Browse Source

由蹬地发起的OTS SDK自动发布, 版本号:1.6.1

Signed-off-by: haowei.yao <haowei.yao@alibaba-inc.com>
haowei.yao 7 years ago
parent
commit
5618efbed5

+ 3 - 0
ChangeLog.txt

@@ -1,3 +1,6 @@
+2018-04-04 Version: 1.6.1
+1, add tablestore trigger pop api and sample code
+
 2018-04-04 Version: 1.6.0
 2018-04-04 Version: 1.6.0
 1, Add APIs for domain transfer in and transfer out.
 1, Add APIs for domain transfer in and transfer out.
 2, Add APIs for poll and acknowledge domain task.
 2, Add APIs for poll and acknowledge domain task.

BIN
services/ots/.DS_Store


+ 43 - 0
services/ots/client.go

@@ -0,0 +1,43 @@
+package ots
+
+//Licensed under the Apache License, Version 2.0 (the "License");
+//you may not use this file except in compliance with the License.
+//You may obtain a copy of the License at
+//
+//http://www.apache.org/licenses/LICENSE-2.0
+//
+//Unless required by applicable law or agreed to in writing, software
+//distributed under the License is distributed on an "AS IS" BASIS,
+//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//See the License for the specific language governing permissions and
+//limitations under the License.
+//
+// Code generated by Alibaba Cloud SDK Code Generator.
+// Changes may cause incorrect behavior and will be lost if the code is regenerated.
+
+import (
+	"github.com/aliyun/alibaba-cloud-sdk-go/sdk"
+	"github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth"
+)
+
+type Client struct {
+	sdk.Client
+}
+
+func NewClient() (client *Client, err error) {
+	client = &Client{}
+	err = client.Init()
+	return
+}
+
+func NewClientWithOptions(regionId string, config *sdk.Config, credential auth.Credential) (client *Client, err error) {
+	client = &Client{}
+	err = client.InitWithOptions(regionId, config, credential)
+	return
+}
+
+func NewClientWithAccessKey(regionId, accessKeyId, accessKeySecret string) (client *Client, err error) {
+	client = &Client{}
+	err = client.InitWithAccessKey(regionId, accessKeyId, accessKeySecret)
+	return
+}

+ 115 - 0
services/ots/create_trigger.go

