diff --git a/.changelog/2775.txt b/.changelog/2775.txt new file mode 100644 index 0000000000..45f8730c03 --- /dev/null +++ b/.changelog/2775.txt @@ -0,0 +1,3 @@ +```release-note:new-data-source +tencentcloud_cls_logsets +``` \ No newline at end of file diff --git a/tencentcloud/provider.go b/tencentcloud/provider.go index 2845105389..5e6b7033dd 100644 --- a/tencentcloud/provider.go +++ b/tencentcloud/provider.go @@ -1010,6 +1010,7 @@ func Provider() *schema.Provider { "tencentcloud_cls_shipper_tasks": cls.DataSourceTencentCloudClsShipperTasks(), "tencentcloud_cls_machines": cls.DataSourceTencentCloudClsMachines(), "tencentcloud_cls_machine_group_configs": cls.DataSourceTencentCloudClsMachineGroupConfigs(), + "tencentcloud_cls_logsets": cls.DataSourceTencentCloudClsLogsets(), "tencentcloud_eb_search": eb.DataSourceTencentCloudEbSearch(), "tencentcloud_eb_bus": eb.DataSourceTencentCloudEbBus(), "tencentcloud_eb_event_rules": eb.DataSourceTencentCloudEbEventRules(), diff --git a/tencentcloud/provider.md b/tencentcloud/provider.md index eeed80f0cd..d8c7d343ba 100644 --- a/tencentcloud/provider.md +++ b/tencentcloud/provider.md @@ -1356,6 +1356,7 @@ Cloud Log Service(CLS) tencentcloud_cls_shipper_tasks tencentcloud_cls_machines tencentcloud_cls_machine_group_configs + tencentcloud_cls_logsets TencentCloud Lighthouse(Lighthouse) Resource diff --git a/tencentcloud/services/cls/data_source_tc_cls_logsets.go b/tencentcloud/services/cls/data_source_tc_cls_logsets.go new file mode 100644 index 0000000000..f27a88301f --- /dev/null +++ b/tencentcloud/services/cls/data_source_tc_cls_logsets.go @@ -0,0 +1,216 @@ +package cls + +import ( + "context" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + cls "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cls/v20201016" + tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common" + "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper" +) + +func DataSourceTencentCloudClsLogsets() *schema.Resource { + return &schema.Resource{ + Read: dataSourceTencentCloudClsLogsetsRead, + Schema: map[string]*schema.Schema{ + "filters": { + Optional: true, + MaxItems: 10, + Type: schema.TypeList, + Description: "Query by filter.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "key": { + Type: schema.TypeString, + Required: true, + Description: "Fields that need to be filtered. Support: `logsetName`, `logsetId`, `tagKey`, `tag:tagKey`.", + }, + "values": { + Type: schema.TypeSet, + Required: true, + MaxItems: 5, + Elem: &schema.Schema{Type: schema.TypeString}, + Description: "The values that need to be filtered.", + }, + }, + }, + }, + // computed + "logsets": { + Computed: true, + Type: schema.TypeList, + Description: "logset lists.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "logset_id": { + Type: schema.TypeString, + Computed: true, + Description: "Logset Id.", + }, + "logset_name": { + Type: schema.TypeString, + Computed: true, + Description: "Logset name.", + }, + "create_time": { + Type: schema.TypeString, + Computed: true, + Description: "Create time.", + }, + "assumer_name": { + Type: schema.TypeString, + Computed: true, + Description: "Cloud product identification, when the log set is created by another cloud product, this field will display the cloud product name, such as CDN, TKE.", + }, + "tags": { + Type: schema.TypeList, + Computed: true, + Description: "Tags.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "key": { + Type: schema.TypeString, + Computed: true, + Description: "Tag key.", + }, + "value": { + Type: schema.TypeString, + Computed: true, + Description: "Tag value.", + }, + }, + }, + }, + "topic_count": { + Type: schema.TypeInt, + Computed: true, + Description: "Topic count.", + }, + "role_name": { + Type: schema.TypeString, + Computed: true, + Description: "If `assumer_name` is not empty, it indicates the service role that created the log set.", + }, + }, + }, + }, + "result_output_file": { + Type: schema.TypeString, + Optional: true, + Description: "Used to save results.", + }, + }, + } +} + +func dataSourceTencentCloudClsLogsetsRead(d *schema.ResourceData, meta interface{}) error { + defer tccommon.LogElapsed("data_source.tencentcloud_cls_logsets.read")() + defer tccommon.InconsistentCheck(d, meta)() + + var ( + logId = tccommon.GetLogId(tccommon.ContextNil) + ctx = context.WithValue(context.TODO(), tccommon.LogIdKey, logId) + service = ClsService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()} + logsets []*cls.LogsetInfo + ) + + paramMap := make(map[string]interface{}) + if v, ok := d.GetOk("filters"); ok { + filtersSet := v.([]interface{}) + tmpSet := make([]*cls.Filter, 0, len(filtersSet)) + for _, item := range filtersSet { + filter := cls.Filter{} + filterMap := item.(map[string]interface{}) + if v, ok := filterMap["key"]; ok { + filter.Key = helper.String(v.(string)) + } + + if v, ok := filterMap["values"]; ok { + valuesSet := v.(*schema.Set).List() + filter.Values = helper.InterfacesStringsPoint(valuesSet) + } + + tmpSet = append(tmpSet, &filter) + } + + paramMap["Filters"] = tmpSet + } + + err := resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError { + result, e := service.DescribeClsLogsetsByFilter(ctx, paramMap) + if e != nil { + return tccommon.RetryError(e) + } + + logsets = result + return nil + }) + + if err != nil { + return err + } + + ids := make([]string, 0, len(logsets)) + tmpList := make([]map[string]interface{}, 0, len(logsets)) + if logsets != nil { + for _, logsetInfo := range logsets { + logsetInfoMap := map[string]interface{}{} + if logsetInfo.LogsetId != nil { + logsetInfoMap["logset_id"] = logsetInfo.LogsetId + } + + if logsetInfo.LogsetName != nil { + logsetInfoMap["logset_name"] = logsetInfo.LogsetName + } + + if logsetInfo.CreateTime != nil { + logsetInfoMap["create_time"] = logsetInfo.CreateTime + } + + if logsetInfo.AssumerName != nil { + logsetInfoMap["assumer_name"] = logsetInfo.AssumerName + } + + if logsetInfo.Tags != nil { + tagsList := []interface{}{} + for _, tags := range logsetInfo.Tags { + tagsMap := map[string]interface{}{} + if tags.Key != nil { + tagsMap["key"] = tags.Key + } + + if tags.Value != nil { + tagsMap["value"] = tags.Value + } + + tagsList = append(tagsList, tagsMap) + } + + logsetInfoMap["tags"] = tagsList + } + + if logsetInfo.TopicCount != nil { + logsetInfoMap["topic_count"] = logsetInfo.TopicCount + } + + if logsetInfo.RoleName != nil { + logsetInfoMap["role_name"] = logsetInfo.RoleName + } + + ids = append(ids, *logsetInfo.LogsetId) + tmpList = append(tmpList, logsetInfoMap) + } + + _ = d.Set("logsets", tmpList) + } + + d.SetId(helper.DataResourceIdsHash(ids)) + output, ok := d.GetOk("result_output_file") + if ok && output.(string) != "" { + if e := tccommon.WriteToFile(output.(string), tmpList); e != nil { + return e + } + } + + return nil +} diff --git a/tencentcloud/services/cls/data_source_tc_cls_logsets.md b/tencentcloud/services/cls/data_source_tc_cls_logsets.md new file mode 100644 index 0000000000..180ae8c91b --- /dev/null +++ b/tencentcloud/services/cls/data_source_tc_cls_logsets.md @@ -0,0 +1,45 @@ +Use this data source to query detailed information of cls logsets + +Example Usage + +Query all cls logsets + +```hcl +data "tencentcloud_cls_logsets" "logsets" {} +``` + +Query by filters + +```hcl +# Query by `logsetName` +data "tencentcloud_cls_logsets" "logsets" { + filters { + key = "logsetName" + values = ["cls_service_logging"] + } +} + +# Query by `logsetId` +data "tencentcloud_cls_logsets" "logsets" { + filters { + key = "logsetId" + values = ["50d499a8-c4c0-4442-aa04-e8aa8a02437d"] + } +} + +# Query by `tagKey` +data "tencentcloud_cls_logsets" "logsets" { + filters { + key = "tagKey" + values = ["createdBy"] + } +} + +# Query by `tag:tagKey` +data "tencentcloud_cls_logsets" "logsets" { + filters { + key = "tag:createdBy" + values = ["terraform"] + } +} +``` \ No newline at end of file diff --git a/tencentcloud/services/cls/data_source_tc_cls_logsets_test.go b/tencentcloud/services/cls/data_source_tc_cls_logsets_test.go new file mode 100644 index 0000000000..1a82cdec81 --- /dev/null +++ b/tencentcloud/services/cls/data_source_tc_cls_logsets_test.go @@ -0,0 +1,35 @@ +package cls_test + +import ( + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + tcacctest "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/acctest" + "testing" +) + +// go test -i; go test -test.run TestAccTencentCloudClsLogsetsDataSource_basic -v +func TestAccTencentCloudClsLogsetsDataSource_basic(t *testing.T) { + t.Parallel() + resource.Test(t, resource.TestCase{ + PreCheck: func() { + tcacctest.AccPreCheck(t) + }, + Providers: tcacctest.AccProviders, + Steps: []resource.TestStep{ + { + Config: testAccClsLogsetsDataSource, + Check: resource.ComposeTestCheckFunc( + tcacctest.AccCheckTencentCloudDataSourceID("data.tencentcloud_cls_logsets.logsets"), + ), + }, + }, + }) +} + +const testAccClsLogsetsDataSource = ` +data "tencentcloud_cls_logsets" "logsets" { + filters { + key = "logsetId" + values = ["50d499a8-c4c0-4442-aa04-e8aa8a02437d"] + } +} +` diff --git a/tencentcloud/services/cls/service_tencentcloud_cls.go b/tencentcloud/services/cls/service_tencentcloud_cls.go index 512cc959ec..fa34b6c25d 100644 --- a/tencentcloud/services/cls/service_tencentcloud_cls.go +++ b/tencentcloud/services/cls/service_tencentcloud_cls.go @@ -1160,6 +1160,54 @@ func (me *ClsService) DescribeClsMachineGroupConfigsByFilter(ctx context.Context return } +func (me *ClsService) DescribeClsLogsetsByFilter(ctx context.Context, param map[string]interface{}) (Logsets []*cls.LogsetInfo, errRet error) { + var ( + logId = tccommon.GetLogId(ctx) + request = cls.NewDescribeLogsetsRequest() + ) + + 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()) + } + }() + + for k, v := range param { + if k == "Filters" { + request.Filters = v.([]*cls.Filter) + } + } + + var ( + offset int64 = 0 + limit int64 = 100 + ) + + Logsets = make([]*cls.LogsetInfo, 0) + for { + request.Offset = &offset + request.Limit = &limit + response, err := me.client.UseClsClient().DescribeLogsets(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.Logsets) < 1 { + break + } + Logsets = append(Logsets, response.Response.Logsets...) + if len(response.Response.Logsets) < int(limit) { + break + } + + offset += limit + } + + return +} + func (me *ClsService) DescribeClsDataTransformById(ctx context.Context, taskId string) (dataTransform *cls.DataTransformTaskInfo, errRet error) { logId := tccommon.GetLogId(ctx) diff --git a/website/docs/d/cls_logsets.html.markdown b/website/docs/d/cls_logsets.html.markdown new file mode 100644 index 0000000000..1dbf573e48 --- /dev/null +++ b/website/docs/d/cls_logsets.html.markdown @@ -0,0 +1,85 @@ +--- +subcategory: "Cloud Log Service(CLS)" +layout: "tencentcloud" +page_title: "TencentCloud: tencentcloud_cls_logsets" +sidebar_current: "docs-tencentcloud-datasource-cls_logsets" +description: |- + Use this data source to query detailed information of cls logsets +--- + +# tencentcloud_cls_logsets + +Use this data source to query detailed information of cls logsets + +## Example Usage + +### Query all cls logsets + +```hcl +data "tencentcloud_cls_logsets" "logsets" {} +``` + +### Query by filters + +```hcl +# Query by `logsetName` +data "tencentcloud_cls_logsets" "logsets" { + filters { + key = "logsetName" + values = ["cls_service_logging"] + } +} + +# Query by `logsetId` +data "tencentcloud_cls_logsets" "logsets" { + filters { + key = "logsetId" + values = ["50d499a8-c4c0-4442-aa04-e8aa8a02437d"] + } +} + +# Query by `tagKey` +data "tencentcloud_cls_logsets" "logsets" { + filters { + key = "tagKey" + values = ["createdBy"] + } +} + +# Query by `tag:tagKey` +data "tencentcloud_cls_logsets" "logsets" { + filters { + key = "tag:createdBy" + values = ["terraform"] + } +} +``` + +## Argument Reference + +The following arguments are supported: + +* `filters` - (Optional, List) Query by filter. +* `result_output_file` - (Optional, String) Used to save results. + +The `filters` object supports the following: + +* `key` - (Required, String) Fields that need to be filtered. Support: `logsetName`, `logsetId`, `tagKey`, `tag:tagKey`. +* `values` - (Required, Set) The values that need to be filtered. + +## Attributes Reference + +In addition to all arguments above, the following attributes are exported: + +* `logsets` - logset lists. + * `assumer_name` - Cloud product identification, when the log set is created by another cloud product, this field will display the cloud product name, such as CDN, TKE. + * `create_time` - Create time. + * `logset_id` - Logset Id. + * `logset_name` - Logset name. + * `role_name` - If `assumer_name` is not empty, it indicates the service role that created the log set. + * `tags` - Tags. + * `key` - Tag key. + * `value` - Tag value. + * `topic_count` - Topic count. + + diff --git a/website/tencentcloud.erb b/website/tencentcloud.erb index acfed00692..f111e89388 100644 --- a/website/tencentcloud.erb +++ b/website/tencentcloud.erb @@ -1438,6 +1438,9 @@