Quellcode durchsuchen

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

Signed-off-by: haowei.yao <haowei.yao@alibaba-inc.com>
haowei.yao vor 7 Jahren
Ursprung
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
 1, Add APIs for domain transfer in and transfer out.
 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
+}