diff --git a/.changelog/2706.txt b/.changelog/2706.txt new file mode 100644 index 0000000000..b91fc7f6d4 --- /dev/null +++ b/.changelog/2706.txt @@ -0,0 +1,7 @@ +```release-note:enhancement +resource/tencentcloud_rum_project: add retry operator +``` + +```release-note:enhancement +resource/tencentcloud_monitor_tmp_alert_group: add retry operator +``` diff --git a/.changelog/2707.txt b/.changelog/2707.txt new file mode 100644 index 0000000000..85214c0bfa --- /dev/null +++ b/.changelog/2707.txt @@ -0,0 +1,3 @@ +```release-note:enhancement +resource/tencentcloud_apm_instance: add retry operator +``` diff --git a/.changelog/2708.txt b/.changelog/2708.txt new file mode 100644 index 0000000000..44937d8c69 --- /dev/null +++ b/.changelog/2708.txt @@ -0,0 +1,3 @@ +```release-note:enhancement +resource/tencentcloud_elasticsearch_instance: support es kibana switch +``` diff --git a/.changelog/2709.txt b/.changelog/2709.txt new file mode 100644 index 0000000000..9d7c0fe877 --- /dev/null +++ b/.changelog/2709.txt @@ -0,0 +1,3 @@ +```release-note:enhancement +resource/tencentcloud_postgresql_readonly_group: support import +``` diff --git a/CHANGELOG.md b/CHANGELOG.md index 17e351f481..0fecfc679f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,15 @@ +## 1.81.107 (July 5, 2024) + +ENHANCEMENTS: + +* resource/tencentcloud_apm_instance: add retry operator ([#2707](https://github.com/tencentcloudstack/terraform-provider-tencentcloud/pull/2707)) +* resource/tencentcloud_elasticsearch_instance: support es kibana switch ([#2708](https://github.com/tencentcloudstack/terraform-provider-tencentcloud/pull/2708)) +* resource/tencentcloud_monitor_tmp_instance: update document ([#2704](https://github.com/tencentcloudstack/terraform-provider-tencentcloud/pull/2704)) +* resource/tencentcloud_postgresql_readonly_group: support import ([#2709](https://github.com/tencentcloudstack/terraform-provider-tencentcloud/pull/2709)) +* resource/tencentcloud_tdmq_rabbitmq_user: supports return `max_connections`, `max_channels` params; supports import this resource ([#2703](https://github.com/tencentcloudstack/terraform-provider-tencentcloud/pull/2703)) +* resource/tencentcloud_tdmq_rabbitmq_vip_instance: update document ([#2703](https://github.com/tencentcloudstack/terraform-provider-tencentcloud/pull/2703)) +* resource/tencentcloud_tdmq_rabbitmq_virtual_host: supports set `trace_flag` params; supports import this resource ([#2703](https://github.com/tencentcloudstack/terraform-provider-tencentcloud/pull/2703)) + ## 1.81.106 (June 28, 2024) FEATURES: diff --git a/tencentcloud/acctest/basic.go b/tencentcloud/acctest/basic.go index 5eb5cce9b3..2313184478 100644 --- a/tencentcloud/acctest/basic.go +++ b/tencentcloud/acctest/basic.go @@ -1148,6 +1148,8 @@ const ( DefaultEsInstanceId = "es-5wn36he6" DefaultEsSecurityGroup = "sg-edmur627" DefaultEsLogstash = "ls-kru90fkz" + DefaultEsVpcId = "vpc-lrj71tt3" + DefaultEsSubnetId = "subnet-kggvos8o" ) const DefaultEsVariables = ` @@ -1162,6 +1164,18 @@ variable "security_group_id" { variable "logstash_id" { default = "` + DefaultEsLogstash + `" } + +variable "availability_zone" { + default = "ap-guangzhou-3" +} + +variable "vpc_id" { + default = "` + DefaultEsVpcId + `" +} + +variable "subnet_id" { + default = "` + DefaultEsSubnetId + `" +} ` // End of TSE diff --git a/tencentcloud/services/apm/resource_tc_apm_instance.go b/tencentcloud/services/apm/resource_tc_apm_instance.go index 6b1a9668bc..78ea9806d9 100644 --- a/tencentcloud/services/apm/resource_tc_apm_instance.go +++ b/tencentcloud/services/apm/resource_tc_apm_instance.go @@ -68,13 +68,13 @@ func resourceTencentCloudApmInstanceCreate(d *schema.ResourceData, meta interfac defer tccommon.LogElapsed("resource.tencentcloud_apm_instance.create")() defer tccommon.InconsistentCheck(d, meta)() - logId := tccommon.GetLogId(tccommon.ContextNil) - var ( + logId = tccommon.GetLogId(tccommon.ContextNil) request = apm.NewCreateApmInstanceRequest() response = apm.NewCreateApmInstanceResponse() instanceId string ) + if v, ok := d.GetOk("name"); ok { request.Name = helper.String(v.(string)) } @@ -102,9 +102,11 @@ func resourceTencentCloudApmInstanceCreate(d *schema.ResourceData, meta interfac } else { log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString()) } + response = result return nil }) + if err != nil { log.Printf("[CRITAL]%s create apm instance failed, reason:%+v", logId, err) return err @@ -130,15 +132,24 @@ func resourceTencentCloudApmInstanceRead(d *schema.ResourceData, meta interface{ defer tccommon.LogElapsed("resource.tencentcloud_apm_instance.read")() defer tccommon.InconsistentCheck(d, meta)() - logId := tccommon.GetLogId(tccommon.ContextNil) - - ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + service = ApmService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + instance *apm.ApmInstanceDetail + instanceId = d.Id() + ) - service := ApmService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + err := resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError { + result, err := service.DescribeApmInstanceById(ctx, instanceId) + if err != nil { + return tccommon.RetryError(err) + } - instanceId := d.Id() + instance = result + return nil + }) - instance, err := service.DescribeApmInstanceById(ctx, instanceId) if err != nil { return err } @@ -184,18 +195,16 @@ func resourceTencentCloudApmInstanceUpdate(d *schema.ResourceData, meta interfac defer tccommon.LogElapsed("resource.tencentcloud_apm_instance.update")() defer tccommon.InconsistentCheck(d, meta)() - logId := tccommon.GetLogId(tccommon.ContextNil) - - request := apm.NewModifyApmInstanceRequest() + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + request = apm.NewModifyApmInstanceRequest() + instanceId = d.Id() + ) needChange := false - - instanceId := d.Id() - request.InstanceId = &instanceId mutableArgs := []string{"name", "description", "trace_duration", "span_daily_counters", "pay_mode"} - for _, v := range mutableArgs { if d.HasChange(v) { needChange = true @@ -204,7 +213,6 @@ func resourceTencentCloudApmInstanceUpdate(d *schema.ResourceData, meta interfac } if needChange { - if v, ok := d.GetOk("name"); ok { request.Name = helper.String(v.(string)) } @@ -232,13 +240,14 @@ func resourceTencentCloudApmInstanceUpdate(d *schema.ResourceData, meta interfac } else { log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString()) } + return nil }) + if err != nil { log.Printf("[CRITAL]%s update apm instance failed, reason:%+v", logId, err) return err } - } if d.HasChange("tags") { @@ -260,11 +269,12 @@ func resourceTencentCloudApmInstanceDelete(d *schema.ResourceData, meta interfac defer tccommon.LogElapsed("resource.tencentcloud_apm_instance.delete")() defer tccommon.InconsistentCheck(d, meta)() - logId := tccommon.GetLogId(tccommon.ContextNil) - ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) - - service := ApmService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} - instanceId := d.Id() + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + service = ApmService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + instanceId = d.Id() + ) if err := service.DeleteApmInstanceById(ctx, instanceId); err != nil { return err diff --git a/tencentcloud/services/apm/resource_tc_apm_instance.md b/tencentcloud/services/apm/resource_tc_apm_instance.md index c2ad72996e..f8d8674afa 100644 --- a/tencentcloud/services/apm/resource_tc_apm_instance.md +++ b/tencentcloud/services/apm/resource_tc_apm_instance.md @@ -5,13 +5,13 @@ Provides a resource to create a apm instance Example Usage ```hcl -resource "tencentcloud_apm_instance" "instance" { - name = "terraform-test" - description = "for terraform test" - trace_duration = 15 - span_daily_counters = 20 +resource "tencentcloud_apm_instance" "example" { + name = "tf-example" + description = "desc." + trace_duration = 15 + span_daily_counters = 0 tags = { - "createdBy" = "terraform" + createdBy = "terraform" } } ``` @@ -21,5 +21,5 @@ Import apm instance can be imported using the id, e.g. ``` -terraform import tencentcloud_apm_instance.instance instance_id -``` \ No newline at end of file +terraform import tencentcloud_apm_instance.example apm-IMVrxXl1K +``` diff --git a/tencentcloud/services/apm/resource_tc_apm_instance_test.go b/tencentcloud/services/apm/resource_tc_apm_instance_test.go index dcccd6923a..a72d6295cf 100644 --- a/tencentcloud/services/apm/resource_tc_apm_instance_test.go +++ b/tencentcloud/services/apm/resource_tc_apm_instance_test.go @@ -8,6 +8,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" ) +// go test -i; go test -test.run TestAccTencentCloudApmInstanceResource_basic -v func TestAccTencentCloudApmInstanceResource_basic(t *testing.T) { t.Parallel() resource.Test(t, resource.TestCase{ @@ -18,17 +19,26 @@ func TestAccTencentCloudApmInstanceResource_basic(t *testing.T) { Steps: []resource.TestStep{ { Config: testAccApmInstance, - Check: resource.ComposeTestCheckFunc(resource.TestCheckResourceAttrSet("tencentcloud_apm_instance.instance", "id")), + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttrSet("tencentcloud_apm_instance.example", "id"), + resource.TestCheckResourceAttr("tencentcloud_apm_instance.example", "name", "tf-example"), + resource.TestCheckResourceAttr("tencentcloud_apm_instance.example", "description", "desc."), + resource.TestCheckResourceAttr("tencentcloud_apm_instance.example", "trace_duration", "15"), + resource.TestCheckResourceAttr("tencentcloud_apm_instance.example", "span_daily_counters", "20"), + ), }, { Config: testAccApmInstanceUpdate, Check: resource.ComposeTestCheckFunc( - resource.TestCheckResourceAttrSet("tencentcloud_apm_instance.instance", "id"), - resource.TestCheckResourceAttr("tencentcloud_apm_instance.instance", "name", "terraform-for-test"), + resource.TestCheckResourceAttrSet("tencentcloud_apm_instance.example", "id"), + resource.TestCheckResourceAttr("tencentcloud_apm_instance.example", "name", "tf-example-update"), + resource.TestCheckResourceAttr("tencentcloud_apm_instance.example", "description", "desc update."), + resource.TestCheckResourceAttr("tencentcloud_apm_instance.example", "trace_duration", "15"), + resource.TestCheckResourceAttr("tencentcloud_apm_instance.example", "span_daily_counters", "20"), ), }, { - ResourceName: "tencentcloud_apm_instance.instance", + ResourceName: "tencentcloud_apm_instance.example", ImportState: true, ImportStateVerify: true, }, @@ -37,23 +47,25 @@ func TestAccTencentCloudApmInstanceResource_basic(t *testing.T) { } const testAccApmInstance = ` - -resource "tencentcloud_apm_instance" "instance" { - name = "terraform-test" - description = "for terraform test" - trace_duration = 15 - span_daily_counters = 20 +resource "tencentcloud_apm_instance" "example" { + name = "tf-example" + description = "desc." + trace_duration = 15 + span_daily_counters = 0 + tags = { + createdBy = "terraform" + } } - ` const testAccApmInstanceUpdate = ` - -resource "tencentcloud_apm_instance" "instance" { - name = "terraform-for-test" - description = "for terraform test" - trace_duration = 15 - span_daily_counters = 20 +resource "tencentcloud_apm_instance" "example" { + name = "tf-example-update" + description = "desc update." + trace_duration = 15 + span_daily_counters = 0 + tags = { + createdBy = "terraform" + } } - ` diff --git a/tencentcloud/services/cvm/resource_tc_instance.go b/tencentcloud/services/cvm/resource_tc_instance.go index b2e8ff3e2f..d772e7a26b 100644 --- a/tencentcloud/services/cvm/resource_tc_instance.go +++ b/tencentcloud/services/cvm/resource_tc_instance.go @@ -697,6 +697,9 @@ func resourceTencentCloudInstanceCreate(d *schema.ResourceData, meta interface{} } if instance != nil && *instance.InstanceState == CVM_STATUS_LAUNCH_FAILED { //LatestOperationCodeMode + if instance.LatestOperationErrorMsg != nil { + return resource.NonRetryableError(fmt.Errorf("cvm instance %s launch failed. Error msg: %s.\n", *instance.InstanceId, *instance.LatestOperationErrorMsg)) + } return resource.NonRetryableError(fmt.Errorf("cvm instance %s launch failed, this resource will not be stored to tfstate and will auto removed\n.", *instance.InstanceId)) } if instance != nil && *instance.InstanceState == CVM_STATUS_RUNNING { diff --git a/tencentcloud/services/es/extension_elasticsearch.go b/tencentcloud/services/es/extension_elasticsearch.go index a7832e65e6..0ac8c49dde 100644 --- a/tencentcloud/services/es/extension_elasticsearch.go +++ b/tencentcloud/services/es/extension_elasticsearch.go @@ -31,6 +31,9 @@ const ( ES_INSTANCE_STATUS_STOP = -1 ES_INSTANCE_STATUS_DESTROYING = -2 ES_INSTANCE_STATUS_DESTROYED = -3 + + ES_KIBANA_PUBLIC_ACCESS_OPEN = "OPEN" + ES_KIBANA_PUBLIC_ACCESS_CLOSE = "CLOSE" ) var ES_CHARGE_TYPE = []string{ @@ -70,3 +73,8 @@ var ES_RENEW_FLAG = []string{ ES_RENEW_FLAG_AUTO, ES_RENEW_FLAG_MANUAL, } + +var ES_KIBANA_PUBLIC_ACCESS = []string{ + ES_KIBANA_PUBLIC_ACCESS_OPEN, + ES_KIBANA_PUBLIC_ACCESS_CLOSE, +} diff --git a/tencentcloud/services/es/resource_tc_elasticsearch_instance.go b/tencentcloud/services/es/resource_tc_elasticsearch_instance.go index 62f464591c..4e27f2ee99 100644 --- a/tencentcloud/services/es/resource_tc_elasticsearch_instance.go +++ b/tencentcloud/services/es/resource_tc_elasticsearch_instance.go @@ -126,6 +126,7 @@ func ResourceTencentCloudElasticsearchInstance() *schema.Resource { "web_node_type_info": { Type: schema.TypeList, Optional: true, + Computed: true, Description: "Visual node configuration.", Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ @@ -234,7 +235,13 @@ func ResourceTencentCloudElasticsearchInstance() *schema.Resource { Optional: true, Description: "A mapping of tags to assign to the instance. For tag limits, please refer to [Use Limits](https://intl.cloud.tencent.com/document/product/651/13354).", }, - + "kibana_public_access": { + Type: schema.TypeString, + Optional: true, + Computed: true, + ValidateFunc: tccommon.ValidateAllowedStringValue(ES_KIBANA_PUBLIC_ACCESS), + Description: "Kibana public network access status. Valid values are `OPEN` and `CLOSE`.", + }, // computed "elasticsearch_domain": { Type: schema.TypeString, @@ -412,6 +419,7 @@ func resourceTencentCloudElasticsearchInstanceCreate(d *schema.ResourceData, met return err } + var isUpdate bool // es acl esAcl := es.EsAcl{} if aclMap, ok := helper.InterfacesHeadMap(d, "es_acl"); ok { @@ -427,17 +435,31 @@ func resourceTencentCloudElasticsearchInstanceCreate(d *schema.ResourceData, met esAcl.WhiteIpList = append(esAcl.WhiteIpList, helper.String(d.(string))) } } + isUpdate = true } - err = resource.Retry(tccommon.WriteRetryTimeout*2, func() *resource.RetryError { - errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", 0, nil, nil, &esAcl) - if errRet != nil { - return tccommon.RetryError(errRet) + // KibanaPublicAccess + var kibanaPublicAccess string + if v, ok := d.GetOk("kibana_public_access"); ok { + kibanaPublicAccess = v.(string) + isUpdate = true + } + if isUpdate { + err = resource.Retry(tccommon.WriteRetryTimeout*2, func() *resource.RetryError { + errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", kibanaPublicAccess, 0, nil, nil, &esAcl) + if errRet != nil { + return tccommon.RetryError(errRet) + } + return nil + }) + if err != nil { + return err + } + + err = tencentCloudElasticsearchInstanceUpgradeWaiting(ctx, &elasticsearchService, instanceId) + if err != nil { + return err } - return nil - }) - if err != nil { - return err } // tags @@ -501,6 +523,7 @@ func resourceTencentCloudElasticsearchInstanceRead(d *schema.ResourceData, meta _ = d.Set("elasticsearch_port", instance.EsPort) _ = d.Set("kibana_url", instance.KibanaUrl) _ = d.Set("create_time", instance.CreateTime) + _ = d.Set("kibana_public_access", instance.KibanaPublicAccess) multiZoneInfos := make([]map[string]interface{}, 0, len(instance.MultiZoneInfo)) for _, item := range instance.MultiZoneInfo { @@ -572,7 +595,7 @@ func resourceTencentCloudElasticsearchInstanceUpdate(d *schema.ResourceData, met instanceName := d.Get("instance_name").(string) // Update operation support at most one item at the same time err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { - errRet := elasticsearchService.UpdateInstance(ctx, instanceId, instanceName, "", 0, nil, nil, nil) + errRet := elasticsearchService.UpdateInstance(ctx, instanceId, instanceName, "", "", 0, nil, nil, nil) if errRet != nil { return tccommon.RetryError(errRet) } @@ -581,11 +604,15 @@ func resourceTencentCloudElasticsearchInstanceUpdate(d *schema.ResourceData, met if err != nil { return err } + err = tencentCloudElasticsearchInstanceUpgradeWaiting(ctx, &elasticsearchService, instanceId) + if err != nil { + return err + } } if d.HasChange("password") { password := d.Get("password").(string) err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { - errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", password, 0, nil, nil, nil) + errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", password, "", 0, nil, nil, nil) if errRet != nil { return tccommon.RetryError(errRet) } @@ -594,8 +621,32 @@ func resourceTencentCloudElasticsearchInstanceUpdate(d *schema.ResourceData, met if err != nil { return err } + err = tencentCloudElasticsearchInstanceUpgradeWaiting(ctx, &elasticsearchService, instanceId) + if err != nil { + return err + } } + // KibanaPublicAccess + if d.HasChange("kibana_public_access") { + if v, ok := d.GetOk("kibana_public_access"); ok { + err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { + errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", v.(string), 0, nil, nil, nil) + if errRet != nil { + return tccommon.RetryError(errRet) + } + return nil + }) + if err != nil { + return err + } + err = tencentCloudElasticsearchInstanceUpgradeWaiting(ctx, &elasticsearchService, instanceId) + if err != nil { + return err + } + } + + } if d.HasChange("version") { version := d.Get("version").(string) err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { @@ -639,7 +690,7 @@ func resourceTencentCloudElasticsearchInstanceUpdate(d *schema.ResourceData, met licenseType := d.Get("license_type").(string) licenseTypeUpgrading := licenseType != "oss" err := resource.Retry(tccommon.WriteRetryTimeout*2, func() *resource.RetryError { - errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", int64(basicSecurityType), nil, nil, nil) + errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", "", int64(basicSecurityType), nil, nil, nil) if errRet != nil { err := errRet.(*sdkErrors.TencentCloudSDKError) if err.Code == es.INVALIDPARAMETER && licenseTypeUpgrading { @@ -670,7 +721,7 @@ func resourceTencentCloudElasticsearchInstanceUpdate(d *schema.ResourceData, met NodeType: helper.String(value["node_type"].(string)), } err = resource.Retry(tccommon.WriteRetryTimeout*2, func() *resource.RetryError { - errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", 0, nil, info, nil) + errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", "", 0, nil, info, nil) if errRet != nil { return tccommon.RetryError(errRet) } @@ -709,7 +760,7 @@ func resourceTencentCloudElasticsearchInstanceUpdate(d *schema.ResourceData, met nodeInfoList = append(nodeInfoList, &dataDisk) } err := resource.Retry(tccommon.WriteRetryTimeout*2, func() *resource.RetryError { - errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", 0, nodeInfoList, nil, nil) + errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", "", 0, nodeInfoList, nil, nil) if errRet != nil { return tccommon.RetryError(errRet) } @@ -760,7 +811,7 @@ func resourceTencentCloudElasticsearchInstanceUpdate(d *schema.ResourceData, met } err := resource.Retry(tccommon.WriteRetryTimeout*2, func() *resource.RetryError { - errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", 0, nil, nil, &esAcl) + errRet := elasticsearchService.UpdateInstance(ctx, instanceId, "", "", "", 0, nil, nil, &esAcl) if errRet != nil { return tccommon.RetryError(errRet) } @@ -769,6 +820,10 @@ func resourceTencentCloudElasticsearchInstanceUpdate(d *schema.ResourceData, met if err != nil { return err } + err = tencentCloudElasticsearchInstanceUpgradeWaiting(ctx, &elasticsearchService, instanceId) + if err != nil { + return err + } } d.Partial(false) diff --git a/tencentcloud/services/es/resource_tc_elasticsearch_instance_test.go b/tencentcloud/services/es/resource_tc_elasticsearch_instance_test.go index 6fda3a54df..188d476734 100644 --- a/tencentcloud/services/es/resource_tc_elasticsearch_instance_test.go +++ b/tencentcloud/services/es/resource_tc_elasticsearch_instance_test.go @@ -80,10 +80,10 @@ func TestAccTencentCloudElasticsearchInstanceResource_basic(t *testing.T) { resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.foo", "instance_name", "tf-ci-test"), resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.foo", "availability_zone", tcacctest.DefaultAZone), resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.foo", "version", "7.10.1"), - resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.foo", "vpc_id", tcacctest.DefaultVpcId), - resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.foo", "subnet_id", tcacctest.DefaultSubnetId), + resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.foo", "vpc_id", tcacctest.DefaultEsVpcId), + resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.foo", "subnet_id", tcacctest.DefaultEsSubnetId), resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.foo", "license_type", "basic"), - resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.foo", "basic_security_type", "1"), + resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.foo", "basic_security_type", "2"), resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.foo", "web_node_type_info.#", "1"), resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.foo", "web_node_type_info.0.node_num", "1"), resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.foo", "web_node_type_info.0.node_type", "ES.S1.MEDIUM4"), @@ -92,6 +92,7 @@ func TestAccTencentCloudElasticsearchInstanceResource_basic(t *testing.T) { resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.foo", "node_info_list.0.type", "hotData"), resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.foo", "node_info_list.0.encrypt", "false"), resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.foo", "tags.test", "terraform"), + resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.foo", "kibana_public_access", "OPEN"), ), }, { @@ -119,6 +120,31 @@ func TestAccTencentCloudElasticsearchInstanceResource_basic(t *testing.T) { }, }) } +func TestAccTencentCloudElasticsearchInstanceResource_kibanaPublicAccess(t *testing.T) { + t.Parallel() + + resource.Test(t, resource.TestCase{ + PreCheck: func() { tcacctest.AccPreCheck(t) }, + Providers: tcacctest.AccProviders, + CheckDestroy: testAccCheckElasticsearchInstanceDestroy, + Steps: []resource.TestStep{ + { + Config: testAccElasticsearchInstanceKibanaPublicAccessClose, + Check: resource.ComposeTestCheckFunc( + testAccCheckElasticsearchInstanceExists("tencentcloud_elasticsearch_instance.es_kibana"), + resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.es_kibana", "kibana_public_access", "CLOSE"), + ), + }, + { + Config: testAccElasticsearchInstanceKibanaPublicAccessOpen, + Check: resource.ComposeTestCheckFunc( + testAccCheckElasticsearchInstanceExists("tencentcloud_elasticsearch_instance.es_kibana"), + resource.TestCheckResourceAttr("tencentcloud_elasticsearch_instance.es_kibana", "kibana_public_access", "OPEN"), + ), + }, + }, + }) +} func testAccCheckElasticsearchInstanceDestroy(s *terraform.State) error { logId := tccommon.GetLogId(tccommon.ContextNil) @@ -182,7 +208,7 @@ func testAccCheckElasticsearchInstanceExists(n string) resource.TestCheckFunc { } } -const testAccElasticsearchInstance = tcacctest.DefaultVpcVariable + ` +const testAccElasticsearchInstance = tcacctest.DefaultEsVariables + ` resource "tencentcloud_elasticsearch_instance" "foo" { instance_name = "tf-ci-test" availability_zone = var.availability_zone @@ -218,7 +244,7 @@ resource "tencentcloud_elasticsearch_instance" "foo" { } ` -const testAccElasticsearchInstanceUpdate = tcacctest.DefaultVpcVariable + ` +const testAccElasticsearchInstanceUpdate = tcacctest.DefaultEsVariables + ` resource "tencentcloud_elasticsearch_instance" "foo" { instance_name = "tf-ci-test-update" availability_zone = var.availability_zone @@ -253,3 +279,41 @@ resource "tencentcloud_elasticsearch_instance" "foo" { } } ` + +const testAccElasticsearchInstanceKibanaPublicAccessClose = tcacctest.DefaultEsVariables + ` +resource "tencentcloud_elasticsearch_instance" "es_kibana" { + instance_name = "tf-ci-test-kibana" + availability_zone = var.availability_zone + version = "7.10.1" + vpc_id = var.vpc_id + subnet_id = var.subnet_id + password = "Test1234" + license_type = "basic" + basic_security_type = 2 + kibana_public_access = "CLOSE" + + node_info_list { + node_num = 2 + node_type = "ES.S1.MEDIUM4" + } + } +` + +const testAccElasticsearchInstanceKibanaPublicAccessOpen = tcacctest.DefaultEsVariables + ` +resource "tencentcloud_elasticsearch_instance" "es_kibana" { + instance_name = "tf-ci-test-kibana" + availability_zone = var.availability_zone + version = "7.10.1" + vpc_id = var.vpc_id + subnet_id = var.subnet_id + password = "Test1234" + license_type = "basic" + basic_security_type = 2 + kibana_public_access = "OPEN" + + node_info_list { + node_num = 2 + node_type = "ES.S1.MEDIUM4" + } + } +` diff --git a/tencentcloud/services/es/service_tencentcloud_elasticsearch.go b/tencentcloud/services/es/service_tencentcloud_elasticsearch.go index cd06efca8a..1b2a75d8b2 100644 --- a/tencentcloud/services/es/service_tencentcloud_elasticsearch.go +++ b/tencentcloud/services/es/service_tencentcloud_elasticsearch.go @@ -107,7 +107,7 @@ func (me *ElasticsearchService) DeleteInstance(ctx context.Context, instanceId s } // UpdateInstance FIXME: use *Request instead of these suck params -func (me *ElasticsearchService) UpdateInstance(ctx context.Context, instanceId, instanceName, password string, basicSecurityType int64, nodeList []*es.NodeInfo, nodeTypeInfo *es.WebNodeTypeInfo, esAcl *es.EsAcl) error { +func (me *ElasticsearchService) UpdateInstance(ctx context.Context, instanceId, instanceName, password, kibanaPublicAccess string, basicSecurityType int64, nodeList []*es.NodeInfo, nodeTypeInfo *es.WebNodeTypeInfo, esAcl *es.EsAcl) error { logId := tccommon.GetLogId(ctx) request := es.NewUpdateInstanceRequest() request.InstanceId = &instanceId @@ -117,6 +117,9 @@ func (me *ElasticsearchService) UpdateInstance(ctx context.Context, instanceId, if password != "" { request.Password = &password } + if kibanaPublicAccess != "" { + request.KibanaPublicAccess = &kibanaPublicAccess + } if basicSecurityType > 0 { request.BasicSecurityType = &basicSecurityType } diff --git a/tencentcloud/services/postgresql/resource_tc_postgresql_readonly_group.go b/tencentcloud/services/postgresql/resource_tc_postgresql_readonly_group.go index 3e85f36085..5158e35bda 100644 --- a/tencentcloud/services/postgresql/resource_tc_postgresql_readonly_group.go +++ b/tencentcloud/services/postgresql/resource_tc_postgresql_readonly_group.go @@ -21,10 +21,9 @@ func ResourceTencentCloudPostgresqlReadonlyGroup() *schema.Resource { Read: resourceTencentCloudPostgresqlReadOnlyGroupRead, Update: resourceTencentCloudPostgresqlReadOnlyGroupUpdate, Delete: resourceTencentCLoudPostgresqlReadOnlyGroupDelete, - //Importer: &schema.ResourceImporter{ - // State: schema.ImportStatePassthrough, - //}, - + Importer: &schema.ResourceImporter{ + State: schema.ImportStatePassthrough, + }, Schema: map[string]*schema.Schema{ "master_db_instance_id": { Type: schema.TypeString, @@ -52,25 +51,6 @@ func ResourceTencentCloudPostgresqlReadonlyGroup() *schema.Resource { Required: true, Description: "VPC subnet ID.", }, - "net_info_list": { - Type: schema.TypeList, - Computed: true, - Description: "List of db instance net info.", - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "ip": { - Type: schema.TypeString, - Computed: true, - Description: "Ip address of the net info.", - }, - "port": { - Type: schema.TypeInt, - Computed: true, - Description: "Port of the net info.", - }, - }, - }, - }, "replay_lag_eliminate": { Type: schema.TypeInt, Required: true, @@ -110,6 +90,25 @@ func ResourceTencentCloudPostgresqlReadonlyGroup() *schema.Resource { Computed: true, Description: "Create time of the postgresql instance.", }, + "net_info_list": { + Type: schema.TypeList, + Computed: true, + Description: "List of db instance net info.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "ip": { + Type: schema.TypeString, + Computed: true, + Description: "Ip address of the net info.", + }, + "port": { + Type: schema.TypeInt, + Computed: true, + Description: "Port of the net info.", + }, + }, + }, + }, }, } } @@ -117,47 +116,53 @@ func ResourceTencentCloudPostgresqlReadonlyGroup() *schema.Resource { func resourceTencentCloudPostgresqlReadOnlyGroupCreate(d *schema.ResourceData, meta interface{}) error { defer tccommon.LogElapsed("resource.tencentcloud_postgresql_readonly_group.create")() - logId := tccommon.GetLogId(tccommon.ContextNil) - var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + postgresqlService = PostgresqlService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} request = postgresql.NewCreateReadOnlyGroupRequest() response *postgresql.CreateReadOnlyGroupResponse - msaterDbInstanceId string + masterDbInstanceId string ) + if v, ok := d.GetOk("master_db_instance_id"); ok { request.MasterDBInstanceId = helper.String(v.(string)) - msaterDbInstanceId = v.(string) + masterDbInstanceId = v.(string) } + if v, ok := d.GetOk("name"); ok { request.Name = helper.String(v.(string)) } - if v, ok := d.GetOk("project_id"); ok { + + if v, ok := d.GetOkExists("project_id"); ok { request.ProjectId = helper.IntUint64(v.(int)) } + if v, ok := d.GetOk("vpc_id"); ok { request.VpcId = helper.String(v.(string)) } + if v, ok := d.GetOk("subnet_id"); ok { request.SubnetId = helper.String(v.(string)) } - if v, ok := d.GetOk("replay_lag_eliminate"); ok { + if v, ok := d.GetOkExists("replay_lag_eliminate"); ok { request.ReplayLagEliminate = helper.IntUint64(v.(int)) } - if v, ok := d.GetOk("replay_latency_eliminate"); ok { + if v, ok := d.GetOkExists("replay_latency_eliminate"); ok { request.ReplayLatencyEliminate = helper.IntUint64(v.(int)) } - if v, ok := d.GetOk("max_replay_lag"); ok { + if v, ok := d.GetOkExists("max_replay_lag"); ok { request.MaxReplayLag = helper.IntUint64(v.(int)) } - if v, ok := d.GetOk("max_replay_latency"); ok { + if v, ok := d.GetOkExists("max_replay_latency"); ok { request.MaxReplayLatency = helper.IntUint64(v.(int)) } - if v, ok := d.GetOk("min_delay_eliminate_reserve"); ok { + if v, ok := d.GetOkExists("min_delay_eliminate_reserve"); ok { request.MinDelayEliminateReserve = helper.IntUint64(v.(int)) } @@ -177,35 +182,37 @@ func resourceTencentCloudPostgresqlReadOnlyGroupCreate(d *schema.ResourceData, m log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString()) } + response = result return nil }) + if err != nil { return err } - instanceId := *response.Response.ReadOnlyGroupId - d.SetId(instanceId) - ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) - postgresqlService := PostgresqlService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + readOnlyGroupId := *response.Response.ReadOnlyGroupId + d.SetId(readOnlyGroupId) err = resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { - groups, e := postgresqlService.DescribePostgresqlReadOnlyGroupById(ctx, msaterDbInstanceId) + groups, e := postgresqlService.DescribePostgresqlReadOnlyGroupById(ctx, masterDbInstanceId) if e != nil { return tccommon.RetryError(e) } var status string for _, gg := range groups { - if *gg.ReadOnlyGroupId == instanceId { + if *gg.ReadOnlyGroupId == readOnlyGroupId { status = *gg.Status if status == "ok" { return nil } } } + return resource.RetryableError(fmt.Errorf("waiting status[%s] to running, retry... ", status)) }) + if err != nil { return err } @@ -216,49 +223,97 @@ func resourceTencentCloudPostgresqlReadOnlyGroupCreate(d *schema.ResourceData, m func resourceTencentCloudPostgresqlReadOnlyGroupRead(d *schema.ResourceData, meta interface{}) error { defer tccommon.LogElapsed("resource.tencentcloud_postgresql_readonly_group.read")() - logId := tccommon.GetLogId(tccommon.ContextNil) - ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) - - // for now, the id should be the master db instance id, cause the describe api only support this kind of filter. - var masterInsId string - if v, ok := d.GetOk("master_db_instance_id"); ok { - masterInsId = v.(string) - } - roGroupId := d.Id() + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + postgresqlService = PostgresqlService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + readOnlyGroupId = d.Id() + ) - postgresqlService := PostgresqlService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} - netInfos, err := postgresqlService.DescribePostgresqlReadonlyGroupNetInfosById(ctx, masterInsId, roGroupId) + readOnlyGroupInfo, err := postgresqlService.DescribePostgresqlReadonlyGroupsById(ctx, readOnlyGroupId) if err != nil { return err } - if netInfos != nil { + if readOnlyGroupInfo.MasterDBInstanceId != nil { + _ = d.Set("master_db_instance_id", readOnlyGroupInfo.MasterDBInstanceId) + } + + if readOnlyGroupInfo.ReadOnlyGroupName != nil { + _ = d.Set("name", readOnlyGroupInfo.ReadOnlyGroupName) + } + + if readOnlyGroupInfo.ProjectId != nil { + _ = d.Set("project_id", readOnlyGroupInfo.ProjectId) + } + + if readOnlyGroupInfo.VpcId != nil { + _ = d.Set("vpc_id", readOnlyGroupInfo.VpcId) + } + + if readOnlyGroupInfo.SubnetId != nil { + _ = d.Set("subnet_id", readOnlyGroupInfo.SubnetId) + } + + if readOnlyGroupInfo.ReplayLagEliminate != nil { + _ = d.Set("replay_lag_eliminate", readOnlyGroupInfo.ReplayLagEliminate) + } + + if readOnlyGroupInfo.ReplayLatencyEliminate != nil { + _ = d.Set("replay_latency_eliminate", readOnlyGroupInfo.ReplayLatencyEliminate) + } + + if readOnlyGroupInfo.MaxReplayLag != nil { + _ = d.Set("max_replay_lag", readOnlyGroupInfo.MaxReplayLag) + } + + if readOnlyGroupInfo.MaxReplayLatency != nil { + _ = d.Set("max_replay_latency", readOnlyGroupInfo.MaxReplayLatency) + } + + if readOnlyGroupInfo.MinDelayEliminateReserve != nil { + _ = d.Set("min_delay_eliminate_reserve", readOnlyGroupInfo.MinDelayEliminateReserve) + } + + if readOnlyGroupInfo.DBInstanceNetInfo != nil { netInfoList := []interface{}{} - for _, netInfo := range netInfos { + for _, netInfo := range readOnlyGroupInfo.DBInstanceNetInfo { netInfoMap := map[string]interface{}{} - if netInfo.Ip != nil { netInfoMap["ip"] = *netInfo.Ip } + if netInfo.Port != nil { netInfoMap["port"] = helper.UInt64Int64(*netInfo.Port) } + netInfoList = append(netInfoList, netInfoMap) } + _ = d.Set("net_info_list", netInfoList) } + // security groups + sg, err := postgresqlService.DescribeDBInstanceSecurityGroupsByGroupId(ctx, readOnlyGroupId) + if err != nil { + return err + } + + if len(sg) > 0 { + _ = d.Set("security_groups_ids", sg) + } + return nil } func resourceTencentCloudPostgresqlReadOnlyGroupUpdate(d *schema.ResourceData, meta interface{}) error { defer tccommon.LogElapsed("resource.tencentcloud_postgresql_readonly_group.update")() - logId := tccommon.GetLogId(tccommon.ContextNil) - ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) - request := postgresql.NewModifyReadOnlyGroupConfigRequest() - - request.ReadOnlyGroupId = helper.String(d.Id()) + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + service = PostgresqlService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + ) // update vpc and subnet if d.HasChange("vpc_id") || d.HasChange("subnet_id") { @@ -269,17 +324,18 @@ func resourceTencentCloudPostgresqlReadOnlyGroupUpdate(d *schema.ResourceData, m subnetNew string vipOld string vipNew string - msaterDbInstanceId string + masterDbInstanceId string ) if v, ok := d.GetOk("master_db_instance_id"); ok { - msaterDbInstanceId = v.(string) + masterDbInstanceId = v.(string) } old, new := d.GetChange("vpc_id") if old != nil { vpcOld = old.(string) } + if new != nil { vpcNew = new.(string) } @@ -288,13 +344,13 @@ func resourceTencentCloudPostgresqlReadOnlyGroupUpdate(d *schema.ResourceData, m if old != nil { subnetOld = old.(string) } + if new != nil { subnetNew = new.(string) } - service := PostgresqlService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} // get the old ip before creating - netInfos, err := service.DescribePostgresqlReadonlyGroupNetInfosById(ctx, msaterDbInstanceId, d.Id()) + netInfos, err := service.DescribePostgresqlReadonlyGroupNetInfosById(ctx, masterDbInstanceId, d.Id()) if err != nil { return err } @@ -328,15 +384,17 @@ func resourceTencentCloudPostgresqlReadOnlyGroupUpdate(d *schema.ResourceData, m } else { log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString()) } + return nil }) + if err != nil { log.Printf("[CRITAL]%s create postgresql ReadOnlyGroup NetworkAccess failed, reason:%+v", logId, err) return err } // wait for new network enabled - conf := tccommon.BuildStateChangeConf([]string{}, []string{"opened"}, 3*tccommon.ReadRetryTimeout, time.Second, service.PostgresqlReadonlyGroupNetworkAccessStateRefreshFunc(msaterDbInstanceId, d.Id(), vpcNew, subnetNew, vipOld, "", []string{})) + conf := tccommon.BuildStateChangeConf([]string{}, []string{"opened"}, 3*tccommon.ReadRetryTimeout, time.Second, service.PostgresqlReadonlyGroupNetworkAccessStateRefreshFunc(masterDbInstanceId, d.Id(), vpcNew, subnetNew, vipOld, "", []string{})) if object, e := conf.WaitForState(); e != nil { return e @@ -347,10 +405,10 @@ func resourceTencentCloudPostgresqlReadOnlyGroupUpdate(d *schema.ResourceData, m } log.Printf("[DEBUG]%s resourceTencentCloudPostgresqlReadOnlyGroupUpdate, msaterDbInstanceId:[%s], roGroupId:[%s], vpcOld:[%s], vpcNew:[%s], subnetOld:[%s], subnetNew:[%s], vipOld:[%s], vipNew:[%s]\n", - logId, msaterDbInstanceId, d.Id(), vpcOld, vpcNew, subnetOld, subnetNew, vipOld, vipNew) + logId, masterDbInstanceId, d.Id(), vpcOld, vpcNew, subnetOld, subnetNew, vipOld, vipNew) // wait unit network changing operation of ro group done - conf = tccommon.BuildStateChangeConf([]string{}, []string{"ok"}, 3*tccommon.ReadRetryTimeout, time.Second, service.PostgresqlReadonlyGroupStateRefreshFunc(msaterDbInstanceId, d.Id(), []string{})) + conf = tccommon.BuildStateChangeConf([]string{}, []string{"ok"}, 3*tccommon.ReadRetryTimeout, time.Second, service.PostgresqlReadonlyGroupStateRefreshFunc(masterDbInstanceId, d.Id(), []string{})) if _, e := conf.WaitForState(); e != nil { return e } @@ -361,13 +419,13 @@ func resourceTencentCloudPostgresqlReadOnlyGroupUpdate(d *schema.ResourceData, m } // wait for old network removed - conf = tccommon.BuildStateChangeConf([]string{}, []string{"closed"}, 3*tccommon.ReadRetryTimeout, time.Second, service.PostgresqlReadonlyGroupNetworkAccessStateRefreshFunc(msaterDbInstanceId, d.Id(), vpcOld, subnetOld, vipNew, vipOld, []string{})) + conf = tccommon.BuildStateChangeConf([]string{}, []string{"closed"}, 3*tccommon.ReadRetryTimeout, time.Second, service.PostgresqlReadonlyGroupNetworkAccessStateRefreshFunc(masterDbInstanceId, d.Id(), vpcOld, subnetOld, vipNew, vipOld, []string{})) if _, e := conf.WaitForState(); e != nil { return e } // wait unit network changing operation of ro group done - conf = tccommon.BuildStateChangeConf([]string{}, []string{"ok"}, 3*tccommon.ReadRetryTimeout, time.Second, service.PostgresqlReadonlyGroupStateRefreshFunc(msaterDbInstanceId, d.Id(), []string{})) + conf = tccommon.BuildStateChangeConf([]string{}, []string{"ok"}, 3*tccommon.ReadRetryTimeout, time.Second, service.PostgresqlReadonlyGroupStateRefreshFunc(masterDbInstanceId, d.Id(), []string{})) if _, e := conf.WaitForState(); e != nil { return e } @@ -376,6 +434,8 @@ func resourceTencentCloudPostgresqlReadOnlyGroupUpdate(d *schema.ResourceData, m } // required attributes + request := postgresql.NewModifyReadOnlyGroupConfigRequest() + request.ReadOnlyGroupId = helper.String(d.Id()) request.ReadOnlyGroupName = helper.String(d.Get("name").(string)) request.ReplayLagEliminate = helper.IntUint64(d.Get("replay_lag_eliminate").(int)) request.ReplayLatencyEliminate = helper.IntUint64(d.Get("replay_latency_eliminate").(int)) @@ -391,31 +451,49 @@ func resourceTencentCloudPostgresqlReadOnlyGroupUpdate(d *schema.ResourceData, m log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString()) } + return nil }) if err != nil { return err } + + if d.HasChange("security_groups_ids") { + ids := d.Get("security_groups_ids").(*schema.Set).List() + var sgIds []*string + for _, id := range ids { + sgIds = append(sgIds, helper.String(id.(string))) + } + + err = service.ModifyDBInstanceSecurityGroupsByGroupId(ctx, d.Id(), sgIds) + if err != nil { + return err + } + } + return resourceTencentCloudPostgresqlReadOnlyGroupRead(d, meta) } func resourceTencentCLoudPostgresqlReadOnlyGroupDelete(d *schema.ResourceData, meta interface{}) error { defer tccommon.LogElapsed("resource.tencentcloud_postgresql_readonly_group.delete")() - logId := tccommon.GetLogId(tccommon.ContextNil) - ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) - - groupId := d.Id() - postgresqlService := PostgresqlService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + postgresqlService = PostgresqlService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + groupId = d.Id() + ) err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError { e := postgresqlService.DeletePostgresqlReadOnlyGroupById(ctx, groupId) if e != nil { return tccommon.RetryError(e) } + return nil }) + if err != nil { return err } diff --git a/tencentcloud/services/postgresql/resource_tc_postgresql_readonly_group.md b/tencentcloud/services/postgresql/resource_tc_postgresql_readonly_group.md index 13045aed2a..88e16cc9b9 100644 --- a/tencentcloud/services/postgresql/resource_tc_postgresql_readonly_group.md +++ b/tencentcloud/services/postgresql/resource_tc_postgresql_readonly_group.md @@ -3,17 +3,76 @@ Use this resource to create postgresql readonly group. Example Usage ```hcl -resource "tencentcloud_postgresql_readonly_group" "group" { - master_db_instance_id = "postgres-gzg9jb2n" - name = "world" - project_id = 0 - vpc_id = "vpc-86v957zb" - subnet_id = "subnet-enm92y0m" - replay_lag_eliminate = 1 - replay_latency_eliminate = 1 - max_replay_lag = 100 - max_replay_latency = 512 +variable "availability_zone" { + default = "ap-guangzhou-3" +} + +# create vpc +resource "tencentcloud_vpc" "vpc" { + name = "vpc" + cidr_block = "10.0.0.0/16" +} + +# create vpc subnet +resource "tencentcloud_subnet" "subnet" { + availability_zone = var.availability_zone + name = "subnet" + vpc_id = tencentcloud_vpc.vpc.id + cidr_block = "10.0.20.0/28" + is_multicast = false +} + +# create postgresql +resource "tencentcloud_postgresql_instance" "example" { + name = "example" + availability_zone = var.availability_zone + charge_type = "POSTPAID_BY_HOUR" + vpc_id = tencentcloud_vpc.vpc.id + subnet_id = tencentcloud_subnet.subnet.id + engine_version = "10.4" + root_user = "root123" + root_password = "Root123$" + charset = "UTF8" + project_id = 0 + memory = 4 + cpu = 2 + storage = 50 + + tags = { + test = "tf" + } +} + +# create security group +resource "tencentcloud_security_group" "example" { + name = "tf-example" + description = "sg desc." + project_id = 0 + + tags = { + "example" = "test" + } +} + +resource "tencentcloud_postgresql_readonly_group" "example" { + master_db_instance_id = tencentcloud_postgresql_instance.example.id + name = "tf_ro_group" + project_id = 0 + vpc_id = tencentcloud_vpc.vpc.id + subnet_id = tencentcloud_subnet.subnet.id + security_groups_ids = [tencentcloud_security_group.example.id] + replay_lag_eliminate = 1 + replay_latency_eliminate = 1 + max_replay_lag = 100 + max_replay_latency = 512 min_delay_eliminate_reserve = 1 -# security_groups_ids = [] } -``` \ No newline at end of file +``` + +Import + +postgresql readonly group can be imported, e.g. + +``` +$ terraform import tencentcloud_postgresql_readonly_group.example pgrogrp-lckioi2a +``` diff --git a/tencentcloud/services/postgresql/resource_tc_postgresql_readonly_group_test.go b/tencentcloud/services/postgresql/resource_tc_postgresql_readonly_group_test.go index f527f1f1ea..71abd94ed5 100644 --- a/tencentcloud/services/postgresql/resource_tc_postgresql_readonly_group_test.go +++ b/tencentcloud/services/postgresql/resource_tc_postgresql_readonly_group_test.go @@ -8,8 +8,9 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" ) -var testPostgresqlReadonlyGroupResourceKey = "tencentcloud_postgresql_readonly_group.group" +var testPostgresqlReadonlyGroupResourceKey = "tencentcloud_postgresql_readonly_group.example" +// go test -i; go test -test.run TestAccTencentCloudPostgresqlReadonlyGroupResource_basic -v func TestAccTencentCloudPostgresqlReadonlyGroupResource_basic(t *testing.T) { // t.Parallel() resource.Test(t, resource.TestCase{ @@ -20,15 +21,11 @@ func TestAccTencentCloudPostgresqlReadonlyGroupResource_basic(t *testing.T) { Providers: tcacctest.AccProviders, Steps: []resource.TestStep{ { - PreConfig: func() { - tcacctest.AccStepSetRegion(t, "ap-guangzhou") - tcacctest.AccPreCheckCommon(t, tcacctest.ACCOUNT_TYPE_COMMON) - }, Config: testAccPostgresqlReadonlyGroupInstance, Check: resource.ComposeTestCheckFunc( resource.TestCheckResourceAttrSet(testPostgresqlReadonlyGroupResourceKey, "id"), resource.TestCheckResourceAttrSet(testPostgresqlReadonlyGroupResourceKey, "master_db_instance_id"), - resource.TestCheckResourceAttr(testPostgresqlReadonlyGroupResourceKey, "name", "tf_ro_group_test"), + resource.TestCheckResourceAttr(testPostgresqlReadonlyGroupResourceKey, "name", "tf_ro_group"), resource.TestCheckResourceAttr(testPostgresqlReadonlyGroupResourceKey, "project_id", "0"), resource.TestCheckResourceAttrSet(testPostgresqlReadonlyGroupResourceKey, "vpc_id"), resource.TestCheckResourceAttrSet(testPostgresqlReadonlyGroupResourceKey, "subnet_id"), @@ -37,114 +34,143 @@ func TestAccTencentCloudPostgresqlReadonlyGroupResource_basic(t *testing.T) { resource.TestCheckResourceAttr(testPostgresqlReadonlyGroupResourceKey, "max_replay_lag", "100"), resource.TestCheckResourceAttr(testPostgresqlReadonlyGroupResourceKey, "max_replay_latency", "512"), resource.TestCheckResourceAttr(testPostgresqlReadonlyGroupResourceKey, "min_delay_eliminate_reserve", "1"), - resource.TestCheckResourceAttr(testPostgresqlReadonlyGroupResourceKey, "min_delay_eliminate_reserve", "1"), resource.TestCheckResourceAttrSet(testPostgresqlReadonlyGroupResourceKey, "net_info_list.#"), - resource.TestCheckResourceAttrSet(testPostgresqlReadonlyGroupResourceKey, "net_info_list.0.ip"), - resource.TestCheckResourceAttr(testPostgresqlReadonlyGroupResourceKey, "net_info_list.0.port", "5432"), ), }, { - PreConfig: func() { - tcacctest.AccStepSetRegion(t, "ap-guangzhou") - tcacctest.AccPreCheckCommon(t, tcacctest.ACCOUNT_TYPE_COMMON) - }, + ResourceName: testPostgresqlReadonlyGroupResourceKey, + ImportState: true, + ImportStateVerify: true, + }, + { Config: testAccPostgresqlReadonlyGroupInstance_update, Check: resource.ComposeTestCheckFunc( resource.TestCheckResourceAttrSet(testPostgresqlReadonlyGroupResourceKey, "id"), resource.TestCheckResourceAttrSet(testPostgresqlReadonlyGroupResourceKey, "master_db_instance_id"), - resource.TestCheckResourceAttr(testPostgresqlReadonlyGroupResourceKey, "name", "tf_ro_group_test_updated"), + resource.TestCheckResourceAttr(testPostgresqlReadonlyGroupResourceKey, "name", "tf_ro_group_update"), + resource.TestCheckResourceAttr(testPostgresqlReadonlyGroupResourceKey, "project_id", "0"), resource.TestCheckResourceAttrSet(testPostgresqlReadonlyGroupResourceKey, "vpc_id"), resource.TestCheckResourceAttrSet(testPostgresqlReadonlyGroupResourceKey, "subnet_id"), + resource.TestCheckResourceAttr(testPostgresqlReadonlyGroupResourceKey, "replay_lag_eliminate", "1"), + resource.TestCheckResourceAttr(testPostgresqlReadonlyGroupResourceKey, "replay_latency_eliminate", "1"), + resource.TestCheckResourceAttr(testPostgresqlReadonlyGroupResourceKey, "max_replay_lag", "100"), + resource.TestCheckResourceAttr(testPostgresqlReadonlyGroupResourceKey, "max_replay_latency", "512"), + resource.TestCheckResourceAttr(testPostgresqlReadonlyGroupResourceKey, "min_delay_eliminate_reserve", "1"), resource.TestCheckResourceAttrSet(testPostgresqlReadonlyGroupResourceKey, "net_info_list.#"), - resource.TestCheckResourceAttrSet(testPostgresqlReadonlyGroupResourceKey, "net_info_list.0.ip"), - resource.TestCheckResourceAttr(testPostgresqlReadonlyGroupResourceKey, "net_info_list.0.port", "5432"), ), }, }, }) } -const testAccPostgresqlReadonlyGroupInstance string = tcacctest.DefaultVpcSubnets + ` -resource "tencentcloud_postgresql_instance" "test" { - name = "example" - availability_zone = var.default_az - charge_type = "POSTPAID_BY_HOUR" - vpc_id = local.vpc_id - subnet_id = local.subnet_id - engine_version = "10.4" - root_user = "root123" - root_password = "Root123$" - charset = "UTF8" - project_id = 0 - memory = 2 - storage = 10 - - tags = { - test = "tf" - } - } +const testAccPostgresqlReadonlyGroupInstance string = ` +variable "availability_zone" { + default = "ap-guangzhou-3" +} + +# create vpc +resource "tencentcloud_vpc" "vpc" { + name = "vpc" + cidr_block = "10.0.0.0/16" +} + +# create vpc subnet +resource "tencentcloud_subnet" "subnet" { + availability_zone = var.availability_zone + name = "subnet" + vpc_id = tencentcloud_vpc.vpc.id + cidr_block = "10.0.20.0/28" + is_multicast = false +} -resource "tencentcloud_postgresql_readonly_group" "group" { - master_db_instance_id = tencentcloud_postgresql_instance.test.id - name = "tf_ro_group_test" - project_id = 0 - vpc_id = local.vpc_id - subnet_id = local.subnet_id - replay_lag_eliminate = 1 - replay_latency_eliminate = 1 - max_replay_lag = 100 - max_replay_latency = 512 - min_delay_eliminate_reserve = 1 +# create postgresql +resource "tencentcloud_postgresql_instance" "example" { + name = "example" + availability_zone = var.availability_zone + charge_type = "POSTPAID_BY_HOUR" + vpc_id = tencentcloud_vpc.vpc.id + subnet_id = tencentcloud_subnet.subnet.id + engine_version = "10.4" + root_user = "root123" + root_password = "Root123$" + charset = "UTF8" + project_id = 0 + memory = 4 + cpu = 2 + storage = 50 + + tags = { + test = "tf" } +} + +resource "tencentcloud_postgresql_readonly_group" "example" { + master_db_instance_id = tencentcloud_postgresql_instance.example.id + name = "tf_ro_group" + project_id = 0 + vpc_id = tencentcloud_vpc.vpc.id + subnet_id = tencentcloud_subnet.subnet.id + security_groups_ids = ["sg-cm7fbbf3", "sg-5275dorp"] + replay_lag_eliminate = 1 + replay_latency_eliminate = 1 + max_replay_lag = 100 + max_replay_latency = 512 + min_delay_eliminate_reserve = 1 +} ` -const testAccPostgresqlReadonlyGroupInstance_update string = tcacctest.DefaultVpcSubnets + ` - resource "tencentcloud_postgresql_instance" "test" { - name = "example" - availability_zone = var.default_az - charge_type = "POSTPAID_BY_HOUR" - vpc_id = local.vpc_id - subnet_id = local.subnet_id - engine_version = "10.4" - root_user = "root123" - root_password = "Root123$" - charset = "UTF8" - project_id = 0 - memory = 2 - storage = 10 - - tags = { - test = "tf" - } - } +const testAccPostgresqlReadonlyGroupInstance_update string = ` +variable "availability_zone" { + default = "ap-guangzhou-3" +} - resource "tencentcloud_vpc" "vpc" { - cidr_block = "172.18.111.0/24" - name = "test-pg-rogroup-network-vpc" - } - - resource "tencentcloud_subnet" "subnet" { - availability_zone = var.default_az - cidr_block = "172.18.111.0/24" - name = "test-pg-rogroup-network-sub1" - vpc_id = tencentcloud_vpc.vpc.id - } +# create vpc +resource "tencentcloud_vpc" "vpc" { + name = "vpc" + cidr_block = "10.0.0.0/16" +} - locals { - new_vpc_id = tencentcloud_subnet.subnet.vpc_id - new_subnet_id = tencentcloud_subnet.subnet.id - } +# create vpc subnet +resource "tencentcloud_subnet" "subnet" { + availability_zone = var.availability_zone + name = "subnet" + vpc_id = tencentcloud_vpc.vpc.id + cidr_block = "10.0.20.0/28" + is_multicast = false +} + +# create postgresql +resource "tencentcloud_postgresql_instance" "example" { + name = "example" + availability_zone = var.availability_zone + charge_type = "POSTPAID_BY_HOUR" + vpc_id = tencentcloud_vpc.vpc.id + subnet_id = tencentcloud_subnet.subnet.id + engine_version = "10.4" + root_user = "root123" + root_password = "Root123$" + charset = "UTF8" + project_id = 0 + memory = 4 + cpu = 2 + storage = 50 -resource "tencentcloud_postgresql_readonly_group" "group" { - master_db_instance_id = tencentcloud_postgresql_instance.test.id - name = "tf_ro_group_test_updated" - project_id = 0 - vpc_id = local.new_vpc_id - subnet_id = local.new_subnet_id - replay_lag_eliminate = 1 - replay_latency_eliminate = 1 - max_replay_lag = 100 - max_replay_latency = 512 - min_delay_eliminate_reserve = 1 + tags = { + test = "tf" } +} + +resource "tencentcloud_postgresql_readonly_group" "example" { + master_db_instance_id = tencentcloud_postgresql_instance.example.id + name = "tf_ro_group_update" + project_id = 0 + vpc_id = tencentcloud_vpc.vpc.id + subnet_id = tencentcloud_subnet.subnet.id + security_groups_ids = ["sg-cm7fbbf3"] + replay_lag_eliminate = 1 + replay_latency_eliminate = 1 + max_replay_lag = 100 + max_replay_latency = 512 + min_delay_eliminate_reserve = 1 +} ` diff --git a/tencentcloud/services/postgresql/service_tencentcloud_postgresql.go b/tencentcloud/services/postgresql/service_tencentcloud_postgresql.go index ba557b3e59..ebad3c7774 100644 --- a/tencentcloud/services/postgresql/service_tencentcloud_postgresql.go +++ b/tencentcloud/services/postgresql/service_tencentcloud_postgresql.go @@ -459,6 +459,38 @@ func (me *PostgresqlService) DescribePostgresqlInstanceById(ctx context.Context, return } +func (me *PostgresqlService) DescribeDBInstanceSecurityGroupsByGroupId(ctx context.Context, readOnlyGroupId string) (sg []string, errRet error) { + logId := tccommon.GetLogId(ctx) + request := postgresql.NewDescribeDBInstanceSecurityGroupsRequest() + defer func() { + if errRet != nil { + log.Printf("[CRITAL]%s api[%s] fail,reason[%s]", logId, request.GetAction(), errRet.Error()) + } + }() + + request.ReadOnlyGroupId = &readOnlyGroupId + ratelimit.Check(request.GetAction()) + response, err := me.client.UsePostgresqlClient().DescribeDBInstanceSecurityGroups(request) + if err != nil { + errRet = err + return + } + + if response == nil || response.Response == nil { + errRet = fmt.Errorf("TencentCloud SDK return nil response, %s", request.GetAction()) + return + } + + groups := response.Response.SecurityGroupSet + if len(groups) > 0 { + for i := range groups { + sg = append(sg, *groups[i].SecurityGroupId) + } + } + + return +} + func (me *PostgresqlService) DescribeDBInstanceSecurityGroupsById(ctx context.Context, instanceId string) (sg []string, errRet error) { logId := tccommon.GetLogId(ctx) request := postgresql.NewDescribeDBInstanceSecurityGroupsRequest() @@ -492,6 +524,28 @@ func (me *PostgresqlService) DescribeDBInstanceSecurityGroupsById(ctx context.Co return } +func (me *PostgresqlService) ModifyDBInstanceSecurityGroupsByGroupId(ctx context.Context, readOnlyGroupId string, securityGroupIds []*string) (errRet error) { + logId := tccommon.GetLogId(ctx) + request := postgresql.NewModifyDBInstanceSecurityGroupsRequest() + defer func() { + if errRet != nil { + log.Printf("[CRITAL]%s api[%s] fail,reason[%s]", logId, request.GetAction(), errRet.Error()) + } + }() + + request.ReadOnlyGroupId = &readOnlyGroupId + request.SecurityGroupIdSet = securityGroupIds + ratelimit.Check(request.GetAction()) + response, err := me.client.UsePostgresqlClient().ModifyDBInstanceSecurityGroups(request) + if err == nil { + log.Printf("[DEBUG]%s api[%s] , request body [%s], response body[%s]\n", + logId, request.GetAction(), request.ToJsonString(), response.ToJsonString()) + } + + errRet = err + return +} + func (me *PostgresqlService) ModifyDBInstanceSecurityGroupsById(ctx context.Context, instanceId string, securityGroupIds []*string) (errRet error) { logId := tccommon.GetLogId(ctx) request := postgresql.NewModifyDBInstanceSecurityGroupsRequest() @@ -1359,6 +1413,44 @@ func (me *PostgresqlService) PostgresqlDBInstanceNetworkAccessStateRefreshFunc(d } } +func (me *PostgresqlService) DescribePostgresqlReadonlyGroupsById(ctx context.Context, roGroupId string) (readOnlyGroup *postgresql.ReadOnlyGroup, errRet error) { + tccommon.LogElapsed("DescribePostgresqlReadonlyGroupsById called")() + + var ( + logId = tccommon.GetLogId(ctx) + request = postgresql.NewDescribeReadOnlyGroupsRequest() + ) + + defer func() { + if errRet != nil { + log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n", logId, request.GetAction(), request.ToJsonString(), errRet.Error()) + } + }() + + request.Filters = []*postgresql.Filter{ + { + Name: helper.String("read-only-group-id"), + Values: helper.Strings([]string{roGroupId}), + }, + } + + ratelimit.Check(request.GetAction()) + response, err := me.client.UsePostgresqlClient().DescribeReadOnlyGroups(request) + if err != nil { + errRet = err + return + } + + log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), response.ToJsonString()) + + if response == nil || len(response.Response.ReadOnlyGroupList) < 1 { + return + } + + readOnlyGroup = response.Response.ReadOnlyGroupList[0] + return +} + func (me *PostgresqlService) DescribePostgresqlReadonlyGroupNetInfosById(ctx context.Context, dbInstanceId, roGroupId string) (netInfos []*postgresql.DBInstanceNetInfo, errRet error) { tccommon.LogElapsed("DescribePostgresqlReadonlyGroupNetInfoById called")() logId := tccommon.GetLogId(ctx) diff --git a/tencentcloud/services/rum/resource_tc_rum_project.go b/tencentcloud/services/rum/resource_tc_rum_project.go index 1a94dc96ff..9e0194c91e 100644 --- a/tencentcloud/services/rum/resource_tc_rum_project.go +++ b/tencentcloud/services/rum/resource_tc_rum_project.go @@ -17,8 +17,8 @@ import ( func ResourceTencentCloudRumProject() *schema.Resource { return &schema.Resource{ - Read: resourceTencentCloudRumProjectRead, Create: resourceTencentCloudRumProjectCreate, + Read: resourceTencentCloudRumProjectRead, Update: resourceTencentCloudRumProjectUpdate, Delete: resourceTencentCloudRumProjectDelete, Importer: &schema.ResourceImporter{ @@ -68,9 +68,9 @@ func ResourceTencentCloudRumProject() *schema.Resource { }, "desc": { - Type: schema.TypeString, - Optional: true, - Description: " Description of the created project (optional and up to 1,000 characters).", + Type: schema.TypeString, + Optional: true, + Description: "Description of the created project (optional and up to 1,000 characters).", }, "creator": { @@ -82,7 +82,7 @@ func ResourceTencentCloudRumProject() *schema.Resource { "create_time": { Type: schema.TypeString, Computed: true, - Description: "Creata Time.", + Description: "Create Time.", }, "key": { @@ -122,9 +122,8 @@ func resourceTencentCloudRumProjectCreate(d *schema.ResourceData, meta interface defer tccommon.LogElapsed("resource.tencentcloud_rum_project.create")() defer tccommon.InconsistentCheck(d, meta)() - logId := tccommon.GetLogId(tccommon.ContextNil) - var ( + logId = tccommon.GetLogId(tccommon.ContextNil) request = rum.NewCreateProjectRequest() response *rum.CreateProjectResponse id uint64 @@ -170,6 +169,7 @@ func resourceTencentCloudRumProjectCreate(d *schema.ResourceData, meta interface log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString()) } + response = result return nil }) @@ -180,7 +180,6 @@ func resourceTencentCloudRumProjectCreate(d *schema.ResourceData, meta interface } id = *response.Response.ID - d.SetId(strconv.Itoa(int(id))) return resourceTencentCloudRumProjectRead(d, meta) } @@ -189,15 +188,14 @@ func resourceTencentCloudRumProjectRead(d *schema.ResourceData, meta interface{} defer tccommon.LogElapsed("resource.tencentcloud_rum_project.read")() defer tccommon.InconsistentCheck(d, meta)() - logId := tccommon.GetLogId(tccommon.ContextNil) - ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) - - service := RumService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} - - projectId := d.Id() + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + service = RumService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + projectId = d.Id() + ) project, err := service.DescribeRumProject(ctx, projectId) - if err != nil { return err } @@ -274,11 +272,11 @@ func resourceTencentCloudRumProjectUpdate(d *schema.ResourceData, meta interface defer tccommon.LogElapsed("resource.tencentcloud_rum_project.update")() defer tccommon.InconsistentCheck(d, meta)() - logId := tccommon.GetLogId(tccommon.ContextNil) - - request := rum.NewModifyProjectRequest() - - projectId := d.Id() + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + request = rum.NewModifyProjectRequest() + projectId = d.Id() + ) id, e := strconv.Atoi(projectId) if e != nil { @@ -286,7 +284,6 @@ func resourceTencentCloudRumProjectUpdate(d *schema.ResourceData, meta interface } request.ID = helper.Uint64(uint64(id)) - if d.HasChange("name") { if v, ok := d.GetOk("name"); ok { request.Name = helper.String(v.(string)) @@ -297,7 +294,6 @@ func resourceTencentCloudRumProjectUpdate(d *schema.ResourceData, meta interface if v, ok := d.GetOk("instance_id"); ok { request.InstanceID = helper.String(v.(string)) } - } if d.HasChange("rate") { @@ -344,11 +340,12 @@ func resourceTencentCloudRumProjectUpdate(d *schema.ResourceData, meta interface log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString()) } + return nil }) if err != nil { - log.Printf("[CRITAL]%s create rum project failed, reason:%+v", logId, err) + log.Printf("[CRITAL]%s update rum project failed, reason:%+v", logId, err) return err } @@ -359,12 +356,12 @@ func resourceTencentCloudRumProjectDelete(d *schema.ResourceData, meta interface defer tccommon.LogElapsed("resource.tencentcloud_rum_project.delete")() defer tccommon.InconsistentCheck(d, meta)() - logId := tccommon.GetLogId(tccommon.ContextNil) - ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) - - service := RumService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} - - projectId := d.Id() + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + service = RumService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + projectId = d.Id() + ) if err := service.DeleteRumProjectById(ctx, projectId); err != nil { return err diff --git a/tencentcloud/services/rum/resource_tc_rum_project.md b/tencentcloud/services/rum/resource_tc_rum_project.md index 338ef9faea..bd19c7da50 100644 --- a/tencentcloud/services/rum/resource_tc_rum_project.md +++ b/tencentcloud/services/rum/resource_tc_rum_project.md @@ -3,21 +3,32 @@ Provides a resource to create a rum project Example Usage ```hcl -resource "tencentcloud_rum_project" "project" { - name = "projectName" - instance_id = "rum-pasZKEI3RLgakj" - rate = "100" - enable_url_group = "0" - type = "web" - repo = "" - url = "iac-tf.com" - desc = "projectDesc-1" +resource "tencentcloud_rum_taw_instance" "example" { + area_id = "1" + charge_type = "1" + data_retention_days = "30" + instance_name = "tf-example" + instance_desc = "desc." + + tags = { + createdBy = "terraform" + } } +resource "tencentcloud_rum_project" "example" { + name = "tf-example" + instance_id = tencentcloud_rum_taw_instance.example.id + rate = "100" + enable_url_group = "0" + type = "web" + repo = "https://github.com/xxx" + url = "iac-tf.com" + desc = "desc." +} ``` Import rum project can be imported using the id, e.g. ``` -$ terraform import tencentcloud_rum_project.project project_id -``` \ No newline at end of file +$ terraform import tencentcloud_rum_project.example 139422 +``` diff --git a/tencentcloud/services/rum/resource_tc_rum_taw_instance.go b/tencentcloud/services/rum/resource_tc_rum_taw_instance.go index 76d0ad7858..bb8d7e95bf 100644 --- a/tencentcloud/services/rum/resource_tc_rum_taw_instance.go +++ b/tencentcloud/services/rum/resource_tc_rum_taw_instance.go @@ -17,8 +17,8 @@ import ( func ResourceTencentCloudRumTawInstance() *schema.Resource { return &schema.Resource{ - Read: resourceTencentCloudRumTawInstanceRead, Create: resourceTencentCloudRumTawInstanceCreate, + Read: resourceTencentCloudRumTawInstanceRead, Update: resourceTencentCloudRumTawInstanceUpdate, Delete: resourceTencentCloudRumTawInstanceDelete, Importer: &schema.ResourceImporter{ @@ -116,9 +116,8 @@ func resourceTencentCloudRumTawInstanceCreate(d *schema.ResourceData, meta inter defer tccommon.LogElapsed("resource.tencentcloud_rum_taw_instance.create")() defer tccommon.InconsistentCheck(d, meta)() - logId := tccommon.GetLogId(tccommon.ContextNil) - var ( + logId = tccommon.GetLogId(tccommon.ContextNil) request = rum.NewCreateTawInstanceRequest() response *rum.CreateTawInstanceResponse instanceId string @@ -178,6 +177,7 @@ func resourceTencentCloudRumTawInstanceCreate(d *schema.ResourceData, meta inter log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString()) } + response = result return nil }) @@ -188,7 +188,6 @@ func resourceTencentCloudRumTawInstanceCreate(d *schema.ResourceData, meta inter } instanceId = *response.Response.InstanceId - d.SetId(instanceId) ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) @@ -208,15 +207,14 @@ func resourceTencentCloudRumTawInstanceRead(d *schema.ResourceData, meta interfa defer tccommon.LogElapsed("resource.tencentcloud_rum_taw_instance.read")() defer tccommon.InconsistentCheck(d, meta)() - logId := tccommon.GetLogId(tccommon.ContextNil) - ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) - - service := RumService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} - - instanceId := d.Id() + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + service = RumService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + instanceId = d.Id() + ) tawInstance, err := service.DescribeRumTawInstance(ctx, instanceId) - if err != nil { return err } @@ -248,10 +246,12 @@ func resourceTencentCloudRumTawInstanceRead(d *schema.ResourceData, meta interfa if tags.Key != nil { tagsMap["key"] = tags.Key } + if tags.Value != nil { tagsMap["value"] = tags.Value } } + _ = d.Set("tags", tagsMap) } @@ -306,12 +306,12 @@ func resourceTencentCloudRumTawInstanceUpdate(d *schema.ResourceData, meta inter defer tccommon.LogElapsed("resource.tencentcloud_rum_taw_instance.update")() defer tccommon.InconsistentCheck(d, meta)() - logId := tccommon.GetLogId(tccommon.ContextNil) - ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) - - request := rum.NewModifyInstanceRequest() - - instanceId := d.Id() + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + request = rum.NewModifyInstanceRequest() + instanceId = d.Id() + ) request.InstanceId = &instanceId @@ -343,6 +343,7 @@ func resourceTencentCloudRumTawInstanceUpdate(d *schema.ResourceData, meta inter log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString()) } + return nil }) @@ -369,12 +370,12 @@ func resourceTencentCloudRumTawInstanceDelete(d *schema.ResourceData, meta inter defer tccommon.LogElapsed("resource.tencentcloud_rum_taw_instance.delete")() defer tccommon.InconsistentCheck(d, meta)() - logId := tccommon.GetLogId(tccommon.ContextNil) - ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) - - service := RumService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} - - instanceId := d.Id() + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + service = RumService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + instanceId = d.Id() + ) if err := service.DeleteRumTawInstanceById(ctx, instanceId); err != nil { return err diff --git a/tencentcloud/services/rum/resource_tc_rum_taw_instance.md b/tencentcloud/services/rum/resource_tc_rum_taw_instance.md index ed63af909e..7c5f925ee8 100644 --- a/tencentcloud/services/rum/resource_tc_rum_taw_instance.md +++ b/tencentcloud/services/rum/resource_tc_rum_taw_instance.md @@ -3,21 +3,21 @@ Provides a resource to create a rum taw_instance Example Usage ```hcl -resource "tencentcloud_rum_taw_instance" "taw_instance" { - area_id = "1" - charge_type = "1" +resource "tencentcloud_rum_taw_instance" "example" { + area_id = "1" + charge_type = "1" data_retention_days = "30" - instance_name = "instanceName-1" + instance_name = "tf-example" + instance_desc = "desc." + tags = { createdBy = "terraform" } - instance_desc = "instanceDesc-1" } - ``` Import rum taw_instance can be imported using the id, e.g. ``` -$ terraform import tencentcloud_rum_taw_instance.taw_instance tawInstance_id -``` \ No newline at end of file +$ terraform import tencentcloud_rum_taw_instance.example rum-WYsjMaiGOVXBeJ +``` diff --git a/tencentcloud/services/rum/service_tencentcloud_rum.go b/tencentcloud/services/rum/service_tencentcloud_rum.go index e98ba62004..8060b295cd 100644 --- a/tencentcloud/services/rum/service_tencentcloud_rum.go +++ b/tencentcloud/services/rum/service_tencentcloud_rum.go @@ -4,6 +4,9 @@ import ( "context" "log" "strconv" + "time" + + sdkErrors "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/errors" tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common" @@ -115,8 +118,15 @@ func (me *RumService) DescribeRumProject(ctx context.Context, id string) (projec request.Offset = &offset request.Limit = &pageSize ratelimit.Check(request.GetAction()) + ReTryDescribe: response, err := me.client.UseRumClient().DescribeProjects(request) if err != nil { + // Exceeded request frequency limit + if err.(*sdkErrors.TencentCloudSDKError).Code == "RequestLimitExceeded" { + time.Sleep(time.Second * 1) + goto ReTryDescribe + } + log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n", logId, request.GetAction(), request.ToJsonString(), err.Error()) errRet = err diff --git a/tencentcloud/services/tmp/resource_tc_monitor_tmp_alert_group.go b/tencentcloud/services/tmp/resource_tc_monitor_tmp_alert_group.go index 8113802794..ec462a54ee 100644 --- a/tencentcloud/services/tmp/resource_tc_monitor_tmp_alert_group.go +++ b/tencentcloud/services/tmp/resource_tc_monitor_tmp_alert_group.go @@ -155,14 +155,14 @@ func resourceTencentCloudMonitorTmpAlertGroupCreate(d *schema.ResourceData, meta defer tccommon.LogElapsed("resource.tencentcloud_monitor_tmp_alert_group.create")() defer tccommon.InconsistentCheck(d, meta)() - logId := tccommon.GetLogId(tccommon.ContextNil) - var ( + logId = tccommon.GetLogId(tccommon.ContextNil) request = monitor.NewCreatePrometheusAlertGroupRequest() response = monitor.NewCreatePrometheusAlertGroupResponse() instanceId string groupId string ) + if v, ok := d.GetOk("instance_id"); ok { instanceId = v.(string) request.InstanceId = helper.String(v.(string)) @@ -187,9 +187,11 @@ func resourceTencentCloudMonitorTmpAlertGroupCreate(d *schema.ResourceData, meta if v, ok := dMap["type"]; ok { prometheusAlertCustomReceiver.Type = helper.String(v.(string)) } + if v, ok := dMap["url"]; ok { prometheusAlertCustomReceiver.Url = helper.String(v.(string)) } + if v, ok := dMap["allowed_time_ranges"]; ok { for _, item := range v.([]interface{}) { allowedTimeRangesMap := item.(map[string]interface{}) @@ -197,18 +199,23 @@ func resourceTencentCloudMonitorTmpAlertGroupCreate(d *schema.ResourceData, meta if v, ok := allowedTimeRangesMap["start"]; ok { prometheusAlertAllowTimeRange.Start = helper.String(v.(string)) } + if v, ok := allowedTimeRangesMap["end"]; ok { prometheusAlertAllowTimeRange.End = helper.String(v.(string)) } + prometheusAlertCustomReceiver.AllowedTimeRanges = append(prometheusAlertCustomReceiver.AllowedTimeRanges, &prometheusAlertAllowTimeRange) } } + if v, ok := dMap["cluster_id"]; ok { prometheusAlertCustomReceiver.ClusterId = helper.String(v.(string)) } + if v, ok := dMap["cluster_type"]; ok { prometheusAlertCustomReceiver.ClusterType = helper.String(v.(string)) } + request.CustomReceiver = &prometheusAlertCustomReceiver } @@ -246,12 +253,15 @@ func resourceTencentCloudMonitorTmpAlertGroupCreate(d *schema.ResourceData, meta if v, ok := dMap["duration"]; ok { prometheusAlertGroupRuleSet.Duration = helper.String(v.(string)) } + if v, ok := dMap["expr"]; ok { prometheusAlertGroupRuleSet.Expr = helper.String(v.(string)) } + if v, ok := dMap["state"]; ok { prometheusAlertGroupRuleSet.State = helper.IntInt64(v.(int)) } + request.Rules = append(request.Rules, &prometheusAlertGroupRuleSet) } } @@ -263,9 +273,11 @@ func resourceTencentCloudMonitorTmpAlertGroupCreate(d *schema.ResourceData, meta } else { log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString()) } + response = result return nil }) + if err != nil { log.Printf("[CRITAL]%s create monitor tmpAlertGroup failed, reason:%+v", logId, err) return err @@ -281,10 +293,12 @@ func resourceTencentCloudMonitorTmpAlertGroupRead(d *schema.ResourceData, meta i defer tccommon.LogElapsed("resource.tencentcloud_monitor_tmp_alert_group.read")() defer tccommon.InconsistentCheck(d, meta)() - logId := tccommon.GetLogId(tccommon.ContextNil) - ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) - - service := svcmonitor.NewMonitorService(meta.(tccommon.ProviderMeta).GetAPIV3Conn()) + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + service = svcmonitor.NewMonitorService(meta.(tccommon.ProviderMeta).GetAPIV3Conn()) + tmpAlertGroup *monitor.PrometheusAlertGroupSet + ) ids := strings.Split(d.Id(), tccommon.FILED_SP) if len(ids) != 2 { @@ -293,7 +307,16 @@ func resourceTencentCloudMonitorTmpAlertGroupRead(d *schema.ResourceData, meta i instanceId := ids[0] groupId := ids[1] - tmpAlertGroup, err := service.DescribeMonitorTmpAlertGroupById(ctx, instanceId, groupId) + err := resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError { + result, err := service.DescribeMonitorTmpAlertGroupById(ctx, instanceId, groupId) + if err != nil { + return tccommon.RetryError(err) + } + + tmpAlertGroup = result + return nil + }) + if err != nil { return err } @@ -377,6 +400,7 @@ func resourceTencentCloudMonitorTmpAlertGroupRead(d *schema.ResourceData, meta i labelsMap[*labels.Key] = labels.Value } } + rulesMap["labels"] = labelsMap } @@ -407,7 +431,6 @@ func resourceTencentCloudMonitorTmpAlertGroupRead(d *schema.ResourceData, meta i } _ = d.Set("rules", rulesList) - } return nil @@ -417,9 +440,10 @@ func resourceTencentCloudMonitorTmpAlertGroupUpdate(d *schema.ResourceData, meta defer tccommon.LogElapsed("resource.tencentcloud_monitor_tmp_alert_group.update")() defer tccommon.InconsistentCheck(d, meta)() - logId := tccommon.GetLogId(tccommon.ContextNil) - - request := monitor.NewUpdatePrometheusAlertGroupRequest() + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + request = monitor.NewUpdatePrometheusAlertGroupRequest() + ) ids := strings.Split(d.Id(), tccommon.FILED_SP) if len(ids) != 2 { @@ -430,7 +454,6 @@ func resourceTencentCloudMonitorTmpAlertGroupUpdate(d *schema.ResourceData, meta request.InstanceId = &instanceId request.GroupId = &groupId - if v, ok := d.GetOk("group_name"); ok { request.GroupName = helper.String(v.(string)) } @@ -450,9 +473,11 @@ func resourceTencentCloudMonitorTmpAlertGroupUpdate(d *schema.ResourceData, meta if v, ok := dMap["type"]; ok { prometheusAlertCustomReceiver.Type = helper.String(v.(string)) } + if v, ok := dMap["url"]; ok { prometheusAlertCustomReceiver.Url = helper.String(v.(string)) } + if v, ok := dMap["allowed_time_ranges"]; ok { for _, item := range v.([]interface{}) { allowedTimeRangesMap := item.(map[string]interface{}) @@ -460,18 +485,23 @@ func resourceTencentCloudMonitorTmpAlertGroupUpdate(d *schema.ResourceData, meta if v, ok := allowedTimeRangesMap["start"]; ok { prometheusAlertAllowTimeRange.Start = helper.String(v.(string)) } + if v, ok := allowedTimeRangesMap["end"]; ok { prometheusAlertAllowTimeRange.End = helper.String(v.(string)) } + prometheusAlertCustomReceiver.AllowedTimeRanges = append(prometheusAlertCustomReceiver.AllowedTimeRanges, &prometheusAlertAllowTimeRange) } } + if v, ok := dMap["cluster_id"]; ok { prometheusAlertCustomReceiver.ClusterId = helper.String(v.(string)) } + if v, ok := dMap["cluster_type"]; ok { prometheusAlertCustomReceiver.ClusterType = helper.String(v.(string)) } + request.CustomReceiver = &prometheusAlertCustomReceiver } @@ -506,15 +536,19 @@ func resourceTencentCloudMonitorTmpAlertGroupUpdate(d *schema.ResourceData, meta prometheusAlertGroupRuleSet.Annotations = append(prometheusAlertGroupRuleSet.Annotations, &prometheusRuleKV) } } + if v, ok := dMap["duration"]; ok { prometheusAlertGroupRuleSet.Duration = helper.String(v.(string)) } + if v, ok := dMap["expr"]; ok { prometheusAlertGroupRuleSet.Expr = helper.String(v.(string)) } + if v, ok := dMap["state"]; ok { prometheusAlertGroupRuleSet.State = helper.IntInt64(v.(int)) } + request.Rules = append(request.Rules, &prometheusAlertGroupRuleSet) } } @@ -526,8 +560,10 @@ func resourceTencentCloudMonitorTmpAlertGroupUpdate(d *schema.ResourceData, meta } else { log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString()) } + return nil }) + if err != nil { log.Printf("[CRITAL]%s update monitor tmpAlertGroup failed, reason:%+v", logId, err) return err @@ -540,10 +576,12 @@ func resourceTencentCloudMonitorTmpAlertGroupDelete(d *schema.ResourceData, meta defer tccommon.LogElapsed("resource.tencentcloud_monitor_tmp_alert_group.delete")() defer tccommon.InconsistentCheck(d, meta)() - logId := tccommon.GetLogId(tccommon.ContextNil) - ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + service = svcmonitor.NewMonitorService(meta.(tccommon.ProviderMeta).GetAPIV3Conn()) + ) - service := svcmonitor.NewMonitorService(meta.(tccommon.ProviderMeta).GetAPIV3Conn()) ids := strings.Split(d.Id(), tccommon.FILED_SP) if len(ids) != 2 { return fmt.Errorf("id is broken, id is %s", d.Id()) diff --git a/tencentcloud/services/tmp/resource_tc_monitor_tmp_alert_group.md b/tencentcloud/services/tmp/resource_tc_monitor_tmp_alert_group.md index 3dd36e1c38..a3ab5c679b 100644 --- a/tencentcloud/services/tmp/resource_tc_monitor_tmp_alert_group.md +++ b/tencentcloud/services/tmp/resource_tc_monitor_tmp_alert_group.md @@ -3,12 +3,36 @@ Provides a resource to create a monitor tmp_alert_group Example Usage ```hcl -resource "tencentcloud_monitor_tmp_alert_group" "tmp_alert_group" { - amp_receivers = [ - "notice-om017kc2", - ] - group_name = "tf-test" - instance_id = "prom-ip429jis" +variable "availability_zone" { + default = "ap-guangzhou-4" +} + +resource "tencentcloud_vpc" "vpc" { + cidr_block = "10.0.0.0/16" + name = "tf_monitor_vpc" +} + +resource "tencentcloud_subnet" "subnet" { + vpc_id = tencentcloud_vpc.vpc.id + availability_zone = var.availability_zone + name = "tf_monitor_subnet" + cidr_block = "10.0.1.0/24" +} + +resource "tencentcloud_monitor_tmp_instance" "example" { + instance_name = "tf-tmp-instance" + vpc_id = tencentcloud_vpc.vpc.id + subnet_id = tencentcloud_subnet.subnet.id + data_retention_time = 30 + zone = var.availability_zone + tags = { + "createdBy" = "terraform" + } +} + +resource "tencentcloud_monitor_tmp_alert_group" "example" { + group_name = "tf-example" + instance_id = tencentcloud_monitor_tmp_instance.example.id repeat_interval = "5m" custom_receiver { @@ -31,7 +55,6 @@ resource "tencentcloud_monitor_tmp_alert_group" "tmp_alert_group" { } } } - ``` Import @@ -39,5 +62,5 @@ Import monitor tmp_alert_group can be imported using the id, e.g. ``` -terraform import tencentcloud_monitor_tmp_alert_group.tmp_alert_group instance_id#group_id -``` \ No newline at end of file +terraform import tencentcloud_monitor_tmp_alert_group.example prom-34qkzwvs#alert-rfkkr6cw +``` diff --git a/website/docs/r/apm_instance.html.markdown b/website/docs/r/apm_instance.html.markdown index 0f3fe5187d..67fb593024 100644 --- a/website/docs/r/apm_instance.html.markdown +++ b/website/docs/r/apm_instance.html.markdown @@ -16,13 +16,13 @@ Provides a resource to create a apm instance ## Example Usage ```hcl -resource "tencentcloud_apm_instance" "instance" { - name = "terraform-test" - description = "for terraform test" +resource "tencentcloud_apm_instance" "example" { + name = "tf-example" + description = "desc." trace_duration = 15 - span_daily_counters = 20 + span_daily_counters = 0 tags = { - "createdBy" = "terraform" + createdBy = "terraform" } } ``` @@ -51,6 +51,6 @@ In addition to all arguments above, the following attributes are exported: apm instance can be imported using the id, e.g. ``` -terraform import tencentcloud_apm_instance.instance instance_id +terraform import tencentcloud_apm_instance.example apm-IMVrxXl1K ``` diff --git a/website/docs/r/elasticsearch_instance.html.markdown b/website/docs/r/elasticsearch_instance.html.markdown index dabb9fe193..9ad32b9b7e 100644 --- a/website/docs/r/elasticsearch_instance.html.markdown +++ b/website/docs/r/elasticsearch_instance.html.markdown @@ -166,6 +166,7 @@ The following arguments are supported: * `deploy_mode` - (Optional, Int, ForceNew) Cluster deployment mode. Valid values are `0` and `1`. `0` is single-AZ deployment, and `1` is multi-AZ deployment. Default value is `0`. * `es_acl` - (Optional, List) Kibana Access Control Configuration. * `instance_name` - (Optional, String) Name of the instance, which can contain 1 to 50 English letters, Chinese characters, digits, dashes(-), or underscores(_). +* `kibana_public_access` - (Optional, String) Kibana public network access status. Valid values are `OPEN` and `CLOSE`. * `license_type` - (Optional, String) License type. Valid values are `oss`, `basic` and `platinum`. The default value is `platinum`. * `multi_zone_infos` - (Optional, List, ForceNew) Details of AZs in multi-AZ deployment mode (which is required when deploy_mode is `1`). * `renew_flag` - (Optional, String, ForceNew) When enabled, the instance will be renew automatically when it reach the end of the prepaid tenancy. Valid values are `RENEW_FLAG_AUTO` and `RENEW_FLAG_MANUAL`. NOTE: it only works when charge_type is set to `PREPAID`. diff --git a/website/docs/r/monitor_tmp_alert_group.html.markdown b/website/docs/r/monitor_tmp_alert_group.html.markdown index 4db03c9cd6..48d5d3cab9 100644 --- a/website/docs/r/monitor_tmp_alert_group.html.markdown +++ b/website/docs/r/monitor_tmp_alert_group.html.markdown @@ -14,12 +14,36 @@ Provides a resource to create a monitor tmp_alert_group ## Example Usage ```hcl -resource "tencentcloud_monitor_tmp_alert_group" "tmp_alert_group" { - amp_receivers = [ - "notice-om017kc2", - ] - group_name = "tf-test" - instance_id = "prom-ip429jis" +variable "availability_zone" { + default = "ap-guangzhou-4" +} + +resource "tencentcloud_vpc" "vpc" { + cidr_block = "10.0.0.0/16" + name = "tf_monitor_vpc" +} + +resource "tencentcloud_subnet" "subnet" { + vpc_id = tencentcloud_vpc.vpc.id + availability_zone = var.availability_zone + name = "tf_monitor_subnet" + cidr_block = "10.0.1.0/24" +} + +resource "tencentcloud_monitor_tmp_instance" "example" { + instance_name = "tf-tmp-instance" + vpc_id = tencentcloud_vpc.vpc.id + subnet_id = tencentcloud_subnet.subnet.id + data_retention_time = 30 + zone = var.availability_zone + tags = { + "createdBy" = "terraform" + } +} + +resource "tencentcloud_monitor_tmp_alert_group" "example" { + group_name = "tf-example" + instance_id = tencentcloud_monitor_tmp_instance.example.id repeat_interval = "5m" custom_receiver { @@ -90,6 +114,6 @@ In addition to all arguments above, the following attributes are exported: monitor tmp_alert_group can be imported using the id, e.g. ``` -terraform import tencentcloud_monitor_tmp_alert_group.tmp_alert_group instance_id#group_id +terraform import tencentcloud_monitor_tmp_alert_group.example prom-34qkzwvs#alert-rfkkr6cw ``` diff --git a/website/docs/r/postgresql_readonly_group.html.markdown b/website/docs/r/postgresql_readonly_group.html.markdown index 5b921c93fe..91a91c3592 100644 --- a/website/docs/r/postgresql_readonly_group.html.markdown +++ b/website/docs/r/postgresql_readonly_group.html.markdown @@ -14,18 +14,69 @@ Use this resource to create postgresql readonly group. ## Example Usage ```hcl -resource "tencentcloud_postgresql_readonly_group" "group" { - master_db_instance_id = "postgres-gzg9jb2n" - name = "world" +variable "availability_zone" { + default = "ap-guangzhou-3" +} + +# create vpc +resource "tencentcloud_vpc" "vpc" { + name = "vpc" + cidr_block = "10.0.0.0/16" +} + +# create vpc subnet +resource "tencentcloud_subnet" "subnet" { + availability_zone = var.availability_zone + name = "subnet" + vpc_id = tencentcloud_vpc.vpc.id + cidr_block = "10.0.20.0/28" + is_multicast = false +} + +# create postgresql +resource "tencentcloud_postgresql_instance" "example" { + name = "example" + availability_zone = var.availability_zone + charge_type = "POSTPAID_BY_HOUR" + vpc_id = tencentcloud_vpc.vpc.id + subnet_id = tencentcloud_subnet.subnet.id + engine_version = "10.4" + root_user = "root123" + root_password = "Root123$" + charset = "UTF8" + project_id = 0 + memory = 4 + cpu = 2 + storage = 50 + + tags = { + test = "tf" + } +} + +# create security group +resource "tencentcloud_security_group" "example" { + name = "tf-example" + description = "sg desc." + project_id = 0 + + tags = { + "example" = "test" + } +} + +resource "tencentcloud_postgresql_readonly_group" "example" { + master_db_instance_id = tencentcloud_postgresql_instance.example.id + name = "tf_ro_group" project_id = 0 - vpc_id = "vpc-86v957zb" - subnet_id = "subnet-enm92y0m" + vpc_id = tencentcloud_vpc.vpc.id + subnet_id = tencentcloud_subnet.subnet.id + security_groups_ids = [tencentcloud_security_group.example.id] replay_lag_eliminate = 1 replay_latency_eliminate = 1 max_replay_lag = 100 max_replay_latency = 512 min_delay_eliminate_reserve = 1 - # security_groups_ids = [] } ``` @@ -56,3 +107,11 @@ In addition to all arguments above, the following attributes are exported: * `port` - Port of the net info. +## Import + +postgresql readonly group can be imported, e.g. + +``` +$ terraform import tencentcloud_postgresql_readonly_group.example pgrogrp-lckioi2a +``` + diff --git a/website/docs/r/rum_project.html.markdown b/website/docs/r/rum_project.html.markdown index b07e26d421..b4711762e6 100644 --- a/website/docs/r/rum_project.html.markdown +++ b/website/docs/r/rum_project.html.markdown @@ -14,15 +14,27 @@ Provides a resource to create a rum project ## Example Usage ```hcl -resource "tencentcloud_rum_project" "project" { - name = "projectName" - instance_id = "rum-pasZKEI3RLgakj" +resource "tencentcloud_rum_taw_instance" "example" { + area_id = "1" + charge_type = "1" + data_retention_days = "30" + instance_name = "tf-example" + instance_desc = "desc." + + tags = { + createdBy = "terraform" + } +} + +resource "tencentcloud_rum_project" "example" { + name = "tf-example" + instance_id = tencentcloud_rum_taw_instance.example.id rate = "100" enable_url_group = "0" type = "web" - repo = "" + repo = "https://github.com/xxx" url = "iac-tf.com" - desc = "projectDesc-1" + desc = "desc." } ``` @@ -35,7 +47,7 @@ The following arguments are supported: * `name` - (Required, String) Name of the created project (required and up to 200 characters). * `rate` - (Required, String) Project sampling rate (greater than or equal to 0). * `type` - (Required, String) Project type (valid values: `web`, `mp`, `android`, `ios`, `node`, `hippy`, `weex`, `viola`, `rn`). -* `desc` - (Optional, String) Description of the created project (optional and up to 1,000 characters). +* `desc` - (Optional, String) Description of the created project (optional and up to 1,000 characters). * `repo` - (Optional, String) Repository address of the project (optional and up to 256 characters). * `url` - (Optional, String) Webpage address of the project (optional and up to 256 characters). @@ -44,7 +56,7 @@ The following arguments are supported: In addition to all arguments above, the following attributes are exported: * `id` - ID of the resource. -* `create_time` - Creata Time. +* `create_time` - Create Time. * `creator` - Creator ID. * `instance_key` - Instance key. * `instance_name` - Instance name. @@ -57,6 +69,6 @@ In addition to all arguments above, the following attributes are exported: rum project can be imported using the id, e.g. ``` -$ terraform import tencentcloud_rum_project.project project_id +$ terraform import tencentcloud_rum_project.example 139422 ``` diff --git a/website/docs/r/rum_taw_instance.html.markdown b/website/docs/r/rum_taw_instance.html.markdown index 95b08ad17a..c11f1060b5 100644 --- a/website/docs/r/rum_taw_instance.html.markdown +++ b/website/docs/r/rum_taw_instance.html.markdown @@ -14,15 +14,16 @@ Provides a resource to create a rum taw_instance ## Example Usage ```hcl -resource "tencentcloud_rum_taw_instance" "taw_instance" { +resource "tencentcloud_rum_taw_instance" "example" { area_id = "1" charge_type = "1" data_retention_days = "30" - instance_name = "instanceName-1" + instance_name = "tf-example" + instance_desc = "desc." + tags = { createdBy = "terraform" } - instance_desc = "instanceDesc-1" } ``` @@ -53,6 +54,6 @@ In addition to all arguments above, the following attributes are exported: rum taw_instance can be imported using the id, e.g. ``` -$ terraform import tencentcloud_rum_taw_instance.taw_instance tawInstance_id +$ terraform import tencentcloud_rum_taw_instance.example rum-WYsjMaiGOVXBeJ ```