@@ -0,0 +1,115 @@
+package ots
+
+//Licensed under the Apache License, Version 2.0 (the "License");
+//you may not use this file except in compliance with the License.
+//You may obtain a copy of the License at
+//
+//http://www.apache.org/licenses/LICENSE-2.0
+//
+//Unless required by applicable law or agreed to in writing, software
+//distributed under the License is distributed on an "AS IS" BASIS,
+//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//See the License for the specific language governing permissions and
+//limitations under the License.
+//
+// Code generated by Alibaba Cloud SDK Code Generator.
+// Changes may cause incorrect behavior and will be lost if the code is regenerated.
+
+import (
+	"encoding/json"
+	"fmt"
+	"github.com/aliyun/alibaba-cloud-sdk-go/sdk/errors"
+	"github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
+	"github.com/aliyun/alibaba-cloud-sdk-go/sdk/responses"
+)
+
+func (client *Client) CreateTrigger(request *CreateTriggerRequest) (response *CreateTriggerResponse, err error) {
+	response = CreateCreateTriggerResponse()
+	err = client.DoAction(request, response)
+	return
+}
+
+func (client *Client) CreateTriggerWithChan(request *CreateTriggerRequest) (<-chan *CreateTriggerResponse, <-chan error) {
+	responseChan := make(chan *CreateTriggerResponse, 1)
+	errChan := make(chan error, 1)
+	err := client.AddAsyncTask(func() {
+		defer close(responseChan)
+		defer close(errChan)
+		response, err := client.CreateTrigger(request)
+		responseChan <- response
+		errChan <- err
+	})
+	if err != nil {
+		errChan <- err
+		close(responseChan)
+		close(errChan)
+	}
+	return responseChan, errChan
+}
+
+func (client *Client) CreateTriggerWithCallback(request *CreateTriggerRequest, callback func(response *CreateTriggerResponse, err error)) <-chan int {
+	result := make(chan int, 1)
+	err := client.AddAsyncTask(func() {
+		var response *CreateTriggerResponse
+		var err error
+		defer close(result)
+		response, err = client.CreateTrigger(request)
+		callback(response, err)
+		result <- 1
+	})
+	if err != nil {
+		defer close(result)
+		callback(nil, err)
+		result <- 0
+	}
+	return result
+}
+
+type CreateTriggerRequest struct {
+	*requests.RoaRequest
+	InstanceName string `position:"Path" name:"InstanceName"`
+	ApiVersion   string `position:"Path" name:"ApiVersion"`
+	TableName    string `position:"Path" name:"TableName"`
+}
+
+type CreateTriggerResponse struct {
+	*responses.BaseResponse
+}
+
+func (resp *CreateTriggerResponse) GetBody() (body *CreateTriggerResponseBody, err error) {
+	body = &CreateTriggerResponseBody{}
+	bodyBuf := resp.GetHttpContentBytes()
+	err = json.Unmarshal(bodyBuf, body)
+	if err != nil {
+		errorMsg := fmt.Sprintf(CanNotUnmarshalRequestBodyMessage, string(bodyBuf))
+		return nil, errors.NewClientError(CanNotUnmarshalRequestBodyCode, errorMsg, err)
+	}
+	return
+}
+
+func NewCreateTriggerRequest(domain, instance, table string, body *CreateTriggerRequestBody) (request *CreateTriggerRequest, err error) {
+	request = &CreateTriggerRequest{
+		RoaRequest:   &requests.RoaRequest{},
+		InstanceName: instance,
+		TableName:    table,
+		ApiVersion:   ApiVersion,
+	}
+	request.InitWithApiInfo("Ots", "2017-11-11", "CreateTrigger", "/[ApiVersion]/instance/[InstanceName]/table/[TableName]/trigger", "", "")
+	request.Domain = domain
+	request.Method = "POST"
+
+	bodyBuf, err := json.Marshal(body)
+	if err != nil {
+		errorMsg := fmt.Sprintf(CanNotMarshalRequestBodyMessage, body)
+		return nil, errors.NewClientError(CanNotMarshalRequestBodyCode, errorMsg, err)
+	}
+	request.SetContent(bodyBuf)
+	return
+}
+
+func CreateCreateTriggerResponse() (response *CreateTriggerResponse) {
+	response = &CreateTriggerResponse{
+		BaseResponse: &responses.BaseResponse{},
+	}
+	return
+}

+ 96 - 0
services/ots/delete_trigger.go

