alibabacloudstack/service_apsarastack_ots.go (347 lines of code) (raw):

package alibabacloudstack import ( "encoding/json" "strings" "time" "fmt" "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests" "github.com/aliyun/alibaba-cloud-sdk-go/sdk/responses" "github.com/aliyun/alibaba-cloud-sdk-go/services/ecs" "github.com/aliyun/alibaba-cloud-sdk-go/services/ots" "github.com/aliyun/aliyun-tablestore-go-sdk/tablestore" "github.com/aliyun/terraform-provider-alibabacloudstack/alibabacloudstack/connectivity" "github.com/aliyun/terraform-provider-alibabacloudstack/alibabacloudstack/errmsgs" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" ) type OtsService struct { client *connectivity.AlibabacloudStackClient } func (s *OtsService) getPrimaryKeyType(primaryKeyType string) tablestore.PrimaryKeyType { var keyType tablestore.PrimaryKeyType t := PrimaryKeyTypeString(primaryKeyType) switch t { case IntegerType: keyType = tablestore.PrimaryKeyType_INTEGER case StringType: keyType = tablestore.PrimaryKeyType_STRING case BinaryType: keyType = tablestore.PrimaryKeyType_BINARY } return keyType } func (s *OtsService) ListOtsTable(instanceName string) (table *tablestore.ListTableResponse, err error) { if _, err := s.DescribeOtsInstance(instanceName); err != nil { return nil, errmsgs.WrapError(err) } var raw interface{} var requestInfo *tablestore.TableStoreClient err = resource.Retry(5*time.Minute, func() *resource.RetryError { raw, err = s.client.WithTableStoreClient(instanceName, func(tableStoreClient *tablestore.TableStoreClient) (interface{}, error) { requestInfo = tableStoreClient return tableStoreClient.ListTable() }) if err != nil { if strings.HasSuffix(err.Error(), "no such host") { return resource.RetryableError(err) } return resource.NonRetryableError(err) } addDebug("ListTable", raw, requestInfo) return nil }) if err != nil { if strings.HasPrefix(err.Error(), "OTSObjectNotExist") { return table, errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AliyunTablestoreGoSdk) } return nil, errmsgs.WrapErrorf(err, errmsgs.DataDefaultErrorMsg, instanceName, "ListTable", errmsgs.AliyunTablestoreGoSdk) } table, _ = raw.(*tablestore.ListTableResponse) if table == nil { return table, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("OtsTable", instanceName)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR) } return } func (s *OtsService) DescribeOtsTable(id string) (*tablestore.DescribeTableResponse, error) { table := &tablestore.DescribeTableResponse{} parts, err := ParseResourceId(id, 2) if err != nil { return table, errmsgs.WrapError(err) } instanceName, tableName := parts[0], parts[1] request := new(tablestore.DescribeTableRequest) request.TableName = tableName if _, err := s.DescribeOtsInstance(instanceName); err != nil { return table, errmsgs.WrapError(err) } var raw interface{} var requestInfo *tablestore.TableStoreClient err = resource.Retry(5*time.Minute, func() *resource.RetryError { raw, err = s.client.WithTableStoreClient(instanceName, func(tableStoreClient *tablestore.TableStoreClient) (interface{}, error) { requestInfo = tableStoreClient return tableStoreClient.DescribeTable(request) }) if err != nil { if errmsgs.IsExpectedErrors(err, errmsgs.OtsTableIsTemporarilyUnavailable) { return resource.RetryableError(err) } return resource.NonRetryableError(err) } addDebug("DescribeTable", raw, requestInfo, request) return nil }) if err != nil { if strings.HasPrefix(err.Error(), "OTSObjectNotExist") { return table, errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AliyunTablestoreGoSdk) } return table, errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg, id, "DescribeTable", errmsgs.AliyunTablestoreGoSdk) } table, _ = raw.(*tablestore.DescribeTableResponse) if table == nil || table.TableMeta == nil || table.TableMeta.TableName != tableName { return table, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("OtsTable", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR) } return table, nil } func (s *OtsService) WaitForOtsTable(instanceName, tableName string, status Status, timeout int) error { deadline := time.Now().Add(time.Duration(timeout) * time.Second) id := fmt.Sprintf("%s%s%s", instanceName, COLON_SEPARATED, tableName) for { object, err := s.DescribeOtsTable(id) if err != nil { if errmsgs.NotFoundError(err) { if status == Deleted { return nil } } else { return errmsgs.WrapError(err) } } if object.TableMeta.TableName == tableName && status != Deleted { return nil } if time.Now().After(deadline) { return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, object.TableMeta.TableName, tableName, errmsgs.ProviderERROR) } } } func (s *OtsService) convertPrimaryKeyType(t tablestore.PrimaryKeyType) PrimaryKeyTypeString { var typeString PrimaryKeyTypeString switch t { case tablestore.PrimaryKeyType_INTEGER: typeString = IntegerType case tablestore.PrimaryKeyType_BINARY: typeString = BinaryType case tablestore.PrimaryKeyType_STRING: typeString = StringType } return typeString } func (s *OtsService) ListOtsInstance(pageSize int, pageNum int) ([]string, error) { req := ots.CreateListInstanceRequest() s.client.InitRpcRequest(*req.RpcRequest) req.Method = "GET" req.PageSize = requests.NewInteger(pageSize) req.PageNum = requests.NewInteger(pageNum) req.Domain = s.client.Domain var allInstanceNames []string for { raw, err := s.client.WithOtsClient(func(otsClient *ots.Client) (interface{}, error) { return otsClient.ListInstance(req) }) response, ok := raw.(*ots.ListInstanceResponse) if err != nil { errmsg := "" if ok { errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse) } return nil, errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alicloud_ots_instances", req.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg) } addDebug(req.GetActionName(), raw, req.RpcRequest, req) if response == nil || len(response.InstanceInfos.InstanceInfo) < 1 { break } for _, instance := range response.InstanceInfos.InstanceInfo { allInstanceNames = append(allInstanceNames, instance.InstanceName) } if len(response.InstanceInfos.InstanceInfo) < PageSizeLarge { break } if page, err := getNextpageNumber(req.PageNum); err != nil { return nil, errmsgs.WrapError(err) } else { req.PageNum = page } } return allInstanceNames, nil } func (s *OtsService) DescribeOtsInstance(id string) (inst InstanceInfo, err error) { request := s.client.NewCommonRequest("GET", "Ots", "2016-06-20", "GetInstance", "") request.QueryParams["InstanceName"] = id raw, err := s.client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { return ecsClient.ProcessCommonRequest(request) }) addDebug(request.GetActionName(), raw, request.QueryParams, errmsgs.AlibabacloudStackSdkGoERROR) // OTS instance not found error code is "NotFound" bresponse, ok := raw.(*responses.CommonResponse) if err != nil { errmsg := "" if ok { errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse) }else{ errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("OtsInstance", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR) } if errmsgs.NotFoundError(err) { return inst, errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackSdkGoERROR) } return inst, errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg) } var instmap GetInstanceResponse e := json.Unmarshal(bresponse.GetHttpContentBytes(), &instmap) if e != nil { return inst, errmsgs.WrapErrorf(e, errmsgs.DefaultErrorMsg, id, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR) } if instmap.AsapiSuccess { inst = instmap.InstanceInfo return inst, nil } else { return inst, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("OtsInstance", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR) } } func (s *OtsService) DescribeOtsInstanceAttachment(id string) (inst ots.VpcInfo, err error) { request := ots.CreateListVpcInfoByInstanceRequest() s.client.InitRpcRequest(*request.RpcRequest) request.Method = "GET" request.InstanceName = id raw, err := s.client.WithOtsClient(func(otsClient *ots.Client) (interface{}, error) { return otsClient.ListVpcInfoByInstance(request) }) resp, ok := raw.(*ots.ListVpcInfoByInstanceResponse) if err != nil { errmsg := "" if ok { errmsg = errmsgs.GetBaseResponseErrorMessage(resp.BaseResponse) } if errmsgs.NotFoundError(err) { return inst, errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackSdkGoERROR) } return inst, errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg) } addDebug(request.GetActionName(), raw, request.RpcRequest, request) if resp.TotalCount < 1 { return inst, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("OtsInstanceAttachment", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR) } return resp.VpcInfos.VpcInfo[0], nil } func (s *OtsService) WaitForOtsInstanceVpc(id string, status Status, timeout int) error { deadline := time.Now().Add(time.Duration(timeout) * time.Second) for { object, err := s.DescribeOtsInstanceAttachment(id) if err != nil { if errmsgs.NotFoundError(err) { if status == Deleted { return nil } } else { return errmsgs.WrapError(err) } } if object.InstanceName == id && status != Deleted { return nil } if time.Now().After(deadline) { return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, object.InstanceName, id, errmsgs.ProviderERROR) } } } func (s *OtsService) ListOtsInstanceVpc(id string) (inst []ots.VpcInfo, err error) { request := ots.CreateListVpcInfoByInstanceRequest() s.client.InitRpcRequest(*request.RpcRequest) request.Method = "GET" request.InstanceName = id raw, err := s.client.WithOtsClient(func(otsClient *ots.Client) (interface{}, error) { return otsClient.ListVpcInfoByInstance(request) }) resp, ok := raw.(*ots.ListVpcInfoByInstanceResponse) if err != nil { errmsg := "" if ok { errmsg = errmsgs.GetBaseResponseErrorMessage(resp.BaseResponse) } return inst, errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alicloud_ots_instance_attachments", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg) } addDebug(request.GetActionName(), raw, request.RpcRequest, request) if resp.TotalCount < 1 { return inst, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("OtsInstanceAttachment", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR) } var retInfos []ots.VpcInfo for _, vpcInfo := range resp.VpcInfos.VpcInfo { vpcInfo.InstanceName = id retInfos = append(retInfos, vpcInfo) } return retInfos, nil } func (s *OtsService) WaitForOtsInstance(id string, status Status, timeout int) error { deadline := time.Now().Add(time.Duration(timeout) * time.Second) for { object, err := s.DescribeOtsInstance(id) if err != nil { if errmsgs.NotFoundError(err) { if status == Deleted { return nil } } else { return errmsgs.WrapError(err) } } if object.Status == convertOtsInstanceStatus(status) { break } if time.Now().After(deadline) { return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, fmt.Sprint(object.Status), status, errmsgs.ProviderERROR) } time.Sleep(DefaultIntervalShort * time.Second) } return nil } func (s *OtsService) DescribeOtsInstanceTypes() (types []string, err error) { request := ots.CreateListClusterTypeRequest() s.client.InitRpcRequest(*request.RpcRequest) request.Method = requests.GET raw, err := s.client.WithOtsClient(func(otsClient *ots.Client) (interface{}, error) { return otsClient.ListClusterType(request) }) resp, ok := raw.(*ots.ListClusterTypeResponse) if err != nil { errmsg := "" if ok { errmsg = errmsgs.GetBaseResponseErrorMessage(resp.BaseResponse) } return nil, errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alicloud_ots_instance", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg) } addDebug(request.GetActionName(), raw, request.RpcRequest, request) if resp != nil { return resp.ClusterTypeInfos.ClusterType, nil } return } type TagInfos struct { TagInfo []map[string]string `json:"TagInfo" xml:"TagInfo"` } type InstanceInfo struct { InstanceName string `json:"InstanceName" xml:"InstanceName"` Status int `json:"Status" xml:"Status"` TagInfos TagInfos `json:"TagInfos" xml:"TagInfos"` Description string `json:"Description" xml:"Description"` Quota map[string]interface{} `json:"Quota" xml:"Quota"` UserId string `json:"UserId" xml:"UserId"` Network string `json:"Network" xml:"Network"` CreateTime string `json:"CreateTime" xml:"CreateTime"` ClusterType string `json:"ClusterType" xml:"ClusterType"` WriteCapacity int `json:"WriteCapacity" xml:"WriteCapacity"` ReadCapacity int `json:"ReadCapacity" xml:"ReadCapacity"` } type GetInstanceResponse struct { EagleEyeTraceId string `json:"eagleEyeTraceId" xml:"eagleEyeTraceId"` AsapiSuccess bool `json:"asapiSuccess" xml:"asapiSuccess"` RequestId string `json:"RequestId" xml:"RequestId"` AsapiRequestId string `json:"asapiRequestId" xml:"asapiRequestId"` InstanceInfo InstanceInfo `json:"InstanceInfo" xml:"InstanceInfo"` }