alicloud/resource_alicloud_redis_tair_instance.go (1,156 lines of code) (raw):

package alicloud import ( "fmt" "log" "time" "github.com/PaesslerAG/jsonpath" util "github.com/alibabacloud-go/tea-utils/service" "github.com/aliyun/terraform-provider-alicloud/alicloud/connectivity" "github.com/hashicorp/terraform-plugin-sdk/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/helper/schema" ) func resourceAliCloudRedisTairInstance() *schema.Resource { return &schema.Resource{ Create: resourceAliCloudRedisTairInstanceCreate, Read: resourceAliCloudRedisTairInstanceRead, Update: resourceAliCloudRedisTairInstanceUpdate, Delete: resourceAliCloudRedisTairInstanceDelete, Importer: &schema.ResourceImporter{ State: schema.ImportStatePassthrough, }, Timeouts: &schema.ResourceTimeout{ Create: schema.DefaultTimeout(60 * time.Minute), Update: schema.DefaultTimeout(60 * time.Minute), Delete: schema.DefaultTimeout(30 * time.Minute), }, Schema: map[string]*schema.Schema{ "architecture_type": { Type: schema.TypeString, Computed: true, }, "auto_renew": { Type: schema.TypeString, Optional: true, }, "auto_renew_period": { Type: schema.TypeString, Optional: true, }, "backup_id": { Type: schema.TypeString, Optional: true, }, "cluster_backup_id": { Type: schema.TypeString, Optional: true, }, "connection_domain": { Type: schema.TypeString, Computed: true, }, "connection_string_prefix": { Type: schema.TypeString, Optional: true, }, "create_time": { Type: schema.TypeString, Computed: true, }, "effective_time": { Type: schema.TypeString, Optional: true, ValidateFunc: StringInSlice([]string{"Immediately", "MaintainTime"}, false), }, "engine_version": { Type: schema.TypeString, Optional: true, Computed: true, }, "force_upgrade": { Type: schema.TypeBool, Optional: true, }, "global_instance_id": { Type: schema.TypeString, Optional: true, }, "instance_class": { Type: schema.TypeString, Required: true, }, "instance_type": { Type: schema.TypeString, Required: true, ForceNew: true, ValidateFunc: StringInSlice([]string{"tair_rdb", "tair_scm", "tair_essd"}, false), }, "intranet_bandwidth": { Type: schema.TypeInt, Optional: true, Computed: true, }, "max_connections": { Type: schema.TypeInt, Computed: true, }, "modify_mode": { Type: schema.TypeString, Optional: true, }, "network_type": { Type: schema.TypeString, Computed: true, }, "node_type": { Type: schema.TypeString, Optional: true, Computed: true, ValidateFunc: StringInSlice([]string{"MASTER_SLAVE", "STAND_ALONE", "double", "single"}, false), }, "param_no_loose_sentinel_enabled": { Type: schema.TypeString, Optional: true, Computed: true, }, "param_no_loose_sentinel_password_free_access": { Type: schema.TypeString, Optional: true, Computed: true, }, "param_no_loose_sentinel_password_free_commands": { Type: schema.TypeString, Optional: true, Computed: true, }, "param_repl_mode": { Type: schema.TypeString, Optional: true, Computed: true, }, "param_semisync_repl_timeout": { Type: schema.TypeString, Optional: true, Computed: true, }, "param_sentinel_compat_enable": { Type: schema.TypeString, Optional: true, Computed: true, }, "password": { Type: schema.TypeString, Optional: true, Sensitive: true, }, "payment_type": { Type: schema.TypeString, Optional: true, Computed: true, ValidateFunc: StringInSlice([]string{"PayAsYouGo", "Subscription"}, false), }, "period": { Type: schema.TypeInt, Optional: true, ValidateFunc: IntInSlice([]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 12, 24, 36, 60}), }, "port": { Type: schema.TypeInt, Optional: true, Computed: true, ForceNew: true, ValidateFunc: IntBetween(1024, 65535), }, "read_only_count": { Type: schema.TypeInt, Optional: true, ValidateFunc: IntBetween(0, 5), }, "recover_config_mode": { Type: schema.TypeString, Optional: true, }, "region_id": { Type: schema.TypeString, Computed: true, }, "resource_group_id": { Type: schema.TypeString, Optional: true, Computed: true, }, "secondary_zone_id": { Type: schema.TypeString, Optional: true, ForceNew: true, }, "security_group_id": { Type: schema.TypeString, Optional: true, }, "security_ip_group_name": { Type: schema.TypeString, Optional: true, Computed: true, }, "security_ips": { Type: schema.TypeString, Optional: true, Computed: true, }, "shard_count": { Type: schema.TypeInt, Optional: true, Computed: true, }, "slave_read_only_count": { Type: schema.TypeInt, Optional: true, }, "src_db_instance_id": { Type: schema.TypeString, Optional: true, }, "ssl_enabled": { Type: schema.TypeString, Optional: true, Computed: true, ValidateFunc: StringInSlice([]string{"Disable", "Enable", "Update"}, false), }, "status": { Type: schema.TypeString, Computed: true, }, "storage_performance_level": { Type: schema.TypeString, Optional: true, ForceNew: true, ValidateFunc: StringInSlice([]string{"PL1", "PL2", "PL3"}, false), }, "storage_size_gb": { Type: schema.TypeInt, Optional: true, Computed: true, ForceNew: true, }, "tags": tagsSchema(), "tair_instance_id": { Type: schema.TypeString, Computed: true, }, "tair_instance_name": { Type: schema.TypeString, Optional: true, }, "vswitch_id": { Type: schema.TypeString, Required: true, ForceNew: true, }, "vpc_auth_mode": { Type: schema.TypeString, Optional: true, Computed: true, }, "vpc_id": { Type: schema.TypeString, Required: true, ForceNew: true, }, "zone_id": { Type: schema.TypeString, Required: true, ForceNew: true, }, }, } } func resourceAliCloudRedisTairInstanceCreate(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AliyunClient) action := "CreateTairInstance" var request map[string]interface{} var response map[string]interface{} query := make(map[string]interface{}) var err error request = make(map[string]interface{}) request["RegionId"] = client.RegionId request["ClientToken"] = buildClientToken(action) request["InstanceClass"] = d.Get("instance_class") request["VpcId"] = d.Get("vpc_id") request["VSwitchId"] = d.Get("vswitch_id") if v, ok := d.GetOk("resource_group_id"); ok { request["ResourceGroupId"] = v } request["InstanceType"] = d.Get("instance_type") if v, ok := d.GetOk("secondary_zone_id"); ok { request["SecondaryZoneId"] = v } if v, ok := d.GetOkExists("port"); ok && v.(int) > 0 { request["Port"] = v } if v, ok := d.GetOk("tair_instance_name"); ok { request["InstanceName"] = v } if v, ok := d.GetOk("payment_type"); ok { request["ChargeType"] = convertRedisTairInstanceChargeTypeRequest(v.(string)) } request["ZoneId"] = d.Get("zone_id") if v, ok := d.GetOk("password"); ok { request["Password"] = v } if v, ok := d.GetOkExists("period"); ok { request["Period"] = v } if v, ok := d.GetOk("auto_renew"); ok { request["AutoRenew"] = v } if v, ok := d.GetOk("auto_renew_period"); ok { request["AutoRenewPeriod"] = v } request["AutoPay"] = "true" if v, ok := d.GetOkExists("shard_count"); ok { request["ShardCount"] = v } if v, ok := d.GetOk("engine_version"); ok { request["EngineVersion"] = v } if v, ok := d.GetOk("tags"); ok { tagsMap := ConvertTags(v.(map[string]interface{})) request = expandTagsToMap(request, tagsMap) } if v, ok := d.GetOkExists("storage_size_gb"); ok && v.(int) > 0 { request["Storage"] = v } if v, ok := d.GetOk("storage_performance_level"); ok { request["StorageType"] = convertRedisTairInstanceStorageTypeRequest(v.(string)) } if v, ok := d.GetOk("cluster_backup_id"); ok { request["ClusterBackupId"] = v } if v, ok := d.GetOkExists("slave_read_only_count"); ok { request["SlaveReadOnlyCount"] = v } if v, ok := d.GetOkExists("read_only_count"); ok { request["ReadOnlyCount"] = v } if v, ok := d.GetOk("node_type"); ok { request["ShardType"] = convertRedisTairInstanceShardTypeRequest(v.(string)) } if v, ok := d.GetOk("global_instance_id"); ok { request["GlobalInstanceId"] = v } if v, ok := d.GetOk("src_db_instance_id"); ok { request["SrcDBInstanceId"] = v } if v, ok := d.GetOk("backup_id"); ok { request["BackupId"] = v } if v, ok := d.GetOk("recover_config_mode"); ok { request["RecoverConfigMode"] = v } if v, ok := d.GetOk("connection_string_prefix"); ok { request["ConnectionStringPrefix"] = v } wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(d.Timeout(schema.TimeoutCreate), func() *resource.RetryError { response, err = client.RpcPost("R-kvstore", "2015-01-01", action, query, request, true) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, request) if err != nil { return WrapErrorf(err, DefaultErrorMsg, "alicloud_redis_tair_instance", action, AlibabaCloudSdkGoERROR) } d.SetId(fmt.Sprint(response["InstanceId"])) redisServiceV2 := RedisServiceV2{client} stateConf := BuildStateConf([]string{}, []string{"Normal"}, d.Timeout(schema.TimeoutCreate), 5*time.Minute, redisServiceV2.RedisTairInstanceStateRefreshFunc(d.Id(), "InstanceStatus", []string{})) if _, err := stateConf.WaitForState(); err != nil { return WrapErrorf(err, IdMsg, d.Id()) } return resourceAliCloudRedisTairInstanceUpdate(d, meta) } func resourceAliCloudRedisTairInstanceRead(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AliyunClient) redisServiceV2 := RedisServiceV2{client} objectRaw, err := redisServiceV2.DescribeRedisTairInstance(d.Id()) if err != nil { if !d.IsNewResource() && NotFoundError(err) { log.Printf("[DEBUG] Resource alicloud_redis_tair_instance DescribeRedisTairInstance Failed!!! %s", err) d.SetId("") return nil } return WrapError(err) } if objectRaw["ArchitectureType"] != nil { d.Set("architecture_type", objectRaw["ArchitectureType"]) } if objectRaw["ConnectionDomain"] != nil { d.Set("connection_domain", objectRaw["ConnectionDomain"]) } if objectRaw["CreateTime"] != nil { d.Set("create_time", objectRaw["CreateTime"]) } if objectRaw["EngineVersion"] != nil { d.Set("engine_version", objectRaw["EngineVersion"]) } if objectRaw["RealInstanceClass"] != nil { d.Set("instance_class", objectRaw["RealInstanceClass"]) } if objectRaw["InstanceType"] != nil { d.Set("instance_type", objectRaw["InstanceType"]) } if objectRaw["Connections"] != nil { d.Set("max_connections", objectRaw["Connections"]) } if objectRaw["NetworkType"] != nil { d.Set("network_type", objectRaw["NetworkType"]) } if objectRaw["NodeType"] != nil { d.Set("node_type", convertRedisTairInstanceInstancesDBInstanceAttributeNodeTypeResponse(objectRaw["NodeType"])) } if objectRaw["ChargeType"] != nil { d.Set("payment_type", convertRedisTairInstanceInstancesDBInstanceAttributeChargeTypeResponse(objectRaw["ChargeType"])) } if objectRaw["Port"] != nil { d.Set("port", objectRaw["Port"]) } if objectRaw["RegionId"] != nil { d.Set("region_id", objectRaw["RegionId"]) } if objectRaw["ResourceGroupId"] != nil { d.Set("resource_group_id", objectRaw["ResourceGroupId"]) } if objectRaw["SecondaryZoneId"] != nil { d.Set("secondary_zone_id", objectRaw["SecondaryZoneId"]) } if objectRaw["ShardCount"] != nil && objectRaw["ShardCount"] != 0 { d.Set("shard_count", objectRaw["ShardCount"]) } if objectRaw["InstanceStatus"] != nil { d.Set("status", objectRaw["InstanceStatus"]) } if objectRaw["StorageType"] != nil { d.Set("storage_performance_level", convertRedisTairInstanceInstancesDBInstanceAttributeStorageTypeResponse(objectRaw["StorageType"])) } if objectRaw["Storage"] != nil { d.Set("storage_size_gb", formatInt(objectRaw["Storage"])) } if objectRaw["InstanceName"] != nil { d.Set("tair_instance_name", objectRaw["InstanceName"]) } if objectRaw["VSwitchId"] != nil { d.Set("vswitch_id", objectRaw["VSwitchId"]) } if objectRaw["VpcAuthMode"] != nil { d.Set("vpc_auth_mode", objectRaw["VpcAuthMode"]) } if objectRaw["VpcId"] != nil { d.Set("vpc_id", objectRaw["VpcId"]) } if objectRaw["ZoneId"] != nil { d.Set("zone_id", objectRaw["ZoneId"]) } if objectRaw["InstanceId"] != nil { d.Set("tair_instance_id", objectRaw["InstanceId"]) } tagsMaps, _ := jsonpath.Get("$.Tags.Tag", objectRaw) d.Set("tags", tagsToMap(tagsMaps)) objectRaw, err = redisServiceV2.DescribeTairInstanceDescribeInstanceConfig(d.Id()) if err != nil && !NotFoundError(err) { return WrapError(err) } if objectRaw["ParamNoLooseSentinelEnabled"] != nil { d.Set("param_no_loose_sentinel_enabled", objectRaw["ParamNoLooseSentinelEnabled"]) } if objectRaw["ParamNoLooseSentinelPasswordFreeAccess"] != nil { d.Set("param_no_loose_sentinel_password_free_access", objectRaw["ParamNoLooseSentinelPasswordFreeAccess"]) } if objectRaw["ParamNoLooseSentinelPasswordFreeCommands"] != nil { d.Set("param_no_loose_sentinel_password_free_commands", objectRaw["ParamNoLooseSentinelPasswordFreeCommands"]) } if objectRaw["ParamReplMode"] != nil { d.Set("param_repl_mode", objectRaw["ParamReplMode"]) } if objectRaw["ParamReplTimeout"] != nil { d.Set("param_semisync_repl_timeout", objectRaw["ParamReplTimeout"]) } if objectRaw["ParamSentinelCompatEnable"] != nil { d.Set("param_sentinel_compat_enable", objectRaw["ParamSentinelCompatEnable"]) } var securityIpGroupName string if v, ok := d.GetOk("security_ip_group_name"); ok { securityIpGroupName = v.(string) } objectRaw, err = redisServiceV2.DescribeDescribeSecurityIps(d.Id(), securityIpGroupName) if err != nil && !NotFoundError(err) { return WrapError(err) } if objectRaw["SecurityIpGroupName"] != nil { d.Set("security_ip_group_name", objectRaw["SecurityIpGroupName"]) } if objectRaw["SecurityIpList"] != nil { d.Set("security_ips", objectRaw["SecurityIpList"]) } objectRaw, err = redisServiceV2.DescribeTairInstanceDescribeSecurityGroupConfiguration(d.Id()) if err != nil && !NotFoundError(err) { return WrapError(err) } if objectRaw["RegionId"] != nil { d.Set("region_id", objectRaw["RegionId"]) } if objectRaw["SecurityGroupId"] != nil { d.Set("security_group_id", objectRaw["SecurityGroupId"]) } objectRaw, err = redisServiceV2.DescribeTairInstanceDescribeInstanceSSL(d.Id()) if err != nil && !NotFoundError(err) { return WrapError(err) } if objectRaw["SSLEnabled"] != nil { d.Set("ssl_enabled", objectRaw["SSLEnabled"]) } if objectRaw["InstanceId"] != nil { d.Set("tair_instance_id", objectRaw["InstanceId"]) } objectRaw, err = redisServiceV2.DescribeTairInstanceDescribeIntranetAttribute(d.Id()) if err != nil && !NotFoundError(err) { return WrapError(err) } if objectRaw["IntranetBandwidth"] != nil { d.Set("intranet_bandwidth", objectRaw["IntranetBandwidth"]) } return nil } func resourceAliCloudRedisTairInstanceUpdate(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AliyunClient) var request map[string]interface{} var response map[string]interface{} var query map[string]interface{} update := false d.Partial(true) action := "ModifyInstanceAttribute" var err error request = make(map[string]interface{}) query = make(map[string]interface{}) request["InstanceId"] = d.Id() request["RegionId"] = client.RegionId if !d.IsNewResource() && d.HasChange("tair_instance_name") { update = true request["InstanceName"] = d.Get("tair_instance_name") } if !d.IsNewResource() && d.HasChange("password") { update = true request["NewPassword"] = d.Get("password") } if update { runtime := util.RuntimeOptions{} runtime.SetAutoretry(true) wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError { response, err = client.RpcPost("R-kvstore", "2015-01-01", action, query, request, true) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, request) if err != nil { return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR) } redisServiceV2 := RedisServiceV2{client} stateConf := BuildStateConf([]string{}, []string{"Normal"}, d.Timeout(schema.TimeoutUpdate), 3*time.Minute, redisServiceV2.RedisTairInstanceStateRefreshFunc(d.Id(), "InstanceStatus", []string{})) if _, err := stateConf.WaitForState(); err != nil { return WrapErrorf(err, IdMsg, d.Id()) } } update = false action = "ModifyInstanceSpec" request = make(map[string]interface{}) query = make(map[string]interface{}) request["InstanceId"] = d.Id() request["RegionId"] = client.RegionId request["ClientToken"] = buildClientToken(action) if !d.IsNewResource() && d.HasChange("instance_class") { update = true } request["InstanceClass"] = d.Get("instance_class") if v, ok := d.GetOkExists("force_upgrade"); ok { request["ForceUpgrade"] = v } if v, ok := d.GetOk("effective_time"); ok { request["EffectiveTime"] = v } request["AutoPay"] = "true" if v, ok := d.GetOkExists("slave_read_only_count"); ok { request["SlaveReadOnlyCount"] = v } if v, ok := d.GetOkExists("read_only_count"); ok { request["ReadOnlyCount"] = v } if !d.IsNewResource() && d.HasChange("node_type") { update = true request["NodeType"] = d.Get("node_type") } if update { runtime := util.RuntimeOptions{} runtime.SetAutoretry(true) wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError { response, err = client.RpcPost("R-kvstore", "2015-01-01", action, query, request, true) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, request) if err != nil { return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR) } redisServiceV2 := RedisServiceV2{client} stateConf := BuildStateConf([]string{}, []string{"true"}, d.Timeout(schema.TimeoutUpdate), 30*time.Second, redisServiceV2.RedisTairInstanceStateRefreshFunc(d.Id(), "$.IsOrderCompleted", []string{})) if _, err := stateConf.WaitForState(); err != nil { return WrapErrorf(err, IdMsg, d.Id()) } } update = false action = "ModifyResourceGroup" request = make(map[string]interface{}) query = make(map[string]interface{}) request["InstanceId"] = d.Id() request["RegionId"] = client.RegionId request["ClientToken"] = buildClientToken(action) if _, ok := d.GetOk("resource_group_id"); ok && !d.IsNewResource() && d.HasChange("resource_group_id") { update = true } request["ResourceGroupId"] = d.Get("resource_group_id") if update { runtime := util.RuntimeOptions{} runtime.SetAutoretry(true) wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError { response, err = client.RpcPost("R-kvstore", "2015-01-01", action, query, request, true) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, request) if err != nil { return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR) } } update = false action = "ModifyInstanceMajorVersion" request = make(map[string]interface{}) query = make(map[string]interface{}) request["InstanceId"] = d.Id() request["RegionId"] = client.RegionId if v, ok := d.GetOk("effective_time"); ok { request["EffectiveTime"] = v } if !d.IsNewResource() && d.HasChange("engine_version") { update = true } request["MajorVersion"] = d.Get("engine_version") if update { runtime := util.RuntimeOptions{} runtime.SetAutoretry(true) wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError { response, err = client.RpcPost("R-kvstore", "2015-01-01", action, query, request, true) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, request) if err != nil { return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR) } redisServiceV2 := RedisServiceV2{client} stateConf := BuildStateConf([]string{}, []string{"Normal"}, d.Timeout(schema.TimeoutUpdate), 6*time.Minute, redisServiceV2.RedisTairInstanceStateRefreshFunc(d.Id(), "InstanceStatus", []string{})) if _, err := stateConf.WaitForState(); err != nil { return WrapErrorf(err, IdMsg, d.Id()) } } update = false action = "ModifySecurityGroupConfiguration" request = make(map[string]interface{}) query = make(map[string]interface{}) request["DBInstanceId"] = d.Id() request["RegionId"] = client.RegionId if d.HasChange("security_group_id") { update = true } request["SecurityGroupId"] = d.Get("security_group_id") if update { runtime := util.RuntimeOptions{} runtime.SetAutoretry(true) wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError { response, err = client.RpcPost("R-kvstore", "2015-01-01", action, query, request, true) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, request) if err != nil { return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR) } } update = false action = "TransformInstanceChargeType" request = make(map[string]interface{}) query = make(map[string]interface{}) request["InstanceId"] = d.Id() request["RegionId"] = client.RegionId if !d.IsNewResource() && d.HasChange("payment_type") { update = true } request["ChargeType"] = convertRedisTairInstanceChargeTypeRequest(d.Get("payment_type").(string)) request["AutoPay"] = "true" if v, ok := d.GetOkExists("period"); ok { request["Period"] = v } if v, ok := d.GetOk("auto_renew"); ok { request["AutoRenew"] = v } if v, ok := d.GetOk("auto_renew_period"); ok { request["AutoRenewPeriod"] = v } if update { runtime := util.RuntimeOptions{} runtime.SetAutoretry(true) wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError { response, err = client.RpcPost("R-kvstore", "2015-01-01", action, query, request, true) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, request) if err != nil { return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR) } } update = false action = "ModifyInstanceSSL" request = make(map[string]interface{}) query = make(map[string]interface{}) request["InstanceId"] = d.Id() request["RegionId"] = client.RegionId if d.HasChange("ssl_enabled") { update = true } request["SSLEnabled"] = d.Get("ssl_enabled") redisServiceV2 := RedisServiceV2{client} objectRaw, _ := redisServiceV2.DescribeTairInstanceDescribeInstanceSSL(d.Id()) if objectRaw["SSLEnabled"] != nil && objectRaw["SSLEnabled"] == d.Get("ssl_enabled") { update = false } if update { runtime := util.RuntimeOptions{} runtime.SetAutoretry(true) wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError { response, err = client.RpcPost("R-kvstore", "2015-01-01", action, query, request, true) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, request) if err != nil { return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR) } redisServiceV2 := RedisServiceV2{client} stateConf := BuildStateConf([]string{}, []string{"Normal"}, d.Timeout(schema.TimeoutUpdate), 5*time.Minute, redisServiceV2.RedisTairInstanceStateRefreshFunc(d.Id(), "InstanceStatus", []string{})) if _, err := stateConf.WaitForState(); err != nil { return WrapErrorf(err, IdMsg, d.Id()) } } update = false action = "ModifyInstanceBandwidth" request = make(map[string]interface{}) query = make(map[string]interface{}) request["InstanceId"] = d.Id() request["RegionId"] = client.RegionId if d.HasChange("intranet_bandwidth") { update = true } request["TargetIntranetBandwidth"] = d.Get("intranet_bandwidth") if update { runtime := util.RuntimeOptions{} runtime.SetAutoretry(true) wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError { response, err = client.RpcPost("R-kvstore", "2015-01-01", action, query, request, true) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, request) if err != nil { return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR) } redisServiceV2 := RedisServiceV2{client} stateConf := BuildStateConf([]string{}, []string{"Normal"}, d.Timeout(schema.TimeoutUpdate), 60*time.Second, redisServiceV2.RedisTairInstanceStateRefreshFunc(d.Id(), "InstanceStatus", []string{})) if _, err := stateConf.WaitForState(); err != nil { return WrapErrorf(err, IdMsg, d.Id()) } } update = false action = "ModifyInstanceVpcAuthMode" request = make(map[string]interface{}) query = make(map[string]interface{}) request["InstanceId"] = d.Id() request["RegionId"] = client.RegionId if d.HasChange("vpc_auth_mode") { update = true } request["VpcAuthMode"] = d.Get("vpc_auth_mode") if update { runtime := util.RuntimeOptions{} runtime.SetAutoretry(true) wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError { response, err = client.RpcPost("R-kvstore", "2015-01-01", action, query, request, true) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, request) if err != nil { return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR) } redisServiceV2 := RedisServiceV2{client} stateConf := BuildStateConf([]string{}, []string{"Normal"}, d.Timeout(schema.TimeoutUpdate), 60*time.Second, redisServiceV2.RedisTairInstanceStateRefreshFunc(d.Id(), "InstanceStatus", []string{})) if _, err := stateConf.WaitForState(); err != nil { return WrapErrorf(err, IdMsg, d.Id()) } } update = false action = "ModifySecurityIps" request = make(map[string]interface{}) query = make(map[string]interface{}) request["InstanceId"] = d.Id() request["RegionId"] = client.RegionId if d.HasChange("security_ip_group_name") { update = true } if v, ok := d.GetOk("security_ip_group_name"); ok { request["SecurityIpGroupName"] = v } if v, ok := d.GetOk("modify_mode"); ok { request["ModifyMode"] = v } if d.HasChange("security_ips") { update = true } request["SecurityIps"] = d.Get("security_ips") if update { runtime := util.RuntimeOptions{} runtime.SetAutoretry(true) wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError { response, err = client.RpcPost("R-kvstore", "2015-01-01", action, query, request, true) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, request) if err != nil { return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR) } redisServiceV2 := RedisServiceV2{client} stateConf := BuildStateConf([]string{}, []string{"Normal"}, d.Timeout(schema.TimeoutUpdate), 30*time.Second, redisServiceV2.RedisTairInstanceStateRefreshFunc(d.Id(), "InstanceStatus", []string{})) if _, err := stateConf.WaitForState(); err != nil { return WrapErrorf(err, IdMsg, d.Id()) } } update = false action = "ModifyInstanceConfig" request = make(map[string]interface{}) query = make(map[string]interface{}) request["InstanceId"] = d.Id() request["RegionId"] = client.RegionId if d.HasChange("param_repl_mode") { update = true request["ParamReplMode"] = d.Get("param_repl_mode") } if d.HasChange("param_semisync_repl_timeout") { update = true request["ParamSemisyncReplTimeout"] = d.Get("param_semisync_repl_timeout") } if d.HasChange("param_no_loose_sentinel_enabled") { update = true request["ParamNoLooseSentinelEnabled"] = d.Get("param_no_loose_sentinel_enabled") } if d.HasChange("param_sentinel_compat_enable") { update = true request["ParamSentinelCompatEnable"] = d.Get("param_sentinel_compat_enable") } if d.HasChange("param_no_loose_sentinel_password_free_access") { update = true request["ParamNoLooseSentinelPasswordFreeAccess"] = d.Get("param_no_loose_sentinel_password_free_access") } if d.HasChange("param_no_loose_sentinel_password_free_commands") { update = true request["ParamNoLooseSentinelPasswordFreeCommands"] = d.Get("param_no_loose_sentinel_password_free_commands") } if update { runtime := util.RuntimeOptions{} runtime.SetAutoretry(true) wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError { response, err = client.RpcPost("R-kvstore", "2015-01-01", action, query, request, true) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, request) if err != nil { return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR) } redisServiceV2 := RedisServiceV2{client} stateConf := BuildStateConf([]string{}, []string{"Normal"}, d.Timeout(schema.TimeoutUpdate), 3*time.Minute, redisServiceV2.RedisTairInstanceStateRefreshFunc(d.Id(), "InstanceStatus", []string{})) if _, err := stateConf.WaitForState(); err != nil { return WrapErrorf(err, IdMsg, d.Id()) } } if !d.IsNewResource() && d.HasChange("shard_count") { oldEntry, newEntry := d.GetChange("shard_count") oldEntryValue := oldEntry.(int) newEntryValue := newEntry.(int) removed := oldEntryValue - newEntryValue added := newEntryValue - oldEntryValue if removed > 0 { action := "DeleteShardingNode" request = make(map[string]interface{}) query = make(map[string]interface{}) request["InstanceId"] = d.Id() request["RegionId"] = client.RegionId request["ShardCount"] = removed runtime := util.RuntimeOptions{} runtime.SetAutoretry(true) wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError { response, err = client.RpcPost("R-kvstore", "2015-01-01", action, query, request, true) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, request) if err != nil { return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR) } redisServiceV2 := RedisServiceV2{client} stateConf := BuildStateConf([]string{}, []string{"true"}, d.Timeout(schema.TimeoutUpdate), 10*time.Second, redisServiceV2.RedisTairInstanceStateRefreshFunc(d.Id(), "$.IsOrderCompleted", []string{})) if _, err := stateConf.WaitForState(); err != nil { return WrapErrorf(err, IdMsg, d.Id()) } } if added > 0 { action := "AddShardingNode" request = make(map[string]interface{}) query = make(map[string]interface{}) request["InstanceId"] = d.Id() request["RegionId"] = client.RegionId request["ClientToken"] = buildClientToken(action) request["ShardCount"] = added runtime := util.RuntimeOptions{} runtime.SetAutoretry(true) wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError { response, err = client.RpcPost("R-kvstore", "2015-01-01", action, query, request, true) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, request) if err != nil { return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR) } redisServiceV2 := RedisServiceV2{client} stateConf := BuildStateConf([]string{}, []string{"true"}, d.Timeout(schema.TimeoutUpdate), 10*time.Second, redisServiceV2.RedisTairInstanceStateRefreshFunc(d.Id(), "$.IsOrderCompleted", []string{})) if _, err := stateConf.WaitForState(); err != nil { return WrapErrorf(err, IdMsg, d.Id()) } } } if d.HasChange("tags") { redisServiceV2 := RedisServiceV2{client} if err := redisServiceV2.SetResourceTags(d, "INSTANCE"); err != nil { return WrapError(err) } } d.Partial(false) return resourceAliCloudRedisTairInstanceRead(d, meta) } func resourceAliCloudRedisTairInstanceDelete(d *schema.ResourceData, meta interface{}) error { if v, ok := d.GetOk("payment_type"); ok { if v == "Subscription" { log.Printf("[WARN] Cannot destroy resource alicloud_redis_tair_instance which payment_type valued Subscription. Terraform will remove this resource from the state file, however resources may remain.") return nil } } client := meta.(*connectivity.AliyunClient) action := "DeleteInstance" var request map[string]interface{} var response map[string]interface{} query := make(map[string]interface{}) var err error request = make(map[string]interface{}) request["InstanceId"] = d.Id() runtime := util.RuntimeOptions{} runtime.SetAutoretry(true) wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(d.Timeout(schema.TimeoutDelete), func() *resource.RetryError { response, err = client.RpcPost("R-kvstore", "2015-01-01", action, query, request, true) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, request) if err != nil { if NotFoundError(err) { return nil } return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR) } redisServiceV2 := RedisServiceV2{client} stateConf := BuildStateConf([]string{}, []string{""}, d.Timeout(schema.TimeoutDelete), 5*time.Minute, redisServiceV2.RedisTairInstanceStateRefreshFunc(d.Id(), "InstanceStatus", []string{})) if _, err := stateConf.WaitForState(); err != nil { return WrapErrorf(err, IdMsg, d.Id()) } return nil } func convertRedisTairInstanceInstancesDBInstanceAttributeNodeTypeResponse(source interface{}) interface{} { source = fmt.Sprint(source) switch source { case "double": return "MASTER_SLAVE" case "single": return "STAND_ALONE" } return source } func convertRedisTairInstanceInstancesDBInstanceAttributeChargeTypeResponse(source interface{}) interface{} { source = fmt.Sprint(source) switch source { case "PrePaid": return "Subscription" case "PostPaid": return "PayAsYouGo" } return source } func convertRedisTairInstanceInstancesDBInstanceAttributeStorageTypeResponse(source interface{}) interface{} { source = fmt.Sprint(source) switch source { case "essd_pl1": return "PL1" case "essd_pl2": return "PL2" case "essd_pl3": return "PL3" } return source } func convertRedisTairInstanceChargeTypeRequest(source interface{}) interface{} { source = fmt.Sprint(source) switch source { case "Subscription": return "PrePaid" case "PayAsYouGo": return "PostPaid" } return source } func convertRedisTairInstanceStorageTypeRequest(source interface{}) interface{} { source = fmt.Sprint(source) switch source { case "PL1": return "essd_pl1" case "PL2": return "essd_pl2" case "PL3": return "essd_pl3" } return source } func convertRedisTairInstanceShardTypeRequest(source interface{}) interface{} { source = fmt.Sprint(source) switch source { } return source }