@@ -0,0 +1,96 @@
+package ots
+
+//Licensed under the Apache License, Version 2.0 (the "License");
+//you may not use this file except in compliance with the License.
+//You may obtain a copy of the License at
+//
+//http://www.apache.org/licenses/LICENSE-2.0
+//
+//Unless required by applicable law or agreed to in writing, software
+//distributed under the License is distributed on an "AS IS" BASIS,
+//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//See the License for the specific language governing permissions and
+//limitations under the License.
+//
+// Code generated by Alibaba Cloud SDK Code Generator.
+// Changes may cause incorrect behavior and will be lost if the code is regenerated.
+
+import (
+	"github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
+	"github.com/aliyun/alibaba-cloud-sdk-go/sdk/responses"
+)
+
+func (client *Client) DeleteTrigger(request *DeleteTriggerRequest) (response *DeleteTriggerResponse, err error) {
+	response = CreateDeleteTriggerResponse()
+	err = client.DoAction(request, response)
+	return
+}
+
+func (client *Client) DeleteTriggerWithChan(request *DeleteTriggerRequest) (<-chan *DeleteTriggerResponse, <-chan error) {
+	responseChan := make(chan *DeleteTriggerResponse, 1)
+	errChan := make(chan error, 1)
+	err := client.AddAsyncTask(func() {
+		defer close(responseChan)
+		defer close(errChan)
+		response, err := client.DeleteTrigger(request)
+		responseChan <- response
+		errChan <- err
+	})
+	if err != nil {
+		errChan <- err
+		close(responseChan)
+		close(errChan)
+	}
+	return responseChan, errChan
+}
+
+func (client *Client) DeleteTriggerWithCallback(request *DeleteTriggerRequest, callback func(response *DeleteTriggerResponse, err error)) <-chan int {
+	result := make(chan int, 1)
+	err := client.AddAsyncTask(func() {
+		var response *DeleteTriggerResponse
+		var err error
+		defer close(result)
+		response, err = client.DeleteTrigger(request)
+		callback(response, err)
+		result <- 1
+	})
+	if err != nil {
+		defer close(result)
+		callback(nil, err)
+		result <- 0
+	}
+	return result
+}
+
+type DeleteTriggerRequest struct {
+	*requests.RoaRequest
+	InstanceName string `position:"Path" name:"InstanceName"`
+	TriggerName  string `position:"Path" name:"TriggerName"`
+	ApiVersion   string `position:"Path" name:"ApiVersion"`
+	TableName    string `position:"Path" name:"TableName"`
+}
+
+type DeleteTriggerResponse struct {
+	*responses.BaseResponse
+}
+
+func NewDeleteTriggerRequest(domain, instance, table, trigger string) (request *DeleteTriggerRequest) {
+	request = &DeleteTriggerRequest{
+		RoaRequest:   &requests.RoaRequest{},
+		InstanceName: instance,
+		TableName:    table,
+		TriggerName:  trigger,
+		ApiVersion:   ApiVersion,
+	}
+	request.InitWithApiInfo("Ots", "2017-11-11", "DeleteTrigger", "/[ApiVersion]/instance/[InstanceName]/table/[TableName]/trigger/[TriggerName]", "", "")
+	request.Domain = domain
+	request.Method = "DELETE"
+	return
+}
+
+func CreateDeleteTriggerResponse() (response *DeleteTriggerResponse) {
+	response = &DeleteTriggerResponse{
+		BaseResponse: &responses.BaseResponse{},
+	}
+	return
+}

+ 21 - 0
services/ots/error.go

@@ -0,0 +1,21 @@
+package ots
+
+//Licensed under the Apache License, Version 2.0 (the "License");
+//you may not use this file except in compliance with the License.
+//You may obtain a copy of the License at
+//
+//http://www.apache.org/licenses/LICENSE-2.0
+//
+//Unless required by applicable law or agreed to in writing, software
+//distributed under the License is distributed on an "AS IS" BASIS,
+//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//See the License for the specific language governing permissions and
+//limitations under the License.
+
+const (
+	CanNotMarshalRequestBodyCode    = "SDK.CanNotMarshalRequestBody"
+	CanNotMarshalRequestBodyMessage = "Can not marshal body(param = %v)"
+
+	CanNotUnmarshalRequestBodyCode    = "SDK.CanNotUnmarshalRequestBody"
+	CanNotUnmarshalRequestBodyMessage = "Can not unmarshal body(param = %s)"
+)

+ 109 - 0
services/ots/get_trigger.go

