From 97820fba2ddc500471d58d26a897706a0d6c8dcd Mon Sep 17 00:00:00 2001 From: nickyinluo Date: Fri, 12 Aug 2022 16:49:41 +0800 Subject: [PATCH 1/7] support tmp promethus config --- tencentcloud/provider.go | 1 + tencentcloud/resource_tc_tke_tmp_config.go | 210 ++++++++++++++++++ tencentcloud/service_tencentcloud_tke.go | 240 +++++++++++++++++++++ 3 files changed, 451 insertions(+) create mode 100644 tencentcloud/resource_tc_tke_tmp_config.go diff --git a/tencentcloud/provider.go b/tencentcloud/provider.go index 83ef85d498..ddfbc678d1 100644 --- a/tencentcloud/provider.go +++ b/tencentcloud/provider.go @@ -1001,6 +1001,7 @@ func Provider() terraform.ResourceProvider { "tencentcloud_kubernetes_scale_worker": resourceTencentCloudTkeScaleWorker(), "tencentcloud_kubernetes_cluster_attachment": resourceTencentCloudTkeClusterAttachment(), "tencentcloud_kubernetes_node_pool": ResourceTencentCloudKubernetesNodePool(), + "tencentcloud_tke_tmp_config": resourceTencentCloudTkeTmpConfig(), "tencentcloud_mysql_backup_policy": resourceTencentCloudMysqlBackupPolicy(), "tencentcloud_mysql_account": resourceTencentCloudMysqlAccount(), "tencentcloud_mysql_account_privilege": resourceTencentCloudMysqlAccountPrivilege(), diff --git a/tencentcloud/resource_tc_tke_tmp_config.go b/tencentcloud/resource_tc_tke_tmp_config.go new file mode 100644 index 0000000000..2e946ed3e8 --- /dev/null +++ b/tencentcloud/resource_tc_tke_tmp_config.go @@ -0,0 +1,210 @@ +package tencentcloud + +import ( + "fmt" + "log" + "strings" + + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +) + +func resourceTencentCloudTkeTmpConfig() *schema.Resource { + return &schema.Resource{ + Create: resourceTencentCloudTkeTmpConfigCreate, + Read: resourceTencentCloudTkeTmpConfigRead, + Update: resourceTencentCloudTkeTmpConfigUpdate, + Delete: resourceTencentCloudTkeTmpConfigDelete, + Importer: &schema.ResourceImporter{ + State: schema.ImportStatePassthrough, + }, + Schema: map[string]*schema.Schema{ + "instance_id": { + Type: schema.TypeString, + Required: true, + Description: "ID of instance.", + }, + "cluster_type": { + Type: schema.TypeString, + Required: true, + Description: "Type of cluster.", + }, + "cluster_id": { + Type: schema.TypeString, + Required: true, + Description: "ID of cluster.", + }, + "config": { + Type: schema.TypeString, + Computed: true, + Description: "Global configuration.", + }, + "service_monitors": { + Type: schema.TypeList, + Optional: true, + Description: "Configuration of the service monitors.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "name": { + Type: schema.TypeString, + Required: true, + Description: "Name.", + }, + "config": { + Type: schema.TypeString, + Required: true, + Description: "Config.", + }, + "template_id": { + Type: schema.TypeString, + Optional: true, + Description: "Used for output parameters, if the configuration comes from a template, it is the template id.", + }, + }, + }, + }, + "pod_monitors": { + Type: schema.TypeList, + Optional: true, + Description: "Configuration of the pod monitors.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "name": { + Type: schema.TypeString, + Required: true, + Description: "Name.", + }, + "config": { + Type: schema.TypeString, + Required: true, + Description: "Config.", + }, + "template_id": { + Type: schema.TypeString, + Optional: true, + Description: "Used for output parameters, if the configuration comes from a template, it is the template id.", + }, + }, + }, + }, + "raw_jobs": { + Type: schema.TypeList, + Optional: true, + Description: "Configuration of the native prometheus job.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "name": { + Type: schema.TypeString, + Required: true, + Description: "Name.", + }, + "config": { + Type: schema.TypeString, + Required: true, + Description: "Config.", + }, + "template_id": { + Type: schema.TypeString, + Optional: true, + Description: "Used for output parameters, if the configuration comes from a template, it is the template id.", + }, + }, + }, + }, + }, + //compare to console, miss cam_role and running_version and lock_initial_node and security_proof + } +} + +func resourceTencentCloudTkeTmpConfigRead(d *schema.ResourceData, meta interface{}) error { + defer logElapsed("resource.tencentcloud_tke_tmp_config.read")() + defer inconsistentCheck(d, meta)() + + var ( + logId = getLogId(contextNil) + service = TkeService{client: meta.(*TencentCloudClient).apiV3Conn} + configId = d.Id() + ) + + params, err := service.DescribeTkeTmpConfigById(logId, configId) + + if err != nil { + return err + } + + if params == nil { + d.SetId("") + return fmt.Errorf("resource `prometheus_config` %s does not exist", configId) + } + + if e := d.Set("config", params.Config); e != nil { + log.Printf("[CRITAL]%s provider set config fail, reason:%s\n", logId, e.Error()) + return e + } + if e := d.Set("service_monitors", flattenPrometheusConfigItems(params.ServiceMonitors)); e != nil { + log.Printf("[CRITAL]%s provider set service_monitors fail, reason:%s\n", logId, e.Error()) + return e + } + if e := d.Set("pod_monitors", flattenPrometheusConfigItems(params.PodMonitors)); e != nil { + log.Printf("[CRITAL]%s provider set pod_monitors fail, reason:%s\n", logId, e.Error()) + return e + } + if e := d.Set("raw_jobs", flattenPrometheusConfigItems(params.RawJobs)); e != nil { + log.Printf("[CRITAL]%s provider set raw_jobs fail, reason:%s\n", logId, e.Error()) + return e + } + return nil +} + +func resourceTencentCloudTkeTmpConfigCreate(d *schema.ResourceData, meta interface{}) error { + defer logElapsed("resource.tencentcloud_tke_tmp_config.create")() + defer inconsistentCheck(d, meta)() + + service := TkeService{client: meta.(*TencentCloudClient).apiV3Conn} + + ret, err := service.CreateTkeTmpConfig(d) + + if err != nil { + return err + } + + ids := strings.Join([]string{ret.InstanceId, ret.ClusterType, ret.ClusterId}, FILED_SP) + d.SetId(ids) + + return resourceTencentCloudTkeTmpConfigRead(d, meta) +} + +func resourceTencentCloudTkeTmpConfigUpdate(d *schema.ResourceData, meta interface{}) error { + defer logElapsed("resource.tencentcloud_tke_tmp_config.update, Id: %s", d.Id())() + defer inconsistentCheck(d, meta)() + + if d.HasChange("instance_id") { + return fmt.Errorf("`instance_id` do not support change now.") + } + if d.HasChange("cluster_id") { + return fmt.Errorf("`cluster_id` do not support change now.") + } + if d.HasChange("cluster_type") { + return fmt.Errorf("`cluster_type` do not support change now.") + } + + service := TkeService{client: meta.(*TencentCloudClient).apiV3Conn} + + if err := service.UpdateTkeTmpConfig(d); err != nil { + return err + } + + return resourceTencentCloudTkeTmpConfigRead(d, meta) +} + +func resourceTencentCloudTkeTmpConfigDelete(d *schema.ResourceData, meta interface{}) error { + defer logElapsed("resource.tencentcloud_tke_tmp_config.delete, Id: %s", d.Id())() + defer inconsistentCheck(d, meta)() + + service := TkeService{client: meta.(*TencentCloudClient).apiV3Conn} + + if err := service.DeleteTkeTmpConfig(d); err != nil { + return err + } + + return nil +} diff --git a/tencentcloud/service_tencentcloud_tke.go b/tencentcloud/service_tencentcloud_tke.go index effb6dea65..67b82e1c2d 100644 --- a/tencentcloud/service_tencentcloud_tke.go +++ b/tencentcloud/service_tencentcloud_tke.go @@ -100,6 +100,12 @@ type InstanceInfo struct { LanIp string } +type PrometheusConfigIds struct { + InstanceId string + ClusterType string + ClusterId string +} + type TkeService struct { client *connectivity.TencentCloudClient } @@ -1838,3 +1844,237 @@ func (me *TkeService) DeleteTkeTmpAlertPolicyById(ctx context.Context, tmpAlertP return } + +func (me *TkeService) DescribeTkeTmpConfigById(logId string, configId string) (respParams *tke.DescribePrometheusConfigResponseParams, errRet error) { + request := tke.NewDescribePrometheusConfigRequest() + + defer func() { + if errRet != nil { + log.Printf("[CRITAL]%s api[%s] fail, ids [%s], request body [%s], reason[%s]\n", + logId, "query object", configId, request.ToJsonString(), errRet.Error()) + } + }() + + ids, err := parseId(configId) + if err != nil { + errRet = err + return + } + + request.ClusterId = &ids.ClusterId + request.ClusterType = &ids.ClusterType + request.InstanceId = &ids.InstanceId + + ratelimit.Check(request.GetAction()) + response, err := me.client.UseTkeClient().DescribePrometheusConfig(request) + if err != nil { + log.Printf("[CRITAL]%s api[%s] fail,ids [%s], request body [%s], reason[%s]\n", + logId, request.GetAction(), configId, request.ToJsonString(), err.Error()) + errRet = err + return + } + log.Printf("[DEBUG]%s api[%s] success,ids [%s], request body [%s], response body [%s]\n", + logId, request.GetAction(), configId, request.ToJsonString(), response.ToJsonString()) + + if response == nil || response.Response.RequestId == nil { + return nil, fmt.Errorf("response is invalid,%s", response.ToJsonString()) + } + + respParams = response.Response + return +} + +func (me *TkeService) CreateTkeTmpConfig(d *schema.ResourceData) (idsRet *PrometheusConfigIds, errRet error) { + var ( + logId = getLogId(contextNil) + request = tke.NewCreatePrometheusConfigRequest() + ) + + if v, ok := d.GetOk("instance_id"); ok { + request.InstanceId = helper.String(v.(string)) + } + if v, ok := d.GetOk("cluster_id"); ok { + request.ClusterId = helper.String(v.(string)) + } + if v, ok := d.GetOk("cluster_type"); ok { + request.ClusterType = helper.String(v.(string)) + } + if v, ok := d.GetOk("service_monitors"); ok { + request.ServiceMonitors = serializePromConfigItems(v) + } + if v, ok := d.GetOk("pod_monitors"); ok { + request.PodMonitors = serializePromConfigItems(v) + } + if v, ok := d.GetOk("raw_jobs"); ok { + request.RawJobs = serializePromConfigItems(v) + } + + idsRet = &PrometheusConfigIds{*request.InstanceId, *request.ClusterType, *request.ClusterId} + + errRet = resource.Retry(writeRetryTimeout, func() *resource.RetryError { + response, e := me.client.UseTkeClient().CreatePrometheusConfig(request) + if e != nil { + return retryError(e) + } else { + log.Printf("[DEBUG]%s api[%s] success, ids [%s], request body [%s], response body [%s]\n", + logId, request.GetAction(), idsRet, request.ToJsonString(), response.ToJsonString()) + } + return nil + }) + return +} + +func (me *TkeService) UpdateTkeTmpConfig(d *schema.ResourceData) (errRet error) { + var ( + logId = getLogId(contextNil) + request = tke.NewModifyPrometheusConfigRequest() + ) + + ids, err := parseId(d.Id()) + if err != nil { + return err + } + request.ClusterId = &ids.ClusterId + request.ClusterType = &ids.ClusterType + request.InstanceId = &ids.InstanceId + + if d.HasChange("service_monitors") { + if v, ok := d.GetOk("service_monitors"); ok { + request.ServiceMonitors = serializePromConfigItems(v) + } + } + + if d.HasChange("pod_monitors") { + if v, ok := d.GetOk("pod_monitors"); ok { + request.PodMonitors = serializePromConfigItems(v) + } + } + + if d.HasChange("raw_jobs") { + if v, ok := d.GetOk("raw_jobs"); ok { + request.RawJobs = serializePromConfigItems(v) + } + } + + errRet = resource.Retry(writeRetryTimeout, func() *resource.RetryError { + response, e := me.client.UseTkeClient().ModifyPrometheusConfig(request) + if e != nil { + return retryError(e) + } else { + log.Printf("[DEBUG]%s api[%s] success, ids [%s], request body [%s], response body [%s]\n", + logId, request.GetAction(), d.Id(), request.ToJsonString(), response.ToJsonString()) + } + return nil + }) + return +} + +func (me *TkeService) DeleteTkeTmpConfig(d *schema.ResourceData) (errRet error) { + logId := getLogId(contextNil) + request := tke.NewDeletePrometheusConfigRequest() + + defer func() { + if errRet != nil { + log.Printf("[CRITAL]%s api[%s] fail,ids [%s], request body [%s], reason[%s]\n", + logId, "delete object", d.Id(), request.ToJsonString(), errRet.Error()) + } + }() + + ids, err := parseId(d.Id()) + if err != nil { + errRet = err + return + } + + request.ClusterId = &ids.ClusterId + request.ClusterType = &ids.ClusterType + request.InstanceId = &ids.InstanceId + + if v, ok := d.GetOk("service_monitors"); ok { + request.ServiceMonitors = serializePromConfigItemNames(v) + } + + if v, ok := d.GetOk("pod_monitors"); ok { + request.PodMonitors = serializePromConfigItemNames(v) + } + + if v, ok := d.GetOk("raw_jobs"); ok { + request.RawJobs = serializePromConfigItemNames(v) + } + + ratelimit.Check(request.GetAction()) + response, err := me.client.UseTkeClient().DeletePrometheusConfig(request) + if err != nil { + errRet = err + return + } + log.Printf("[DEBUG]%s api[%s] success, ids [%s], request body [%s], response body [%s]\n", + logId, request.GetAction(), d.Id(), request.ToJsonString(), response.ToJsonString()) + + return +} + +func parseId(configId string) (ret *PrometheusConfigIds, err error) { + idSplit := strings.Split(configId, FILED_SP) + if len(idSplit) != 3 { + return nil, fmt.Errorf("id is broken,%s", configId) + } + + instanceId := idSplit[0] + clusterType := idSplit[1] + clusterId := idSplit[2] + if instanceId == "" || clusterType == "" || clusterId == "" { + return nil, fmt.Errorf("id is broken,%s", configId) + } + + ret = &PrometheusConfigIds{instanceId, clusterType, clusterId} + return +} + +func flattenPrometheusConfigItems(objList []*tke.PrometheusConfigItem) []map[string]interface{} { + result := make([]map[string]interface{}, 0, len(objList)) + for i := range objList { + v := objList[i] + item := map[string]interface{}{ + "config": v.Config, + "name": v.Name, + } + if v.TemplateId != nil { + item["template_id"] = v.TemplateId + } + result = append(result, item) + } + return result +} + +func serializePromConfigItems(v interface{}) []*tke.PrometheusConfigItem { + resList := v.([]interface{}) + items := make([]*tke.PrometheusConfigItem, 0, len(resList)) + for _, res := range resList { + vv := res.(map[string]interface{}) + var item tke.PrometheusConfigItem + if v, ok := vv["name"]; ok { + item.Name = helper.String(v.(string)) + } + if v, ok := vv["config"]; ok { + item.Config = helper.String(v.(string)) + } + if v, ok := vv["template_id"]; ok { + item.TemplateId = helper.String(v.(string)) + } + items = append(items, &item) + } + return items +} + +func serializePromConfigItemNames(v interface{}) []*string { + resList := v.([]interface{}) + names := make([]*string, 0, len(resList)) + for _, res := range resList { + vv := res.(map[string]interface{}) + if v, ok := vv["name"]; ok { + names = append(names, helper.String(v.(string))) + } + } + return names +} From 504c6b489b584ee7bf74c56424308c45f71b7b3f Mon Sep 17 00:00:00 2001 From: nickyinluo Date: Mon, 15 Aug 2022 16:27:18 +0800 Subject: [PATCH 2/7] modified according to heller's comment. --- tencentcloud/provider.go | 3 +- ... => resource_tc_monitor_tmp_tke_config.go} | 135 ++++++++++++++++-- tencentcloud/service_tencentcloud_tke.go | 103 +------------ .../r/monitor_tmp_tke_config.html.markdown | 54 +++++++ website/tencentcloud.erb | 3 + 5 files changed, 187 insertions(+), 111 deletions(-) rename tencentcloud/{resource_tc_tke_tmp_config.go => resource_tc_monitor_tmp_tke_config.go} (60%) create mode 100644 website/docs/r/monitor_tmp_tke_config.html.markdown diff --git a/tencentcloud/provider.go b/tencentcloud/provider.go index 45f64f522c..75c6cf165f 100644 --- a/tencentcloud/provider.go +++ b/tencentcloud/provider.go @@ -432,6 +432,7 @@ Monitor tencentcloud_monitor_tmp_recording_rule tencentcloud_monitor_tmp_tke_template tencentcloud_monitor_tmp_tke_alert_policy + tencentcloud_monitor_tmp_tke_config PostgreSQL Data Source @@ -1011,7 +1012,6 @@ func Provider() terraform.ResourceProvider { "tencentcloud_kubernetes_scale_worker": resourceTencentCloudTkeScaleWorker(), "tencentcloud_kubernetes_cluster_attachment": resourceTencentCloudTkeClusterAttachment(), "tencentcloud_kubernetes_node_pool": ResourceTencentCloudKubernetesNodePool(), - "tencentcloud_tke_tmp_config": resourceTencentCloudTkeTmpConfig(), "tencentcloud_mysql_backup_policy": resourceTencentCloudMysqlBackupPolicy(), "tencentcloud_mysql_account": resourceTencentCloudMysqlAccount(), "tencentcloud_mysql_account_privilege": resourceTencentCloudMysqlAccountPrivilege(), @@ -1093,6 +1093,7 @@ func Provider() terraform.ResourceProvider { "tencentcloud_monitor_tmp_recording_rule": resourceTencentCloudMonitorTmpRecordingRule(), "tencentcloud_monitor_tmp_tke_template": resourceTencentCloudMonitorTmpTkeTemplate(), "tencentcloud_monitor_tmp_tke_alert_policy": resourceTencentCloudMonitorTmpTkeAlertPolicy(), + "tencentcloud_monitor_tmp_tke_config": resourceTencentCloudMonitorTmpTkeConfig(), "tencentcloud_mongodb_standby_instance": resourceTencentCloudMongodbStandbyInstance(), "tencentcloud_elasticsearch_instance": resourceTencentCloudElasticsearchInstance(), "tencentcloud_postgresql_instance": resourceTencentCloudPostgresqlInstance(), diff --git a/tencentcloud/resource_tc_tke_tmp_config.go b/tencentcloud/resource_tc_monitor_tmp_tke_config.go similarity index 60% rename from tencentcloud/resource_tc_tke_tmp_config.go rename to tencentcloud/resource_tc_monitor_tmp_tke_config.go index 2e946ed3e8..449c455e68 100644 --- a/tencentcloud/resource_tc_tke_tmp_config.go +++ b/tencentcloud/resource_tc_monitor_tmp_tke_config.go @@ -1,3 +1,31 @@ +/* +Provides a resource to create a tke tmpPrometheusConfig + +Example Usage + +```hcl + +resource "tencentcloud_monitor_tmp_tke_config" "foo" { + instance_id = "xxx" + cluster_type = "xxx" + cluster_id = "xxx" + + raw_jobs { + name = "rawjob_001" + config = "your_config_for_raw_jobs\n" + } + + service_monitors { + name = "servicemonitors_001" + config = "your_config_for_service_monitors\n" + } + + pod_monitors { + name = "pod_monitors_001" + config = "your_config_for_pod_monitors\n" + } +} +*/ package tencentcloud import ( @@ -5,10 +33,13 @@ import ( "log" "strings" + "github.com/hashicorp/terraform-plugin-sdk/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/helper/schema" + tke "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tke/v20180525" + "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper" ) -func resourceTencentCloudTkeTmpConfig() *schema.Resource { +func resourceTencentCloudMonitorTmpTkeConfig() *schema.Resource { return &schema.Resource{ Create: resourceTencentCloudTkeTmpConfigCreate, Read: resourceTencentCloudTkeTmpConfigRead, @@ -111,7 +142,6 @@ func resourceTencentCloudTkeTmpConfig() *schema.Resource { }, }, }, - //compare to console, miss cam_role and running_version and lock_initial_node and security_proof } } @@ -159,15 +189,47 @@ func resourceTencentCloudTkeTmpConfigCreate(d *schema.ResourceData, meta interfa defer logElapsed("resource.tencentcloud_tke_tmp_config.create")() defer inconsistentCheck(d, meta)() - service := TkeService{client: meta.(*TencentCloudClient).apiV3Conn} + var ( + logId = getLogId(contextNil) + request = tke.NewCreatePrometheusConfigRequest() + client = meta.(*TencentCloudClient).apiV3Conn.UseTkeClient() + ) - ret, err := service.CreateTkeTmpConfig(d) + if v, ok := d.GetOk("instance_id"); ok { + request.InstanceId = helper.String(v.(string)) + } + if v, ok := d.GetOk("cluster_id"); ok { + request.ClusterId = helper.String(v.(string)) + } + if v, ok := d.GetOk("cluster_type"); ok { + request.ClusterType = helper.String(v.(string)) + } + if v, ok := d.GetOk("service_monitors"); ok { + request.ServiceMonitors = serializePromConfigItems(v) + } + if v, ok := d.GetOk("pod_monitors"); ok { + request.PodMonitors = serializePromConfigItems(v) + } + if v, ok := d.GetOk("raw_jobs"); ok { + request.RawJobs = serializePromConfigItems(v) + } + ids := strings.Join([]string{*request.InstanceId, *request.ClusterType, *request.ClusterId}, FILED_SP) + + err := resource.Retry(writeRetryTimeout, func() *resource.RetryError { + response, e := client.CreatePrometheusConfig(request) + if e != nil { + return retryError(e) + } else { + log.Printf("[DEBUG]%s api[%s] success, ids [%s], request body [%s], response body [%s]\n", + logId, request.GetAction(), ids, request.ToJsonString(), response.ToJsonString()) + } + return nil + }) if err != nil { return err } - ids := strings.Join([]string{ret.InstanceId, ret.ClusterType, ret.ClusterId}, FILED_SP) d.SetId(ids) return resourceTencentCloudTkeTmpConfigRead(d, meta) @@ -177,6 +239,12 @@ func resourceTencentCloudTkeTmpConfigUpdate(d *schema.ResourceData, meta interfa defer logElapsed("resource.tencentcloud_tke_tmp_config.update, Id: %s", d.Id())() defer inconsistentCheck(d, meta)() + var ( + logId = getLogId(contextNil) + request = tke.NewModifyPrometheusConfigRequest() + client = meta.(*TencentCloudClient).apiV3Conn.UseTkeClient() + ) + if d.HasChange("instance_id") { return fmt.Errorf("`instance_id` do not support change now.") } @@ -187,9 +255,44 @@ func resourceTencentCloudTkeTmpConfigUpdate(d *schema.ResourceData, meta interfa return fmt.Errorf("`cluster_type` do not support change now.") } - service := TkeService{client: meta.(*TencentCloudClient).apiV3Conn} + ids, err := parseId(d.Id()) + if err != nil { + return err + } + request.ClusterId = &ids.ClusterId + request.ClusterType = &ids.ClusterType + request.InstanceId = &ids.InstanceId + + if d.HasChange("service_monitors") { + if v, ok := d.GetOk("service_monitors"); ok { + request.ServiceMonitors = serializePromConfigItems(v) + } + } - if err := service.UpdateTkeTmpConfig(d); err != nil { + if d.HasChange("pod_monitors") { + if v, ok := d.GetOk("pod_monitors"); ok { + request.PodMonitors = serializePromConfigItems(v) + } + } + + if d.HasChange("raw_jobs") { + if v, ok := d.GetOk("raw_jobs"); ok { + request.RawJobs = serializePromConfigItems(v) + } + } + + err = resource.Retry(writeRetryTimeout, func() *resource.RetryError { + response, e := client.ModifyPrometheusConfig(request) + if e != nil { + return retryError(e) + } else { + log.Printf("[DEBUG]%s api[%s] success, ids [%s], request body [%s], response body [%s]\n", + logId, request.GetAction(), d.Id(), request.ToJsonString(), response.ToJsonString()) + } + return nil + }) + + if err != nil { return err } @@ -202,9 +305,25 @@ func resourceTencentCloudTkeTmpConfigDelete(d *schema.ResourceData, meta interfa service := TkeService{client: meta.(*TencentCloudClient).apiV3Conn} - if err := service.DeleteTkeTmpConfig(d); err != nil { + if err := service.DeleteTkeTmpConfigById(d); err != nil { return err } return nil } + +func flattenPrometheusConfigItems(objList []*tke.PrometheusConfigItem) []map[string]interface{} { + result := make([]map[string]interface{}, 0, len(objList)) + for i := range objList { + v := objList[i] + item := map[string]interface{}{ + "config": v.Config, + "name": v.Name, + } + if v.TemplateId != nil { + item["template_id"] = v.TemplateId + } + result = append(result, item) + } + return result +} diff --git a/tencentcloud/service_tencentcloud_tke.go b/tencentcloud/service_tencentcloud_tke.go index c0ebe2f519..e86620b8c4 100644 --- a/tencentcloud/service_tencentcloud_tke.go +++ b/tencentcloud/service_tencentcloud_tke.go @@ -1907,92 +1907,7 @@ func (me *TkeService) DescribeTkeTmpConfigById(logId string, configId string) (r return } -func (me *TkeService) CreateTkeTmpConfig(d *schema.ResourceData) (idsRet *PrometheusConfigIds, errRet error) { - var ( - logId = getLogId(contextNil) - request = tke.NewCreatePrometheusConfigRequest() - ) - - if v, ok := d.GetOk("instance_id"); ok { - request.InstanceId = helper.String(v.(string)) - } - if v, ok := d.GetOk("cluster_id"); ok { - request.ClusterId = helper.String(v.(string)) - } - if v, ok := d.GetOk("cluster_type"); ok { - request.ClusterType = helper.String(v.(string)) - } - if v, ok := d.GetOk("service_monitors"); ok { - request.ServiceMonitors = serializePromConfigItems(v) - } - if v, ok := d.GetOk("pod_monitors"); ok { - request.PodMonitors = serializePromConfigItems(v) - } - if v, ok := d.GetOk("raw_jobs"); ok { - request.RawJobs = serializePromConfigItems(v) - } - - idsRet = &PrometheusConfigIds{*request.InstanceId, *request.ClusterType, *request.ClusterId} - - errRet = resource.Retry(writeRetryTimeout, func() *resource.RetryError { - response, e := me.client.UseTkeClient().CreatePrometheusConfig(request) - if e != nil { - return retryError(e) - } else { - log.Printf("[DEBUG]%s api[%s] success, ids [%s], request body [%s], response body [%s]\n", - logId, request.GetAction(), idsRet, request.ToJsonString(), response.ToJsonString()) - } - return nil - }) - return -} - -func (me *TkeService) UpdateTkeTmpConfig(d *schema.ResourceData) (errRet error) { - var ( - logId = getLogId(contextNil) - request = tke.NewModifyPrometheusConfigRequest() - ) - - ids, err := parseId(d.Id()) - if err != nil { - return err - } - request.ClusterId = &ids.ClusterId - request.ClusterType = &ids.ClusterType - request.InstanceId = &ids.InstanceId - - if d.HasChange("service_monitors") { - if v, ok := d.GetOk("service_monitors"); ok { - request.ServiceMonitors = serializePromConfigItems(v) - } - } - - if d.HasChange("pod_monitors") { - if v, ok := d.GetOk("pod_monitors"); ok { - request.PodMonitors = serializePromConfigItems(v) - } - } - - if d.HasChange("raw_jobs") { - if v, ok := d.GetOk("raw_jobs"); ok { - request.RawJobs = serializePromConfigItems(v) - } - } - - errRet = resource.Retry(writeRetryTimeout, func() *resource.RetryError { - response, e := me.client.UseTkeClient().ModifyPrometheusConfig(request) - if e != nil { - return retryError(e) - } else { - log.Printf("[DEBUG]%s api[%s] success, ids [%s], request body [%s], response body [%s]\n", - logId, request.GetAction(), d.Id(), request.ToJsonString(), response.ToJsonString()) - } - return nil - }) - return -} - -func (me *TkeService) DeleteTkeTmpConfig(d *schema.ResourceData) (errRet error) { +func (me *TkeService) DeleteTkeTmpConfigById(d *schema.ResourceData) (errRet error) { logId := getLogId(contextNil) request := tke.NewDeletePrometheusConfigRequest() @@ -2054,22 +1969,6 @@ func parseId(configId string) (ret *PrometheusConfigIds, err error) { return } -func flattenPrometheusConfigItems(objList []*tke.PrometheusConfigItem) []map[string]interface{} { - result := make([]map[string]interface{}, 0, len(objList)) - for i := range objList { - v := objList[i] - item := map[string]interface{}{ - "config": v.Config, - "name": v.Name, - } - if v.TemplateId != nil { - item["template_id"] = v.TemplateId - } - result = append(result, item) - } - return result -} - func serializePromConfigItems(v interface{}) []*tke.PrometheusConfigItem { resList := v.([]interface{}) items := make([]*tke.PrometheusConfigItem, 0, len(resList)) diff --git a/website/docs/r/monitor_tmp_tke_config.html.markdown b/website/docs/r/monitor_tmp_tke_config.html.markdown new file mode 100644 index 0000000000..7df48b5bb5 --- /dev/null +++ b/website/docs/r/monitor_tmp_tke_config.html.markdown @@ -0,0 +1,54 @@ +--- +subcategory: "Monitor" +layout: "tencentcloud" +page_title: "TencentCloud: tencentcloud_monitor_tmp_tke_config" +sidebar_current: "docs-tencentcloud-resource-monitor_tmp_tke_config" +description: |- + Provides a resource to create a tke tmpPrometheusConfig +--- + +# tencentcloud_monitor_tmp_tke_config + +Provides a resource to create a tke tmpPrometheusConfig + +## Example Usage + + + +## Argument Reference + +The following arguments are supported: + +* `cluster_id` - (Required, String) ID of cluster. +* `cluster_type` - (Required, String) Type of cluster. +* `instance_id` - (Required, String) ID of instance. +* `pod_monitors` - (Optional, List) Configuration of the pod monitors. +* `raw_jobs` - (Optional, List) Configuration of the native prometheus job. +* `service_monitors` - (Optional, List) Configuration of the service monitors. + +The `pod_monitors` object supports the following: + +* `config` - (Required, String) Config. +* `name` - (Required, String) Name. +* `template_id` - (Optional, String) Used for output parameters, if the configuration comes from a template, it is the template id. + +The `raw_jobs` object supports the following: + +* `config` - (Required, String) Config. +* `name` - (Required, String) Name. +* `template_id` - (Optional, String) Used for output parameters, if the configuration comes from a template, it is the template id. + +The `service_monitors` object supports the following: + +* `config` - (Required, String) Config. +* `name` - (Required, String) Name. +* `template_id` - (Optional, String) Used for output parameters, if the configuration comes from a template, it is the template id. + +## Attributes Reference + +In addition to all arguments above, the following attributes are exported: + +* `id` - ID of the resource. +* `config` - Global configuration. + + diff --git a/website/tencentcloud.erb b/website/tencentcloud.erb index fc7aea59a5..ebc3c75839 100644 --- a/website/tencentcloud.erb +++ b/website/tencentcloud.erb @@ -1145,6 +1145,9 @@
  • tencentcloud_monitor_tmp_tke_alert_policy
  • +
  • + tencentcloud_monitor_tmp_tke_config +
  • tencentcloud_monitor_tmp_tke_template
  • From 1f4d02728ac1a5c3026c2b8ce839a963b5a10d04 Mon Sep 17 00:00:00 2001 From: nickyinluo Date: Tue, 16 Aug 2022 16:14:07 +0800 Subject: [PATCH 3/7] add ut --- tencentcloud/basic_test.go | 2 + .../resource_tc_monitor_tmp_tke_config.go | 125 ++++++++++--- ...resource_tc_monitor_tmp_tke_config_test.go | 170 ++++++++++++++++++ tencentcloud/service_tencentcloud_tke.go | 57 ++---- 4 files changed, 282 insertions(+), 72 deletions(-) create mode 100644 tencentcloud/resource_tc_monitor_tmp_tke_config_test.go diff --git a/tencentcloud/basic_test.go b/tencentcloud/basic_test.go index 1d0bf963a1..75f81a7f5e 100644 --- a/tencentcloud/basic_test.go +++ b/tencentcloud/basic_test.go @@ -173,6 +173,8 @@ const ( tkeExclusiveVpcName = "keep_tke_exclusive_vpc" defaultTkeClusterId = "cls-ely08ic4" defaultTkeClusterName = "keep-tke-cluster" + defaultTkeClusterType = "tke" + defaultPrometheusId = "prom-1lspn8sw" ) /* diff --git a/tencentcloud/resource_tc_monitor_tmp_tke_config.go b/tencentcloud/resource_tc_monitor_tmp_tke_config.go index 449c455e68..ca80f7b5b7 100644 --- a/tencentcloud/resource_tc_monitor_tmp_tke_config.go +++ b/tencentcloud/resource_tc_monitor_tmp_tke_config.go @@ -52,16 +52,19 @@ func resourceTencentCloudMonitorTmpTkeConfig() *schema.Resource { "instance_id": { Type: schema.TypeString, Required: true, + ForceNew: true, Description: "ID of instance.", }, "cluster_type": { Type: schema.TypeString, Required: true, + ForceNew: true, Description: "Type of cluster.", }, "cluster_id": { Type: schema.TypeString, Required: true, + ForceNew: true, Description: "ID of cluster.", }, "config": { @@ -170,18 +173,18 @@ func resourceTencentCloudTkeTmpConfigRead(d *schema.ResourceData, meta interface log.Printf("[CRITAL]%s provider set config fail, reason:%s\n", logId, e.Error()) return e } - if e := d.Set("service_monitors", flattenPrometheusConfigItems(params.ServiceMonitors)); e != nil { - log.Printf("[CRITAL]%s provider set service_monitors fail, reason:%s\n", logId, e.Error()) - return e - } - if e := d.Set("pod_monitors", flattenPrometheusConfigItems(params.PodMonitors)); e != nil { - log.Printf("[CRITAL]%s provider set pod_monitors fail, reason:%s\n", logId, e.Error()) - return e - } - if e := d.Set("raw_jobs", flattenPrometheusConfigItems(params.RawJobs)); e != nil { - log.Printf("[CRITAL]%s provider set raw_jobs fail, reason:%s\n", logId, e.Error()) - return e - } + // if e := d.Set("service_monitors", flattenPrometheusConfigItems(params.ServiceMonitors)); e != nil { + // log.Printf("[CRITAL]%s provider set service_monitors fail, reason:%s\n", logId, e.Error()) + // return e + // } + // if e := d.Set("pod_monitors", flattenPrometheusConfigItems(params.PodMonitors)); e != nil { + // log.Printf("[CRITAL]%s provider set pod_monitors fail, reason:%s\n", logId, e.Error()) + // return e + // } + // if e := d.Set("raw_jobs", flattenPrometheusConfigItems(params.RawJobs)); e != nil { + // log.Printf("[CRITAL]%s provider set raw_jobs fail, reason:%s\n", logId, e.Error()) + // return e + // } return nil } @@ -213,6 +216,7 @@ func resourceTencentCloudTkeTmpConfigCreate(d *schema.ResourceData, meta interfa if v, ok := d.GetOk("raw_jobs"); ok { request.RawJobs = serializePromConfigItems(v) } + ids := strings.Join([]string{*request.InstanceId, *request.ClusterType, *request.ClusterId}, FILED_SP) err := resource.Retry(writeRetryTimeout, func() *resource.RetryError { @@ -232,6 +236,19 @@ func resourceTencentCloudTkeTmpConfigCreate(d *schema.ResourceData, meta interfa d.SetId(ids) + if e := d.Set("service_monitors", flattenPrometheusConfigItems(request.ServiceMonitors)); e != nil { + log.Printf("[CRITAL]%s provider set service_monitors fail, reason:%s\n", logId, e.Error()) + return e + } + if e := d.Set("pod_monitors", flattenPrometheusConfigItems(request.PodMonitors)); e != nil { + log.Printf("[CRITAL]%s provider set pod_monitors fail, reason:%s\n", logId, e.Error()) + return e + } + if e := d.Set("raw_jobs", flattenPrometheusConfigItems(request.RawJobs)); e != nil { + log.Printf("[CRITAL]%s provider set raw_jobs fail, reason:%s\n", logId, e.Error()) + return e + } + return resourceTencentCloudTkeTmpConfigRead(d, meta) } @@ -242,20 +259,11 @@ func resourceTencentCloudTkeTmpConfigUpdate(d *schema.ResourceData, meta interfa var ( logId = getLogId(contextNil) request = tke.NewModifyPrometheusConfigRequest() - client = meta.(*TencentCloudClient).apiV3Conn.UseTkeClient() + client = meta.(*TencentCloudClient).apiV3Conn + service = TkeService{client: client} ) - if d.HasChange("instance_id") { - return fmt.Errorf("`instance_id` do not support change now.") - } - if d.HasChange("cluster_id") { - return fmt.Errorf("`cluster_id` do not support change now.") - } - if d.HasChange("cluster_type") { - return fmt.Errorf("`cluster_type` do not support change now.") - } - - ids, err := parseId(d.Id()) + ids, err := service.parseConfigId(d.Id()) if err != nil { return err } @@ -282,7 +290,7 @@ func resourceTencentCloudTkeTmpConfigUpdate(d *schema.ResourceData, meta interfa } err = resource.Retry(writeRetryTimeout, func() *resource.RetryError { - response, e := client.ModifyPrometheusConfig(request) + response, e := client.UseTkeClient().ModifyPrometheusConfig(request) if e != nil { return retryError(e) } else { @@ -296,6 +304,19 @@ func resourceTencentCloudTkeTmpConfigUpdate(d *schema.ResourceData, meta interfa return err } + if e := d.Set("service_monitors", flattenPrometheusConfigItems(request.ServiceMonitors)); e != nil { + log.Printf("[CRITAL]%s provider set service_monitors fail, reason:%s\n", logId, e.Error()) + return e + } + if e := d.Set("pod_monitors", flattenPrometheusConfigItems(request.PodMonitors)); e != nil { + log.Printf("[CRITAL]%s provider set pod_monitors fail, reason:%s\n", logId, e.Error()) + return e + } + if e := d.Set("raw_jobs", flattenPrometheusConfigItems(request.RawJobs)); e != nil { + log.Printf("[CRITAL]%s provider set raw_jobs fail, reason:%s\n", logId, e.Error()) + return e + } + return resourceTencentCloudTkeTmpConfigRead(d, meta) } @@ -303,9 +324,27 @@ func resourceTencentCloudTkeTmpConfigDelete(d *schema.ResourceData, meta interfa defer logElapsed("resource.tencentcloud_tke_tmp_config.delete, Id: %s", d.Id())() defer inconsistentCheck(d, meta)() - service := TkeService{client: meta.(*TencentCloudClient).apiV3Conn} + var ( + logId = getLogId(contextNil) + service = TkeService{client: meta.(*TencentCloudClient).apiV3Conn} + ServiceMonitors = []*string{} + PodMonitors = []*string{} + RawJobs = []*string{} + ) + + if v, ok := d.GetOk("service_monitors"); ok { + ServiceMonitors = serializePromConfigItemNames(v) + } + + if v, ok := d.GetOk("pod_monitors"); ok { + PodMonitors = serializePromConfigItemNames(v) + } + + if v, ok := d.GetOk("raw_jobs"); ok { + RawJobs = serializePromConfigItemNames(v) + } - if err := service.DeleteTkeTmpConfigById(d); err != nil { + if err := service.DeleteTkeTmpConfigByName(logId, d.Id(), ServiceMonitors, PodMonitors, RawJobs); err != nil { return err } @@ -327,3 +366,35 @@ func flattenPrometheusConfigItems(objList []*tke.PrometheusConfigItem) []map[str } return result } + +func serializePromConfigItems(v interface{}) []*tke.PrometheusConfigItem { + resList := v.([]interface{}) + items := make([]*tke.PrometheusConfigItem, 0, len(resList)) + for _, res := range resList { + vv := res.(map[string]interface{}) + var item tke.PrometheusConfigItem + if v, ok := vv["name"]; ok { + item.Name = helper.String(v.(string)) + } + if v, ok := vv["config"]; ok { + item.Config = helper.String(v.(string)) + } + if v, ok := vv["template_id"]; ok { + item.TemplateId = helper.String(v.(string)) + } + items = append(items, &item) + } + return items +} + +func serializePromConfigItemNames(v interface{}) []*string { + resList := v.([]interface{}) + names := make([]*string, 0, len(resList)) + for _, res := range resList { + vv := res.(map[string]interface{}) + if v, ok := vv["name"]; ok { + names = append(names, helper.String(v.(string))) + } + } + return names +} diff --git a/tencentcloud/resource_tc_monitor_tmp_tke_config_test.go b/tencentcloud/resource_tc_monitor_tmp_tke_config_test.go new file mode 100644 index 0000000000..2ebd6ff156 --- /dev/null +++ b/tencentcloud/resource_tc_monitor_tmp_tke_config_test.go @@ -0,0 +1,170 @@ +package tencentcloud + +import ( + "fmt" + "strings" + "testing" + + "github.com/hashicorp/terraform-plugin-sdk/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/terraform" + "github.com/pkg/errors" + tke "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tke/v20180525" +) + +func init() { + // go test -v ./tencentcloud -sweep=ap-guangzhou -sweep-run=tencentcloud_monitor_tmp_tke_config + resource.AddTestSweepers("tencentcloud_monitor_tmp_tke_config", &resource.Sweeper{ + Name: "tencentcloud_monitor_tmp_tke_config", + F: func(r string) error { + logId := getLogId(contextNil) + cli, _ := sharedClientForRegion(r) + client := cli.(*TencentCloudClient).apiV3Conn + configId := packConfigId(defaultPrometheusId, defaultTkeClusterType, defaultTkeClusterId) + + service := TkeService{client} + + promConfigs, err := service.DescribeTkeTmpConfigById(logId, configId) + + if err != nil { + return err + } + + if promConfigs == nil { + return fmt.Errorf("Prometheus config %s not exist", configId) + } + + ServiceMonitors := transObj2StrNames(promConfigs.ServiceMonitors) + PodMonitors := transObj2StrNames(promConfigs.PodMonitors) + RawJobs := transObj2StrNames(promConfigs.RawJobs) + service.DeleteTkeTmpConfigByName(logId, configId, ServiceMonitors, PodMonitors, RawJobs) + + return nil + }, + }) +} + +func TestAccTencentCloudTmpTkeConfig_basic(t *testing.T) { + t.Parallel() + id := new(string) + + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheckCommon(t, ACCOUNT_TYPE_PREPAY) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckTmpTkeConfigDestroy(id), + Steps: []resource.TestStep{ + { + Config: testAccTmpTkeConfig_basic, + Check: resource.ComposeTestCheckFunc( + testAccCheckTmpTkeConfigExists("tencentcloud_monitor_tmp_tke_config.foo", id), + resource.TestCheckResourceAttr("tencentcloud_monitor_tmp_tke_config.foo", "instance_id", defaultPrometheusId), + resource.TestCheckResourceAttr("tencentcloud_monitor_tmp_tke_config.foo", "cluster_type", defaultTkeClusterType), + resource.TestCheckResourceAttr("tencentcloud_monitor_tmp_tke_config.foo", "cluster_id", defaultTkeClusterId), + ), + }, + { + Config: testAccTmpTkeConfig_basic, + Check: resource.ComposeTestCheckFunc( + testAccCheckTmpTkeConfigExists("tencentcloud_monitor_tmp_tke_config.foo", id), + resource.TestCheckResourceAttr("tencentcloud_monitor_tmp_tke_config.foo", "instance_id", defaultPrometheusId), + resource.TestCheckResourceAttr("tencentcloud_monitor_tmp_tke_config.foo", "cluster_type", defaultTkeClusterType), + resource.TestCheckResourceAttr("tencentcloud_monitor_tmp_tke_config.foo", "cluster_id", defaultTkeClusterId), + ), + }, + { + ResourceName: "tencentcloud_monitor_tmp_tke_config.foo", + ImportState: true, + ImportStateVerify: true, + }, + }, + }) +} + +func testAccCheckTmpTkeConfigDestroy(configId *string) resource.TestCheckFunc { + return func(s *terraform.State) error { + logId := getLogId(contextNil) + client := testAccProvider.Meta().(*TencentCloudClient).apiV3Conn + service := TkeService{client} + + // rs, ok := s.RootModule().Resources[n] + // if !ok { + // return fmt.Errorf("not found: %s", n) + // } + + // configId := rs.Primary.ID + // if configId == "" { + // return errors.New("no prometheus config ID is set") + // } + + promConfigs, err := service.DescribeTkeTmpConfigById(logId, *configId) + + if err != nil { + return err + } + + if promConfigs == nil { + return nil + } + + if len(promConfigs.ServiceMonitors) != 0 || len(promConfigs.PodMonitors) != 0 || len(promConfigs.RawJobs) != 0 { + return errors.New("promConfigs still exists") + } + + return nil + } +} + +func testAccCheckTmpTkeConfigExists(n string, id *string) resource.TestCheckFunc { + return func(s *terraform.State) error { + logId := getLogId(contextNil) + client := testAccProvider.Meta().(*TencentCloudClient).apiV3Conn + service := TkeService{client} + + rs, ok := s.RootModule().Resources[n] + if !ok { + return fmt.Errorf("not found: %s", n) + } + + configId := rs.Primary.ID + if configId == "" { + return errors.New("no prometheus config ID is set") + } + + promConfigs, err := service.DescribeTkeTmpConfigById(logId, configId) + if err != nil { + return err + } + + if promConfigs == nil || (len(promConfigs.ServiceMonitors) == 0 && len(promConfigs.PodMonitors) == 0 && len(promConfigs.RawJobs) == 0) { + return fmt.Errorf("prometheus config not found: %s", rs.Primary.ID) + } + *id = configId + + return nil + } +} + +func packConfigId(instanceId string, clusterType string, clusterId string) (ids string) { + ids = strings.Join([]string{instanceId, clusterType, clusterId}, FILED_SP) + return +} + +func transObj2StrNames(resList []*tke.PrometheusConfigItem) []*string { + names := make([]*string, 0, len(resList)) + for _, res := range resList { + if res.Name != nil { + names = append(names, res.Name) + } + } + return names +} + +const testAccTmpTkeConfig_basic = ` +resource "tencentcloud_monitor_tmp_tke_config" "foo" { + instance_id = "` + defaultPrometheusId + `" + cluster_type = "` + defaultTkeClusterType + `" + cluster_id = "` + defaultTkeClusterId + `" + raw_jobs { + name = "rawjob_test_001" + config = "scrape_configs:\n- job_name: rawjob_test_001\n honor_labels: true\n honor_timestamps: false\n scrape_interval: 20s\n metrics_path: /metrics\n scheme: http\n" + } +}` diff --git a/tencentcloud/service_tencentcloud_tke.go b/tencentcloud/service_tencentcloud_tke.go index e86620b8c4..c35c856b5e 100644 --- a/tencentcloud/service_tencentcloud_tke.go +++ b/tencentcloud/service_tencentcloud_tke.go @@ -1878,7 +1878,7 @@ func (me *TkeService) DescribeTkeTmpConfigById(logId string, configId string) (r } }() - ids, err := parseId(configId) + ids, err := me.parseConfigId(configId) if err != nil { errRet = err return @@ -1907,18 +1907,17 @@ func (me *TkeService) DescribeTkeTmpConfigById(logId string, configId string) (r return } -func (me *TkeService) DeleteTkeTmpConfigById(d *schema.ResourceData) (errRet error) { - logId := getLogId(contextNil) +func (me *TkeService) DeleteTkeTmpConfigByName(logId string, configId string, ServiceMonitors []*string, PodMonitors []*string, RawJobs []*string) (errRet error) { request := tke.NewDeletePrometheusConfigRequest() defer func() { if errRet != nil { log.Printf("[CRITAL]%s api[%s] fail,ids [%s], request body [%s], reason[%s]\n", - logId, "delete object", d.Id(), request.ToJsonString(), errRet.Error()) + logId, "delete object", configId, request.ToJsonString(), errRet.Error()) } }() - ids, err := parseId(d.Id()) + ids, err := me.parseConfigId(configId) if err != nil { errRet = err return @@ -1928,16 +1927,16 @@ func (me *TkeService) DeleteTkeTmpConfigById(d *schema.ResourceData) (errRet err request.ClusterType = &ids.ClusterType request.InstanceId = &ids.InstanceId - if v, ok := d.GetOk("service_monitors"); ok { - request.ServiceMonitors = serializePromConfigItemNames(v) + if len(ServiceMonitors) > 0 { + request.ServiceMonitors = ServiceMonitors } - if v, ok := d.GetOk("pod_monitors"); ok { - request.PodMonitors = serializePromConfigItemNames(v) + if len(PodMonitors) > 0 { + request.PodMonitors = PodMonitors } - if v, ok := d.GetOk("raw_jobs"); ok { - request.RawJobs = serializePromConfigItemNames(v) + if len(RawJobs) > 0 { + request.RawJobs = RawJobs } ratelimit.Check(request.GetAction()) @@ -1947,12 +1946,12 @@ func (me *TkeService) DeleteTkeTmpConfigById(d *schema.ResourceData) (errRet err return } log.Printf("[DEBUG]%s api[%s] success, ids [%s], request body [%s], response body [%s]\n", - logId, request.GetAction(), d.Id(), request.ToJsonString(), response.ToJsonString()) + logId, request.GetAction(), configId, request.ToJsonString(), response.ToJsonString()) return } -func parseId(configId string) (ret *PrometheusConfigIds, err error) { +func (me *TkeService) parseConfigId(configId string) (ret *PrometheusConfigIds, err error) { idSplit := strings.Split(configId, FILED_SP) if len(idSplit) != 3 { return nil, fmt.Errorf("id is broken,%s", configId) @@ -1968,35 +1967,3 @@ func parseId(configId string) (ret *PrometheusConfigIds, err error) { ret = &PrometheusConfigIds{instanceId, clusterType, clusterId} return } - -func serializePromConfigItems(v interface{}) []*tke.PrometheusConfigItem { - resList := v.([]interface{}) - items := make([]*tke.PrometheusConfigItem, 0, len(resList)) - for _, res := range resList { - vv := res.(map[string]interface{}) - var item tke.PrometheusConfigItem - if v, ok := vv["name"]; ok { - item.Name = helper.String(v.(string)) - } - if v, ok := vv["config"]; ok { - item.Config = helper.String(v.(string)) - } - if v, ok := vv["template_id"]; ok { - item.TemplateId = helper.String(v.(string)) - } - items = append(items, &item) - } - return items -} - -func serializePromConfigItemNames(v interface{}) []*string { - resList := v.([]interface{}) - names := make([]*string, 0, len(resList)) - for _, res := range resList { - vv := res.(map[string]interface{}) - if v, ok := vv["name"]; ok { - names = append(names, helper.String(v.(string))) - } - } - return names -} From 890d4f3dfdf2161f45a4bd224bde28a85216853a Mon Sep 17 00:00:00 2001 From: nickyinluo Date: Tue, 16 Aug 2022 21:41:41 +0800 Subject: [PATCH 4/7] save the tf resource to tfstate locally instead of call the read method --- .../resource_tc_monitor_tmp_tke_config.go | 58 +-------------- ...resource_tc_monitor_tmp_tke_config_test.go | 72 ++++++++++++------- .../r/monitor_tmp_tke_config.html.markdown | 6 +- 3 files changed, 49 insertions(+), 87 deletions(-) diff --git a/tencentcloud/resource_tc_monitor_tmp_tke_config.go b/tencentcloud/resource_tc_monitor_tmp_tke_config.go index ca80f7b5b7..c0e4ee738e 100644 --- a/tencentcloud/resource_tc_monitor_tmp_tke_config.go +++ b/tencentcloud/resource_tc_monitor_tmp_tke_config.go @@ -45,9 +45,6 @@ func resourceTencentCloudMonitorTmpTkeConfig() *schema.Resource { Read: resourceTencentCloudTkeTmpConfigRead, Update: resourceTencentCloudTkeTmpConfigUpdate, Delete: resourceTencentCloudTkeTmpConfigDelete, - Importer: &schema.ResourceImporter{ - State: schema.ImportStatePassthrough, - }, Schema: map[string]*schema.Schema{ "instance_id": { Type: schema.TypeString, @@ -173,18 +170,7 @@ func resourceTencentCloudTkeTmpConfigRead(d *schema.ResourceData, meta interface log.Printf("[CRITAL]%s provider set config fail, reason:%s\n", logId, e.Error()) return e } - // if e := d.Set("service_monitors", flattenPrometheusConfigItems(params.ServiceMonitors)); e != nil { - // log.Printf("[CRITAL]%s provider set service_monitors fail, reason:%s\n", logId, e.Error()) - // return e - // } - // if e := d.Set("pod_monitors", flattenPrometheusConfigItems(params.PodMonitors)); e != nil { - // log.Printf("[CRITAL]%s provider set pod_monitors fail, reason:%s\n", logId, e.Error()) - // return e - // } - // if e := d.Set("raw_jobs", flattenPrometheusConfigItems(params.RawJobs)); e != nil { - // log.Printf("[CRITAL]%s provider set raw_jobs fail, reason:%s\n", logId, e.Error()) - // return e - // } + return nil } @@ -236,19 +222,6 @@ func resourceTencentCloudTkeTmpConfigCreate(d *schema.ResourceData, meta interfa d.SetId(ids) - if e := d.Set("service_monitors", flattenPrometheusConfigItems(request.ServiceMonitors)); e != nil { - log.Printf("[CRITAL]%s provider set service_monitors fail, reason:%s\n", logId, e.Error()) - return e - } - if e := d.Set("pod_monitors", flattenPrometheusConfigItems(request.PodMonitors)); e != nil { - log.Printf("[CRITAL]%s provider set pod_monitors fail, reason:%s\n", logId, e.Error()) - return e - } - if e := d.Set("raw_jobs", flattenPrometheusConfigItems(request.RawJobs)); e != nil { - log.Printf("[CRITAL]%s provider set raw_jobs fail, reason:%s\n", logId, e.Error()) - return e - } - return resourceTencentCloudTkeTmpConfigRead(d, meta) } @@ -304,19 +277,6 @@ func resourceTencentCloudTkeTmpConfigUpdate(d *schema.ResourceData, meta interfa return err } - if e := d.Set("service_monitors", flattenPrometheusConfigItems(request.ServiceMonitors)); e != nil { - log.Printf("[CRITAL]%s provider set service_monitors fail, reason:%s\n", logId, e.Error()) - return e - } - if e := d.Set("pod_monitors", flattenPrometheusConfigItems(request.PodMonitors)); e != nil { - log.Printf("[CRITAL]%s provider set pod_monitors fail, reason:%s\n", logId, e.Error()) - return e - } - if e := d.Set("raw_jobs", flattenPrometheusConfigItems(request.RawJobs)); e != nil { - log.Printf("[CRITAL]%s provider set raw_jobs fail, reason:%s\n", logId, e.Error()) - return e - } - return resourceTencentCloudTkeTmpConfigRead(d, meta) } @@ -351,22 +311,6 @@ func resourceTencentCloudTkeTmpConfigDelete(d *schema.ResourceData, meta interfa return nil } -func flattenPrometheusConfigItems(objList []*tke.PrometheusConfigItem) []map[string]interface{} { - result := make([]map[string]interface{}, 0, len(objList)) - for i := range objList { - v := objList[i] - item := map[string]interface{}{ - "config": v.Config, - "name": v.Name, - } - if v.TemplateId != nil { - item["template_id"] = v.TemplateId - } - result = append(result, item) - } - return result -} - func serializePromConfigItems(v interface{}) []*tke.PrometheusConfigItem { resList := v.([]interface{}) items := make([]*tke.PrometheusConfigItem, 0, len(resList)) diff --git a/tencentcloud/resource_tc_monitor_tmp_tke_config_test.go b/tencentcloud/resource_tc_monitor_tmp_tke_config_test.go index 2ebd6ff156..3163ffdda8 100644 --- a/tencentcloud/resource_tc_monitor_tmp_tke_config_test.go +++ b/tencentcloud/resource_tc_monitor_tmp_tke_config_test.go @@ -55,26 +55,27 @@ func TestAccTencentCloudTmpTkeConfig_basic(t *testing.T) { { Config: testAccTmpTkeConfig_basic, Check: resource.ComposeTestCheckFunc( - testAccCheckTmpTkeConfigExists("tencentcloud_monitor_tmp_tke_config.foo", id), - resource.TestCheckResourceAttr("tencentcloud_monitor_tmp_tke_config.foo", "instance_id", defaultPrometheusId), - resource.TestCheckResourceAttr("tencentcloud_monitor_tmp_tke_config.foo", "cluster_type", defaultTkeClusterType), - resource.TestCheckResourceAttr("tencentcloud_monitor_tmp_tke_config.foo", "cluster_id", defaultTkeClusterId), + testAccCheckTmpTkeConfigExists("tencentcloud_monitor_tmp_tke_config.basic", id), + resource.TestCheckResourceAttr("tencentcloud_monitor_tmp_tke_config.basic", "instance_id", defaultPrometheusId), + resource.TestCheckResourceAttr("tencentcloud_monitor_tmp_tke_config.basic", "cluster_type", defaultTkeClusterType), + resource.TestCheckResourceAttr("tencentcloud_monitor_tmp_tke_config.basic", "cluster_id", defaultTkeClusterId), + resource.TestCheckResourceAttr("tencentcloud_monitor_tmp_tke_config.basic", "raw_jobs.name", "rawjob-test-001"), + resource.TestCheckResourceAttr("tencentcloud_monitor_tmp_tke_config.basic", "service_monitors.name", "service-monitor-001"), + resource.TestCheckResourceAttr("tencentcloud_monitor_tmp_tke_config.basic", "pod_monitors.name", "pod-monitor-001"), ), }, { - Config: testAccTmpTkeConfig_basic, + Config: testAccTmpTkeConfig_update, Check: resource.ComposeTestCheckFunc( - testAccCheckTmpTkeConfigExists("tencentcloud_monitor_tmp_tke_config.foo", id), - resource.TestCheckResourceAttr("tencentcloud_monitor_tmp_tke_config.foo", "instance_id", defaultPrometheusId), - resource.TestCheckResourceAttr("tencentcloud_monitor_tmp_tke_config.foo", "cluster_type", defaultTkeClusterType), - resource.TestCheckResourceAttr("tencentcloud_monitor_tmp_tke_config.foo", "cluster_id", defaultTkeClusterId), + testAccCheckTmpTkeConfigExists("tencentcloud_monitor_tmp_tke_config.update", id), + resource.TestCheckResourceAttr("tencentcloud_monitor_tmp_tke_config.update", "instance_id", defaultPrometheusId), + resource.TestCheckResourceAttr("tencentcloud_monitor_tmp_tke_config.update", "cluster_type", defaultTkeClusterType), + resource.TestCheckResourceAttr("tencentcloud_monitor_tmp_tke_config.update", "cluster_id", defaultTkeClusterId), + resource.TestCheckResourceAttr("tencentcloud_monitor_tmp_tke_config.update", "raw_jobs.name", "rawjob-test-001-config-updated"), + resource.TestCheckResourceAttr("tencentcloud_monitor_tmp_tke_config.update", "service_monitors.name", "service-monitor-001-config-updated"), + resource.TestCheckResourceAttr("tencentcloud_monitor_tmp_tke_config.update", "pod_monitors.name", "pod-monitor-001-config-updated"), ), }, - { - ResourceName: "tencentcloud_monitor_tmp_tke_config.foo", - ImportState: true, - ImportStateVerify: true, - }, }, }) } @@ -85,16 +86,6 @@ func testAccCheckTmpTkeConfigDestroy(configId *string) resource.TestCheckFunc { client := testAccProvider.Meta().(*TencentCloudClient).apiV3Conn service := TkeService{client} - // rs, ok := s.RootModule().Resources[n] - // if !ok { - // return fmt.Errorf("not found: %s", n) - // } - - // configId := rs.Primary.ID - // if configId == "" { - // return errors.New("no prometheus config ID is set") - // } - promConfigs, err := service.DescribeTkeTmpConfigById(logId, *configId) if err != nil { @@ -159,12 +150,39 @@ func transObj2StrNames(resList []*tke.PrometheusConfigItem) []*string { } const testAccTmpTkeConfig_basic = ` -resource "tencentcloud_monitor_tmp_tke_config" "foo" { +resource "tencentcloud_monitor_tmp_tke_config" "basic" { + instance_id = "` + defaultPrometheusId + `" + cluster_type = "` + defaultTkeClusterType + `" + cluster_id = "` + defaultTkeClusterId + `" + raw_jobs { + name = "rawjob-test-001" + config = "rawjob-test-001-config" + } + service_monitors { + name = "service-monitor-001" + config = "service-monitor-001-config" + } + pod_monitors { + name = "pod-monitor-001" + config = "pod-monitor-001-config" + } +}` + +const testAccTmpTkeConfig_update = ` +resource "tencentcloud_monitor_tmp_tke_config" "update" { instance_id = "` + defaultPrometheusId + `" cluster_type = "` + defaultTkeClusterType + `" cluster_id = "` + defaultTkeClusterId + `" raw_jobs { - name = "rawjob_test_001" - config = "scrape_configs:\n- job_name: rawjob_test_001\n honor_labels: true\n honor_timestamps: false\n scrape_interval: 20s\n metrics_path: /metrics\n scheme: http\n" + name = "rawjob-test-001" + config = "rawjob-test-001-config-updated" + } + service_monitors { + name = "service-monitor-001" + config = "service-monitor-001-config-updated" + } + pod_monitors { + name = "pod-monitor-001" + config = "pod-monitor-001-config-updated" } }` diff --git a/website/docs/r/monitor_tmp_tke_config.html.markdown b/website/docs/r/monitor_tmp_tke_config.html.markdown index 7df48b5bb5..82be5fad4d 100644 --- a/website/docs/r/monitor_tmp_tke_config.html.markdown +++ b/website/docs/r/monitor_tmp_tke_config.html.markdown @@ -19,9 +19,9 @@ Provides a resource to create a tke tmpPrometheusConfig The following arguments are supported: -* `cluster_id` - (Required, String) ID of cluster. -* `cluster_type` - (Required, String) Type of cluster. -* `instance_id` - (Required, String) ID of instance. +* `cluster_id` - (Required, String, ForceNew) ID of cluster. +* `cluster_type` - (Required, String, ForceNew) Type of cluster. +* `instance_id` - (Required, String, ForceNew) ID of instance. * `pod_monitors` - (Optional, List) Configuration of the pod monitors. * `raw_jobs` - (Optional, List) Configuration of the native prometheus job. * `service_monitors` - (Optional, List) Configuration of the service monitors. From c6acda40445bab67ae269790c123c180b983a37c Mon Sep 17 00:00:00 2001 From: nickyinluo Date: Thu, 18 Aug 2022 18:44:35 +0800 Subject: [PATCH 5/7] Revised the spec and ut for the name rule about PrometheusConfigItem.Name field. --- .../resource_tc_monitor_tmp_tke_config.go | 16 +++--- ...resource_tc_monitor_tmp_tke_config_test.go | 50 ++++++++++--------- .../r/monitor_tmp_tke_config.html.markdown | 4 +- 3 files changed, 37 insertions(+), 33 deletions(-) diff --git a/tencentcloud/resource_tc_monitor_tmp_tke_config.go b/tencentcloud/resource_tc_monitor_tmp_tke_config.go index c0e4ee738e..727c25e740 100644 --- a/tencentcloud/resource_tc_monitor_tmp_tke_config.go +++ b/tencentcloud/resource_tc_monitor_tmp_tke_config.go @@ -11,18 +11,18 @@ resource "tencentcloud_monitor_tmp_tke_config" "foo" { cluster_id = "xxx" raw_jobs { - name = "rawjob_001" - config = "your_config_for_raw_jobs\n" + name = "raw_jobs_001" + config = "your config for raw_jobs_001\n" } service_monitors { - name = "servicemonitors_001" - config = "your_config_for_service_monitors\n" + name = "kube-system/service-monitor-001" # name with default namespace kube-system + config = "apiVersion: monitoring.coreos.com/v1\nkind: ServiceMonitor\nmetadata:\n name: service-monitor-001\n namespace: kube-system\n" } pod_monitors { - name = "pod_monitors_001" - config = "your_config_for_pod_monitors\n" + name = "mynamespace/pod-monitor-001" # name with the specified namespace + config = "apiVersion: monitoring.coreos.com/v1\nkind: PodMonitor\nmetadata:\n name: pod-monitor-001\n namespace: mynamespace\n" } } */ @@ -78,7 +78,7 @@ func resourceTencentCloudMonitorTmpTkeConfig() *schema.Resource { "name": { Type: schema.TypeString, Required: true, - Description: "Name.", + Description: "Name. The naming rule is: namespace/name. If you don't have any namespace, use the default namespace: kube-system, otherwise use the specified one.", }, "config": { Type: schema.TypeString, @@ -102,7 +102,7 @@ func resourceTencentCloudMonitorTmpTkeConfig() *schema.Resource { "name": { Type: schema.TypeString, Required: true, - Description: "Name.", + Description: "Name. The naming rule is: namespace/name. If you don't have any namespace, use the default namespace: kube-system, otherwise use the specified one.", }, "config": { Type: schema.TypeString, diff --git a/tencentcloud/resource_tc_monitor_tmp_tke_config_test.go b/tencentcloud/resource_tc_monitor_tmp_tke_config_test.go index 3163ffdda8..7a2af2e0ee 100644 --- a/tencentcloud/resource_tc_monitor_tmp_tke_config_test.go +++ b/tencentcloud/resource_tc_monitor_tmp_tke_config_test.go @@ -48,7 +48,7 @@ func TestAccTencentCloudTmpTkeConfig_basic(t *testing.T) { id := new(string) resource.Test(t, resource.TestCase{ - PreCheck: func() { testAccPreCheckCommon(t, ACCOUNT_TYPE_PREPAY) }, + PreCheck: func() { testAccPreCheckCommon(t, ACCOUNT_TYPE_COMMON) }, Providers: testAccProviders, CheckDestroy: testAccCheckTmpTkeConfigDestroy(id), Steps: []resource.TestStep{ @@ -59,9 +59,9 @@ func TestAccTencentCloudTmpTkeConfig_basic(t *testing.T) { resource.TestCheckResourceAttr("tencentcloud_monitor_tmp_tke_config.basic", "instance_id", defaultPrometheusId), resource.TestCheckResourceAttr("tencentcloud_monitor_tmp_tke_config.basic", "cluster_type", defaultTkeClusterType), resource.TestCheckResourceAttr("tencentcloud_monitor_tmp_tke_config.basic", "cluster_id", defaultTkeClusterId), - resource.TestCheckResourceAttr("tencentcloud_monitor_tmp_tke_config.basic", "raw_jobs.name", "rawjob-test-001"), - resource.TestCheckResourceAttr("tencentcloud_monitor_tmp_tke_config.basic", "service_monitors.name", "service-monitor-001"), - resource.TestCheckResourceAttr("tencentcloud_monitor_tmp_tke_config.basic", "pod_monitors.name", "pod-monitor-001"), + resource.TestCheckResourceAttr("tencentcloud_monitor_tmp_tke_config.basic", "raw_jobs.0.name", "raw_jobs_001"), + resource.TestCheckResourceAttr("tencentcloud_monitor_tmp_tke_config.basic", "service_monitors.0.name", "kube-system/service-monitor-001"), + resource.TestCheckResourceAttr("tencentcloud_monitor_tmp_tke_config.basic", "pod_monitors.0.name", "kube-system/pod-monitor-001"), ), }, { @@ -71,9 +71,9 @@ func TestAccTencentCloudTmpTkeConfig_basic(t *testing.T) { resource.TestCheckResourceAttr("tencentcloud_monitor_tmp_tke_config.update", "instance_id", defaultPrometheusId), resource.TestCheckResourceAttr("tencentcloud_monitor_tmp_tke_config.update", "cluster_type", defaultTkeClusterType), resource.TestCheckResourceAttr("tencentcloud_monitor_tmp_tke_config.update", "cluster_id", defaultTkeClusterId), - resource.TestCheckResourceAttr("tencentcloud_monitor_tmp_tke_config.update", "raw_jobs.name", "rawjob-test-001-config-updated"), - resource.TestCheckResourceAttr("tencentcloud_monitor_tmp_tke_config.update", "service_monitors.name", "service-monitor-001-config-updated"), - resource.TestCheckResourceAttr("tencentcloud_monitor_tmp_tke_config.update", "pod_monitors.name", "pod-monitor-001-config-updated"), + resource.TestCheckResourceAttr("tencentcloud_monitor_tmp_tke_config.update", "raw_jobs.0.config", "scrape_configs:\n- job_name: raw_jobs_001\n scrape_interval: 20s\n honor_labels: true\n"), + resource.TestCheckResourceAttr("tencentcloud_monitor_tmp_tke_config.update", "service_monitors.0.config", "apiVersion: monitoring.coreos.com/v1\nkind: ServiceMonitor\nmetadata:\n name: service-monitor-001\n namespace: kube-system\nspec:\n endpoints:\n - interval: 20s\n port: 8080-8080-tcp\n path: /metrics\n relabelings:\n - action: replace\n sourceLabels:\n - __meta_kubernetes_pod_label_app\n targetLabel: application\n namespaceSelector:\n matchNames:\n - test\n selector:\n matchLabels:\n app: test"), + resource.TestCheckResourceAttr("tencentcloud_monitor_tmp_tke_config.update", "pod_monitors.0.config", "apiVersion: monitoring.coreos.com/v1\nkind: PodMonitor\nmetadata:\n name: pod-monitor-001\n namespace: kube-system\nspec:\n podMetricsEndpoints:\n - interval: 20s\n port: metric-port\n path: /metrics\n relabelings:\n - action: replace\n sourceLabels:\n - instance\n regex: (.*)\n targetLabel: instance\n replacement: xxxxxx\n namespaceSelector:\n matchNames:\n - test\n selector:\n matchLabels:\n k8s-app: test"), ), }, }, @@ -154,17 +154,19 @@ resource "tencentcloud_monitor_tmp_tke_config" "basic" { instance_id = "` + defaultPrometheusId + `" cluster_type = "` + defaultTkeClusterType + `" cluster_id = "` + defaultTkeClusterId + `" - raw_jobs { - name = "rawjob-test-001" - config = "rawjob-test-001-config" - } service_monitors { - name = "service-monitor-001" - config = "service-monitor-001-config" + name = "kube-system/service-monitor-001" + config = "apiVersion: monitoring.coreos.com/v1\nkind: ServiceMonitor\nmetadata:\n name: service-monitor-001\n namespace: kube-system\nspec:\n endpoints:\n - interval: 115s\n port: 8080-8080-tcp\n path: /metrics\n relabelings:\n - action: replace\n sourceLabels:\n - __meta_kubernetes_pod_label_app\n targetLabel: application\n namespaceSelector:\n matchNames:\n - test\n selector:\n matchLabels:\n app: test" } + pod_monitors { - name = "pod-monitor-001" - config = "pod-monitor-001-config" + name = "kube-system/pod-monitor-001" + config = "apiVersion: monitoring.coreos.com/v1\nkind: PodMonitor\nmetadata:\n name: pod-monitor-001\n namespace: kube-system\nspec:\n podMetricsEndpoints:\n - interval: 15s\n port: metric-port\n path: /metrics\n relabelings:\n - action: replace\n sourceLabels:\n - instance\n regex: (.*)\n targetLabel: instance\n replacement: xxxxxx\n namespaceSelector:\n matchNames:\n - test\n selector:\n matchLabels:\n k8s-app: test" + } + + raw_jobs { + name = "raw_jobs_001" + config = "scrape_configs:\n- job_name: raw_jobs_001\n honor_labels: true\n" } }` @@ -173,16 +175,18 @@ resource "tencentcloud_monitor_tmp_tke_config" "update" { instance_id = "` + defaultPrometheusId + `" cluster_type = "` + defaultTkeClusterType + `" cluster_id = "` + defaultTkeClusterId + `" - raw_jobs { - name = "rawjob-test-001" - config = "rawjob-test-001-config-updated" - } service_monitors { - name = "service-monitor-001" - config = "service-monitor-001-config-updated" + name = "kube-system/service-monitor-001" + config = "apiVersion: monitoring.coreos.com/v1\nkind: ServiceMonitor\nmetadata:\n name: service-monitor-001\n namespace: kube-system\nspec:\n endpoints:\n - interval: 20s\n port: 8080-8080-tcp\n path: /metrics\n relabelings:\n - action: replace\n sourceLabels:\n - __meta_kubernetes_pod_label_app\n targetLabel: application\n namespaceSelector:\n matchNames:\n - test\n selector:\n matchLabels:\n app: test" } + pod_monitors { - name = "pod-monitor-001" - config = "pod-monitor-001-config-updated" + name = "kube-system/pod-monitor-001" + config = "apiVersion: monitoring.coreos.com/v1\nkind: PodMonitor\nmetadata:\n name: pod-monitor-001\n namespace: kube-system\nspec:\n podMetricsEndpoints:\n - interval: 20s\n port: metric-port\n path: /metrics\n relabelings:\n - action: replace\n sourceLabels:\n - instance\n regex: (.*)\n targetLabel: instance\n replacement: xxxxxx\n namespaceSelector:\n matchNames:\n - test\n selector:\n matchLabels:\n k8s-app: test" + } + + raw_jobs { + name = "raw_jobs_001" + config = "scrape_configs:\n- job_name: raw_jobs_001\n scrape_interval: 20s\n honor_labels: true\n" } }` diff --git a/website/docs/r/monitor_tmp_tke_config.html.markdown b/website/docs/r/monitor_tmp_tke_config.html.markdown index 82be5fad4d..062f0c3203 100644 --- a/website/docs/r/monitor_tmp_tke_config.html.markdown +++ b/website/docs/r/monitor_tmp_tke_config.html.markdown @@ -29,7 +29,7 @@ The following arguments are supported: The `pod_monitors` object supports the following: * `config` - (Required, String) Config. -* `name` - (Required, String) Name. +* `name` - (Required, String) Name. The naming rule is: namespace/name. If you don't have any namespace, use the default namespace: kube-system, otherwise use the specified one. * `template_id` - (Optional, String) Used for output parameters, if the configuration comes from a template, it is the template id. The `raw_jobs` object supports the following: @@ -41,7 +41,7 @@ The `raw_jobs` object supports the following: The `service_monitors` object supports the following: * `config` - (Required, String) Config. -* `name` - (Required, String) Name. +* `name` - (Required, String) Name. The naming rule is: namespace/name. If you don't have any namespace, use the default namespace: kube-system, otherwise use the specified one. * `template_id` - (Optional, String) Used for output parameters, if the configuration comes from a template, it is the template id. ## Attributes Reference From 4ad52c96decf023383b326b972c5c0e199860c5d Mon Sep 17 00:00:00 2001 From: nickyinluo Date: Thu, 18 Aug 2022 20:43:29 +0800 Subject: [PATCH 6/7] update the ut --- ...resource_tc_monitor_tmp_tke_config_test.go | 112 +++++++++++++----- 1 file changed, 84 insertions(+), 28 deletions(-) diff --git a/tencentcloud/resource_tc_monitor_tmp_tke_config_test.go b/tencentcloud/resource_tc_monitor_tmp_tke_config_test.go index 7a2af2e0ee..b6ead8ba5a 100644 --- a/tencentcloud/resource_tc_monitor_tmp_tke_config_test.go +++ b/tencentcloud/resource_tc_monitor_tmp_tke_config_test.go @@ -59,9 +59,9 @@ func TestAccTencentCloudTmpTkeConfig_basic(t *testing.T) { resource.TestCheckResourceAttr("tencentcloud_monitor_tmp_tke_config.basic", "instance_id", defaultPrometheusId), resource.TestCheckResourceAttr("tencentcloud_monitor_tmp_tke_config.basic", "cluster_type", defaultTkeClusterType), resource.TestCheckResourceAttr("tencentcloud_monitor_tmp_tke_config.basic", "cluster_id", defaultTkeClusterId), - resource.TestCheckResourceAttr("tencentcloud_monitor_tmp_tke_config.basic", "raw_jobs.0.name", "raw_jobs_001"), - resource.TestCheckResourceAttr("tencentcloud_monitor_tmp_tke_config.basic", "service_monitors.0.name", "kube-system/service-monitor-001"), - resource.TestCheckResourceAttr("tencentcloud_monitor_tmp_tke_config.basic", "pod_monitors.0.name", "kube-system/pod-monitor-001"), + resource.TestCheckResourceAttr("tencentcloud_monitor_tmp_tke_config.basic", "raw_jobs.0.name", raw_job_name), + resource.TestCheckResourceAttr("tencentcloud_monitor_tmp_tke_config.basic", "service_monitors.0.name", service_monitors_name_fully), + resource.TestCheckResourceAttr("tencentcloud_monitor_tmp_tke_config.basic", "pod_monitors.0.name", pod_monitors_name_fully), ), }, { @@ -71,9 +71,9 @@ func TestAccTencentCloudTmpTkeConfig_basic(t *testing.T) { resource.TestCheckResourceAttr("tencentcloud_monitor_tmp_tke_config.update", "instance_id", defaultPrometheusId), resource.TestCheckResourceAttr("tencentcloud_monitor_tmp_tke_config.update", "cluster_type", defaultTkeClusterType), resource.TestCheckResourceAttr("tencentcloud_monitor_tmp_tke_config.update", "cluster_id", defaultTkeClusterId), - resource.TestCheckResourceAttr("tencentcloud_monitor_tmp_tke_config.update", "raw_jobs.0.config", "scrape_configs:\n- job_name: raw_jobs_001\n scrape_interval: 20s\n honor_labels: true\n"), - resource.TestCheckResourceAttr("tencentcloud_monitor_tmp_tke_config.update", "service_monitors.0.config", "apiVersion: monitoring.coreos.com/v1\nkind: ServiceMonitor\nmetadata:\n name: service-monitor-001\n namespace: kube-system\nspec:\n endpoints:\n - interval: 20s\n port: 8080-8080-tcp\n path: /metrics\n relabelings:\n - action: replace\n sourceLabels:\n - __meta_kubernetes_pod_label_app\n targetLabel: application\n namespaceSelector:\n matchNames:\n - test\n selector:\n matchLabels:\n app: test"), - resource.TestCheckResourceAttr("tencentcloud_monitor_tmp_tke_config.update", "pod_monitors.0.config", "apiVersion: monitoring.coreos.com/v1\nkind: PodMonitor\nmetadata:\n name: pod-monitor-001\n namespace: kube-system\nspec:\n podMetricsEndpoints:\n - interval: 20s\n port: metric-port\n path: /metrics\n relabelings:\n - action: replace\n sourceLabels:\n - instance\n regex: (.*)\n targetLabel: instance\n replacement: xxxxxx\n namespaceSelector:\n matchNames:\n - test\n selector:\n matchLabels:\n k8s-app: test"), + resource.TestCheckResourceAttr("tencentcloud_monitor_tmp_tke_config.update", "raw_jobs.0.config", "scrape_configs:\n- job_name: "+raw_job_name+"\n scrape_interval: 20s\n honor_labels: true\n"), + resource.TestCheckResourceAttr("tencentcloud_monitor_tmp_tke_config.update", "service_monitors.0.config", "apiVersion: monitoring.coreos.com/v1\nkind: ServiceMonitor\nmetadata:\n name: "+service_monitors_name+"\n namespace: kube-system\nspec:\n endpoints:\n - interval: 20s\n port: 8080-8080-tcp\n path: /metrics\n relabelings:\n - action: replace\n sourceLabels:\n - __meta_kubernetes_pod_label_app\n targetLabel: application\n namespaceSelector:\n matchNames:\n - test\n selector:\n matchLabels:\n app: test"), + resource.TestCheckResourceAttr("tencentcloud_monitor_tmp_tke_config.update", "pod_monitors.0.config", "apiVersion: monitoring.coreos.com/v1\nkind: PodMonitor\nmetadata:\n name: "+pod_monitors_name+"\n namespace: kube-system\nspec:\n podMetricsEndpoints:\n - interval: 20s\n port: metric-port\n path: /metrics\n relabelings:\n - action: replace\n sourceLabels:\n - instance\n regex: (.*)\n targetLabel: instance\n replacement: xxxxxx\n namespaceSelector:\n matchNames:\n - test\n selector:\n matchLabels:\n k8s-app: test"), ), }, }, @@ -96,8 +96,22 @@ func testAccCheckTmpTkeConfigDestroy(configId *string) resource.TestCheckFunc { return nil } - if len(promConfigs.ServiceMonitors) != 0 || len(promConfigs.PodMonitors) != 0 || len(promConfigs.RawJobs) != 0 { - return errors.New("promConfigs still exists") + for _, config := range promConfigs.ServiceMonitors { + if *config.Name == service_monitors_name_fully { + return errors.New("promConfigs service_monitors still exists") + } + } + + for _, config := range promConfigs.PodMonitors { + if *config.Name == pod_monitors_name_fully { + return errors.New("promConfigs pod_monitors still exists") + } + } + + for _, config := range promConfigs.RawJobs { + if *config.Name == raw_job_name { + return errors.New("promConfigs raw_jobs still exists") + } } return nil @@ -149,44 +163,86 @@ func transObj2StrNames(resList []*tke.PrometheusConfigItem) []*string { return names } -const testAccTmpTkeConfig_basic = ` +const ( + raw_job_name = "raw_jobs_001" + pod_monitors_name = "pod-monitor-001" + service_monitors_name = "service-monitor-001" + pod_monitors_name_fully = "kube-system/pod-monitor-001" + service_monitors_name_fully = "kube-system/service-monitor-001" +) + +const testAccTmpTkeConfigVar = ` +variable "prometheus_id" { + default = "` + defaultPrometheusId + `" +} + +variable "tke_cluster_type" { + default = "` + defaultTkeClusterType + `" +} + +variable "tke_cluster_id" { + default = "` + defaultTkeClusterId + `" +} + +variable "pod_monitors_name_fully" { + default = "` + pod_monitors_name_fully + `" +} + +variable "service_monitors_name_fully" { + default = "` + service_monitors_name_fully + `" +} + +variable "raw_job_name" { + default = "` + raw_job_name + `" +} + +variable "pod_monitors_name" { + default = "` + pod_monitors_name + `" +} + +variable "service_monitors_name" { + default = "` + service_monitors_name + `" +} +` + +const testAccTmpTkeConfig_basic = testAccTmpTkeConfigVar + ` resource "tencentcloud_monitor_tmp_tke_config" "basic" { - instance_id = "` + defaultPrometheusId + `" - cluster_type = "` + defaultTkeClusterType + `" - cluster_id = "` + defaultTkeClusterId + `" + instance_id = var.prometheus_id + cluster_type = var.tke_cluster_type + cluster_id = var.tke_cluster_id service_monitors { - name = "kube-system/service-monitor-001" - config = "apiVersion: monitoring.coreos.com/v1\nkind: ServiceMonitor\nmetadata:\n name: service-monitor-001\n namespace: kube-system\nspec:\n endpoints:\n - interval: 115s\n port: 8080-8080-tcp\n path: /metrics\n relabelings:\n - action: replace\n sourceLabels:\n - __meta_kubernetes_pod_label_app\n targetLabel: application\n namespaceSelector:\n matchNames:\n - test\n selector:\n matchLabels:\n app: test" + name = var.service_monitors_name_fully + config = "apiVersion: monitoring.coreos.com/v1\nkind: ServiceMonitor\nmetadata:\n name: ` + service_monitors_name + `\n namespace: kube-system\nspec:\n endpoints:\n - interval: 115s\n port: 8080-8080-tcp\n path: /metrics\n relabelings:\n - action: replace\n sourceLabels:\n - __meta_kubernetes_pod_label_app\n targetLabel: application\n namespaceSelector:\n matchNames:\n - test\n selector:\n matchLabels:\n app: test" } pod_monitors { - name = "kube-system/pod-monitor-001" - config = "apiVersion: monitoring.coreos.com/v1\nkind: PodMonitor\nmetadata:\n name: pod-monitor-001\n namespace: kube-system\nspec:\n podMetricsEndpoints:\n - interval: 15s\n port: metric-port\n path: /metrics\n relabelings:\n - action: replace\n sourceLabels:\n - instance\n regex: (.*)\n targetLabel: instance\n replacement: xxxxxx\n namespaceSelector:\n matchNames:\n - test\n selector:\n matchLabels:\n k8s-app: test" + name = var.pod_monitors_name_fully + config = "apiVersion: monitoring.coreos.com/v1\nkind: PodMonitor\nmetadata:\n name: ` + pod_monitors_name + `\n namespace: kube-system\nspec:\n podMetricsEndpoints:\n - interval: 15s\n port: metric-port\n path: /metrics\n relabelings:\n - action: replace\n sourceLabels:\n - instance\n regex: (.*)\n targetLabel: instance\n replacement: xxxxxx\n namespaceSelector:\n matchNames:\n - test\n selector:\n matchLabels:\n k8s-app: test" } raw_jobs { - name = "raw_jobs_001" - config = "scrape_configs:\n- job_name: raw_jobs_001\n honor_labels: true\n" + name = var.raw_job_name + config = "scrape_configs:\n- job_name: ` + raw_job_name + `\n honor_labels: true\n" } }` -const testAccTmpTkeConfig_update = ` +const testAccTmpTkeConfig_update = testAccTmpTkeConfigVar + ` resource "tencentcloud_monitor_tmp_tke_config" "update" { - instance_id = "` + defaultPrometheusId + `" - cluster_type = "` + defaultTkeClusterType + `" - cluster_id = "` + defaultTkeClusterId + `" + instance_id = var.prometheus_id + cluster_type = var.tke_cluster_type + cluster_id = var.tke_cluster_id service_monitors { - name = "kube-system/service-monitor-001" - config = "apiVersion: monitoring.coreos.com/v1\nkind: ServiceMonitor\nmetadata:\n name: service-monitor-001\n namespace: kube-system\nspec:\n endpoints:\n - interval: 20s\n port: 8080-8080-tcp\n path: /metrics\n relabelings:\n - action: replace\n sourceLabels:\n - __meta_kubernetes_pod_label_app\n targetLabel: application\n namespaceSelector:\n matchNames:\n - test\n selector:\n matchLabels:\n app: test" + name = var.service_monitors_name_fully + config = "apiVersion: monitoring.coreos.com/v1\nkind: ServiceMonitor\nmetadata:\n name: ` + service_monitors_name + `\n namespace: kube-system\nspec:\n endpoints:\n - interval: 20s\n port: 8080-8080-tcp\n path: /metrics\n relabelings:\n - action: replace\n sourceLabels:\n - __meta_kubernetes_pod_label_app\n targetLabel: application\n namespaceSelector:\n matchNames:\n - test\n selector:\n matchLabels:\n app: test" } pod_monitors { - name = "kube-system/pod-monitor-001" - config = "apiVersion: monitoring.coreos.com/v1\nkind: PodMonitor\nmetadata:\n name: pod-monitor-001\n namespace: kube-system\nspec:\n podMetricsEndpoints:\n - interval: 20s\n port: metric-port\n path: /metrics\n relabelings:\n - action: replace\n sourceLabels:\n - instance\n regex: (.*)\n targetLabel: instance\n replacement: xxxxxx\n namespaceSelector:\n matchNames:\n - test\n selector:\n matchLabels:\n k8s-app: test" + name = var.pod_monitors_name_fully + config = "apiVersion: monitoring.coreos.com/v1\nkind: PodMonitor\nmetadata:\n name: ` + pod_monitors_name + `\n namespace: kube-system\nspec:\n podMetricsEndpoints:\n - interval: 20s\n port: metric-port\n path: /metrics\n relabelings:\n - action: replace\n sourceLabels:\n - instance\n regex: (.*)\n targetLabel: instance\n replacement: xxxxxx\n namespaceSelector:\n matchNames:\n - test\n selector:\n matchLabels:\n k8s-app: test" } raw_jobs { - name = "raw_jobs_001" - config = "scrape_configs:\n- job_name: raw_jobs_001\n scrape_interval: 20s\n honor_labels: true\n" + name = var.raw_job_name + config = "scrape_configs:\n- job_name: ` + raw_job_name + `\n scrape_interval: 20s\n honor_labels: true\n" } }` From 1f0b39f65c8d1ae42456192493be1104940d377f Mon Sep 17 00:00:00 2001 From: nickyinluo Date: Fri, 19 Aug 2022 15:08:22 +0800 Subject: [PATCH 7/7] change ut case name --- tencentcloud/resource_tc_monitor_tmp_tke_config_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tencentcloud/resource_tc_monitor_tmp_tke_config_test.go b/tencentcloud/resource_tc_monitor_tmp_tke_config_test.go index b6ead8ba5a..3fc1a1fdd1 100644 --- a/tencentcloud/resource_tc_monitor_tmp_tke_config_test.go +++ b/tencentcloud/resource_tc_monitor_tmp_tke_config_test.go @@ -43,7 +43,7 @@ func init() { }) } -func TestAccTencentCloudTmpTkeConfig_basic(t *testing.T) { +func TestAccTencentCloudMonitorTmpTkeConfig_basic(t *testing.T) { t.Parallel() id := new(string)