diff --git a/CHANGELOG.md b/CHANGELOG.md index fae4fa8e79..1cc8e3bbcc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,15 @@ -## 1.34.0 (Unreleased) +## 1.33.1 (Unreleased) + +ENHANCEMENTS: +Resource: `tencentcloud_redis_instance` add new argument `type_id`,`redis_shard_num`,`redis_replicas_num` +Data Source: `tencentcloud_redis_instances` add new argument `type_id`,`redis_shard_num`,`redis_replicas_num` +Data Source: `tencentcloud_redis_zone_config` add output argument `type_id` and new output argument `type_id`,`redis_shard_nums`,`redis_replicas_nums` + +DEPRECATED: +* Resource: `tencentcloud_redis_instance`: optional argument `type` is no longer supported, replace by `type_id`. +* Data Source: `tencentcloud_redis_instances`: output argument `type` is no longer supported, replace by `type_id` +* Data Source: `tencentcloud_redis_zone_config`: output argument `type` is no longer supported, replace by `type_id` + ## 1.33.0 (May 18, 2020) FEATURES: diff --git a/tencentcloud/connectivity/transport.go b/tencentcloud/connectivity/transport.go index 5c377b3512..e49c6c7777 100644 --- a/tencentcloud/connectivity/transport.go +++ b/tencentcloud/connectivity/transport.go @@ -10,7 +10,7 @@ import ( "time" ) -const ReqClient = "Terraform-v1.24.1" +const ReqClient = "Terraform-v1.33.1" type LogRoundTripper struct { } @@ -27,19 +27,20 @@ func (me *LogRoundTripper) RoundTrip(request *http.Request) (response *http.Resp if errRet != nil { return } - + var headName = "X-TC-Action" request.Header.Set("X-TC-RequestClient", ReqClient) - inBytes = []byte(fmt.Sprintf("%s, request: ", request.Header["X-TC-Action"])) + inBytes = []byte(fmt.Sprintf("%s, request: ", request.Header[headName])) requestBody, errRet := ioutil.ReadAll(bodyReader) if errRet != nil { return } inBytes = append(inBytes, requestBody...) + headName = "X-TC-Region" appendMessage := []byte(fmt.Sprintf( ", (host %+v, region:%+v)", request.Header["Host"], - request.Header["X-TC-Region"], + request.Header[headName], )) inBytes = append(inBytes, appendMessage...) diff --git a/tencentcloud/data_source_tc_redis_instances.go b/tencentcloud/data_source_tc_redis_instances.go index e98de34291..0e92e448a2 100644 --- a/tencentcloud/data_source_tc_redis_instances.go +++ b/tencentcloud/data_source_tc_redis_instances.go @@ -87,11 +87,27 @@ func dataSourceTencentRedisInstances() *schema.Resource { Computed: true, Description: "ID of the project to which a redis instance belongs.", }, + "type_id": { + Type: schema.TypeInt, + Computed: true, + Description: "Instance type. Refer to `data.tencentcloud_redis_zone_config.list.type_id` get available values.", + }, "type": { Type: schema.TypeString, Computed: true, + Deprecated: "It has been deprecated from version 1.33.1. Please use 'type_id' instead.", Description: "Instance type. Available values: master_slave_redis, master_slave_ckv, cluster_ckv, cluster_redis and standalone_redis.", }, + "redis_shard_num": { + Type: schema.TypeInt, + Computed: true, + Description: "The number of instance shard.", + }, + "redis_replicas_num": { + Type: schema.TypeInt, + Computed: true, + Description: "The number of instance copies.", + }, "mem_size": { Type: schema.TypeInt, Computed: true, @@ -225,6 +241,9 @@ instanceLoop: instanceDes["create_time"] = instance.CreateTime instanceDes["tags"] = instance.Tags + instanceDes["redis_shard_num"] = instance.RedisShardNum + instanceDes["redis_replicas_num"] = instance.RedisReplicasNum + instanceDes["type_id"] = instance.TypeId instanceList = append(instanceList, instanceDes) } diff --git a/tencentcloud/data_source_tc_redis_instances_test.go b/tencentcloud/data_source_tc_redis_instances_test.go index 206af66386..f26a1bb8fc 100644 --- a/tencentcloud/data_source_tc_redis_instances_test.go +++ b/tencentcloud/data_source_tc_redis_instances_test.go @@ -47,7 +47,7 @@ func testAccTencentCloudRedisInstancesDataSourceConfig() string { return ` resource "tencentcloud_redis_instance" "redis_instance_test" { availability_zone = "ap-guangzhou-3" - type = "master_slave_redis" + type_id = 2 password = "test12345789" mem_size = 8192 name = "terraform_test" diff --git a/tencentcloud/data_source_tc_redis_zone_config.go b/tencentcloud/data_source_tc_redis_zone_config.go index e82452f62e..7d529d317e 100644 --- a/tencentcloud/data_source_tc_redis_zone_config.go +++ b/tencentcloud/data_source_tc_redis_zone_config.go @@ -31,6 +31,12 @@ func dataSourceTencentRedisZoneConfig() *schema.Resource { Optional: true, Description: "Name of a region. If this value is not set, the current region getting from provider's configuration will be used.", }, + "type_id": { + Type: schema.TypeInt, + Optional: true, + ValidateFunc: validateIntegerMin(2), + Description: "Instance type id.", + }, "result_output_file": { Type: schema.TypeString, Optional: true, @@ -48,9 +54,15 @@ func dataSourceTencentRedisZoneConfig() *schema.Resource { Computed: true, Description: "ID of available zone.", }, + "type_id": { + Type: schema.TypeInt, + Computed: true, + Description: "Instance type. Which redis type supports in this zone.", + }, "type": { Type: schema.TypeString, Computed: true, + Deprecated: "It has been deprecated from version 1.33.1. Please use 'type_id' instead.", Description: "Instance type. Available values: master_slave_redis, master_slave_ckv, cluster_ckv, cluster_redis and standalone_redis.", }, "version": { @@ -64,6 +76,18 @@ func dataSourceTencentRedisZoneConfig() *schema.Resource { Computed: true, Description: "The memory volume of an available instance(in MB).", }, + "redis_shard_nums": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Schema{Type: schema.TypeInt}, + Description: "The support numbers of instance shard.", + }, + "redis_replicas_nums": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Schema{Type: schema.TypeInt}, + Description: "The support numbers of instance copies.", + }, }, }, }, @@ -86,6 +110,8 @@ func dataSourceTencentRedisZoneConfigRead(d *schema.ResourceData, meta interface log.Printf("[INFO]%s region is not set,so we use [%s] from env\n ", logId, region) } + typeId := int64(d.Get("type_id").(int)) + sellConfigures, err := service.DescribeRedisZoneConfig(ctx) if err != nil { return fmt.Errorf("api[DescribeRedisZoneConfig]fail, return %s", err.Error()) @@ -110,18 +136,19 @@ func dataSourceTencentRedisZoneConfigRead(d *schema.ResourceData, meta interface if *products.PayMode != "0" { continue } - //this products sale out. - if *products.Saleout { - continue - } - //not support this type now . - if REDIS_NAMES[*products.Type] == "" { + + if typeId != 0 && typeId != *products.Type { continue } zoneConfigures := map[string]interface{}{} zoneConfigures["zone"] = zoneName zoneConfigures["version"] = *products.Version + zoneConfigures["type_id"] = products.Type + //this products sale out. + if *products.Saleout { + continue + } memSizes := make([]int64, 0, len(products.TotalSize)) @@ -136,6 +163,27 @@ func dataSourceTencentRedisZoneConfigRead(d *schema.ResourceData, meta interface zoneConfigures["mem_sizes"] = memSizes zoneConfigures["type"] = REDIS_NAMES[*products.Type] + var redisShardNums []int64 + var redisReplicasNums []int64 + + for _, v := range products.ShardNum { + int64Value, err := strconv.ParseInt(*v, 10, 64) + if err != nil { + return fmt.Errorf("api[DescribeRedisZoneConfig]return error `redis_shard_nums`,%s", err.Error()) + } + redisShardNums = append(redisShardNums, int64Value) + } + zoneConfigures["redis_shard_nums"] = redisShardNums + + for _, v := range products.ReplicaNum { + int64Value, err := strconv.ParseInt(*v, 10, 64) + if err != nil { + return fmt.Errorf("api[DescribeRedisZoneConfig]return error `redis_replicas_nums`,%s", err.Error()) + } + redisReplicasNums = append(redisReplicasNums, int64Value) + } + zoneConfigures["redis_replicas_nums"] = redisReplicasNums + allZonesConfigs = append(allZonesConfigs, zoneConfigures) } } @@ -144,7 +192,12 @@ func dataSourceTencentRedisZoneConfigRead(d *schema.ResourceData, meta interface log.Printf("[CRITAL]%s provider set redis zoneConfigs fail, reason:%s\n ", logId, err.Error()) return err } - d.SetId("redis_zoneconfig" + region) + + id := "redis_zoneconfig" + region + if typeId != 0 { + id += fmt.Sprintf("%d", typeId) + } + d.SetId(id) if output, ok := d.GetOk("result_output_file"); ok && output.(string) != "" { diff --git a/tencentcloud/data_source_tc_redis_zone_config_test.go b/tencentcloud/data_source_tc_redis_zone_config_test.go index 0d1418898c..029306aa12 100644 --- a/tencentcloud/data_source_tc_redis_zone_config_test.go +++ b/tencentcloud/data_source_tc_redis_zone_config_test.go @@ -29,9 +29,11 @@ func TestAccDataSourceRedisZoneConfig_basic(t *testing.T) { testAccCheckTencentCloudDataSourceID("data.tencentcloud_redis_zone_config.testWithRegion"), resource.TestCheckResourceAttrSet("data.tencentcloud_redis_zone_config.testWithRegion", "list.#"), resource.TestCheckResourceAttrSet("data.tencentcloud_redis_zone_config.testWithRegion", "list.0.zone"), - resource.TestCheckResourceAttrSet("data.tencentcloud_redis_zone_config.testWithRegion", "list.0.type"), + resource.TestCheckResourceAttrSet("data.tencentcloud_redis_zone_config.testWithRegion", "list.0.type_id"), resource.TestCheckResourceAttrSet("data.tencentcloud_redis_zone_config.testWithRegion", "list.0.version"), resource.TestCheckResourceAttrSet("data.tencentcloud_redis_zone_config.testWithRegion", "list.0.mem_sizes.#"), + resource.TestCheckResourceAttrSet("data.tencentcloud_redis_zone_config.testWithRegion", "list.0.redis_shard_nums.#"), + resource.TestCheckResourceAttrSet("data.tencentcloud_redis_zone_config.testWithRegion", "list.0.redis_replicas_nums.#"), ), }, }, diff --git a/tencentcloud/resource_tc_redis_backup_config_test.go b/tencentcloud/resource_tc_redis_backup_config_test.go index aa0690ff99..4c2162bb38 100644 --- a/tencentcloud/resource_tc_redis_backup_config_test.go +++ b/tencentcloud/resource_tc_redis_backup_config_test.go @@ -95,6 +95,7 @@ func testAccRedisBackupConfigUpdate() string { return fmt.Sprintf(` resource "tencentcloud_redis_instance" "redis_instance_test" { availability_zone = "ap-guangzhou-3" + type_id = 2 password = "test12345789" mem_size = 8192 name = "terrform_test" @@ -110,6 +111,7 @@ func testAccRedisBackupConfig() string { return fmt.Sprintf(` resource "tencentcloud_redis_instance" "redis_instance_test" { availability_zone = "ap-guangzhou-3" + type_id = 2 password = "test12345789" mem_size = 8192 name = "terrform_test" diff --git a/tencentcloud/resource_tc_redis_instance.go b/tencentcloud/resource_tc_redis_instance.go index 9eec346bb9..1dddd95013 100644 --- a/tencentcloud/resource_tc_redis_instance.go +++ b/tencentcloud/resource_tc_redis_instance.go @@ -4,13 +4,18 @@ Provides a resource to create a Redis instance and set its attributes. Example Usage ```hcl -resource "tencentcloud_redis_instance" "redis_instance_test"{ - availability_zone = "ap-hongkong-3" - type = "master_slave_redis" - password = "test12345789" - mem_size = 8192 - name = "terrform_test" - port = 6379 +data "tencentcloud_redis_zone_config" "zone" { +} + +resource "tencentcloud_redis_instance" "redis_instance_test_2" { + availability_zone = data.tencentcloud_redis_zone_config.zone.list[0].zone + type_id = data.tencentcloud_redis_zone_config.zone.list[0].type_id + password = "test12345789" + mem_size = 8192 + redis_shard_num = data.tencentcloud_redis_zone_config.zone.list[0].redis_shard_nums[0] + redis_replicas_num = data.tencentcloud_redis_zone_config.zone.list[0].redis_replicas_nums[0] + name = "terrform_test" + port = 6379 } ``` @@ -70,11 +75,31 @@ func resourceTencentCloudRedisInstance() *schema.Resource { Computed: true, Description: "Instance name.", }, + "type_id": { + Type: schema.TypeInt, + Optional: true, + ForceNew: true, + ValidateFunc: validateIntegerMin(2), + Description: "Instance type. Refer to `data.tencentcloud_redis_zone_config.list.type_id` get available values.", + }, + "redis_shard_num": { + Type: schema.TypeInt, + Optional: true, + ForceNew: true, + Default: 1, + Description: "The number of instance shard. This is not required for standalone and master slave versions.", + }, + "redis_replicas_num": { + Type: schema.TypeInt, + Optional: true, + ForceNew: true, + Default: 1, + Description: "The number of instance copies. This is not required for standalone and master slave versions.", + }, "type": { Type: schema.TypeString, ForceNew: true, Optional: true, - Default: REDIS_NAMES[REDIS_VERSION_MASTER_SLAVE_REDIS], ValidateFunc: func(v interface{}, k string) (ws []string, errors []error) { value := v.(string) for _, name := range REDIS_NAMES { @@ -85,6 +110,7 @@ func resourceTencentCloudRedisInstance() *schema.Resource { errors = append(errors, fmt.Errorf("this redis type %s not support now.", value)) return }, + Deprecated: "It has been deprecated from version 1.33.1. Please use 'type_id' instead.", Description: "Instance type. Available values: " + typeStr + ", specific region support specific types, need to refer data `tencentcloud_redis_zone_config`.", }, "password": { @@ -178,6 +204,9 @@ func resourceTencentCloudRedisInstanceCreate(d *schema.ResourceData, meta interf availabilityZone := d.Get("availability_zone").(string) redisName := d.Get("name").(string) redisType := d.Get("type").(string) + typeId := int64(d.Get("type_id").(int)) + redisShardNum := d.Get("redis_shard_num").(int) + redisReplicasNum := d.Get("redis_replicas_num").(int) password := d.Get("password").(string) memSize := d.Get("mem_size").(int) vpcId := d.Get("vpc_id").(string) @@ -193,6 +222,75 @@ func resourceTencentCloudRedisInstanceCreate(d *schema.ResourceData, meta interf } } + if (typeId == 0 && redisType == "") || (typeId != 0 && redisType != "") { + return fmt.Errorf("`type_id` and `type` set one item and only one item") + } + + for id, name := range REDIS_NAMES { + if redisType == name { + typeId = id + break + } + } + + sellConfigures, err := redisService.DescribeRedisZoneConfig(ctx) + if err != nil { + return fmt.Errorf("api[DescribeRedisZoneConfig]fail, return %s", err.Error()) + } + var regionItem *redis.RegionConf + var zoneItem *redis.ZoneCapacityConf + var redisItem *redis.ProductConf + for _, regionItem = range sellConfigures { + if *regionItem.RegionId == region { + break + } + } + if regionItem == nil { + return fmt.Errorf("all redis in this region `%s` be sold out", region) + } + for _, zones := range regionItem.ZoneSet { + if *zones.IsSaleout { + continue + } + if *zones.ZoneName == availabilityZone { + zoneItem = zones + break + } + } + if zoneItem == nil { + return fmt.Errorf("all redis in this zone `%s` be sold out", availabilityZone) + } + + for _, reds := range zoneItem.ProductSet { + if *reds.Type == typeId { + redisItem = reds + break + } + } + if redisItem == nil { + return fmt.Errorf("redis type_id `%d` be sold out or this type_id is not supports", typeId) + } + var redisShardNums []string + var redisReplicasNums []string + var numErrors []string + for _, v := range redisItem.ShardNum { + redisShardNums = append(redisShardNums, *v) + } + for _, v := range redisItem.ReplicaNum { + redisReplicasNums = append(redisReplicasNums, *v) + } + if !IsContains(redisShardNums, fmt.Sprintf("%d", redisShardNum)) { + numErrors = append(numErrors, fmt.Sprintf("redis_shard_num : %s", strings.Join(redisShardNums, ","))) + } + + if !IsContains(redisReplicasNums, fmt.Sprintf("%d", redisReplicasNum)) { + numErrors = append(numErrors, fmt.Sprintf(" redis_replicas_num : %s", strings.Join(redisReplicasNums, ","))) + } + + if len(numErrors) > 0 { + return fmt.Errorf("redis type_id `%d` only supports %s", typeId, strings.Join(numErrors, ",")) + } + requestSecurityGroup := make([]string, 0, len(securityGroups)) for _, v := range securityGroups { @@ -201,7 +299,7 @@ func resourceTencentCloudRedisInstanceCreate(d *schema.ResourceData, meta interf dealId, err := redisService.CreateInstances(ctx, availabilityZone, - redisType, + typeId, password, vpcId, subnetId, @@ -209,7 +307,9 @@ func resourceTencentCloudRedisInstanceCreate(d *schema.ResourceData, meta interf int64(memSize), int64(projectId), int64(port), - requestSecurityGroup) + requestSecurityGroup, + redisShardNum, + redisReplicasNum) if err != nil { return err @@ -303,26 +403,35 @@ func resourceTencentCloudRedisInstanceRead(d *schema.ResourceData, meta interfac if err != nil { return err } - _ = d.Set("availability_zone", zoneName) + //not set field type_id + if d.Get("type_id").(int) == 0 { + typeName := REDIS_NAMES[*info.Type] + if typeName == "" { + err = fmt.Errorf("redis read unkwnow type %d", *info.Type) + log.Printf("[CRITAL]%s redis read type name error, reason:%s\n", logId, err.Error()) + return err + } + _ = d.Set("type", typeName) + } else { + _ = d.Set("type_id", info.Type) + } - typeName := REDIS_NAMES[*info.Type] - if typeName == "" { - err = fmt.Errorf("redis read unkwnow type %d", *info.Type) - log.Printf("[CRITAL]%s redis read type name error, reason:%s\n", logId, err.Error()) - return err + if d.Get("redis_shard_num").(int) != 0 { + _ = d.Set("redis_shard_num", info.RedisShardNum) } - _ = d.Set("type", typeName) - _ = d.Set("mem_size", int64(*info.Size)) + if d.Get("redis_replicas_num").(int) != 0 { + _ = d.Set("redis_replicas_num", info.RedisReplicasNum) + } + _ = d.Set("availability_zone", zoneName) + _ = d.Set("mem_size", int64(*info.Size)) _ = d.Set("vpc_id", *info.UniqVpcId) _ = d.Set("subnet_id", *info.UniqSubnetId) - _ = d.Set("project_id", *info.ProjectId) _ = d.Set("port", *info.Port) _ = d.Set("ip", *info.WanIp) _ = d.Set("create_time", *info.Createtime) - if d.Get("vpc_id").(string) != "" { securityGroups, err := service.DescribeInstanceSecurityGroup(ctx, d.Id()) if err != nil { diff --git a/tencentcloud/resource_tc_redis_instance_test.go b/tencentcloud/resource_tc_redis_instance_test.go index 9735f0c479..31ece2be45 100644 --- a/tencentcloud/resource_tc_redis_instance_test.go +++ b/tencentcloud/resource_tc_redis_instance_test.go @@ -23,11 +23,14 @@ func TestAccTencentCloudRedisInstance(t *testing.T) { resource.TestCheckResourceAttrSet("tencentcloud_redis_instance.redis_instance_test", "ip"), resource.TestCheckResourceAttrSet("tencentcloud_redis_instance.redis_instance_test", "create_time"), resource.TestCheckResourceAttr("tencentcloud_redis_instance.redis_instance_test", "port", "6379"), - resource.TestCheckResourceAttr("tencentcloud_redis_instance.redis_instance_test", "type", "master_slave_redis"), + resource.TestCheckResourceAttr("tencentcloud_redis_instance.redis_instance_test", "type_id", "2"), + resource.TestCheckResourceAttr("tencentcloud_redis_instance.redis_instance_test", "redis_shard_num", "1"), + resource.TestCheckResourceAttr("tencentcloud_redis_instance.redis_instance_test", "redis_replicas_num", "1"), resource.TestCheckResourceAttr("tencentcloud_redis_instance.redis_instance_test", "mem_size", "8192"), resource.TestCheckResourceAttr("tencentcloud_redis_instance.redis_instance_test", "name", "terrform_test"), resource.TestCheckResourceAttr("tencentcloud_redis_instance.redis_instance_test", "project_id", "0"), resource.TestCheckResourceAttr("tencentcloud_redis_instance.redis_instance_test", "status", "online"), + resource.TestCheckResourceAttr("tencentcloud_redis_instance.redis_instance_test", "status", "online"), ), }, { @@ -52,7 +55,9 @@ func TestAccTencentCloudRedisInstance(t *testing.T) { resource.TestCheckResourceAttrSet("tencentcloud_redis_instance.redis_instance_test", "ip"), resource.TestCheckResourceAttrSet("tencentcloud_redis_instance.redis_instance_test", "create_time"), resource.TestCheckResourceAttr("tencentcloud_redis_instance.redis_instance_test", "port", "6379"), - resource.TestCheckResourceAttr("tencentcloud_redis_instance.redis_instance_test", "type", "master_slave_redis"), + resource.TestCheckResourceAttr("tencentcloud_redis_instance.redis_instance_test", "type_id", "2"), + resource.TestCheckResourceAttr("tencentcloud_redis_instance.redis_instance_test", "redis_shard_num", "1"), + resource.TestCheckResourceAttr("tencentcloud_redis_instance.redis_instance_test", "redis_replicas_num", "1"), resource.TestCheckResourceAttr("tencentcloud_redis_instance.redis_instance_test", "mem_size", "8192"), resource.TestCheckResourceAttr("tencentcloud_redis_instance.redis_instance_test", "name", "terrform_test_update"), resource.TestCheckResourceAttr("tencentcloud_redis_instance.redis_instance_test", "project_id", "0"), @@ -66,7 +71,10 @@ func TestAccTencentCloudRedisInstance(t *testing.T) { resource.TestCheckResourceAttrSet("tencentcloud_redis_instance.redis_instance_test", "ip"), resource.TestCheckResourceAttrSet("tencentcloud_redis_instance.redis_instance_test", "create_time"), resource.TestCheckResourceAttr("tencentcloud_redis_instance.redis_instance_test", "port", "6379"), - resource.TestCheckResourceAttr("tencentcloud_redis_instance.redis_instance_test", "type", "master_slave_redis"), + resource.TestCheckResourceAttr("tencentcloud_redis_instance.redis_instance_test", "type_id", "2"), + resource.TestCheckResourceAttr("tencentcloud_redis_instance.redis_instance_test", "redis_shard_num", "1"), + resource.TestCheckResourceAttr("tencentcloud_redis_instance.redis_instance_test", "redis_replicas_num", "1"), + resource.TestCheckResourceAttr("tencentcloud_redis_instance.redis_instance_test", "type_id", "2"), resource.TestCheckResourceAttr("tencentcloud_redis_instance.redis_instance_test", "mem_size", "12288"), resource.TestCheckResourceAttr("tencentcloud_redis_instance.redis_instance_test", "name", "terrform_test_update"), resource.TestCheckResourceAttr("tencentcloud_redis_instance.redis_instance_test", "project_id", "0"), @@ -77,7 +85,7 @@ func TestAccTencentCloudRedisInstance(t *testing.T) { ResourceName: "tencentcloud_redis_instance.redis_instance_test", ImportState: true, ImportStateVerify: true, - ImportStateVerifyIgnore: []string{"password"}, + ImportStateVerifyIgnore: []string{"password", "type", "redis_shard_num", "redis_replicas_num"}, }, }, }) @@ -138,12 +146,14 @@ func testAccTencentCloudRedisInstanceDestroy(s *terraform.State) error { func testAccRedisInstanceBasic() string { return ` resource "tencentcloud_redis_instance" "redis_instance_test" { - availability_zone = "ap-guangzhou-3" - type = "master_slave_redis" - password = "test12345789" - mem_size = 8192 - name = "terrform_test" - port = 6379 + availability_zone = "ap-guangzhou-3" + type_id = 2 + password = "test12345789" + mem_size = 8192 + name = "terrform_test" + port = 6379 + redis_shard_num = 1 + redis_replicas_num = 1 }` } @@ -151,12 +161,13 @@ func testAccRedisInstanceTags() string { return ` resource "tencentcloud_redis_instance" "redis_instance_test" { availability_zone = "ap-guangzhou-3" - type = "master_slave_redis" - password = "test12345789" - mem_size = 8192 - name = "terrform_test" - port = 6379 - + type_id = 2 + password = "test12345789" + mem_size = 8192 + name = "terrform_test" + port = 6379 + redis_shard_num = 1 + redis_replicas_num = 1 tags = { "test" = "test" } @@ -166,13 +177,14 @@ resource "tencentcloud_redis_instance" "redis_instance_test" { func testAccRedisInstanceTagsUpdate() string { return ` resource "tencentcloud_redis_instance" "redis_instance_test" { - availability_zone = "ap-guangzhou-3" - type = "master_slave_redis" - password = "test12345789" - mem_size = 8192 - name = "terrform_test" - port = 6379 - + availability_zone = "ap-guangzhou-3" + type_id = 2 + password = "test12345789" + mem_size = 8192 + name = "terrform_test" + port = 6379 + redis_shard_num = 1 + redis_replicas_num = 1 tags = { "abc" = "abc" } @@ -182,13 +194,14 @@ resource "tencentcloud_redis_instance" "redis_instance_test" { func testAccRedisInstanceUpdateName() string { return ` resource "tencentcloud_redis_instance" "redis_instance_test" { - availability_zone = "ap-guangzhou-3" - type = "master_slave_redis" - password = "test12345789" - mem_size = 8192 - name = "terrform_test_update" - port = 6379 - + availability_zone = "ap-guangzhou-3" + type_id = 2 + password = "test12345789" + mem_size = 8192 + name = "terrform_test_update" + port = 6379 + redis_shard_num = 1 + redis_replicas_num = 1 tags = { "abc" = "abc" } @@ -199,11 +212,13 @@ func testAccRedisInstanceUpdateMemsizeAndPassword() string { return ` resource "tencentcloud_redis_instance" "redis_instance_test" { availability_zone = "ap-guangzhou-3" - type = "master_slave_redis" - password = "AAA123456BBB" - mem_size = 12288 - name = "terrform_test_update" - port = 6379 + type_id = 2 + password = "AAA123456BBB" + mem_size = 12288 + name = "terrform_test_update" + port = 6379 + redis_shard_num = 1 + redis_replicas_num = 1 tags = { "abc" = "abc" diff --git a/tencentcloud/service_tencentcloud_redis.go b/tencentcloud/service_tencentcloud_redis.go index 3df2876381..4eb3e7aca8 100644 --- a/tencentcloud/service_tencentcloud_redis.go +++ b/tencentcloud/service_tencentcloud_redis.go @@ -21,19 +21,22 @@ type RedisService struct { } type TencentCloudRedisDetail struct { - RedisId string - Name string - Zone string - ProjectId int64 - Type string - MemSize int64 - Status string - VpcId string - SubnetId string - Ip string - Port int64 - CreateTime string - Tags map[string]string + RedisId string + Name string + Zone string + ProjectId int64 + TypeId int64 + Type string + MemSize int64 + Status string + VpcId string + SubnetId string + Ip string + Port int64 + RedisShardNum int64 + RedisReplicasNum int64 + CreateTime string + Tags map[string]string } func (me *RedisService) fullZoneId() (errRet error) { @@ -161,11 +164,7 @@ needMoreItems: continue } var instance TencentCloudRedisDetail - if REDIS_NAMES[*item.Type] == "" { - instance.Type = "unknown" - } else { - instance.Type = REDIS_NAMES[*item.Type] - } + instance.Type = REDIS_NAMES[*item.Type] if REDIS_STATUS[*item.Status] == "" { instance.Status = "unknown" } else { @@ -189,6 +188,13 @@ needMoreItems: instance.SubnetId = *item.UniqSubnetId instance.VpcId = *item.UniqVpcId + instance.TypeId = *item.Type + if item.RedisReplicasNum != nil { + instance.RedisReplicasNum = *item.RedisReplicasNum + } + if item.RedisShardNum != nil { + instance.RedisShardNum = *item.RedisShardNum + } instance.Tags = make(map[string]string, len(item.InstanceTags)) for _, tag := range item.InstanceTags { if tag.TagKey == nil { @@ -215,9 +221,11 @@ needMoreItems: } func (me *RedisService) CreateInstances(ctx context.Context, - zoneName, typeId, password, vpcId, subnetId, redisName string, + zoneName string, typeId int64, password, vpcId, subnetId, redisName string, memSize, projectId, port int64, - securityGroups []string) (dealId string, errRet error) { + securityGroups []string, + redisShardNum, + redisReplicasNum int) (dealId string, errRet error) { logId := getLogId(ctx) request := redis.NewCreateInstancesRequest() @@ -235,20 +243,7 @@ func (me *RedisService) CreateInstances(ctx context.Context, return } request.ZoneId = helper.Int64Uint64(intZoneId) - - // type - var intTypeId uint64 - for id, name := range REDIS_NAMES { - if typeId == name { - intTypeId = uint64(id) - break - } - } - if intTypeId == 0 { - errRet = fmt.Errorf("redis not supports this type %s now", typeId) - return - } - request.TypeId = &intTypeId + request.TypeId = helper.Int64Uint64(typeId) // vpc if (vpcId == "" && subnetId != "") || (vpcId != "" && subnetId == "") { @@ -281,7 +276,12 @@ func (me *RedisService) CreateInstances(ctx context.Context, request.BillingMode = &billingMode request.GoodsNum = &goodsNum request.Period = &period - + if redisShardNum > 0 { + request.RedisShardNum = helper.IntInt64(redisShardNum) + } + if redisReplicasNum > 0 { + request.RedisReplicasNum = helper.IntInt64(redisReplicasNum) + } if redisName != "" { request.InstanceName = &redisName } diff --git a/website/docs/d/redis_instances.html.markdown b/website/docs/d/redis_instances.html.markdown index ad9c2f2b6a..7a865b0798 100644 --- a/website/docs/d/redis_instances.html.markdown +++ b/website/docs/d/redis_instances.html.markdown @@ -45,10 +45,13 @@ In addition to all arguments above, the following attributes are exported: * `port` - The port used to access a redis instance. * `project_id` - ID of the project to which a redis instance belongs. * `redis_id` - ID of a redis instance. + * `redis_replicas_num` - The number of instance copies. + * `redis_shard_num` - The number of instance shard. * `status` - Current status of an instance, maybe: init, processing, online, isolate and todelete. * `subnet_id` - ID of the vpc subnet. * `tags` - Tags of an instance. - * `type` - Instance type. Available values: master_slave_redis, master_slave_ckv, cluster_ckv, cluster_redis and standalone_redis. + * `type_id` - Instance type. Refer to `data.tencentcloud_redis_zone_config.list.type_id` get available values. + * `type` - (**Deprecated**) It has been deprecated from version 1.33.1. Please use 'type_id' instead. Instance type. Available values: master_slave_redis, master_slave_ckv, cluster_ckv, cluster_redis and standalone_redis. * `vpc_id` - ID of the vpc with which the instance is associated. * `zone` - Available zone to which a redis instance belongs. diff --git a/website/docs/d/redis_zone_config.html.markdown b/website/docs/d/redis_zone_config.html.markdown index 9de22e37b9..82f6335182 100644 --- a/website/docs/d/redis_zone_config.html.markdown +++ b/website/docs/d/redis_zone_config.html.markdown @@ -25,6 +25,7 @@ The following arguments are supported: * `region` - (Optional) Name of a region. If this value is not set, the current region getting from provider's configuration will be used. * `result_output_file` - (Optional) Used to save results. +* `type_id` - (Optional) Instance type id. ## Attributes Reference @@ -32,7 +33,10 @@ In addition to all arguments above, the following attributes are exported: * `list` - A list of zone. Each element contains the following attributes: * `mem_sizes` - The memory volume of an available instance(in MB). - * `type` - Instance type. Available values: master_slave_redis, master_slave_ckv, cluster_ckv, cluster_redis and standalone_redis. + * `redis_replicas_nums` - The support numbers of instance copies. + * `redis_shard_nums` - The support numbers of instance shard. + * `type_id` - Instance type. Which redis type supports in this zone. + * `type` - (**Deprecated**) It has been deprecated from version 1.33.1. Please use 'type_id' instead. Instance type. Available values: master_slave_redis, master_slave_ckv, cluster_ckv, cluster_redis and standalone_redis. * `version` - Version description of an available instance. Possible values: Redis 3.2, Redis 4.0. * `zone` - ID of available zone. diff --git a/website/docs/r/monitor_policy_group.html.markdown b/website/docs/r/monitor_policy_group.html.markdown index fa00a9d939..bdf8ee478e 100644 --- a/website/docs/r/monitor_policy_group.html.markdown +++ b/website/docs/r/monitor_policy_group.html.markdown @@ -63,11 +63,11 @@ The following arguments are supported: The `conditions` object supports the following: -* `alarm_notify_period` - (Required) Alarm sending cycle per second.<0 does not fire, 0 only fires once, and >0 fires every triggerTime second. +* `alarm_notify_period` - (Required) Alarm sending cycle per second. <0 does not fire, 0 only fires once, and >0 fires every triggerTime second. * `alarm_notify_type` - (Required) Alarm sending convergence type. 0 continuous alarm, 1 index alarm. -* `metric_id` - (Required) Id of the metric.refer to `data.tencentcloud_monitor_policy_conditions(metric_id)`. +* `metric_id` - (Required) Id of the metric, refer to `data.tencentcloud_monitor_policy_conditions(metric_id)`. * `calc_period` - (Optional) Data aggregation cycle (unit of second), if the metric has a default value can not be filled, refer to `data.tencentcloud_monitor_policy_conditions(period_keys)`. -* `calc_type` - (Optional) Compare type, 1 means more than, 2 means greater than or equal, 3 means less than, 4 means less than or equal to, 5 means equal, 6 means not equal, 7 means days rose, 8 means days fell, 9 means weeks rose, 10 means weeks fell, 11 means period rise, 12 means period fell. refer to `data.tencentcloud_monitor_policy_conditions(calc_type_keys)`. +* `calc_type` - (Optional) Compare type, 1 means more than, 2 means greater than or equal, 3 means less than, 4 means less than or equal to, 5 means equal, 6 means not equal, 7 means days rose, 8 means days fell, 9 means weeks rose, 10 means weeks fell, 11 means period rise, 12 means period fell, refer to `data.tencentcloud_monitor_policy_conditions(calc_type_keys)`. * `calc_value` - (Optional) Threshold value, refer to `data.tencentcloud_monitor_policy_conditions(calc_value_*)`. * `continue_period` - (Optional) The rule triggers an alert that lasts for several detection cycles, refer to `data.tencentcloud_monitor_policy_conditions(period_num_keys)`. diff --git a/website/docs/r/redis_instance.html.markdown b/website/docs/r/redis_instance.html.markdown index ae1e8c3882..575f55a9db 100644 --- a/website/docs/r/redis_instance.html.markdown +++ b/website/docs/r/redis_instance.html.markdown @@ -13,13 +13,18 @@ Provides a resource to create a Redis instance and set its attributes. ## Example Usage ```hcl -resource "tencentcloud_redis_instance" "redis_instance_test" { - availability_zone = "ap-hongkong-3" - type = "master_slave_redis" - password = "test12345789" - mem_size = 8192 - name = "terrform_test" - port = 6379 +data "tencentcloud_redis_zone_config" "zone" { +} + +resource "tencentcloud_redis_instance" "redis_instance_test_2" { + availability_zone = data.tencentcloud_redis_zone_config.zone.list[0].zone + type_id = data.tencentcloud_redis_zone_config.zone.list[0].type_id + password = "test12345789" + mem_size = 8192 + redis_shard_num = data.tencentcloud_redis_zone_config.zone.list[0].redis_shard_nums[0] + redis_replicas_num = data.tencentcloud_redis_zone_config.zone.list[0].redis_replicas_nums[0] + name = "terrform_test" + port = 6379 } ``` @@ -33,10 +38,13 @@ The following arguments are supported: * `name` - (Optional) Instance name. * `port` - (Optional, ForceNew) The port used to access a redis instance. The default value is 6379. And this value can't be changed after creation, or the Redis instance will be recreated. * `project_id` - (Optional) Specifies which project the instance should belong to. +* `redis_replicas_num` - (Optional, ForceNew) The number of instance copies. This is not required for standalone and master slave versions. +* `redis_shard_num` - (Optional, ForceNew) The number of instance shard. This is not required for standalone and master slave versions. * `security_groups` - (Optional, ForceNew) ID of security group. If both vpc_id and subnet_id are not set, this argument should not be set either. * `subnet_id` - (Optional, ForceNew) Specifies which subnet the instance should belong to. * `tags` - (Optional) Instance tags. -* `type` - (Optional, ForceNew) Instance type. Available values: `cluster_ckv`,`cluster_redis5.0`,`cluster_redis`,`master_slave_ckv`,`master_slave_redis5.0`,`master_slave_redis`,`standalone_redis`, specific region support specific types, need to refer data `tencentcloud_redis_zone_config`. +* `type_id` - (Optional, ForceNew) Instance type. Refer to `data.tencentcloud_redis_zone_config.list.type_id` get available values. +* `type` - (Optional, ForceNew, **Deprecated**) It has been deprecated from version 1.33.1. Please use 'type_id' instead. Instance type. Available values: `cluster_ckv`,`cluster_redis5.0`,`cluster_redis`,`master_slave_ckv`,`master_slave_redis5.0`,`master_slave_redis`,`standalone_redis`, specific region support specific types, need to refer data `tencentcloud_redis_zone_config`. * `vpc_id` - (Optional, ForceNew) ID of the vpc with which the instance is to be associated. ## Attributes Reference