@@ -0,0 +1,109 @@
+package ots
+
+//Licensed under the Apache License, Version 2.0 (the "License");
+//you may not use this file except in compliance with the License.
+//You may obtain a copy of the License at
+//
+//http://www.apache.org/licenses/LICENSE-2.0
+//
+//Unless required by applicable law or agreed to in writing, software
+//distributed under the License is distributed on an "AS IS" BASIS,
+//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//See the License for the specific language governing permissions and
+//limitations under the License.
+//
+// Code generated by Alibaba Cloud SDK Code Generator.
+// Changes may cause incorrect behavior and will be lost if the code is regenerated.
+
+import (
+	"encoding/json"
+	"fmt"
+	"github.com/aliyun/alibaba-cloud-sdk-go/sdk/errors"
+	"github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
+	"github.com/aliyun/alibaba-cloud-sdk-go/sdk/responses"
+)
+
+func (client *Client) GetTrigger(request *GetTriggerRequest) (response *GetTriggerResponse, err error) {
+	response = CreateGetTriggerResponse()
+	err = client.DoAction(request, response)
+	return
+}
+
+func (client *Client) GetTriggerWithChan(request *GetTriggerRequest) (<-chan *GetTriggerResponse, <-chan error) {
+	responseChan := make(chan *GetTriggerResponse, 1)
+	errChan := make(chan error, 1)
+	err := client.AddAsyncTask(func() {
+		defer close(responseChan)
+		defer close(errChan)
+		response, err := client.GetTrigger(request)
+		responseChan <- response
+		errChan <- err
+	})
+	if err != nil {
+		errChan <- err
+		close(responseChan)
+		close(errChan)
+	}
+	return responseChan, errChan
+}
+
+func (client *Client) GetTriggerWithCallback(request *GetTriggerRequest, callback func(response *GetTriggerResponse, err error)) <-chan int {
+	result := make(chan int, 1)
+	err := client.AddAsyncTask(func() {
+		var response *GetTriggerResponse
+		var err error
+		defer close(result)
+		response, err = client.GetTrigger(request)
+		callback(response, err)
+		result <- 1
+	})
+	if err != nil {
+		defer close(result)
+		callback(nil, err)
+		result <- 0
+	}
+	return result
+}
+
+type GetTriggerRequest struct {
+	*requests.RoaRequest
+	InstanceName string `position:"Path" name:"InstanceName"`
+	TriggerName  string `position:"Path" name:"TriggerName"`
+	ApiVersion   string `position:"Path" name:"ApiVersion"`
+	TableName    string `position:"Path" name:"TableName"`
+}
+
+type GetTriggerResponse struct {
+	*responses.BaseResponse
+}
+
+func (resp *GetTriggerResponse) GetBody() (body *GetTriggerResponseBody, err error) {
+	body = &GetTriggerResponseBody{}
+	bodyBuf := resp.GetHttpContentBytes()
+	err = json.Unmarshal(bodyBuf, body)
+	if err != nil {
+		errorMsg := fmt.Sprintf(CanNotUnmarshalRequestBodyMessage, string(bodyBuf))
+		return nil, errors.NewClientError(CanNotUnmarshalRequestBodyCode, errorMsg, err)
+	}
+	return
+}
+
+func NewGetTriggerRequest(domain, instance, table, trigger string) (request *GetTriggerRequest) {
+	request = &GetTriggerRequest{
+		RoaRequest:   &requests.RoaRequest{},
+		InstanceName: instance,
+		TableName:    table,
+		TriggerName:  trigger,
+		ApiVersion:   ApiVersion,
+	}
+	request.InitWithApiInfo("Ots", "2017-11-11", "GetTrigger", "/[ApiVersion]/instance/[InstanceName]/table/[TableName]/trigger/[TriggerName]", "", "")
+	request.Domain = domain
+	return
+}
+
+func CreateGetTriggerResponse() (response *GetTriggerResponse) {
+	response = &GetTriggerResponse{
+		BaseResponse: &responses.BaseResponse{},
+	}
+	return
+}

+ 107 - 0
services/ots/list_trigger.go

