diff --git a/alicloud/connectivity/client.go b/alicloud/connectivity/client.go index 1bed34d6a16c..d1c1e149d7c2 100644 --- a/alicloud/connectivity/client.go +++ b/alicloud/connectivity/client.go @@ -16,6 +16,8 @@ import ( gatewayclient "github.com/alibabacloud-go/alibabacloud-gateway-sls/client" roaCS "github.com/alibabacloud-go/cs-20151215/v5/client" openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client" + "github.com/alibabacloud-go/darabonba-openapi/v2/utils" + ots "github.com/alibabacloud-go/tablestore-20201209/v3/client" roa "github.com/alibabacloud-go/tea-roa/client" rpc "github.com/alibabacloud-go/tea-rpc/client" util "github.com/alibabacloud-go/tea-utils/service" @@ -51,7 +53,6 @@ import ( "github.com/aliyun/alibaba-cloud-sdk-go/services/hbase" "github.com/aliyun/alibaba-cloud-sdk-go/services/market" "github.com/aliyun/alibaba-cloud-sdk-go/services/maxcompute" - "github.com/aliyun/alibaba-cloud-sdk-go/services/ots" "github.com/aliyun/alibaba-cloud-sdk-go/services/polardb" r_kvstore "github.com/aliyun/alibaba-cloud-sdk-go/services/r-kvstore" "github.com/aliyun/alibaba-cloud-sdk-go/services/ram" @@ -67,6 +68,7 @@ import ( "github.com/aliyun/aliyun-oss-go-sdk/oss" "github.com/aliyun/aliyun-tablestore-go-sdk/tablestore" otsTunnel "github.com/aliyun/aliyun-tablestore-go-sdk/tunnel" + credential "github.com/aliyun/credentials-go/credentials" "github.com/aliyun/fc-go-sdk" "github.com/denverdino/aliyungo/cdn" "github.com/denverdino/aliyungo/cs" @@ -884,7 +886,8 @@ func (client *AliyunClient) WithOtsClient(do func(*ots.Client) (interface{}, err if client.otsconn != nil && !client.config.needRefreshCredential() { return do(client.otsconn) } - product := "ots" + product := "tablestore" + config := new(utils.Config) endpoint, err := client.loadApiEndpoint(product) if err != nil { return nil, err @@ -892,10 +895,12 @@ func (client *AliyunClient) WithOtsClient(do func(*ots.Client) (interface{}, err if endpoint != "" { endpoints.AddEndpointMapping(client.config.RegionId, product, endpoint) } - otsconn, err := ots.NewClientWithOptions(client.config.RegionId, client.getSdkConfig(0), client.config.getAuthCredential(true)) + config.SetRegionId(client.config.RegionId).SetEndpoint(endpoint) + cred, err := credential.NewCredential(client.config.getCredentialConfig(true)) if err != nil { return nil, fmt.Errorf("unable to initialize the OTS client: %#v", err) } + config.SetCredential(cred) proxy, err := client.getHttpProxy() if proxy != nil { @@ -906,17 +911,19 @@ func (client *AliyunClient) WithOtsClient(do func(*ots.Client) (interface{}, err if !skip { if client.config.Protocol == "HTTPS" { - otsconn.SetHttpsProxy(proxy.String()) + config.SetHttpsProxy(proxy.String()) } else { - otsconn.SetHttpProxy(proxy.String()) + config.SetHttpProxy(proxy.String()) } } } - otsconn.SetReadTimeout(time.Duration(client.config.ClientReadTimeout) * time.Millisecond) - otsconn.SetConnectTimeout(time.Duration(client.config.ClientConnectTimeout) * time.Millisecond) - otsconn.SourceIp = client.config.SourceIp - otsconn.SecureTransport = client.config.SecureTransport + config.SetReadTimeout(client.config.ClientReadTimeout) + config.SetConnectTimeout(client.config.ClientConnectTimeout) + otsconn, err := ots.NewClient(config) + if err != nil { + return nil, fmt.Errorf("unable to initialize the OTS client: %#v", err) + } client.otsconn = otsconn return do(client.otsconn) diff --git a/alicloud/data_source_alicloud_ots_instance_attachments.go b/alicloud/data_source_alicloud_ots_instance_attachments.go index 139e42e69fb0..6cb98c564a88 100644 --- a/alicloud/data_source_alicloud_ots_instance_attachments.go +++ b/alicloud/data_source_alicloud_ots_instance_attachments.go @@ -3,7 +3,7 @@ package alicloud import ( "regexp" - "github.com/aliyun/alibaba-cloud-sdk-go/services/ots" + ots "github.com/alibabacloud-go/tablestore-20201209/v3/client" "github.com/aliyun/terraform-provider-alicloud/alicloud/connectivity" "github.com/hashicorp/terraform-plugin-sdk/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/helper/validation" @@ -89,11 +89,11 @@ func dataSourceAlicloudOtsInstanceAttachmentsRead(d *schema.ResourceData, meta i return WrapError(err) } - var filteredVpcs []ots.VpcInfo + var filteredVpcs []*ots.ListVpcInfoByInstanceResponseBodyVpcInfos if v, ok := d.GetOk("name_regex"); ok && v.(string) != "" { r := regexp.MustCompile(v.(string)) for _, vpc := range allVpcs { - if r.MatchString(vpc.InstanceVpcName) { + if r.MatchString(*vpc.InstanceVpcName) { filteredVpcs = append(filteredVpcs, vpc) } } @@ -103,24 +103,26 @@ func dataSourceAlicloudOtsInstanceAttachmentsRead(d *schema.ResourceData, meta i return otsAttachmentsDescriptionAttributes(d, filteredVpcs, meta) } -func otsAttachmentsDescriptionAttributes(d *schema.ResourceData, vpcInfos []ots.VpcInfo, meta interface{}) error { +func otsAttachmentsDescriptionAttributes(d *schema.ResourceData, vpcInfos []*ots.ListVpcInfoByInstanceResponseBodyVpcInfos, meta interface{}) error { var ids []string var names []string var vpcIds []string var s []map[string]interface{} + + instanceName := d.Get("instance_name").(string) for _, vpc := range vpcInfos { mapping := map[string]interface{}{ - "id": vpc.InstanceName, + "id": instanceName, "domain": vpc.Domain, "endpoint": vpc.Endpoint, "region": vpc.RegionNo, - "instance_name": vpc.InstanceName, + "instance_name": instanceName, "vpc_name": vpc.InstanceVpcName, "vpc_id": vpc.VpcId, } - names = append(names, vpc.InstanceVpcName) - ids = append(ids, vpc.InstanceName) - vpcIds = append(vpcIds, vpc.VpcId) + names = append(names, *vpc.InstanceVpcName) + ids = append(ids, instanceName) + vpcIds = append(vpcIds, *vpc.VpcId) s = append(s, mapping) } diff --git a/alicloud/data_source_alicloud_ots_instances.go b/alicloud/data_source_alicloud_ots_instances.go index 11478a819ddb..62e7c699e3fe 100644 --- a/alicloud/data_source_alicloud_ots_instances.go +++ b/alicloud/data_source_alicloud_ots_instances.go @@ -3,6 +3,7 @@ package alicloud import ( "regexp" + ots "github.com/alibabacloud-go/tablestore-20201209/v3/client" "github.com/aliyun/terraform-provider-alicloud/alicloud/connectivity" "github.com/hashicorp/terraform-plugin-sdk/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/helper/validation" @@ -145,20 +146,20 @@ func dataSourceAlicloudOtsInstancesRead(d *schema.ResourceData, meta interface{} var filteredInstanceNames []string for _, instanceName := range allInstanceNames { // name_regex mismatch - if nameReg != nil && !nameReg.MatchString(instanceName) { + if nameReg != nil && !nameReg.MatchString(*instanceName) { continue } // ids mismatch if len(idsMap) != 0 { - if _, ok := idsMap[instanceName]; !ok { + if _, ok := idsMap[*instanceName]; !ok { continue } } - filteredInstanceNames = append(filteredInstanceNames, instanceName) + filteredInstanceNames = append(filteredInstanceNames, *instanceName) } // get full instance info via GetInstance - var allInstances []RestOtsInstanceInfo + var allInstances []*ots.GetInstanceResponseBody for _, instanceName := range filteredInstanceNames { instanceInfo, err := otsService.DescribeOtsInstance(instanceName) if err != nil { @@ -168,7 +169,7 @@ func dataSourceAlicloudOtsInstancesRead(d *schema.ResourceData, meta interface{} } // filter by tag. - var filteredInstances []RestOtsInstanceInfo + var filteredInstances []*ots.GetInstanceResponseBody if v, ok := d.GetOk("tags"); ok { if vmap, ok := v.(map[string]interface{}); ok && len(vmap) > 0 { for _, instance := range allInstances { @@ -185,29 +186,33 @@ func dataSourceAlicloudOtsInstancesRead(d *schema.ResourceData, meta interface{} return otsInstancesDecriptionAttributes(d, filteredInstances, meta) } -func otsInstancesDecriptionAttributes(d *schema.ResourceData, instances []RestOtsInstanceInfo, meta interface{}) error { +func otsInstancesDecriptionAttributes(d *schema.ResourceData, instances []*ots.GetInstanceResponseBody, meta interface{}) error { var ids []string var names []string var s []map[string]interface{} for _, instance := range instances { mapping := map[string]interface{}{ - "id": instance.InstanceName, - "name": instance.InstanceName, - "status": toInstanceOuterStatus(instance.InstanceStatus), - "cluster_type": instance.InstanceSpecification, - "create_time": instance.CreateTime, - "user_id": instance.UserId, - "resource_group_id": instance.ResourceGroupId, - "network_type_acl": instance.NetworkTypeACL, - "network_source_acl": instance.NetworkSourceACL, - "policy": instance.Policy, - "policy_version": instance.PolicyVersion, - "description": instance.InstanceDescription, - "table_quota": instance.Quota.TableQuota, - "tags": otsRestTagsToMap(instance.Tags), + "id": instance.InstanceName, + "name": instance.InstanceName, + "status": toInstanceOuterStatus(*instance.InstanceStatus), + "cluster_type": instance.InstanceSpecification, + "create_time": instance.CreateTime, + "user_id": instance.UserId, + "resource_group_id": instance.ResourceGroupId, + "network_type_acl": instance.NetworkTypeACL, + "network_source_acl": instance.NetworkSourceACL, + "accessed_by": instance.Network, + "policy": instance.Policy, + "policy_version": instance.PolicyVersion, + "description": instance.InstanceDescription, + "alias_name": instance.AliasName, + "payment_type": instance.PaymentType, + "elastic_vcs_upper_limit": instance.ElasticVCUUpperLimit, + "table_quota": instance.TableQuota, + "tags": otsRestTagsToMap(instance.Tags), } - names = append(names, instance.InstanceName) - ids = append(ids, instance.InstanceName) + names = append(names, *instance.InstanceName) + ids = append(ids, *instance.InstanceName) s = append(s, mapping) } diff --git a/alicloud/extension_ots.go b/alicloud/extension_ots.go index 6ca6f1426637..547eac5993de 100644 --- a/alicloud/extension_ots.go +++ b/alicloud/extension_ots.go @@ -113,6 +113,19 @@ func toInstanceInnerStatus(instanceOuterStatus Status) string { } } +// Takes the result of flatmap.Expand for an array of strings +// and returns a []string +func expandStringPointerList(configured []interface{}) []*string { + vs := make([]*string, 0, len(configured)) + for _, v := range configured { + if v == nil { + continue + } + vs = append(vs, StringPointer(v.(string))) + } + return vs +} + type TunnelTypeString string const ( @@ -202,8 +215,11 @@ type RestOtsInstanceInfo struct { NetworkTypeACL []string `json:"NetworkTypeACL" xml:"NetworkTypeACL"` NetworkSourceACL []string `json:"NetworkSourceACL" xml:"NetworkSourceACL"` Policy string `json:"Policy" xml:"Policy"` - PolicyVersion int `json:"PolicyVersion" xml:"PolicyVersion"` + PolicyVersion int64 `json:"PolicyVersion" xml:"PolicyVersion"` InstanceDescription string `json:"InstanceDescription" xml:"InstanceDescription"` + AliasName string `json:"AliasName" xml:"AliasName"` + PaymentType string `json:"PaymentType" xml:"PaymentType"` + ElasticVCUUpperLimit float64 `json:"ElasticVCUUpperLimit" xml:"ElasticVCUUpperLimit"` Quota RestOtsQuota `json:"Quota" xml:"Quota"` Tags []RestOtsTagInfo `json:"Tags" xml:"Tags"` } diff --git a/alicloud/resource_alicloud_ots_instance.go b/alicloud/resource_alicloud_ots_instance.go index b40e18a9a490..1ea3ddc5bb39 100644 --- a/alicloud/resource_alicloud_ots_instance.go +++ b/alicloud/resource_alicloud_ots_instance.go @@ -1,6 +1,7 @@ package alicloud import ( + ots "github.com/alibabacloud-go/tablestore-20201209/v3/client" "github.com/aliyun/terraform-provider-alicloud/alicloud/connectivity" "github.com/hashicorp/terraform-plugin-sdk/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/helper/validation" @@ -33,27 +34,33 @@ func resourceAlicloudOtsInstance() *schema.Resource { string(AnyNetwork), string(VpcOnly), string(VpcOrConsole), }, false), }, - "resource_group_id": { Type: schema.TypeString, Optional: true, Computed: true, }, - "network_type_acl": { Type: schema.TypeSet, Optional: true, Computed: true, Elem: &schema.Schema{Type: schema.TypeString}, }, - "network_source_acl": { Type: schema.TypeSet, Optional: true, Computed: true, Elem: &schema.Schema{Type: schema.TypeString}, }, - + "policy": { + Type: schema.TypeString, + Optional: true, + ValidateFunc: validation.StringIsJSON, + }, + "policy_version": { + Type: schema.TypeInt, + Optional: false, + Computed: true, + }, "instance_type": { Type: schema.TypeString, Optional: true, @@ -66,10 +73,11 @@ func resourceAlicloudOtsInstance() *schema.Resource { "description": { Type: schema.TypeString, Optional: true, - ForceNew: true, - DiffSuppressFunc: func(k, old, new string, d *schema.ResourceData) bool { - return d.Id() != "" - }, + }, + "alias_name": { + Type: schema.TypeString, + Optional: true, + ValidateFunc: validateOTSInstanceName, }, // lintignore: S006 "tags": { @@ -84,99 +92,90 @@ func resourceAliyunOtsInstanceCreate(d *schema.ResourceData, meta interface{}) e client := meta.(*connectivity.AliyunClient) otsService := OtsService{client} - instanceTypeStr := d.Get("instance_type").(string) - instanceType, err := parseAndCheckInstanceType(instanceTypeStr, otsService) - if err != nil { - return WrapError(err) - } - - actionPath, instanceName, request := buildCreateInstanceRoaRequest(d, client.RegionId, instanceType) - - _, err = OtsRestApiPostWithRetry(client, "tablestore", "2020-12-09", actionPath, request) - if err != nil { - return WrapError(err) - } - - d.SetId(instanceName) - if err := otsService.WaitForOtsInstance(instanceName, toInstanceInnerStatus(Running), DefaultTimeout); err != nil { - return WrapError(err) - } - return resourceAliyunOtsInstanceUpdate(d, meta) -} - -func parseAndCheckInstanceType(instanceTypeStr string, otsService OtsService) (string, error) { - instanceType := convertInstanceType(OtsInstanceType(instanceTypeStr)) + instanceType := d.Get("instance_type").(string) + request := new(ots.CreateInstanceRequest) + request.ClusterType = StringPointer(convertInstanceType(OtsInstanceType(instanceType))) types, err := otsService.DescribeOtsInstanceTypes() if err != nil { - return "", WrapError(err) + return WrapError(err) } valid := false for _, t := range types { - if instanceType == t { + if *request.ClusterType == *t { valid = true break } } - if valid { - return instanceType, nil + if !valid { + return WrapError(Error("The instance type %s is not available in the region %s.", instanceType, client.RegionId)) } - return instanceType, WrapError(Error("The instance type %s is not available in the region %s.", instanceTypeStr, otsService.client.RegionId)) - -} - -func buildCreateInstanceRoaRequest(d *schema.ResourceData, regionId string, instanceType string) (string, string, map[string]interface{}) { - actionPath := "/v2/openapi/createinstance" - request := make(map[string]interface{}) - request["RegionId"] = StringPointer(regionId) - request["ClusterType"] = StringPointer(instanceType) instanceName := d.Get("name").(string) - request["InstanceName"] = StringPointer(instanceName) - request["ResourceGroupId"] = StringPointer(d.Get("resource_group_id").(string)) - request["InstanceDescription"] = StringPointer(d.Get("description").(string)) + request.InstanceName = StringPointer(instanceName) + request.ResourceGroupId = StringPointer(d.Get("resource_group_id").(string)) + request.Policy = StringPointer(d.Get("policy").(string)) + request.InstanceDescription = StringPointer(d.Get("description").(string)) hasSetNetwork := false if v, ok := d.GetOk("accessed_by"); ok { hasSetNetwork = true - request["Network"] = StringPointer(convertInstanceAccessedBy(InstanceAccessedByType(v.(string)))) + request.Network = StringPointer(convertInstanceAccessedBy(InstanceAccessedByType(v.(string)))) } hasSetACL := false // LIST or SET cannot set default values in schema in latest terraform version, so do it manually // terraform cannot handle nil and[] in list/set: https://github.com/hashicorp/terraform-plugin-sdk/issues/142 // in terraform the zero value of list/set is [], in golang the zero value of slice is nil - netTypeList := []string{string(VpcAccess), string(ClassicAccess), string(InternetAccess)} + netTypeList := []*string{StringPointer(string(VpcAccess)), StringPointer(string(ClassicAccess)), StringPointer(string(InternetAccess))} // v not nil and [], it will be ok if v, ok := d.GetOk("network_type_acl"); ok { hasSetACL = true - netTypeList = expandStringList(v.(*schema.Set).List()) + netTypeList = expandStringPointerList(v.(*schema.Set).List()) } - request["NetworkTypeACL"] = netTypeList + request.NetworkTypeACL = netTypeList - netSourceList := []string{string(TrustProxyAccess)} + netSourceList := []*string{StringPointer(string(TrustProxyAccess))} if v, ok := d.GetOk("network_source_acl"); ok { hasSetACL = true - netSourceList = expandStringList(v.(*schema.Set).List()) + netSourceList = expandStringPointerList(v.(*schema.Set).List()) } - request["NetworkSourceACL"] = netSourceList + request.NetworkSourceACL = netSourceList // In order to maintain compatibility, when the Network attribute is set, // the ACL attribute cannot have a default value. if hasSetNetwork && !hasSetACL { - request["NetworkTypeACL"] = nil - request["NetworkSourceACL"] = nil + request.NetworkTypeACL = nil + request.NetworkSourceACL = nil } if tagMap, ok := d.GetOk("tags"); ok { - var tags []map[string]string + var tags []*ots.CreateInstanceRequestTags for key, value := range tagMap.(map[string]interface{}) { - tag := map[string]string{"Key": key, "Value": value.(string)} - tags = append(tags, tag) + tags = append(tags, &ots.CreateInstanceRequestTags{ + Key: StringPointer(key), + Value: StringPointer(value.(string)), + }) } - request["Tags"] = tags + request.Tags = tags } - return actionPath, instanceName, request + raw, err := client.WithOtsClient(func(client *ots.Client) (interface{}, error) { + return client.CreateInstance(request) + }) + if err != nil { + if NotFoundError(err) { + return WrapErrorf(err, NotFoundMsg, AlibabaCloudSdkGoERROR) + } + return WrapErrorf(err, DefaultErrorMsg, "CreateInstance", AlibabaCloudSdkGoERROR) + } + resp := raw.(*ots.CreateInstanceResponse) + addDebug("CreateInstance", resp, request) + + d.SetId(instanceName) + if err = otsService.WaitForOtsInstance(instanceName, toInstanceInnerStatus(Running), DefaultTimeout); err != nil { + return WrapError(err) + } + return resourceAliyunOtsInstanceUpdate(d, meta) } func resourceAliyunOtsInstanceRead(d *schema.ResourceData, meta interface{}) error { @@ -192,7 +191,7 @@ func resourceAliyunOtsInstanceRead(d *schema.ResourceData, meta interface{}) err } d.Set("name", instance.InstanceName) - err = d.Set("accessed_by", convertInstanceAccessedByRevert(instance.Network)) + err = d.Set("accessed_by", convertInstanceAccessedByRevert(*instance.Network)) if err != nil { return err } @@ -208,8 +207,15 @@ func resourceAliyunOtsInstanceRead(d *schema.ResourceData, meta interface{}) err if err != nil { return err } - - err = d.Set("instance_type", convertInstanceTypeRevert(instance.InstanceSpecification)) + err = d.Set("policy", instance.Policy) + if err != nil { + return err + } + err = d.Set("policy_version", instance.PolicyVersion) + if err != nil { + return err + } + err = d.Set("instance_type", convertInstanceTypeRevert(*instance.InstanceSpecification)) if err != nil { return err } @@ -217,6 +223,10 @@ func resourceAliyunOtsInstanceRead(d *schema.ResourceData, meta interface{}) err if err != nil { return err } + err = d.Set("alias_name", instance.AliasName) + if err != nil { + return err + } err = d.Set("tags", otsRestTagsToMap(instance.Tags)) if err != nil { return err @@ -231,81 +241,168 @@ func resourceAliyunOtsInstanceUpdate(d *schema.ResourceData, meta interface{}) e d.Partial(true) if !d.IsNewResource() && d.HasChange("resource_group_id") { - actionPath := "/v2/openapi/changeresourcegroup" - request := make(map[string]interface{}) - request["ResourceId"] = StringPointer(d.Id()) - request["NewResourceGroupId"] = StringPointer(d.Get("resource_group_id").(string)) + request := new(ots.ChangeResourceGroupRequest) + request.ResourceId = StringPointer(d.Id()) + request.NewResourceGroupId = StringPointer(d.Get("resource_group_id").(string)) - response, err := OtsRestApiPostWithRetry(client, "tablestore", "2020-12-09", actionPath, request) + raw, err := client.WithOtsClient(func(otsClient *ots.Client) (interface{}, error) { + return otsClient.ChangeResourceGroup(request) + }) if err != nil { - return WrapErrorf(err, DefaultErrorMsg, d.Id(), actionPath, AlibabaCloudSdkGoERROR) + if NotFoundError(err) { + return WrapErrorf(err, NotFoundMsg, AlibabaCloudSdkGoERROR) + } + return WrapErrorf(err, DefaultErrorMsg, "ChangeResourceGroup", AlibabaCloudSdkGoERROR) } - addDebug(actionPath, response, request) + resp := raw.(*ots.ChangeResourceGroupResponse) + addDebug("ChangeResourceGroup", resp, request) d.SetPartial("resource_group_id") } hasChangeACL := false if !d.IsNewResource() && d.HasChange("network_type_acl") { - actionPath := "/v2/openapi/updateinstance" - request := make(map[string]interface{}) - request["RegionId"] = StringPointer(client.RegionId) - // id is instanceName - request["InstanceName"] = StringPointer(d.Id()) - - netTypeList := expandStringList(d.Get("network_type_acl").(*schema.Set).List()) - request["NetworkTypeACL"] = netTypeList + request := new(ots.UpdateInstanceRequest) + request.InstanceName = StringPointer(d.Id()) + + netTypeList := expandStringPointerList(d.Get("network_type_acl").(*schema.Set).List()) + request.NetworkTypeACL = netTypeList // acl must set together - netSourceList := expandStringList(d.Get("network_source_acl").(*schema.Set).List()) - request["NetworkSourceACL"] = netSourceList + netSourceList := expandStringPointerList(d.Get("network_source_acl").(*schema.Set).List()) + request.NetworkSourceACL = netSourceList - response, err := OtsRestApiPostWithRetry(client, "tablestore", "2020-12-09", actionPath, request) + raw, err := client.WithOtsClient(func(otsClient *ots.Client) (interface{}, error) { + return otsClient.UpdateInstance(request) + }) if err != nil { - return WrapErrorf(err, DefaultErrorMsg, d.Id(), actionPath, AlibabaCloudSdkGoERROR) + if NotFoundError(err) { + return WrapErrorf(err, NotFoundMsg, AlibabaCloudSdkGoERROR) + } + return WrapErrorf(err, DefaultErrorMsg, "UpdateInstance", AlibabaCloudSdkGoERROR) } - addDebug(actionPath, response, request) + resp := raw.(*ots.UpdateInstanceResponse) + addDebug("UpdateInstance", resp, request) hasChangeACL = true d.SetPartial("network_type_acl") } if !d.IsNewResource() && d.HasChange("network_source_acl") { - actionPath := "/v2/openapi/updateinstance" - request := make(map[string]interface{}) - request["RegionId"] = StringPointer(client.RegionId) - // id is instanceName - request["InstanceName"] = StringPointer(d.Id()) - - // todo handle lens 0 [] - netSourceList := expandStringList(d.Get("network_source_acl").(*schema.Set).List()) - request["NetworkSourceACL"] = netSourceList + request := new(ots.UpdateInstanceRequest) + request.InstanceName = StringPointer(d.Id()) + + netSourceList := expandStringPointerList(d.Get("network_source_acl").(*schema.Set).List()) + request.NetworkSourceACL = netSourceList // acl must set together - netTypeList := expandStringList(d.Get("network_type_acl").(*schema.Set).List()) - request["NetworkTypeACL"] = netTypeList + netTypeList := expandStringPointerList(d.Get("network_type_acl").(*schema.Set).List()) + request.NetworkTypeACL = netTypeList - response, err := OtsRestApiPostWithRetry(client, "tablestore", "2020-12-09", actionPath, request) + raw, err := client.WithOtsClient(func(otsClient *ots.Client) (interface{}, error) { + return otsClient.UpdateInstance(request) + }) if err != nil { - return WrapErrorf(err, DefaultErrorMsg, d.Id(), actionPath, AlibabaCloudSdkGoERROR) + if NotFoundError(err) { + return WrapErrorf(err, NotFoundMsg, AlibabaCloudSdkGoERROR) + } + return WrapErrorf(err, DefaultErrorMsg, "UpdateInstance", AlibabaCloudSdkGoERROR) } - addDebug(actionPath, response, request) + resp := raw.(*ots.UpdateInstanceResponse) + addDebug("UpdateInstance", resp, request) hasChangeACL = true d.SetPartial("network_source_acl") } // accessed_by is a deprecated attribute, updates on accessed_by will only take effect when the ACL has not been updated. if !d.IsNewResource() && (d.HasChange("accessed_by") && !hasChangeACL) { - actionPath := "/v2/openapi/updateinstance" - request := make(map[string]interface{}) - request["RegionId"] = StringPointer(client.RegionId) - // id is instanceName - request["InstanceName"] = StringPointer(d.Id()) - request["Network"] = StringPointer(convertInstanceAccessedBy(InstanceAccessedByType(d.Get("accessed_by").(string)))) - - response, err := OtsRestApiPostWithRetry(client, "tablestore", "2020-12-09", actionPath, request) + request := new(ots.UpdateInstanceRequest) + request.InstanceName = StringPointer(d.Id()) + request.Network = StringPointer(convertInstanceAccessedBy(InstanceAccessedByType(d.Get("accessed_by").(string)))) + + raw, err := client.WithOtsClient(func(otsClient *ots.Client) (interface{}, error) { + return otsClient.UpdateInstance(request) + }) if err != nil { - return WrapErrorf(err, DefaultErrorMsg, d.Id(), actionPath, AlibabaCloudSdkGoERROR) + if NotFoundError(err) { + return WrapErrorf(err, NotFoundMsg, AlibabaCloudSdkGoERROR) + } + return WrapErrorf(err, DefaultErrorMsg, "UpdateInstance", AlibabaCloudSdkGoERROR) } - addDebug(actionPath, response, request) + resp := raw.(*ots.UpdateInstanceResponse) + addDebug("UpdateInstance", resp, request) d.SetPartial("accessed_by") } + if !d.IsNewResource() && d.HasChange("policy") { + policy := d.Get("policy").(string) + if policy != "" { + request := new(ots.UpdateInstancePolicyRequest) + request.InstanceName = StringPointer(d.Id()) + request.Policy = StringPointer(policy) + request.PolicyVersion = Int64Pointer(int64(d.Get("policy_version").(int))) + raw, err := client.WithOtsClient(func(otsClient *ots.Client) (interface{}, error) { + return otsClient.UpdateInstancePolicy(request) + }) + if err != nil { + if NotFoundError(err) { + return WrapErrorf(err, NotFoundMsg, AlibabaCloudSdkGoERROR) + } + return WrapErrorf(err, DefaultErrorMsg, "UpdateInstancePolicy", AlibabaCloudSdkGoERROR) + } + resp := raw.(*ots.UpdateInstancePolicyResponse) + addDebug("UpdateInstancePolicy", resp, request) + } else { + request := new(ots.DeleteInstancePolicyRequest) + request.InstanceName = StringPointer(d.Id()) + request.PolicyVersion = Int64Pointer(int64(d.Get("policy_version").(int))) + raw, err := client.WithOtsClient(func(otsClient *ots.Client) (interface{}, error) { + return otsClient.DeleteInstancePolicy(request) + }) + if err != nil { + if NotFoundError(err) { + return WrapErrorf(err, NotFoundMsg, AlibabaCloudSdkGoERROR) + } + return WrapErrorf(err, DefaultErrorMsg, "DeleteInstancePolicy", AlibabaCloudSdkGoERROR) + } + resp := raw.(*ots.DeleteInstancePolicyResponse) + addDebug("DeleteInstancePolicy", resp, request) + } + d.SetPartial("policy") + } + + if !d.IsNewResource() && d.HasChange("description") { + request := new(ots.UpdateInstanceRequest) + request.InstanceName = StringPointer(d.Id()) + request.InstanceDescription = StringPointer(d.Get("description").(string)) + + raw, err := client.WithOtsClient(func(otsClient *ots.Client) (interface{}, error) { + return otsClient.UpdateInstance(request) + }) + if err != nil { + if NotFoundError(err) { + return WrapErrorf(err, NotFoundMsg, AlibabaCloudSdkGoERROR) + } + return WrapErrorf(err, DefaultErrorMsg, "UpdateInstance", AlibabaCloudSdkGoERROR) + } + resp := raw.(*ots.UpdateInstanceResponse) + addDebug("UpdateInstance", resp, request) + d.SetPartial("description") + } + if d.HasChange("alias_name") { + request := new(ots.UpdateInstanceRequest) + request.InstanceName = StringPointer(d.Id()) + request.AliasName = StringPointer(d.Get("alias_name").(string)) + + raw, err := client.WithOtsClient(func(otsClient *ots.Client) (interface{}, error) { + return otsClient.UpdateInstance(request) + }) + if err != nil { + if NotFoundError(err) { + return WrapErrorf(err, NotFoundMsg, AlibabaCloudSdkGoERROR) + } + return WrapErrorf(err, DefaultErrorMsg, "UpdateInstance", AlibabaCloudSdkGoERROR) + } + resp := raw.(*ots.UpdateInstanceResponse) + addDebug("UpdateInstance", resp, request) + d.SetPartial("alias_name") + } + if !d.IsNewResource() && d.HasChange("tags") { oraw, nraw := d.GetChange("tags") o := oraw.(map[string]interface{}) @@ -313,48 +410,54 @@ func resourceAliyunOtsInstanceUpdate(d *schema.ResourceData, meta interface{}) e create, remove := diffTags(tagsFromMap(o), tagsFromMap(n)) if len(remove) > 0 { - var removeKeys []string + var removeKeys []*string for _, t := range remove { - removeKeys = append(removeKeys, t.Key) + removeKeys = append(removeKeys, &t.Key) } - actionPath := "/v2/openapi/untagresources" - request := make(map[string]interface{}) - request["RegionId"] = StringPointer(client.RegionId) - request["ResourceType"] = "INSTANCE" - // id is instanceName - request["ResourceIds"] = expandStringList([]interface{}{d.Id()}) - request["TagKeys"] = removeKeys + request := new(ots.UntagResourcesRequest) + request.ResourceType = StringPointer("INSTANCE") + request.ResourceIds = expandStringPointerList([]interface{}{d.Id()}) + request.TagKeys = removeKeys - response, err := OtsRestApiPostWithRetry(client, "tablestore", "2020-12-09", actionPath, request) + raw, err := client.WithOtsClient(func(otsClient *ots.Client) (interface{}, error) { + return otsClient.UntagResources(request) + }) if err != nil { - return WrapErrorf(err, DefaultErrorMsg, d.Id(), actionPath, AlibabaCloudSdkGoERROR) + if NotFoundError(err) { + return WrapErrorf(err, NotFoundMsg, AlibabaCloudSdkGoERROR) + } + return WrapErrorf(err, DefaultErrorMsg, "UntagResources", AlibabaCloudSdkGoERROR) } - addDebug(actionPath, response, request) + resp := raw.(*ots.UntagResourcesResponse) + addDebug("UntagResources", resp, request) } if len(create) > 0 { - var insertTags []RestOtsTagInfo + var insertTags []*ots.TagResourcesRequestTags for _, t := range create { - insertTags = append(insertTags, RestOtsTagInfo{ - Key: t.Key, - Value: t.Value, + insertTags = append(insertTags, &ots.TagResourcesRequestTags{ + Key: &t.Key, + Value: &t.Value, }) } - actionPath := "/v2/openapi/tagresources" - request := make(map[string]interface{}) - request["RegionId"] = StringPointer(client.RegionId) - request["ResourceType"] = "INSTANCE" - // id is instanceName - request["ResourceIds"] = expandStringList([]interface{}{d.Id()}) - request["Tags"] = insertTags + request := new(ots.TagResourcesRequest) + request.ResourceType = StringPointer("INSTANCE") + request.ResourceIds = expandStringPointerList([]interface{}{d.Id()}) + request.Tags = insertTags - response, err := OtsRestApiPostWithRetry(client, "tablestore", "2020-12-09", actionPath, request) + raw, err := client.WithOtsClient(func(otsClient *ots.Client) (interface{}, error) { + return otsClient.TagResources(request) + }) if err != nil { - return WrapErrorf(err, DefaultErrorMsg, d.Id(), actionPath, AlibabaCloudSdkGoERROR) + if NotFoundError(err) { + return WrapErrorf(err, NotFoundMsg, AlibabaCloudSdkGoERROR) + } + return WrapErrorf(err, DefaultErrorMsg, "TagResources", AlibabaCloudSdkGoERROR) } - addDebug(actionPath, response, request) + resp := raw.(*ots.TagResourcesResponse) + addDebug("TagResources", resp, request) } d.SetPartial("tags") } @@ -367,19 +470,20 @@ func resourceAliyunOtsInstanceUpdate(d *schema.ResourceData, meta interface{}) e func resourceAliyunOtsInstanceDelete(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AliyunClient) - actionPath := "/v2/openapi/deleteinstance" - request := make(map[string]interface{}) - request["RegionId"] = StringPointer(client.RegionId) - // id is instanceName - request["InstanceName"] = StringPointer(d.Id()) - _, err := OtsRestApiPostWithRetry(client, "tablestore", "2020-12-09", actionPath, request) + request := new(ots.DeleteInstanceRequest) + request.InstanceName = StringPointer(d.Id()) + raw, err := client.WithOtsClient(func(otsClient *ots.Client) (interface{}, error) { + return otsClient.DeleteInstance(request) + }) if err != nil { if NotFoundError(err) { - return nil + return WrapErrorf(err, NotFoundMsg, AlibabaCloudSdkGoERROR) } - return WrapErrorf(err, DefaultErrorMsg, d.Id(), actionPath, AlibabaCloudSdkGoERROR) + return WrapErrorf(err, DefaultErrorMsg, d.Id(), "DeleteInstance", AlibabaCloudSdkGoERROR) } + resp := raw.(*ots.DeleteInstanceResponse) + addDebug("DeleteInstance", resp, request) otsService := OtsService{client} return WrapError(otsService.WaitForOtsInstance(d.Id(), string(Deleted), DefaultLongTimeout)) diff --git a/alicloud/resource_alicloud_ots_instance_attachment.go b/alicloud/resource_alicloud_ots_instance_attachment.go index 2694645d39fc..c85dbe67e3fc 100644 --- a/alicloud/resource_alicloud_ots_instance_attachment.go +++ b/alicloud/resource_alicloud_ots_instance_attachment.go @@ -1,7 +1,7 @@ package alicloud import ( - "github.com/aliyun/alibaba-cloud-sdk-go/services/ots" + ots "github.com/alibabacloud-go/tablestore-20201209/v3/client" "github.com/aliyun/terraform-provider-alicloud/alicloud/connectivity" "github.com/hashicorp/terraform-plugin-sdk/helper/schema" ) @@ -42,27 +42,27 @@ func resourceAliyunOtsInstanceAttachmentCreate(d *schema.ResourceData, meta inte client := meta.(*connectivity.AliyunClient) vpcService := VpcService{client} - request := ots.CreateBindInstance2VpcRequest() - request.RegionId = client.RegionId - request.InstanceName = d.Get("instance_name").(string) - request.InstanceVpcName = d.Get("vpc_name").(string) - request.VirtualSwitchId = d.Get("vswitch_id").(string) + request := new(ots.BindInstance2VpcRequest) + request.InstanceName = StringPointer(d.Get("instance_name").(string)) + request.InstanceVpcName = StringPointer(d.Get("vpc_name").(string)) + request.VirtualSwitchId = StringPointer(d.Get("vswitch_id").(string)) if vsw, err := vpcService.DescribeVSwitch(d.Get("vswitch_id").(string)); err != nil { return WrapError(err) } else { - request.VpcId = vsw.VpcId + request.VpcId = StringPointer(vsw.VpcId) } raw, err := client.WithOtsClient(func(otsClient *ots.Client) (interface{}, error) { return otsClient.BindInstance2Vpc(request) }) if err != nil { - return WrapErrorf(err, DefaultErrorMsg, "alicloud_ots_instance_attachment", request.GetActionName(), AlibabaCloudSdkGoERROR) + return WrapErrorf(err, DefaultErrorMsg, "alicloud_ots_instance_attachment", "BindInstance2Vpc", AlibabaCloudSdkGoERROR) } - addDebug(request.GetActionName(), raw, request.RpcRequest, request) + resp := raw.(*ots.BindInstance2VpcResponse) + addDebug("BindInstance2Vpc", resp, request) - d.SetId(request.InstanceName) + d.SetId(*request.InstanceName) return resourceAliyunOtsInstanceAttachmentRead(d, meta) } @@ -94,10 +94,9 @@ func resourceAliyunOtsInstanceAttachmentDelete(d *schema.ResourceData, meta inte } return WrapError(err) } - request := ots.CreateUnbindInstance2VpcRequest() - request.RegionId = client.RegionId - request.InstanceName = d.Id() - request.InstanceVpcName = object.InstanceVpcName + request := new(ots.UnbindInstance2VpcRequest) + request.InstanceName = StringPointer(d.Id()) + request.InstanceVpcName = object.GetInstanceVpcName() raw, err := client.WithOtsClient(func(otsClient *ots.Client) (interface{}, error) { return otsClient.UnbindInstance2Vpc(request) @@ -106,8 +105,9 @@ func resourceAliyunOtsInstanceAttachmentDelete(d *schema.ResourceData, meta inte if NotFoundError(err) { return nil } - return WrapErrorf(err, DefaultErrorMsg, d.Id(), request.GetActionName(), AlibabaCloudSdkGoERROR) + return WrapErrorf(err, DefaultErrorMsg, d.Id(), "UnbindInstance2Vpc", AlibabaCloudSdkGoERROR) } - addDebug(request.GetActionName(), raw, request.RpcRequest, request) + resp := raw.(*ots.UnbindInstance2VpcResponse) + addDebug("UnbindInstance2Vpc", raw, resp, request) return WrapError(otsService.WaitForOtsInstanceVpc(d.Id(), Deleted, DefaultTimeout)) } diff --git a/alicloud/resource_alicloud_ots_instance_attachment_test.go b/alicloud/resource_alicloud_ots_instance_attachment_test.go index 61b8505585d1..a4cfbd993e80 100644 --- a/alicloud/resource_alicloud_ots_instance_attachment_test.go +++ b/alicloud/resource_alicloud_ots_instance_attachment_test.go @@ -4,14 +4,14 @@ import ( "fmt" "testing" - "github.com/aliyun/alibaba-cloud-sdk-go/services/ots" + ots "github.com/alibabacloud-go/tablestore-20201209/v3/client" "github.com/aliyun/terraform-provider-alicloud/alicloud/connectivity" "github.com/hashicorp/terraform-plugin-sdk/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/helper/resource" ) func TestAccAliCloudOtsInstanceAttachmentBasic(t *testing.T) { - var v ots.VpcInfo + var v ots.ListVpcInfoByInstanceResponseBodyVpcInfos resourceId := "alicloud_ots_instance_attachment.default" ra := resourceAttrInit(resourceId, otsInstanceAttachmentBasicMap) @@ -56,7 +56,7 @@ func TestAccAliCloudOtsInstanceAttachmentBasic(t *testing.T) { } func TestAccAliCloudOtsInstanceAttachmentHighPerformance(t *testing.T) { - var v ots.VpcInfo + var v ots.ListVpcInfoByInstanceResponseBodyVpcInfos resourceId := "alicloud_ots_instance_attachment.default" ra := resourceAttrInit(resourceId, otsInstanceAttachmentBasicMap) diff --git a/alicloud/resource_alicloud_ots_instance_test.go b/alicloud/resource_alicloud_ots_instance_test.go index 0fc2ca5a9a04..50e566bcc07c 100644 --- a/alicloud/resource_alicloud_ots_instance_test.go +++ b/alicloud/resource_alicloud_ots_instance_test.go @@ -7,14 +7,12 @@ import ( "testing" "time" - "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests" - "github.com/aliyun/alibaba-cloud-sdk-go/services/ots" + ots "github.com/alibabacloud-go/tablestore-20201209/v3/client" "github.com/aliyun/aliyun-tablestore-go-sdk/tablestore" otsTunnel "github.com/aliyun/aliyun-tablestore-go-sdk/tunnel" "github.com/aliyun/terraform-provider-alicloud/alicloud/connectivity" "github.com/hashicorp/terraform-plugin-sdk/helper/acctest" "github.com/hashicorp/terraform-plugin-sdk/helper/resource" - "github.com/hashicorp/terraform-plugin-sdk/terraform" ) func init() { @@ -39,37 +37,30 @@ func testSweepOtsInstances(region string) error { "tftest", } - var insts []ots.InstanceInfo - req := ots.CreateListInstanceRequest() - req.RegionId = client.RegionId - req.Method = "GET" - req.PageSize = requests.NewInteger(PageSizeLarge) - req.PageNum = requests.NewInteger(1) + var insts []*ots.ListInstancesResponseBodyInstances + req := new(ots.ListInstancesRequest) + req.MaxResults = Int32Pointer(PageSizeLarge) for { raw, err := client.WithOtsClient(func(otsClient *ots.Client) (interface{}, error) { - return otsClient.ListInstance(req) + return otsClient.ListInstances(req) }) if err != nil { return fmt.Errorf("Error retrieving OTS Instances: %s", err) } - resp, _ := raw.(*ots.ListInstanceResponse) - if resp == nil || len(resp.InstanceInfos.InstanceInfo) < 1 { + resp := raw.(*ots.ListInstancesResponse) + body := resp.Body + if len(body.Instances) < 1 { break } - insts = append(insts, resp.InstanceInfos.InstanceInfo...) + insts = append(insts, body.Instances...) - if len(resp.InstanceInfos.InstanceInfo) < PageSizeLarge { + if body.NextToken == nil { break } - - if page, err := getNextpageNumber(req.PageNum); err != nil { - return err - } else { - req.PageNum = page - } + req.NextToken = body.NextToken } for _, v := range insts { - name := v.InstanceName + name := *v.InstanceName skip := true if !sweepAll() { for _, prefix := range prefixes { @@ -105,8 +96,8 @@ func testSweepOtsInstances(region string) error { time.Sleep(30 * time.Second) } log.Printf("[INFO] Deleting OTS Instance: %s", name) - req := ots.CreateDeleteInstanceRequest() - req.InstanceName = name + req := new(ots.DeleteInstanceRequest) + req.InstanceName = StringPointer(name) _, err = client.WithOtsClient(func(otsClient *ots.Client) (interface{}, error) { return otsClient.DeleteInstance(req) }) @@ -146,7 +137,7 @@ func sweepTunnelsInTable(client *connectivity.AliyunClient, instanceName string, } func TestAccAliCloudOtsInstance_basic(t *testing.T) { - var v ots.InstanceInfo + var v *ots.ListInstancesResponseBodyInstances resourceId := "alicloud_ots_instance.default" ra := resourceAttrInit(resourceId, otsInstanceBasicMap) @@ -161,6 +152,9 @@ func TestAccAliCloudOtsInstance_basic(t *testing.T) { testAccCheck := rac.resourceAttrMapUpdateSet() rand := acctest.RandIntRange(10000, 99999) name := fmt.Sprintf("tf-testAcc%d", rand) + rand = acctest.RandIntRange(10000, 99999) + alias := fmt.Sprintf("tf-testAcc%d", rand) + policy := `{\"Statement\": [{\"Action\": [\"ots:*\"], \"Resource\": [\"acs:ots:*:*:instance/tf-testAcc*\"], \"Principal\": [\"*\"], \"Effect\": \"Allow\", \"Condition\": {\"IpAddress\": {\"acs:SourceIp\": [\"0.0.0.0/32\"]}}}], \"Version\": \"1\"}` testAccConfig := resourceTestAccConfigFunc(resourceId, name, resourceOtsInstanceConfigDependence) resource.Test(t, resource.TestCase{ @@ -176,21 +170,35 @@ func TestAccAliCloudOtsInstance_basic(t *testing.T) { { Config: testAccConfig(map[string]interface{}{ "name": name, + "alias_name": alias, "description": name, "instance_type": "Capacity", }), Check: resource.ComposeTestCheckFunc( testAccCheck(map[string]string{ "name": name, + "alias_name": alias, "description": name, "instance_type": "Capacity", "network_type_acl.#": "3", "network_source_acl.#": "1", "resource_group_id": CHECKSET, "accessed_by": "Any", + "policy_version": "0", }), ), }, + { + Config: testAccConfig(map[string]interface{}{ + "alias_name": name, + "description": alias, + }), + Check: resource.ComposeTestCheckFunc( + testAccCheck(map[string]string{ + "alias_name": name, + "description": alias, + })), + }, { ResourceName: resourceId, ImportState: true, @@ -266,12 +274,34 @@ func TestAccAliCloudOtsInstance_basic(t *testing.T) { }), ), }, + { + Config: testAccConfig(map[string]interface{}{ + "policy": policy, + }), + Check: resource.ComposeTestCheckFunc( + testAccCheck(map[string]string{ + "policy": CHECKSET, + "policy_version": "1", + }), + ), + }, + { + Config: testAccConfig(map[string]interface{}{ + "policy": REMOVEKEY, + }), + Check: resource.ComposeTestCheckFunc( + testAccCheck(map[string]string{ + "policy": REMOVEKEY, + "policy_version": "2", + }), + ), + }, }, }) } func TestAccAliCloudOtsInstance_acl(t *testing.T) { - var v ots.InstanceInfo + var v *ots.ListInstancesResponseBodyInstances resourceId := "alicloud_ots_instance.default" ra := resourceAttrInit(resourceId, otsInstanceBasicMap) @@ -399,7 +429,7 @@ func TestAccAliCloudOtsInstance_acl(t *testing.T) { } func TestAccAliCloudOtsInstanceHighPerformance(t *testing.T) { - var v ots.InstanceInfo + var v *ots.ListInstancesResponseBodyInstances resourceId := "alicloud_ots_instance.default" ra := resourceAttrInit(resourceId, otsInstanceBasicMap) @@ -522,7 +552,7 @@ func TestAccAliCloudOtsInstanceHighPerformance(t *testing.T) { } func TestAccAliCloudOtsInstance_multi(t *testing.T) { - var v ots.InstanceInfo + var v *ots.ListInstancesResponseBodyInstances resourceId := "alicloud_ots_instance.default.4" ra := resourceAttrInit(resourceId, otsInstanceBasicMap) @@ -579,27 +609,3 @@ var otsInstanceBasicMap = map[string]string{ "instance_type": CHECKSET, "description": CHECKSET, } - -func testAccCheckOtsInstanceExist(n string, instance *RestOtsInstanceInfo) resource.TestCheckFunc { - return func(s *terraform.State) error { - rs, ok := s.RootModule().Resources[n] - if !ok { - return fmt.Errorf("not found OTS table: %s", n) - } - - if rs.Primary.ID == "" { - return fmt.Errorf("no OTS table ID is set") - } - - client := testAccProvider.Meta().(*connectivity.AliyunClient) - otsService := OtsService{client} - - response, err := otsService.DescribeOtsInstance(rs.Primary.ID) - - if err != nil { - return err - } - instance = &response - return nil - } -} diff --git a/alicloud/resource_alicloud_ots_search_index.go b/alicloud/resource_alicloud_ots_search_index.go index 34edbb589e9e..e4a2be711cd1 100644 --- a/alicloud/resource_alicloud_ots_search_index.go +++ b/alicloud/resource_alicloud_ots_search_index.go @@ -529,6 +529,19 @@ func resourceAliyunOtsSearchIndexRead(d *schema.ResourceData, meta interface{}) if err := d.Set("index_id", d.Id()); err != nil { return WrapError(err) } + instanceName, tableName, indexName, _, err := ParseIndexId(d.Id()) + if err != nil { + return WrapError(err) + } + if err := d.Set("instance_name", instanceName); err != nil { + return WrapError(err) + } + if err := d.Set("table_name", tableName); err != nil { + return WrapError(err) + } + if err := d.Set("index_name", indexName); err != nil { + return WrapError(err) + } if err := d.Set("create_time", idx.CreateTime); err != nil { return WrapError(err) } diff --git a/alicloud/service_alicloud_ots.go b/alicloud/service_alicloud_ots.go index 6a2579c4d384..ead3332f1e1e 100644 --- a/alicloud/service_alicloud_ots.go +++ b/alicloud/service_alicloud_ots.go @@ -1,17 +1,13 @@ package alicloud import ( - "encoding/json" - "errors" "fmt" "regexp" - "strconv" "strings" "time" + ots "github.com/alibabacloud-go/tablestore-20201209/v3/client" util "github.com/alibabacloud-go/tea-utils/service" - "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests" - "github.com/aliyun/alibaba-cloud-sdk-go/services/ots" "github.com/aliyun/aliyun-tablestore-go-sdk/tablestore" "github.com/aliyun/aliyun-tablestore-go-sdk/tablestore/search" otsTunnel "github.com/aliyun/aliyun-tablestore-go-sdk/tunnel" @@ -203,95 +199,65 @@ const ( NotExist ColumnFindResult = 3 ) -func (s *OtsService) ListOtsInstance(maxResults int) (allInstanceNames []string, err error) { - actionPath := "/v2/openapi/listinstances" - request := make(map[string]*string) - request["RegionId"] = StringPointer(s.client.RegionId) - request["MaxResults"] = StringPointer(strconv.Itoa(maxResults)) +func (s *OtsService) ListOtsInstance(maxResults int) (allInstanceNames []*string, err error) { + request := new(ots.ListInstancesRequest) + request.MaxResults = Int32Pointer(int32(maxResults)) for { - resp, err := OtsRestApiGetWithRetry(s.client, "tablestore", "2020-12-09", actionPath, request) - if err != nil { - return nil, WrapErrorf(err, DefaultErrorMsg, "alicloud_ots_instances", actionPath, AlibabaCloudSdkGoERROR) - } - addDebug(actionPath, resp, request) - - // resp struct: {"_headers": {...}, "body": {...}} - respBody, ok := resp["body"].(map[string]interface{}) - if !ok { - return allInstanceNames, WrapErrorf(errors.New("parse resp body to map[string]interface{} failed"), DefaultErrorMsg, "instance:*", actionPath, AlibabaCloudSdkGoERROR) - } - // respBody["Instances"] struct: [{}, {}, {}] - instanceMaps := respBody["Instances"] - // Convert map to json string - instancesJSON, err := json.Marshal(instanceMaps) + raw, err := s.client.WithOtsClient(func(otsClient *ots.Client) (interface{}, error) { + return otsClient.ListInstances(request) + }) if err != nil { - return allInstanceNames, WrapErrorf(err, DefaultErrorMsg, "instance:*", actionPath, AlibabaCloudSdkGoERROR) - } - // Convert json string to obj - var instances []RestOtsInstanceInfo - if err := json.Unmarshal(instancesJSON, &instances); err != nil { - return allInstanceNames, WrapErrorf(err, DefaultErrorMsg, "instance:*", actionPath, AlibabaCloudSdkGoERROR) - } - - if instances == nil || len(instances) < 1 { - break + if NotFoundError(err) { + return allInstanceNames, WrapErrorf(err, NotFoundMsg, AlibabaCloudSdkGoERROR) + } + return allInstanceNames, WrapErrorf(err, DefaultErrorMsg, "ListInstances", AlibabaCloudSdkGoERROR) } + resp := raw.(*ots.ListInstancesResponse) + addDebug("ListInstances", resp, request) + body := resp.Body - for _, instance := range instances { - allInstanceNames = append(allInstanceNames, instance.InstanceName) + for _, instance := range body.Instances { + allInstanceNames = append(allInstanceNames, instance.GetInstanceName()) } - nextToken, _ := resp["NextToken"].(string) - if len(instances) < maxResults || nextToken == "" { + nextToken := *body.GetNextToken() + if len(body.Instances) < maxResults || nextToken == "" { break } else { - request["NextToken"] = &nextToken + request.NextToken = &nextToken } } return allInstanceNames, nil } -func (s *OtsService) DescribeOtsInstance(instanceName string) (inst RestOtsInstanceInfo, err error) { - actionPath := "/v2/openapi/getinstance" - request := make(map[string]*string) - request["RegionId"] = StringPointer(s.client.RegionId) - request["InstanceName"] = StringPointer(instanceName) +func (s *OtsService) DescribeOtsInstance(instanceName string) (inst *ots.GetInstanceResponseBody, err error) { + request := new(ots.GetInstanceRequest) + request.InstanceName = StringPointer(instanceName) - //client := meta.(*connectivity.AliyunClient) - resp, err := OtsRestApiGetWithRetry(s.client, "tablestore", "2020-12-09", actionPath, request) + raw, err := s.client.WithOtsClient(func(otsClient *ots.Client) (interface{}, error) { + return otsClient.GetInstance(request) + }) if err != nil { if NotFoundError(err) { return inst, WrapErrorf(err, NotFoundMsg, AlibabaCloudSdkGoERROR) } - return inst, WrapErrorf(err, DefaultErrorMsg, instanceName, actionPath, AlibabaCloudSdkGoERROR) - } - addDebug(actionPath, resp, request) - - // resp struct: {"_headers": {...}, "body": {...}} - instMap := resp["body"] - // Convert map to json string - instJSON, err := json.Marshal(instMap) - if err != nil { - return inst, WrapErrorf(err, DefaultErrorMsg, instanceName, actionPath, AlibabaCloudSdkGoERROR) - } - // Convert json string to obj - if err := json.Unmarshal(instJSON, &inst); err != nil { - return inst, WrapErrorf(err, DefaultErrorMsg, instanceName, actionPath, AlibabaCloudSdkGoERROR) + return inst, WrapErrorf(err, DefaultErrorMsg, "GetInstance", AlibabaCloudSdkGoERROR) } + resp := raw.(*ots.GetInstanceResponse) + addDebug("GetInstance", resp, request) + body := resp.Body - if inst.InstanceName != instanceName { + if *body.GetInstanceName() != instanceName { return inst, WrapErrorf(NotFoundErr("OtsInstance", instanceName), NotFoundMsg, ProviderERROR) } - return inst, nil + return body, nil } -func (s *OtsService) DescribeOtsInstanceAttachment(id string) (inst ots.VpcInfo, err error) { - request := ots.CreateListVpcInfoByInstanceRequest() - request.RegionId = s.client.RegionId - request.Method = "GET" - request.InstanceName = id +func (s *OtsService) DescribeOtsInstanceAttachment(id string) (inst *ots.ListVpcInfoByInstanceResponseBodyVpcInfos, err error) { + request := new(ots.ListVpcInfoByInstanceRequest) + request.InstanceName = StringPointer(id) raw, err := s.client.WithOtsClient(func(otsClient *ots.Client) (interface{}, error) { return otsClient.ListVpcInfoByInstance(request) }) @@ -299,14 +265,15 @@ func (s *OtsService) DescribeOtsInstanceAttachment(id string) (inst ots.VpcInfo, if NotFoundError(err) { return inst, WrapErrorf(err, NotFoundMsg, AlibabaCloudSdkGoERROR) } - return inst, WrapErrorf(err, DefaultErrorMsg, id, request.GetActionName(), AlibabaCloudSdkGoERROR) + return inst, WrapErrorf(err, DefaultErrorMsg, id, "ListVpcInfoByInstance", AlibabaCloudSdkGoERROR) } - addDebug(request.GetActionName(), raw, request.RpcRequest, request) - resp, _ := raw.(*ots.ListVpcInfoByInstanceResponse) - if resp.TotalCount < 1 { + resp := raw.(*ots.ListVpcInfoByInstanceResponse) + addDebug("ListVpcInfoByInstance", resp, request) + body := resp.Body + if *body.TotalCount < 1 { return inst, WrapErrorf(NotFoundErr("OtsInstanceAttachment", id), NotFoundMsg, ProviderERROR) } - return resp.VpcInfos.VpcInfo[0], nil + return body.VpcInfos[0], nil } func (s *OtsService) WaitForOtsInstanceVpc(id string, status Status, timeout int) error { @@ -323,39 +290,32 @@ func (s *OtsService) WaitForOtsInstanceVpc(id string, status Status, timeout int return WrapError(err) } } - if object.InstanceName == id && status != Deleted { + if *object.InstanceVpcName == id && status != Deleted { return nil } if time.Now().After(deadline) { - return WrapErrorf(err, WaitTimeoutMsg, id, GetFunc(1), timeout, object.InstanceName, id, ProviderERROR) + return WrapErrorf(err, WaitTimeoutMsg, id, GetFunc(1), timeout, *object.InstanceVpcName, id, ProviderERROR) } } } -func (s *OtsService) ListOtsInstanceVpc(id string) (inst []ots.VpcInfo, err error) { - request := ots.CreateListVpcInfoByInstanceRequest() - request.RegionId = s.client.RegionId - request.Method = "GET" - request.InstanceName = id +func (s *OtsService) ListOtsInstanceVpc(id string) (inst []*ots.ListVpcInfoByInstanceResponseBodyVpcInfos, err error) { + request := new(ots.ListVpcInfoByInstanceRequest) + request.InstanceName = StringPointer(id) raw, err := s.client.WithOtsClient(func(otsClient *ots.Client) (interface{}, error) { return otsClient.ListVpcInfoByInstance(request) }) if err != nil { - return inst, WrapErrorf(err, DataDefaultErrorMsg, "alicloud_ots_instance_attachments", request.GetActionName(), AlibabaCloudSdkGoERROR) + return inst, WrapErrorf(err, DataDefaultErrorMsg, "alicloud_ots_instance_attachments", "ListVpcInfoByInstance", AlibabaCloudSdkGoERROR) } - addDebug(request.GetActionName(), raw, request.RpcRequest, request) - resp, _ := raw.(*ots.ListVpcInfoByInstanceResponse) - if resp.TotalCount < 1 { + resp := raw.(*ots.ListVpcInfoByInstanceResponse) + addDebug("ListVpcInfoByInstance", resp, request) + body := resp.Body + if *body.TotalCount < 1 { return inst, WrapErrorf(NotFoundErr("OtsInstanceAttachment", id), NotFoundMsg, ProviderERROR) } - - var retInfos []ots.VpcInfo - for _, vpcInfo := range resp.VpcInfos.VpcInfo { - vpcInfo.InstanceName = id - retInfos = append(retInfos, vpcInfo) - } - return retInfos, nil + return body.VpcInfos, nil } func (s *OtsService) WaitForOtsInstance(id string, instanceInnerStatus string, timeout int) error { @@ -372,7 +332,7 @@ func (s *OtsService) WaitForOtsInstance(id string, instanceInnerStatus string, t return WrapError(err) } } - if instance.InstanceStatus == instanceInnerStatus { + if *instance.InstanceStatus == instanceInnerStatus { break } if time.Now().After(deadline) { @@ -383,21 +343,18 @@ func (s *OtsService) WaitForOtsInstance(id string, instanceInnerStatus string, t return nil } -func (s *OtsService) DescribeOtsInstanceTypes() (types []string, err error) { - request := ots.CreateListClusterTypeRequest() - request.Method = requests.GET +func (s *OtsService) DescribeOtsInstanceTypes() (types []*string, err error) { raw, err := s.client.WithOtsClient(func(otsClient *ots.Client) (interface{}, error) { - return otsClient.ListClusterType(request) + return otsClient.ListClusterType() }) if err != nil { - return nil, WrapErrorf(err, DefaultErrorMsg, "alicloud_ots_instance", request.GetActionName(), AlibabaCloudSdkGoERROR) - } - addDebug(request.GetActionName(), raw, request.RpcRequest, request) - resp, _ := raw.(*ots.ListClusterTypeResponse) - if resp != nil { - return resp.ClusterTypeInfos.ClusterType, nil + return nil, WrapErrorf(err, DefaultErrorMsg, "alicloud_ots_instance", "ListClusterType", AlibabaCloudSdkGoERROR) } - return + + resp := raw.(*ots.ListClusterTypeResponse) + addDebug("ListClusterType", resp, nil) + body := resp.Body + return body.ClusterTypes, nil } func isOtsTunnelNotFound(err error) bool { @@ -940,17 +897,17 @@ func (s *OtsService) DeleteSearchIndex(instanceName string, tableName string, in // This method directly passes OpenAPI parameters such as product and version, without relying on SDK version upgrades. // Retry policy: 3, 3+5, 3+5+5…, retry timeout: d.Timeout(schema.TimeoutCreate) // product is openapi product code, version is openapi version, actionPath is restful openapi backend api path, requestBody is request body content -func OtsRestApiPostWithRetry(client *connectivity.AliyunClient, product string, version string, actionPath string, requestBody map[string]interface{}) (map[string]interface{}, error) { - return invokeOtsRestApiWithRetry(client, product, version, actionPath, "POST", nil, nil, requestBody) -} +//func OtsRestApiPostWithRetry(client *connectivity.AliyunClient, product string, version string, actionPath string, requestBody map[string]interface{}) (map[string]interface{}, error) { +// return invokeOtsRestApiWithRetry(client, product, version, actionPath, "POST", nil, nil, requestBody) +//} // OtsRestApiGetWithRetry send GET request by CommonSDK(roa/restful) with retry. // This method directly passes OpenAPI parameters such as product and version, without relying on SDK version upgrades. // Retry policy: 3, 3+5, 3+5+5…, retry timeout: d.Timeout(schema.TimeoutCreate) // product is openapi product code, version is openapi version, actionPath is restful openapi backend api path, urlQuery is url param -func OtsRestApiGetWithRetry(client *connectivity.AliyunClient, product string, version string, actionPath string, urlQuery map[string]*string) (map[string]interface{}, error) { - return invokeOtsRestApiWithRetry(client, product, version, actionPath, "GET", urlQuery, nil, nil) -} +//func OtsRestApiGetWithRetry(client *connectivity.AliyunClient, product string, version string, actionPath string, urlQuery map[string]*string) (map[string]interface{}, error) { +// return invokeOtsRestApiWithRetry(client, product, version, actionPath, "GET", urlQuery, nil, nil) +//} func invokeOtsRestApiWithRetry(client *connectivity.AliyunClient, product string, version string, actionPath string, httpMethod string, urlQuery map[string]*string, headers map[string]*string, requestBody map[string]interface{}) (map[string]interface{}, error) { var response map[string]interface{} diff --git a/alicloud/tags.go b/alicloud/tags.go index 61b6b5a5be3e..911b9a5934d2 100644 --- a/alicloud/tags.go +++ b/alicloud/tags.go @@ -6,12 +6,12 @@ import ( "regexp" "time" + ots "github.com/alibabacloud-go/tablestore-20201209/v3/client" "github.com/aliyun/alibaba-cloud-sdk-go/services/cdn" "github.com/aliyun/alibaba-cloud-sdk-go/services/ecs" "github.com/aliyun/alibaba-cloud-sdk-go/services/elasticsearch" "github.com/aliyun/alibaba-cloud-sdk-go/services/ess" "github.com/aliyun/alibaba-cloud-sdk-go/services/gpdb" - "github.com/aliyun/alibaba-cloud-sdk-go/services/ots" "github.com/aliyun/alibaba-cloud-sdk-go/services/slb" "github.com/aliyun/alibaba-cloud-sdk-go/services/vpc" "github.com/aliyun/terraform-provider-alicloud/alicloud/connectivity" @@ -557,19 +557,10 @@ func essTagsToMap(tags []ess.Tag) map[string]string { return result } -func otsTagsToMap(tags []ots.TagInfo) map[string]string { +func otsRestTagsToMap(tags []*ots.GetInstanceResponseBodyTags) map[string]string { result := make(map[string]string) for _, t := range tags { - result[t.TagKey] = t.TagValue - } - - return result -} - -func otsRestTagsToMap(tags []RestOtsTagInfo) map[string]string { - result := make(map[string]string) - for _, t := range tags { - result[t.Key] = t.Value + result[*t.Key] = *t.Value } return result diff --git a/go.mod b/go.mod index 759d01c9dba3..39cc18a01c71 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ require ( github.com/PaesslerAG/jsonpath v0.1.1 github.com/agiledragon/gomonkey/v2 v2.3.1 github.com/alibabacloud-go/cs-20151215/v5 v5.9.5 - github.com/alibabacloud-go/tea v1.3.8 + github.com/alibabacloud-go/tea v1.3.13 github.com/alibabacloud-go/tea-roa v1.3.4 github.com/alibabacloud-go/tea-rpc v1.2.0 github.com/alibabacloud-go/tea-utils v1.4.5 @@ -38,9 +38,10 @@ require ( require ( github.com/alibabacloud-go/alibabacloud-gateway-oss v0.0.23 github.com/alibabacloud-go/alibabacloud-gateway-sls v0.0.6 - github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.11 + github.com/alibabacloud-go/darabonba-openapi/v2 v2.1.14 github.com/alibabacloud-go/fc-open-20210406/v2 v2.0.7 github.com/alibabacloud-go/sts-20150401/v2 v2.0.2 + github.com/alibabacloud-go/tablestore-20201209/v3 v3.0.0 github.com/alibabacloud-go/tea-utils/v2 v2.0.7 github.com/blues/jsonata-go v1.5.4 github.com/samber/lo v1.49.1 diff --git a/go.sum b/go.sum index 60c8d7a66221..05ac1b56b4a7 100644 --- a/go.sum +++ b/go.sum @@ -249,8 +249,9 @@ github.com/alibabacloud-go/darabonba-encode-util v0.0.2/go.mod h1:JiW9higWHYXm7F github.com/alibabacloud-go/darabonba-map v0.0.2 h1:qvPnGB4+dJbJIxOOfawxzF3hzMnIpjmafa0qOTp6udc= github.com/alibabacloud-go/darabonba-map v0.0.2/go.mod h1:28AJaX8FOE/ym8OUFWga+MtEzBunJwQGceGQlvaPGPc= github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.2/go.mod h1:5JHVmnHvGzR2wNdgaW1zDLQG8kOC4Uec8ubkMogW7OQ= -github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.11 h1:GkVQ9AphMCmgAYakcTpH/OuFz0mQUypO/JiOvo0wgVA= github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.11/go.mod h1:wHxkgZT1ClZdcwEVP/pDgYK/9HucsnCfMipmJgCz4xY= +github.com/alibabacloud-go/darabonba-openapi/v2 v2.1.14 h1:iIamPRvehxQvVnTOvz77rZR+/YME1lR7X8kHonQSU6Y= +github.com/alibabacloud-go/darabonba-openapi/v2 v2.1.14/go.mod h1:lxFGfobinVsQ49ntjpgWghXmIF0/Sm4+wvBJ1h5RtaE= github.com/alibabacloud-go/darabonba-signature-util v0.0.7 h1:UzCnKvsjPFzApvODDNEYqBHMFt1w98wC7FOo0InLyxg= github.com/alibabacloud-go/darabonba-signature-util v0.0.7/go.mod h1:oUzCYV2fcCH797xKdL6BDH8ADIHlzrtKVjeRtunBNTQ= github.com/alibabacloud-go/darabonba-string v1.0.2 h1:E714wms5ibdzCqGeYJ9JCFywE5nDyvIXIIQbZVFkkqo= @@ -269,6 +270,8 @@ github.com/alibabacloud-go/openapi-util v0.1.1 h1:ujGErJjG8ncRW6XtBBMphzHTvCxn4D github.com/alibabacloud-go/openapi-util v0.1.1/go.mod h1:/UehBSE2cf1gYT43GV4E+RxTdLRzURImCYY0aRmlXpw= github.com/alibabacloud-go/sts-20150401/v2 v2.0.2 h1:sz6ULL9xaAndxpCXtG5fDBD2aF9L/GXyHfDj1hUnaCs= github.com/alibabacloud-go/sts-20150401/v2 v2.0.2/go.mod h1:JXPMuEvl9zJzUAYffyFMxxXGOUbNdvZYWP6MpJq1658= +github.com/alibabacloud-go/tablestore-20201209/v3 v3.0.0 h1:tzNfp3IbYgnkD1nekRvzAOuFhGeYshG5QijGmXH+81s= +github.com/alibabacloud-go/tablestore-20201209/v3 v3.0.0/go.mod h1:P/3AWcPXvm/8EnzD2fbalm9WsbdGN44Qx01WeCPryOU= github.com/alibabacloud-go/tea v1.1.0/go.mod h1:IkGyUSX4Ba1V+k4pCtJUc6jDpZLFph9QMy2VUPTwukg= github.com/alibabacloud-go/tea v1.1.7/go.mod h1:/tmnEaQMyb4Ky1/5D+SE1BAsa5zj/KeGOFfwYm3N/p4= github.com/alibabacloud-go/tea v1.1.8/go.mod h1:/tmnEaQMyb4Ky1/5D+SE1BAsa5zj/KeGOFfwYm3N/p4= @@ -277,8 +280,9 @@ github.com/alibabacloud-go/tea v1.1.17/go.mod h1:nXxjm6CIFkBhwW4FQkNrolwbfon8Svy github.com/alibabacloud-go/tea v1.1.19/go.mod h1:nXxjm6CIFkBhwW4FQkNrolwbfon8Svy6cujmKFUq98A= github.com/alibabacloud-go/tea v1.1.20/go.mod h1:nXxjm6CIFkBhwW4FQkNrolwbfon8Svy6cujmKFUq98A= github.com/alibabacloud-go/tea v1.2.2/go.mod h1:CF3vOzEMAG+bR4WOql8gc2G9H3EkH3ZLAQdpmpXMgwk= -github.com/alibabacloud-go/tea v1.3.8 h1:Sk2+BDJC//xJ1/Eljf+Dlg2u2tgWpA9P7mlb87AEcEs= github.com/alibabacloud-go/tea v1.3.8/go.mod h1:A560v/JTQ1n5zklt2BEpurJzZTI8TUT+Psg2drWlxRg= +github.com/alibabacloud-go/tea v1.3.13 h1:WhGy6LIXaMbBM6VBYcsDCz6K/TPsT1Ri2hPmmZffZ94= +github.com/alibabacloud-go/tea v1.3.13/go.mod h1:A560v/JTQ1n5zklt2BEpurJzZTI8TUT+Psg2drWlxRg= github.com/alibabacloud-go/tea-oss-utils v1.1.0 h1:y65crjjcZ2Pbb6UZtC2deuIZHDVTS3IaDWE7M9nVLRc= github.com/alibabacloud-go/tea-oss-utils v1.1.0/go.mod h1:PFCF12e9yEKyBUIn7X1IrF/pNjvxgkHy0CgxX4+xRuY= github.com/alibabacloud-go/tea-roa v1.3.4 h1:afc1MrB9d5euBR5cxQTZ5Erswshguf1KSZmyttxJSTU= diff --git a/website/docs/d/ots_instance_attachments.html.markdown b/website/docs/d/ots_instance_attachments.html.markdown index 448260e3c60f..0356b99cb924 100644 --- a/website/docs/d/ots_instance_attachments.html.markdown +++ b/website/docs/d/ots_instance_attachments.html.markdown @@ -13,7 +13,7 @@ This data source provides the ots instance attachments of the current Alibaba Cl ## Example Usage -``` +```terraform data "alicloud_ots_instance_attachments" "attachments_ds" { instance_name = "sample-instance" name_regex = "testvpc" diff --git a/website/docs/r/ots_instance.html.markdown b/website/docs/r/ots_instance.html.markdown index b8a947deb37f..b473af0dbedd 100644 --- a/website/docs/r/ots_instance.html.markdown +++ b/website/docs/r/ots_instance.html.markdown @@ -66,10 +66,13 @@ The following arguments are supported: * `ConsoleOrVpc` - Allow web console or the attached VPC to access the instance. Default to "Any". +* `policy` - (Optional, Available since v1.271.0) The instance access policy, json string. +* `policy_version` - (Computed, Available since v1.271.0) The version of instance access policy. It's designed to be read-only. * `resource_group_id` - (Optional, Available since v1.221.0) The resource group the instance belongs to. Default to Alibaba Cloud default resource group. * `instance_type` - (Optional, ForceNew) The type of instance. Valid values are "Capacity" and "HighPerformance". Default to "HighPerformance". -* `description` - (Optional, ForceNew) The description of the instance. Currently, it does not support modifying. +* `description` - (Optional) The description of the instance. +* `alias_name` - (Optional) The alias name of the instance. * `tags` - (Optional) A mapping of tags to assign to the instance. ## Attributes Reference