Skip to content

Commit 9f4a130

Browse files
authored
feat(vpc): [122438011]add template (#3246)
* add template * add doc * add changelog * add changelog * add changelog
1 parent c0667b7 commit 9f4a130

10 files changed

+543
-2
lines changed

.changelog/3246.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:new-resource
2+
tencentcloud_address_extra_template
3+
```

tencentcloud/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1715,6 +1715,7 @@ func Provider() *schema.Provider {
17151715
"tencentcloud_cos_bucket_generate_inventory_immediately_operation": cos.ResourceTencentCloudCosBucketGenerateInventoryImmediatelyOperation(),
17161716
"tencentcloud_cos_object_download_operation": cos.ResourceTencentCloudCosObjectDownloadOperation(),
17171717
"tencentcloud_address_template": vpc.ResourceTencentCloudAddressTemplate(),
1718+
"tencentcloud_address_extra_template": vpc.ResourceTencentCloudAddressExtraTemplate(),
17181719
"tencentcloud_address_template_group": vpc.ResourceTencentCloudAddressTemplateGroup(),
17191720
"tencentcloud_protocol_template": vpc.ResourceTencentCloudProtocolTemplate(),
17201721
"tencentcloud_protocol_template_group": vpc.ResourceTencentCloudProtocolTemplateGroup(),

tencentcloud/provider.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1275,6 +1275,7 @@ tencentcloud_security_group
12751275
tencentcloud_security_group_rule_set
12761276
tencentcloud_security_group_lite_rule
12771277
tencentcloud_address_template
1278+
tencentcloud_address_extra_template
12781279
tencentcloud_address_template_group
12791280
tencentcloud_protocol_template
12801281
tencentcloud_protocol_template_group
Lines changed: 300 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,300 @@
1+
package vpc
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"log"
7+
8+
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
9+
svctag "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/services/tag"
10+
11+
vpc "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc/v20170312"
12+
tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
13+
14+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
15+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
16+
)
17+
18+
func ResourceTencentCloudAddressExtraTemplate() *schema.Resource {
19+
return &schema.Resource{
20+
Create: resourceTencentCloudAddressExtraTemplateCreate,
21+
Read: resourceTencentCloudAddressExtraTemplateRead,
22+
Update: resourceTencentCloudAddressExtraTemplateUpdate,
23+
Delete: resourceTencentCloudAddressExtraTemplateDelete,
24+
Importer: &schema.ResourceImporter{
25+
State: schema.ImportStatePassthrough,
26+
},
27+
28+
Schema: map[string]*schema.Schema{
29+
"name": {
30+
Type: schema.TypeString,
31+
Required: true,
32+
Description: "IP address template name.",
33+
},
34+
"addresses_extra": {
35+
Required: true,
36+
Type: schema.TypeSet,
37+
Elem: &schema.Resource{
38+
Schema: map[string]*schema.Schema{
39+
"address": {
40+
Type: schema.TypeString,
41+
Required: true,
42+
Description: "IP address.",
43+
},
44+
"description": {
45+
Type: schema.TypeString,
46+
Optional: true,
47+
Description: "Remarks.",
48+
},
49+
"updated_time": {
50+
Type: schema.TypeString,
51+
Computed: true,
52+
Description: "Update Time.",
53+
},
54+
},
55+
},
56+
Description: "The address information can contain remarks and be presented by the IP, CIDR block or IP address range.",
57+
},
58+
"tags": {
59+
Type: schema.TypeMap,
60+
Optional: true,
61+
Description: "Tags of the Addresses.",
62+
},
63+
},
64+
}
65+
}
66+
67+
func resourceTencentCloudAddressExtraTemplateCreate(d *schema.ResourceData, meta interface{}) error {
68+
defer tccommon.LogElapsed("resource.tencentcloud_address_extra_template.create")()
69+
70+
logId := tccommon.GetLogId(tccommon.ContextNil)
71+
72+
var (
73+
request = vpc.NewCreateAddressTemplateRequest()
74+
response *vpc.CreateAddressTemplateResponse
75+
)
76+
77+
if v, ok := d.GetOk("name"); ok {
78+
request.AddressTemplateName = helper.String(v.(string))
79+
}
80+
81+
if v, ok := d.GetOk("addresses_extra"); ok {
82+
addressInfos := make([]*vpc.AddressInfo, 0, 10)
83+
for _, item := range v.(*schema.Set).List() {
84+
dMap := item.(map[string]interface{})
85+
addressInfo := vpc.AddressInfo{}
86+
if v, ok := dMap["address"]; ok {
87+
addressInfo.Address = helper.String(v.(string))
88+
}
89+
if v, ok := dMap["description"]; ok {
90+
addressInfo.Description = helper.String(v.(string))
91+
}
92+
addressInfos = append(addressInfos, &addressInfo)
93+
}
94+
request.AddressesExtra = addressInfos
95+
}
96+
97+
if v, ok := d.GetOk("tags"); ok {
98+
tags := v.(map[string]interface{})
99+
request.Tags = make([]*vpc.Tag, 0, len(tags))
100+
for k, t := range tags {
101+
key := k
102+
value := t.(string)
103+
tag := vpc.Tag{
104+
Key: &key,
105+
Value: &value,
106+
}
107+
request.Tags = append(request.Tags, &tag)
108+
}
109+
}
110+
111+
err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
112+
result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseVpcClient().CreateAddressTemplate(request)
113+
if e != nil {
114+
return tccommon.RetryError(e)
115+
} else {
116+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n",
117+
logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
118+
}
119+
response = result
120+
return nil
121+
})
122+
123+
if err != nil {
124+
log.Printf("[CRITAL]%s create vpc address template failed, reason:%+v", logId, err)
125+
return err
126+
}
127+
128+
templateId := *response.Response.AddressTemplate.AddressTemplateId
129+
d.SetId(templateId)
130+
131+
return resourceTencentCloudAddressExtraTemplateRead(d, meta)
132+
}
133+
134+
func resourceTencentCloudAddressExtraTemplateRead(d *schema.ResourceData, meta interface{}) error {
135+
defer tccommon.LogElapsed("resource.tencentcloud_address_extra_template.read")()
136+
defer tccommon.InconsistentCheck(d, meta)()
137+
138+
logId := tccommon.GetLogId(tccommon.ContextNil)
139+
ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId)
140+
141+
templateId := d.Id()
142+
var outErr, inErr error
143+
vpcService := VpcService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()}
144+
template, has, outErr := vpcService.DescribeAddressTemplateById(ctx, templateId)
145+
if outErr != nil {
146+
outErr = resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError {
147+
template, has, inErr = vpcService.DescribeAddressTemplateById(ctx, templateId)
148+
if inErr != nil {
149+
return tccommon.RetryError(inErr)
150+
}
151+
return nil
152+
})
153+
}
154+
if outErr != nil {
155+
return outErr
156+
}
157+
if !has {
158+
d.SetId("")
159+
return nil
160+
}
161+
162+
_ = d.Set("name", template.AddressTemplateName)
163+
164+
if len(template.AddressExtraSet) > 0 {
165+
addressExtraSets := make([]map[string]interface{}, 0, len(template.AddressExtraSet))
166+
for _, v := range template.AddressExtraSet {
167+
addressExtraSet := map[string]interface{}{}
168+
if v.Address != nil {
169+
addressExtraSet["address"] = *v.Address
170+
}
171+
if v.Description != nil {
172+
addressExtraSet["description"] = *v.Description
173+
}
174+
if v.UpdatedTime != nil {
175+
addressExtraSet["updated_time"] = *v.UpdatedTime
176+
}
177+
178+
addressExtraSets = append(addressExtraSets, addressExtraSet)
179+
}
180+
_ = d.Set("addresses_extra", addressExtraSets)
181+
}
182+
183+
if len(template.TagSet) > 0 {
184+
tags := make(map[string]string)
185+
for _, tag := range template.TagSet {
186+
if tag.Key != nil && tag.Value != nil {
187+
tags[*tag.Key] = *tag.Value
188+
}
189+
}
190+
_ = d.Set("tags", tags)
191+
}
192+
return nil
193+
}
194+
195+
func resourceTencentCloudAddressExtraTemplateUpdate(d *schema.ResourceData, meta interface{}) error {
196+
defer tccommon.LogElapsed("resource.tencentcloud_address_extra_template.update")()
197+
198+
logId := tccommon.GetLogId(tccommon.ContextNil)
199+
ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId)
200+
templateId := d.Id()
201+
202+
if d.HasChange("name") || d.HasChange("addresses_extra") {
203+
var (
204+
request = vpc.NewModifyAddressTemplateAttributeRequest()
205+
)
206+
request.AddressTemplateId = helper.String(templateId)
207+
208+
if v, ok := d.GetOk("name"); ok {
209+
request.AddressTemplateName = helper.String(v.(string))
210+
}
211+
212+
if v, ok := d.GetOk("addresses_extra"); ok {
213+
addressInfos := make([]*vpc.AddressInfo, 0, 10)
214+
for _, item := range v.(*schema.Set).List() {
215+
dMap := item.(map[string]interface{})
216+
addressInfo := vpc.AddressInfo{}
217+
if v, ok := dMap["address"]; ok {
218+
addressInfo.Address = helper.String(v.(string))
219+
}
220+
if v, ok := dMap["description"]; ok {
221+
addressInfo.Description = helper.String(v.(string))
222+
}
223+
addressInfos = append(addressInfos, &addressInfo)
224+
}
225+
request.AddressesExtra = addressInfos
226+
}
227+
228+
err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
229+
result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseVpcClient().ModifyAddressTemplateAttribute(request)
230+
if e != nil {
231+
return tccommon.RetryError(e)
232+
} else {
233+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n",
234+
logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
235+
}
236+
return nil
237+
})
238+
239+
if err != nil {
240+
log.Printf("[CRITAL]%s modify vpc address template failed, reason:%+v", logId, err)
241+
return err
242+
}
243+
}
244+
245+
if d.HasChange("tags") {
246+
client := meta.(tccommon.ProviderMeta).GetAPIV3Conn()
247+
tagService := svctag.NewTagService(client)
248+
oldValue, newValue := d.GetChange("tags")
249+
replaceTags, deleteTags := svctag.DiffTags(oldValue.(map[string]interface{}), newValue.(map[string]interface{}))
250+
region := client.Region
251+
252+
resourceName := tccommon.BuildTagResourceName("vpc", "address", region, d.Id())
253+
err := tagService.ModifyTags(ctx, resourceName, replaceTags, deleteTags)
254+
if err != nil {
255+
return err
256+
}
257+
}
258+
259+
return resourceTencentCloudAddressExtraTemplateRead(d, meta)
260+
}
261+
262+
func resourceTencentCloudAddressExtraTemplateDelete(d *schema.ResourceData, meta interface{}) error {
263+
defer tccommon.LogElapsed("resource.tencentcloud_address_extra_template.delete")()
264+
265+
logId := tccommon.GetLogId(tccommon.ContextNil)
266+
ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId)
267+
templateId := d.Id()
268+
vpcService := VpcService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()}
269+
var outErr, inErr error
270+
271+
outErr = vpcService.DeleteAddressTemplate(ctx, templateId)
272+
if outErr != nil {
273+
outErr = resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
274+
inErr = vpcService.DeleteAddressTemplate(ctx, templateId)
275+
if inErr != nil {
276+
return tccommon.RetryError(inErr, "UnsupportedOperation.MutexOperationTaskRunning")
277+
}
278+
return nil
279+
})
280+
}
281+
282+
if outErr != nil {
283+
return outErr
284+
}
285+
286+
//check not exist
287+
outErr = resource.Retry(tccommon.ReadRetryTimeout, func() *resource.RetryError {
288+
_, has, inErr := vpcService.DescribeAddressTemplateById(ctx, templateId)
289+
if inErr != nil {
290+
return tccommon.RetryError(inErr)
291+
}
292+
if has {
293+
return resource.RetryableError(fmt.Errorf("address template %s is still exists, retry...", templateId))
294+
} else {
295+
return nil
296+
}
297+
})
298+
299+
return outErr
300+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
Provides a resource to manage address extra template.
2+
3+
~> **NOTE:** Compare to `tencentcloud_address_template`, It contains remarks.
4+
5+
6+
Example Usage
7+
8+
```hcl
9+
resource "tencentcloud_address_extra_template" "foo" {
10+
name = "demo"
11+
12+
addresses_extra {
13+
address = "10.0.0.1"
14+
description = "create by terraform"
15+
}
16+
17+
addresses_extra {
18+
address = "10.0.1.0/24"
19+
description = "delete by terraform"
20+
}
21+
22+
addresses_extra {
23+
address = "10.0.0.1-10.0.0.100"
24+
description = "modify by terraform"
25+
}
26+
27+
tags = {
28+
createBy = "terraform"
29+
deleteBy = "terraform"
30+
}
31+
32+
}
33+
```
34+
35+
Import
36+
37+
Address template can be imported using the id, e.g.
38+
39+
```
40+
$ terraform import tencentcloud_address_extra_template.foo ipm-makf7k9e
41+
```

0 commit comments

Comments
 (0)