@@ -0,0 +1,107 @@
+package ots
+
+//Licensed under the Apache License, Version 2.0 (the "License");
+//you may not use this file except in compliance with the License.
+//You may obtain a copy of the License at
+//
+//http://www.apache.org/licenses/LICENSE-2.0
+//
+//Unless required by applicable law or agreed to in writing, software
+//distributed under the License is distributed on an "AS IS" BASIS,
+//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//See the License for the specific language governing permissions and
+//limitations under the License.
+//
+// Code generated by Alibaba Cloud SDK Code Generator.
+// Changes may cause incorrect behavior and will be lost if the code is regenerated.
+
+import (
+	"encoding/json"
+	"fmt"
+	"github.com/aliyun/alibaba-cloud-sdk-go/sdk/errors"
+	"github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
+	"github.com/aliyun/alibaba-cloud-sdk-go/sdk/responses"
+)
+
+func (client *Client) ListTrigger(request *ListTriggerRequest) (response *ListTriggerResponse, err error) {
+	response = CreateListTriggerResponse()
+	err = client.DoAction(request, response)
+	return
+}
+
+func (client *Client) ListTriggerWithChan(request *ListTriggerRequest) (<-chan *ListTriggerResponse, <-chan error) {
+	responseChan := make(chan *ListTriggerResponse, 1)
+	errChan := make(chan error, 1)
+	err := client.AddAsyncTask(func() {
+		defer close(responseChan)
+		defer close(errChan)
+		response, err := client.ListTrigger(request)
+		responseChan <- response
+		errChan <- err
+	})
+	if err != nil {
+		errChan <- err
+		close(responseChan)
+		close(errChan)
+	}
+	return responseChan, errChan
+}
+
+func (client *Client) ListTriggerWithCallback(request *ListTriggerRequest, callback func(response *ListTriggerResponse, err error)) <-chan int {
+	result := make(chan int, 1)
+	err := client.AddAsyncTask(func() {
+		var response *ListTriggerResponse
+		var err error
+		defer close(result)
+		response, err = client.ListTrigger(request)
+		callback(response, err)
+		result <- 1
+	})
+	if err != nil {
+		defer close(result)
+		callback(nil, err)
+		result <- 0
+	}
+	return result
+}
+
+type ListTriggerRequest struct {
+	*requests.RoaRequest
+	InstanceName string `position:"Path" name:"InstanceName"`
+	ApiVersion   string `position:"Path" name:"ApiVersion"`
+	TableName    string `position:"Path" name:"TableName"`
+}
+
+type ListTriggerResponse struct {
+	*responses.BaseResponse
+}
+
+func (resp *ListTriggerResponse) GetBody() (body *ListTriggerResponseBody, err error) {
+	body = &ListTriggerResponseBody{}
+	bodyBuf := resp.GetHttpContentBytes()
+	err = json.Unmarshal(bodyBuf, body)
+	if err != nil {
+		errorMsg := fmt.Sprintf(CanNotUnmarshalRequestBodyMessage, string(bodyBuf))
+		return nil, errors.NewClientError(CanNotUnmarshalRequestBodyCode, errorMsg, err)
+	}
+	return
+}
+
+func NewListTriggerRequest(domain, instance, table string) (request *ListTriggerRequest) {
+	request = &ListTriggerRequest{
+		RoaRequest:   &requests.RoaRequest{},
+		InstanceName: instance,
+		TableName:    table,
+		ApiVersion:   ApiVersion,
+	}
+	request.InitWithApiInfo("Ots", "2017-11-11", "ListTrigger", "/[ApiVersion]/instance/[InstanceName]/table/[TableName]/trigger", "", "")
+	request.Domain = domain
+	return
+}
+
+func CreateListTriggerResponse() (response *ListTriggerResponse) {
+	response = &ListTriggerResponse{
+		BaseResponse: &responses.BaseResponse{},
+	}
+	return
+}

+ 57 - 0
services/ots/model.go

