-
Notifications
You must be signed in to change notification settings - Fork 162
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(cts): add data source to get the list of resources involved in t…
…he traces. (#6068)
- Loading branch information
1 parent
4634957
commit c91f267
Showing
4 changed files
with
192 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
--- | ||
subcategory: "Cloud Trace Service (CTS)" | ||
layout: "huaweicloud" | ||
page_title: "HuaweiCloud: huaweicloud_cts_resources" | ||
description: |- | ||
Use this data source to get the list of resources involved in the traces. | ||
--- | ||
|
||
# huaweicloud_cts_resources | ||
|
||
Use this data source to get the list of resources involved in the traces. | ||
|
||
## Example Usage | ||
|
||
```hcl | ||
data "huaweicloud_cts_resources" "test" {} | ||
``` | ||
|
||
## Argument Reference | ||
|
||
The following arguments are supported: | ||
|
||
* `region` - (Optional, String) Specifies the region in which to query the resource. | ||
If omitted, the provider-level region will be used. | ||
|
||
## Attribute Reference | ||
|
||
In addition to all arguments above, the following attributes are exported: | ||
|
||
* `id` - The data source ID. | ||
|
||
* `resources` - The resource list. | ||
|
||
The [resources](#resources_struct) structure is documented below. | ||
|
||
<a name="resources_struct"></a> | ||
The `resources` block supports: | ||
|
||
* `service_type` - The cloud service type. | ||
|
||
* `resource` - The resources corresponding to the cloud services. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
33 changes: 33 additions & 0 deletions
33
huaweicloud/services/acceptance/cts/data_source_huaweicloud_cts_resources_test.go
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
package cts | ||
|
||
import ( | ||
"testing" | ||
|
||
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" | ||
|
||
"github.com/huaweicloud/terraform-provider-huaweicloud/huaweicloud/services/acceptance" | ||
) | ||
|
||
func TestAccDataSourceCtsResources_basic(t *testing.T) { | ||
dataSource := "data.huaweicloud_cts_resources.test" | ||
dc := acceptance.InitDataSourceCheck(dataSource) | ||
|
||
resource.ParallelTest(t, resource.TestCase{ | ||
PreCheck: func() { | ||
acceptance.TestAccPreCheck(t) | ||
}, | ||
ProviderFactories: acceptance.TestAccProviderFactories, | ||
Steps: []resource.TestStep{ | ||
{ | ||
Config: testDataSourceCtsResources_basic, | ||
Check: resource.ComposeTestCheckFunc( | ||
dc.CheckResourceExists(), | ||
resource.TestCheckResourceAttrSet(dataSource, "resources.0.service_type"), | ||
resource.TestCheckResourceAttrSet(dataSource, "resources.0.resource.#"), | ||
), | ||
}, | ||
}, | ||
}) | ||
} | ||
|
||
const testDataSourceCtsResources_basic = `data "huaweicloud_cts_resources" "test" {}` |
117 changes: 117 additions & 0 deletions
117
huaweicloud/services/cts/data_source_huaweicloud_cts_resources.go
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,117 @@ | ||
// Generated by PMS #487 | ||
package cts | ||
|
||
import ( | ||
"context" | ||
"strings" | ||
|
||
"github.com/hashicorp/go-multierror" | ||
"github.com/hashicorp/go-uuid" | ||
"github.com/hashicorp/terraform-plugin-sdk/v2/diag" | ||
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" | ||
"github.com/tidwall/gjson" | ||
|
||
"github.com/huaweicloud/terraform-provider-huaweicloud/huaweicloud/config" | ||
"github.com/huaweicloud/terraform-provider-huaweicloud/huaweicloud/helper/httphelper" | ||
"github.com/huaweicloud/terraform-provider-huaweicloud/huaweicloud/helper/schemas" | ||
) | ||
|
||
func DataSourceCtsResources() *schema.Resource { | ||
return &schema.Resource{ | ||
ReadContext: dataSourceCtssRead, | ||
|
||
Schema: map[string]*schema.Schema{ | ||
"region": { | ||
Type: schema.TypeString, | ||
Optional: true, | ||
Computed: true, | ||
Description: `Specifies the region in which to query the resource. If omitted, the provider-level region will be used.`, | ||
}, | ||
"resources": { | ||
Type: schema.TypeList, | ||
Computed: true, | ||
Description: `The resource list.`, | ||
Elem: &schema.Resource{ | ||
Schema: map[string]*schema.Schema{ | ||
"service_type": { | ||
Type: schema.TypeString, | ||
Computed: true, | ||
Description: `The cloud service type.`, | ||
}, | ||
"resource": { | ||
Type: schema.TypeList, | ||
Computed: true, | ||
Elem: &schema.Schema{Type: schema.TypeString}, | ||
Description: `The resources corresponding to the cloud services.`, | ||
}, | ||
}, | ||
}, | ||
}, | ||
}, | ||
} | ||
} | ||
|
||
type sDSWrapper struct { | ||
*schemas.ResourceDataWrapper | ||
Config *config.Config | ||
} | ||
|
||
func newsDSWrapper(d *schema.ResourceData, meta interface{}) *sDSWrapper { | ||
return &sDSWrapper{ | ||
ResourceDataWrapper: schemas.NewSchemaWrapper(d), | ||
Config: meta.(*config.Config), | ||
} | ||
} | ||
|
||
func dataSourceCtssRead(_ context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { | ||
wrapper := newsDSWrapper(d, meta) | ||
lisTraResRst, err := wrapper.ListTraceResources() | ||
if err != nil { | ||
return diag.FromErr(err) | ||
} | ||
|
||
id, err := uuid.GenerateUUID() | ||
if err != nil { | ||
return diag.FromErr(err) | ||
} | ||
d.SetId(id) | ||
|
||
err = wrapper.listTraceResourcesToSchema(lisTraResRst) | ||
if err != nil { | ||
return diag.FromErr(err) | ||
} | ||
|
||
return nil | ||
} | ||
|
||
// @API CTS GET /v3/{domain_id}/resources | ||
func (w *sDSWrapper) ListTraceResources() (*gjson.Result, error) { | ||
client, err := w.NewClient(w.Config, "cts") | ||
if err != nil { | ||
return nil, err | ||
} | ||
|
||
uri := "/v3/{domain_id}/resources" | ||
uri = strings.ReplaceAll(uri, "{domain_id}", w.Config.DomainID) | ||
return httphelper.New(client). | ||
Method("GET"). | ||
URI(uri). | ||
Request(). | ||
Result() | ||
} | ||
|
||
func (w *sDSWrapper) listTraceResourcesToSchema(body *gjson.Result) error { | ||
d := w.ResourceData | ||
mErr := multierror.Append(nil, | ||
d.Set("region", w.Config.GetRegion(w.ResourceData)), | ||
d.Set("resources", schemas.SliceToList(body.Get("resources"), | ||
func(resources gjson.Result) any { | ||
return map[string]any{ | ||
"service_type": resources.Get("service_type").Value(), | ||
"resource": schemas.SliceToStrList(resources.Get("resource")), | ||
} | ||
}, | ||
)), | ||
) | ||
return mErr.ErrorOrNil() | ||
} |