Skip to content

Commit 04dcb39

Browse files
authored
add label related resourcs and datasources (#166)
1 parent 82d104b commit 04dcb39

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+4824
-786
lines changed

CHANGELOG.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,12 @@
1+
## v1.39.0 (2024-04-24)
2+
3+
FEATURES:
4+
5+
* **New Resource:** `ucloud_label`.
6+
* **New Resource:** `ucloud_label_attachment`.
7+
* **New Datasource:** `ucloud_labels`.
8+
* **New Datasource:** `ucloud_label_resources`.
9+
110
## v1.38.8 (2024-03-16)
211

312
FEATURES:

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ require (
77
github.com/mitchellh/mapstructure v1.1.2
88
github.com/pkg/errors v0.8.0
99
github.com/tidwall/gjson v1.16.0
10-
github.com/ucloud/ucloud-sdk-go v0.22.5
10+
github.com/ucloud/ucloud-sdk-go v0.22.17
1111
)
1212

1313
require (

go.sum

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -181,8 +181,10 @@ github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=
181181
github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
182182
github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=
183183
github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
184-
github.com/ucloud/ucloud-sdk-go v0.22.5 h1:GIltVwMDUqQj4iPL/emsZAMhEYWjLTwZqpOxdkdDrM8=
185-
github.com/ucloud/ucloud-sdk-go v0.22.5/go.mod h1:dyLmFHmUfgb4RZKYQP9IArlvQ2pxzFthfhwxRzOEPIw=
184+
github.com/ucloud/ucloud-sdk-go v0.22.15 h1:JzD4GhwwtdN+QfA6p+JQoOLDywW7dHkqrUgTSnAbNGA=
185+
github.com/ucloud/ucloud-sdk-go v0.22.15/go.mod h1:dyLmFHmUfgb4RZKYQP9IArlvQ2pxzFthfhwxRzOEPIw=
186+
github.com/ucloud/ucloud-sdk-go v0.22.17 h1:EFn+GxVKS5Tj8hIPie3qL6Zgk25fmWcHqJ06K8wl+Qo=
187+
github.com/ucloud/ucloud-sdk-go v0.22.17/go.mod h1:dyLmFHmUfgb4RZKYQP9IArlvQ2pxzFthfhwxRzOEPIw=
186188
github.com/ulikunitz/xz v0.5.5 h1:pFrO0lVpTBXLpYw+pnLj6TbvHuyjXMfjGeCwSqCVwok=
187189
github.com/ulikunitz/xz v0.5.5/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8=
188190
github.com/vmihailenco/msgpack v3.3.3+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk=

ucloud/client.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"github.com/ucloud/ucloud-sdk-go/services/uads"
99

1010
"github.com/ucloud/ucloud-sdk-go/services/iam"
11+
"github.com/ucloud/ucloud-sdk-go/services/label"
1112
"github.com/ucloud/ucloud-sdk-go/services/udb"
1213
"github.com/ucloud/ucloud-sdk-go/services/udisk"
1314
"github.com/ucloud/ucloud-sdk-go/services/udpn"
@@ -48,6 +49,7 @@ type UCloudClient struct {
4849
uk8sconn *uk8s.UK8SClient
4950
uadsconn *uads.UADSClient
5051
iamconn *iam.IAMClient
52+
labelconn *label.LabelClient
5153
uphostconn *uphost.UPHostClient
5254
// private services
5355
pumemconn *pumem.UMemClient

ucloud/config.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"time"
1111

1212
"github.com/ucloud/ucloud-sdk-go/services/iam"
13+
"github.com/ucloud/ucloud-sdk-go/services/label"
1314
"github.com/ucloud/ucloud-sdk-go/services/uads"
1415
"github.com/ucloud/ucloud-sdk-go/services/uphost"
1516

@@ -155,6 +156,7 @@ func (c *Config) Client() (*UCloudClient, error) {
155156
client.cubeconn = cube.NewClient(&cfg, &cred)
156157
client.uadsconn = uads.NewClient(&cfg, &cred)
157158
client.iamconn = iam.NewClient(&cfg, &cred)
159+
client.labelconn = label.NewClient(&cfg, &cred)
158160

159161
// initialize client connections for private usage
160162
client.pumemconn = pumem.NewClient(&cfg, &cred)
@@ -185,6 +187,7 @@ func (c *Config) Client() (*UCloudClient, error) {
185187
client.uk8sconn.AddHttpRequestHandler(cloudShellCredHandler)
186188
client.uadsconn.AddHttpRequestHandler(cloudShellCredHandler)
187189
client.iamconn.AddHttpRequestHandler(cloudShellCredHandler)
190+
client.labelconn.AddHttpRequestHandler(cloudShellCredHandler)
188191
client.uphostconn.AddHttpRequestHandler(cloudShellCredHandler)
189192
client.genericClient.AddHttpRequestHandler(cloudShellCredHandler)
190193
}
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
package ucloud
2+
3+
import (
4+
"fmt"
5+
6+
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
7+
"github.com/ucloud/ucloud-sdk-go/services/label"
8+
"github.com/ucloud/ucloud-sdk-go/ucloud"
9+
)
10+
11+
func dataSourceUCloudLabelResources() *schema.Resource {
12+
return &schema.Resource{
13+
Read: dataSourceUCloudLabelResourcesRead,
14+
Schema: map[string]*schema.Schema{
15+
"key": {
16+
Type: schema.TypeString,
17+
Required: true,
18+
},
19+
"value": {
20+
Type: schema.TypeString,
21+
Required: true,
22+
},
23+
"resource_types": {
24+
Type: schema.TypeList,
25+
Required: true,
26+
Elem: &schema.Schema{
27+
Type: schema.TypeString,
28+
},
29+
},
30+
"project_ids": {
31+
Type: schema.TypeList,
32+
Required: true,
33+
Elem: &schema.Schema{
34+
Type: schema.TypeString,
35+
},
36+
},
37+
"output_file": {
38+
Type: schema.TypeString,
39+
Optional: true,
40+
},
41+
"total_count": {
42+
Type: schema.TypeInt,
43+
Computed: true,
44+
},
45+
"resources": {
46+
Type: schema.TypeList,
47+
Computed: true,
48+
Elem: &schema.Resource{
49+
Schema: map[string]*schema.Schema{
50+
"id": {
51+
Type: schema.TypeString,
52+
Computed: true,
53+
},
54+
"name": {
55+
Type: schema.TypeString,
56+
Computed: true,
57+
},
58+
"type": {
59+
Type: schema.TypeString,
60+
Computed: true,
61+
},
62+
},
63+
},
64+
},
65+
},
66+
}
67+
}
68+
69+
func dataSourceUCloudLabelResourcesRead(d *schema.ResourceData, meta interface{}) error {
70+
client := meta.(*UCloudClient)
71+
conn := client.labelconn
72+
limit := 100
73+
offset := 0
74+
resourcesData := make([]map[string]interface{}, 0)
75+
ids := make([]string, 0)
76+
for {
77+
listResourcesReq := conn.NewListResourcesByLabelsRequest()
78+
listResourcesReq.ResourceTypes = interfaceSliceToStringSlice(d.Get("resource_types").([]interface{}))
79+
listResourcesReq.ProjectIds = interfaceSliceToStringSlice(d.Get("project_ids").([]interface{}))
80+
listResourcesReq.Limit = ucloud.Int(limit)
81+
listResourcesReq.Offset = ucloud.Int(offset)
82+
listResourcesReq.Labels = []label.ListResourcesByLabelsParamLabels{
83+
{
84+
Key: ucloud.String(d.Get("key").(string)),
85+
Value: ucloud.String(d.Get("value").(string)),
86+
},
87+
}
88+
listResourcesResp, err := conn.ListResourcesByLabels(listResourcesReq)
89+
if err != nil {
90+
return fmt.Errorf("error on reading resources list, %s", err)
91+
}
92+
93+
if len(listResourcesResp.Resources) < 1 {
94+
break
95+
}
96+
for _, resource := range listResourcesResp.Resources {
97+
ids = append(ids, resource.ResourceId)
98+
resourcesData = append(resourcesData, map[string]interface{}{
99+
"id": resource.ResourceId,
100+
"name": resource.ResourceName,
101+
"type": resource.ResourceType,
102+
})
103+
}
104+
if len(listResourcesResp.Resources) < limit {
105+
break
106+
}
107+
offset = offset + limit
108+
}
109+
d.SetId(hashStringArray(ids))
110+
d.Set("total_count", len(resourcesData))
111+
if err := d.Set("resources", resourcesData); err != nil {
112+
return err
113+
}
114+
115+
if outputFile, ok := d.GetOk("output_file"); ok && outputFile.(string) != "" {
116+
writeToFile(outputFile.(string), resourcesData)
117+
}
118+
return nil
119+
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package ucloud
2+
3+
import (
4+
"testing"
5+
6+
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
7+
)
8+
9+
func TestAccUCloudLabelResourcesDataSource_basic(t *testing.T) {
10+
resource.ParallelTest(t, resource.TestCase{
11+
PreCheck: func() {
12+
testAccPreCheck(t)
13+
},
14+
Providers: testAccProviders,
15+
Steps: []resource.TestStep{
16+
{
17+
Config: testAccDataLabelResourcesConfig,
18+
Check: resource.ComposeTestCheckFunc(
19+
testAccCheckIDExists("data.ucloud_labels.foo"),
20+
resource.TestCheckResourceAttr("data.ucloud_label_resources.foo", "resources.#", "1"),
21+
resource.TestCheckResourceAttr("data.ucloud_label_resources.foo", "resources.0.name", "tf-acc-vip-basic"),
22+
resource.TestCheckResourceAttr("data.ucloud_label_resources.foo", "resources.0.type", "vip"),
23+
),
24+
},
25+
},
26+
})
27+
}
28+
29+
const testAccDataLabelResourcesConfig = `
30+
31+
resource "ucloud_vpc" "foo" {
32+
name = "tf-acc-vip"
33+
tag = "tf-acc"
34+
cidr_blocks = ["192.168.0.0/16"]
35+
}
36+
resource "ucloud_subnet" "foo" {
37+
name = "tf-acc-vip"
38+
tag = "tf-acc"
39+
cidr_block = "192.168.1.0/24"
40+
vpc_id = "${ucloud_vpc.foo.id}"
41+
}
42+
resource "ucloud_vip" "foo" {
43+
vpc_id = "${ucloud_vpc.foo.id}"
44+
subnet_id = "${ucloud_subnet.foo.id}"
45+
name = "tf-acc-vip-basic"
46+
remark = "test"
47+
tag = "tf-acc"
48+
}
49+
resource "ucloud_label" "foo" {
50+
key = "tf-acc-label-key"
51+
value = "tf-acc-label-value"
52+
}
53+
resource "ucloud_label_attachment" "foo" {
54+
key = "${ucloud_label.foo.key}"
55+
value = "${ucloud_label.foo.value}"
56+
resource = "${ucloud_vip.foo.id}"
57+
}
58+
59+
data "ucloud_labels" "foo" {
60+
key_regex = "^${ucloud_label_attachment.foo.key}$"
61+
}
62+
63+
data "ucloud_label_resources" "foo" {
64+
key = "${ucloud_label_attachment.foo.key}"
65+
value = "${ucloud_label_attachment.foo.value}"
66+
resource_types = ["vip"]
67+
project_ids = ["${data.ucloud_labels.foo.labels.0.projects.0.id}"]
68+
}
69+
`

0 commit comments

Comments
 (0)