@@ -0,0 +1,57 @@
+package ots
+
+//Licensed under the Apache License, Version 2.0 (the "License");
+//you may not use this file except in compliance with the License.
+//You may obtain a copy of the License at
+//
+//http://www.apache.org/licenses/LICENSE-2.0
+//
+//Unless required by applicable law or agreed to in writing, software
+//distributed under the License is distributed on an "AS IS" BASIS,
+//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//See the License for the specific language governing permissions and
+//limitations under the License.
+
+const ApiVersion = "v1"
+
+type CreateTriggerRequestBody struct {
+	RoleArn     string
+	TriggerName string
+	UdfInfo     *UdfInfo
+}
+
+type TriggerResponseBase struct {
+	Code    string
+	Message string
+}
+
+type CreateTriggerResponseBody struct {
+	TriggerResponseBase
+	Etag string
+}
+
+type GetTriggerResponseBody struct {
+	TriggerResponseBase
+	Trigger *TriggerInfo
+}
+
+type ListTriggerResponseBody struct {
+	TriggerResponseBase
+	Triggers []*TriggerInfo
+}
+
+type UdfInfo struct {
+	ServiceName  string
+	FunctionName string
+}
+
+type TriggerInfo struct {
+	TriggerName  string
+	AssumeRole   string
+	CreateTime   int64
+	InstanceName string
+	DataTable    string
+	UdfInfo      *UdfInfo
+	Etag         string
+	TimerId      string
+}

+ 177 - 0
services/ots/sample/sample.go

