Skip to content

Commit 16704e9

Browse files
authored
resource/alicloud_vpc_gateway_endpoint: Add new attribute route_tables. (#8444)
1 parent 3966981 commit 16704e9

4 files changed

+1106
-118
lines changed

alicloud/resource_alicloud_vpc_gateway_endpoint.go

+120-30
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"github.com/aliyun/terraform-provider-alicloud/alicloud/connectivity"
1010
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
1111
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
12+
"github.com/hashicorp/terraform-plugin-sdk/helper/validation"
1213
)
1314

1415
func resourceAliCloudVpcGatewayEndpoint() *schema.Resource {
@@ -21,9 +22,9 @@ func resourceAliCloudVpcGatewayEndpoint() *schema.Resource {
2122
State: schema.ImportStatePassthrough,
2223
},
2324
Timeouts: &schema.ResourceTimeout{
24-
Create: schema.DefaultTimeout(5 * time.Minute),
25+
Create: schema.DefaultTimeout(8 * time.Minute),
2526
Update: schema.DefaultTimeout(5 * time.Minute),
26-
Delete: schema.DefaultTimeout(5 * time.Minute),
27+
Delete: schema.DefaultTimeout(10 * time.Minute),
2728
},
2829
Schema: map[string]*schema.Schema{
2930
"create_time": {
@@ -39,8 +40,9 @@ func resourceAliCloudVpcGatewayEndpoint() *schema.Resource {
3940
Optional: true,
4041
},
4142
"policy_document": {
42-
Type: schema.TypeString,
43-
Optional: true,
43+
Type: schema.TypeString,
44+
Optional: true,
45+
ValidateFunc: validation.ValidateJsonString,
4446
DiffSuppressFunc: func(k, old, new string, d *schema.ResourceData) bool {
4547
equal, _ := compareJsonTemplateAreEquivalent(old, new)
4648
return equal
@@ -51,6 +53,11 @@ func resourceAliCloudVpcGatewayEndpoint() *schema.Resource {
5153
Optional: true,
5254
Computed: true,
5355
},
56+
"route_tables": {
57+
Type: schema.TypeSet,
58+
Optional: true,
59+
Elem: &schema.Schema{Type: schema.TypeString},
60+
},
5461
"service_name": {
5562
Type: schema.TypeString,
5663
Required: true,
@@ -71,11 +78,13 @@ func resourceAliCloudVpcGatewayEndpoint() *schema.Resource {
7178
}
7279

7380
func resourceAliCloudVpcGatewayEndpointCreate(d *schema.ResourceData, meta interface{}) error {
81+
7482
client := meta.(*connectivity.AliyunClient)
7583

7684
action := "CreateVpcGatewayEndpoint"
7785
var request map[string]interface{}
7886
var response map[string]interface{}
87+
query := make(map[string]interface{})
7988
var err error
8089
request = make(map[string]interface{})
8190
request["RegionId"] = client.RegionId
@@ -95,21 +104,24 @@ func resourceAliCloudVpcGatewayEndpointCreate(d *schema.ResourceData, meta inter
95104
if v, ok := d.GetOk("resource_group_id"); ok {
96105
request["ResourceGroupId"] = v
97106
}
107+
if v, ok := d.GetOk("tags"); ok {
108+
tagsMap := ConvertTags(v.(map[string]interface{}))
109+
request = expandTagsToMap(request, tagsMap)
110+
}
111+
98112
wait := incrementalWait(3*time.Second, 5*time.Second)
99113
err = resource.Retry(d.Timeout(schema.TimeoutCreate), func() *resource.RetryError {
100-
response, err = client.RpcPost("Vpc", "2016-04-28", action, nil, request, true)
101-
request["ClientToken"] = buildClientToken(action)
102-
114+
response, err = client.RpcPost("Vpc", "2016-04-28", action, query, request, true)
103115
if err != nil {
104116
if IsExpectedErrors(err, []string{"OperationFailed.ConcurrentOperation", "IdempotentParameterMismatch", "IncorrectStatus.Vpc", "OperationConflict", "IncorrectStatus", "ServiceUnavailable", "LastTokenProcessing", "SystemBusy"}) || NeedRetry(err) {
105117
wait()
106118
return resource.RetryableError(err)
107119
}
108120
return resource.NonRetryableError(err)
109121
}
110-
addDebug(action, response, request)
111122
return nil
112123
})
124+
addDebug(action, response, request)
113125

114126
if err != nil {
115127
return WrapErrorf(err, DefaultErrorMsg, "alicloud_vpc_gateway_endpoint", action, AlibabaCloudSdkGoERROR)
@@ -149,6 +161,12 @@ func resourceAliCloudVpcGatewayEndpointRead(d *schema.ResourceData, meta interfa
149161
d.Set("status", objectRaw["EndpointStatus"])
150162
d.Set("vpc_id", objectRaw["VpcId"])
151163

164+
routeTablesRaw := make([]interface{}, 0)
165+
if objectRaw["RouteTables"] != nil {
166+
routeTablesRaw = objectRaw["RouteTables"].([]interface{})
167+
}
168+
169+
d.Set("route_tables", routeTablesRaw)
152170
tagsMaps := objectRaw["Tags"]
153171
d.Set("tags", tagsToMap(tagsMaps))
154172

@@ -159,11 +177,14 @@ func resourceAliCloudVpcGatewayEndpointUpdate(d *schema.ResourceData, meta inter
159177
client := meta.(*connectivity.AliyunClient)
160178
var request map[string]interface{}
161179
var response map[string]interface{}
180+
var query map[string]interface{}
162181
update := false
163182
d.Partial(true)
164-
action := "UpdateVpcGatewayEndpointAttribute"
183+
165184
var err error
185+
action := "UpdateVpcGatewayEndpointAttribute"
166186
request = make(map[string]interface{})
187+
query = make(map[string]interface{})
167188
request["EndpointId"] = d.Id()
168189
request["RegionId"] = client.RegionId
169190
request["ClientToken"] = buildClientToken(action)
@@ -185,19 +206,17 @@ func resourceAliCloudVpcGatewayEndpointUpdate(d *schema.ResourceData, meta inter
185206
if update {
186207
wait := incrementalWait(3*time.Second, 5*time.Second)
187208
err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError {
188-
response, err = client.RpcPost("Vpc", "2016-04-28", action, nil, request, true)
189-
request["ClientToken"] = buildClientToken(action)
190-
209+
response, err = client.RpcPost("Vpc", "2016-04-28", action, query, request, true)
191210
if err != nil {
192211
if IsExpectedErrors(err, []string{"OperationConflict", "IncorrectStatus", "ServiceUnavailable", "LastTokenProcessing", "SystemBusy", "OperationFailed.ConcurrentOperation", "IdempotentParameterMismatch", "IncorrectStatus.Vpc"}) || NeedRetry(err) {
193212
wait()
194213
return resource.RetryableError(err)
195214
}
196215
return resource.NonRetryableError(err)
197216
}
198-
addDebug(action, response, request)
199217
return nil
200218
})
219+
addDebug(action, response, request)
201220
if err != nil {
202221
return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
203222
}
@@ -206,50 +225,120 @@ func resourceAliCloudVpcGatewayEndpointUpdate(d *schema.ResourceData, meta inter
206225
if _, err := stateConf.WaitForState(); err != nil {
207226
return WrapErrorf(err, IdMsg, d.Id())
208227
}
209-
d.SetPartial("gateway_endpoint_name")
210-
d.SetPartial("gateway_endpoint_descrption")
211-
d.SetPartial("policy_document")
212228
}
213229
update = false
214230
action = "MoveResourceGroup"
215231
request = make(map[string]interface{})
232+
query = make(map[string]interface{})
216233
request["ResourceId"] = d.Id()
217234
request["RegionId"] = client.RegionId
218-
if !d.IsNewResource() && d.HasChange("resource_group_id") {
235+
if _, ok := d.GetOk("resource_group_id"); ok && !d.IsNewResource() && d.HasChange("resource_group_id") {
219236
update = true
220-
request["NewResourceGroupId"] = d.Get("resource_group_id")
221237
}
222-
238+
request["NewResourceGroupId"] = d.Get("resource_group_id")
223239
request["ResourceType"] = "GatewayEndpoint"
224240
if update {
225241
wait := incrementalWait(3*time.Second, 5*time.Second)
226242
err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError {
227-
response, err = client.RpcPost("Vpc", "2016-04-28", action, nil, request, false)
228-
243+
response, err = client.RpcPost("Vpc", "2016-04-28", action, query, request, true)
229244
if err != nil {
230245
if NeedRetry(err) {
231246
wait()
232247
return resource.RetryableError(err)
233248
}
234249
return resource.NonRetryableError(err)
235250
}
236-
addDebug(action, response, request)
237251
return nil
238252
})
253+
addDebug(action, response, request)
239254
if err != nil {
240255
return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
241256
}
242-
d.SetPartial("resource_group_id")
243257
}
244258

245-
update = false
259+
if d.HasChange("route_tables") {
260+
oldEntry, newEntry := d.GetChange("route_tables")
261+
oldEntrySet := oldEntry.(*schema.Set)
262+
newEntrySet := newEntry.(*schema.Set)
263+
removed := oldEntrySet.Difference(newEntrySet)
264+
added := newEntrySet.Difference(oldEntrySet)
265+
266+
if removed.Len() > 0 {
267+
action := "DissociateRouteTablesFromVpcGatewayEndpoint"
268+
request = make(map[string]interface{})
269+
query = make(map[string]interface{})
270+
request["EndpointId"] = d.Id()
271+
request["RegionId"] = client.RegionId
272+
request["ClientToken"] = buildClientToken(action)
273+
localData := removed.List()
274+
routeTableIdsMapsArray := localData
275+
request["RouteTableIds"] = routeTableIdsMapsArray
276+
277+
wait := incrementalWait(3*time.Second, 5*time.Second)
278+
err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError {
279+
response, err = client.RpcPost("Vpc", "2016-04-28", action, query, request, true)
280+
if err != nil {
281+
if NeedRetry(err) {
282+
wait()
283+
return resource.RetryableError(err)
284+
}
285+
return resource.NonRetryableError(err)
286+
}
287+
return nil
288+
})
289+
addDebug(action, response, request)
290+
if err != nil {
291+
return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
292+
}
293+
vpcServiceV2 := VpcServiceV2{client}
294+
stateConf := BuildStateConf([]string{}, []string{"Created"}, d.Timeout(schema.TimeoutUpdate), 5*time.Second, vpcServiceV2.VpcGatewayEndpointStateRefreshFunc(d.Id(), "EndpointStatus", []string{}))
295+
if _, err := stateConf.WaitForState(); err != nil {
296+
return WrapErrorf(err, IdMsg, d.Id())
297+
}
298+
299+
}
300+
301+
if added.Len() > 0 {
302+
action := "AssociateRouteTablesWithVpcGatewayEndpoint"
303+
request = make(map[string]interface{})
304+
query = make(map[string]interface{})
305+
request["EndpointId"] = d.Id()
306+
request["RegionId"] = client.RegionId
307+
request["ClientToken"] = buildClientToken(action)
308+
localData := added.List()
309+
routeTableIdsMapsArray := localData
310+
request["RouteTableIds"] = routeTableIdsMapsArray
311+
312+
wait := incrementalWait(3*time.Second, 5*time.Second)
313+
err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError {
314+
response, err = client.RpcPost("Vpc", "2016-04-28", action, query, request, true)
315+
if err != nil {
316+
if NeedRetry(err) {
317+
wait()
318+
return resource.RetryableError(err)
319+
}
320+
return resource.NonRetryableError(err)
321+
}
322+
return nil
323+
})
324+
addDebug(action, response, request)
325+
if err != nil {
326+
return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
327+
}
328+
vpcServiceV2 := VpcServiceV2{client}
329+
stateConf := BuildStateConf([]string{}, []string{"Created"}, d.Timeout(schema.TimeoutUpdate), 5*time.Second, vpcServiceV2.VpcGatewayEndpointStateRefreshFunc(d.Id(), "EndpointStatus", []string{}))
330+
if _, err := stateConf.WaitForState(); err != nil {
331+
return WrapErrorf(err, IdMsg, d.Id())
332+
}
333+
334+
}
335+
336+
}
246337
if d.HasChange("tags") {
247-
update = true
248338
vpcServiceV2 := VpcServiceV2{client}
249339
if err := vpcServiceV2.SetResourceTags(d, "GatewayEndpoint"); err != nil {
250340
return WrapError(err)
251341
}
252-
d.SetPartial("tags")
253342
}
254343
d.Partial(false)
255344
return resourceAliCloudVpcGatewayEndpointRead(d, meta)
@@ -261,16 +350,16 @@ func resourceAliCloudVpcGatewayEndpointDelete(d *schema.ResourceData, meta inter
261350
action := "DeleteVpcGatewayEndpoint"
262351
var request map[string]interface{}
263352
var response map[string]interface{}
353+
query := make(map[string]interface{})
264354
var err error
265355
request = make(map[string]interface{})
266356
request["EndpointId"] = d.Id()
267357
request["RegionId"] = client.RegionId
268-
269358
request["ClientToken"] = buildClientToken(action)
270359

271360
wait := incrementalWait(3*time.Second, 5*time.Second)
272361
err = resource.Retry(d.Timeout(schema.TimeoutDelete), func() *resource.RetryError {
273-
response, err = client.RpcPost("Vpc", "2016-04-28", action, nil, request, true)
362+
response, err = client.RpcPost("Vpc", "2016-04-28", action, query, request, true)
274363
request["ClientToken"] = buildClientToken(action)
275364

276365
if err != nil {
@@ -280,12 +369,12 @@ func resourceAliCloudVpcGatewayEndpointDelete(d *schema.ResourceData, meta inter
280369
}
281370
return resource.NonRetryableError(err)
282371
}
283-
addDebug(action, response, request)
284372
return nil
285373
})
374+
addDebug(action, response, request)
286375

287376
if err != nil {
288-
if IsExpectedErrors(err, []string{"ResourceNotFound.GatewayEndpoint"}) {
377+
if IsExpectedErrors(err, []string{"ResourceNotFound.GatewayEndpoint"}) || NotFoundError(err) {
289378
return nil
290379
}
291380
return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
@@ -296,5 +385,6 @@ func resourceAliCloudVpcGatewayEndpointDelete(d *schema.ResourceData, meta inter
296385
if _, err := stateConf.WaitForState(); err != nil {
297386
return WrapErrorf(err, IdMsg, d.Id())
298387
}
388+
299389
return nil
300390
}

0 commit comments

Comments
 (0)