@@ -0,0 +1,177 @@
+package main
+
+import (
+	"fmt"
+	"github.com/aliyun/alibaba-cloud-sdk-go/sdk/errors"
+	"github.com/aliyun/alibaba-cloud-sdk-go/services/ots"
+	"log"
+	"os"
+)
+
+var otsDomainTmpl = "ots.%s.aliyuncs.com"
+
+func main() {
+	akId := os.Getenv("ACCESSKEY_ID")
+	akSec := "ACCESSKEY_SECRET"
+
+	testInstance := "existInstance"
+	testTable := "StreamTable"
+
+	adapter, err := NewOTSAdapter("cn-beijing", akId, akSec)
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	// ERROR_ACCESS_DENIED
+
+	// ... ignore, return when ram checking permission failed for sub account
+
+	// ERROR_TRIGGER_NOT_EXIST
+	info, err := adapter.ReadTrigger(testInstance, testTable, "not-exist-trigger")
+	if err == nil {
+		log.Fatal("Unexpected trigger info:", info)
+	}
+	if ok, popErr := parsePopError(err); ok {
+		log.Println("http code:", popErr.HttpStatus())
+		log.Println("error code:", popErr.ErrorCode())
+		log.Println("error message:", popErr.Message())
+	} else {
+		log.Println("Unexpected error:", err)
+	}
+
+	err = adapter.DeleteTrigger(testInstance, testTable, "not-exist-trigger")
+	if err == nil {
+		log.Fatal("Unexpected delete succeed")
+	}
+	if ok, popErr := parsePopError(err); ok {
+		log.Println("http code:", popErr.HttpStatus())
+		log.Println("error code:", popErr.ErrorCode())
+		log.Println("error message:", popErr.Message())
+	} else {
+		log.Println("Unexpected error:", err)
+	}
+
+	// ERROR_INVALID_ARGUMENT
+	info, err = adapter.ReadTrigger("notExistInstance", testTable, "not-exist-trigger")
+	if err == nil {
+		log.Fatal("Unexpected trigger info:", info)
+	}
+	if ok, popErr := parsePopError(err); ok {
+		log.Println("http code:", popErr.HttpStatus())
+		log.Println("error code:", popErr.ErrorCode())
+		log.Println("error message:", popErr.Message())
+	} else {
+		log.Println("Unexpected error:", err)
+	}
+
+	// CRUD
+	triggerMeta := &ots.CreateTriggerRequestBody{
+		TriggerName: "testTrigger",
+		RoleArn:     "acs:ram::1158963556308590:role/aliyuntablestorestreamnotificationrole",
+		UdfInfo: &ots.UdfInfo{
+			ServiceName:  "fcService",
+			FunctionName: "fcFunction",
+		},
+	}
+	// CREATE
+	newTrigger, err := adapter.CreateTrigger(testInstance, testTable, triggerMeta)
+	if err != nil {
+		log.Fatal("Create trigger failed:", err)
+	}
+	log.Println("new trigger id:", newTrigger.Etag)
+
+	// READ
+	info, err = adapter.ReadTrigger(testInstance, testTable, triggerMeta.TriggerName)
+	if err != nil {
+		log.Fatal("Read trigger failed:", err)
+	}
+	log.Println("read trigger info:", info.Trigger)
+
+	// UPDATE
+	// not support update
+
+	// ERROR_RESOURCE_CONFLICT
+	conflictMeta := &ots.CreateTriggerRequestBody{
+		TriggerName: "testTrigger1",
+		RoleArn:     "acs:ram::1158963556308590:role/aliyuntablestorestreamnotificationrole",
+		UdfInfo: &ots.UdfInfo{
+			ServiceName:  "fcService",
+			FunctionName: "fcFunction",
+		},
+	}
+	conflictTrigger, err := adapter.CreateTrigger(testInstance, testTable, conflictMeta)
+	if err == nil {
+		log.Fatal("Uexpected trigger:", conflictTrigger)
+	}
+	if ok, popErr := parsePopError(err); ok {
+		log.Println("http code:", popErr.HttpStatus())
+		log.Println("error code:", popErr.ErrorCode())
+		log.Println("error message:", popErr.Message())
+	} else {
+		log.Println("Unexpected error:", err)
+	}
+
+	// DELETE
+	err = adapter.DeleteTrigger(testInstance, testTable, triggerMeta.TriggerName)
+	if err != nil {
+		log.Fatal("Delete trigger failed:", err)
+	}
+	log.Println("CRUD done")
+}
+
+type OTSAdapter struct {
+	client *ots.Client
+	domain string
+}
+
+func NewOTSAdapter(regionId string, accessKeyId, accessKeySecret string) (*OTSAdapter, error) {
+	client, err := ots.NewClientWithAccessKey(regionId, accessKeyId, accessKeySecret)
+	if err != nil {
+		return nil, err
+	}
+	return &OTSAdapter{client: client, domain: fmt.Sprintf(otsDomainTmpl, regionId)}, nil
+}
+
+func (o *OTSAdapter) CreateTrigger(instanceName, tableName string, triggerInfo *ots.CreateTriggerRequestBody) (resp *ots.CreateTriggerResponseBody, err error) {
+	req, err := ots.NewCreateTriggerRequest(o.domain, instanceName, tableName, triggerInfo)
+	if err != nil {
+		return
+	}
+	popResp, err := o.client.CreateTrigger(req)
+	if err != nil {
+		return
+	}
+	resp, err = popResp.GetBody()
+	return
+}
+
+func (o *OTSAdapter) ReadTrigger(instanceName, tableName, triggerName string) (triggerInfo *ots.GetTriggerResponseBody, err error) {
+	popResp, err := o.client.GetTrigger(ots.NewGetTriggerRequest(o.domain, instanceName, tableName, triggerName))
+	if err != nil {
+		return
+	}
+	triggerInfo, err = popResp.GetBody()
+	return
+}
+
+func (o *OTSAdapter) DeleteTrigger(instanceName, tableName, triggerName string) error {
+	_, err := o.client.DeleteTrigger(ots.NewDeleteTriggerRequest(o.domain, instanceName, tableName, triggerName))
+	return err
+}
+
+// fc应该用不到这个接口
+func (o *OTSAdapter) ListTriggers(instanceName, tableName string) (triggers *ots.ListTriggerResponseBody, err error) {
+	popResp, err := o.client.ListTrigger(ots.NewListTriggerRequest(o.domain, instanceName, tableName))
+	if err != nil {
+		return
+	}
+	triggers, err = popResp.GetBody()
+	return
+}
+
+func parsePopError(err error) (succeed bool, error *errors.ServerError) {
+	if sdkErr, ok := err.(*errors.ServerError); ok {
+		return true, sdkErr
+	}
+	return false, nil
+}