Skip to content

Commit eba75e4

Browse files
authored
Merge pull request #9740 from MrWolong/addrtviaii
resource/alicloud_vpc_ipv6_address: Added retry strategy for error code IncorrectStatus.Ipv6Instance
2 parents a68c036 + 124a7fb commit eba75e4

4 files changed

Lines changed: 107 additions & 57 deletions

File tree

alicloud/resource_alicloud_vpc_ipv6_address.go

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ func resourceAliCloudVpcIpv6Address() *schema.Resource {
4646
"ipv6_address_description": {
4747
Type: schema.TypeString,
4848
Optional: true,
49-
Computed: true,
5049
},
5150
"ipv6_address_name": {
5251
Type: schema.TypeString,
@@ -84,28 +83,28 @@ func resourceAliCloudVpcIpv6AddressCreate(d *schema.ResourceData, meta interface
8483
request["RegionId"] = client.RegionId
8584
request["ClientToken"] = buildClientToken(action)
8685

87-
if v, ok := d.GetOk("resource_group_id"); ok {
88-
request["ResourceGroupId"] = v
89-
}
9086
if v, ok := d.GetOk("ipv6_address_name"); ok {
9187
request["Ipv6AddressName"] = v
9288
}
93-
if v, ok := d.GetOk("ipv6_address_description"); ok {
94-
request["Ipv6AddressDescription"] = v
89+
if v, ok := d.GetOk("resource_group_id"); ok {
90+
request["ResourceGroupId"] = v
9591
}
9692
if v, ok := d.GetOk("tags"); ok {
9793
tagsMap := ConvertTags(v.(map[string]interface{}))
9894
request = expandTagsToMap(request, tagsMap)
9995
}
10096

97+
request["VSwitchId"] = d.Get("vswitch_id")
10198
if v, ok := d.GetOk("ipv6_address"); ok {
10299
request["Ipv6Address"] = v
103100
}
104-
request["VSwitchId"] = d.Get("vswitch_id")
105101
if v, ok := d.GetOk("address_type"); ok {
106102
request["AddressType"] = v
107103
}
108-
wait := incrementalWait(3*time.Second, 5*time.Second)
104+
if v, ok := d.GetOk("ipv6_address_description"); ok {
105+
request["Ipv6AddressDescription"] = v
106+
}
107+
wait := incrementalWait(5*time.Second, 5*time.Second)
109108
err = resource.Retry(d.Timeout(schema.TimeoutCreate), func() *resource.RetryError {
110109
response, err = client.RpcPost("Vpc", "2016-04-28", action, query, request, true)
111110
if err != nil {
@@ -262,10 +261,8 @@ func resourceAliCloudVpcIpv6AddressDelete(d *schema.ResourceData, meta interface
262261
wait := incrementalWait(3*time.Second, 5*time.Second)
263262
err = resource.Retry(d.Timeout(schema.TimeoutDelete), func() *resource.RetryError {
264263
response, err = client.RpcPost("Vpc", "2016-04-28", action, query, request, true)
265-
request["ClientToken"] = buildClientToken(action)
266-
267264
if err != nil {
268-
if NeedRetry(err) {
265+
if IsExpectedErrors(err, []string{"IncorrectStatus.Ipv6Instance"}) || NeedRetry(err) {
269266
wait()
270267
return resource.RetryableError(err)
271268
}
@@ -283,7 +280,7 @@ func resourceAliCloudVpcIpv6AddressDelete(d *schema.ResourceData, meta interface
283280
}
284281

285282
vpcServiceV2 := VpcServiceV2{client}
286-
stateConf := BuildStateConf([]string{}, []string{}, d.Timeout(schema.TimeoutDelete), 5*time.Second, vpcServiceV2.VpcIpv6AddressStateRefreshFunc(d.Id(), "Status", []string{}))
283+
stateConf := BuildStateConf([]string{}, []string{""}, d.Timeout(schema.TimeoutDelete), 5*time.Second, vpcServiceV2.VpcIpv6AddressStateRefreshFunc(d.Id(), "Status", []string{}))
287284
if _, err := stateConf.WaitForState(); err != nil {
288285
return WrapErrorf(err, IdMsg, d.Id())
289286
}

alicloud/resource_alicloud_vpc_ipv6_address_test.go

Lines changed: 91 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,15 @@ import (
1414
func TestAccAliCloudVpcIpv6Address_basic4694(t *testing.T) {
1515
var v map[string]interface{}
1616
resourceId := "alicloud_vpc_ipv6_address.default"
17-
ra := resourceAttrInit(resourceId, AlicloudVpcIpv6AddressMap4694)
17+
ra := resourceAttrInit(resourceId, AliCloudVpcIpv6AddressMap4694)
1818
rc := resourceCheckInitWithDescribeMethod(resourceId, &v, func() interface{} {
1919
return &VpcServiceV2{testAccProvider.Meta().(*connectivity.AliyunClient)}
2020
}, "DescribeVpcIpv6Address")
2121
rac := resourceAttrCheckInit(rc, ra)
2222
testAccCheck := rac.resourceAttrMapUpdateSet()
2323
rand := acctest.RandIntRange(1, 999)
2424
name := fmt.Sprintf("tfacc%d", rand)
25-
testAccConfig := resourceTestAccConfigFunc(resourceId, name, AlicloudVpcIpv6AddressBasicDependence4694)
25+
testAccConfig := resourceTestAccConfigFunc(resourceId, name, AliCloudVpcIpv6AddressBasicDependence4694)
2626
resource.Test(t, resource.TestCase{
2727
PreCheck: func() {
2828
testAccPreCheck(t)
@@ -33,48 +33,42 @@ func TestAccAliCloudVpcIpv6Address_basic4694(t *testing.T) {
3333
Steps: []resource.TestStep{
3434
{
3535
Config: testAccConfig(map[string]interface{}{
36-
"resource_group_id": "${data.alicloud_resource_manager_resource_groups.default.ids.0}",
37-
"vswitch_id": "${alicloud_vswitch.vswich.id}",
38-
"ipv6_address_description": "create_description",
39-
"ipv6_address_name": name,
40-
"address_type": "Ipv6Address",
41-
"ipv6_address": "${cidrhost(alicloud_vswitch.vswich.ipv6_cidr_block, 128)}",
36+
"vswitch_id": "${alicloud_vswitch.default.id}",
4237
}),
4338
Check: resource.ComposeTestCheckFunc(
4439
testAccCheck(map[string]string{
45-
"resource_group_id": CHECKSET,
46-
"vswitch_id": CHECKSET,
47-
"ipv6_address": CHECKSET,
48-
"ipv6_address_description": "create_description",
49-
"ipv6_address_name": name,
50-
"address_type": "Ipv6Address",
40+
"vswitch_id": CHECKSET,
5141
}),
5242
),
5343
},
5444
{
5545
Config: testAccConfig(map[string]interface{}{
56-
"resource_group_id": "${data.alicloud_resource_manager_resource_groups.default.ids.1}",
57-
"ipv6_address_description": "modify_description",
58-
"ipv6_address_name": name + "_update",
46+
"ipv6_address_description": name,
5947
}),
6048
Check: resource.ComposeTestCheckFunc(
6149
testAccCheck(map[string]string{
62-
"resource_group_id": CHECKSET,
63-
"ipv6_address_description": "modify_description",
64-
"ipv6_address_name": name + "_update",
50+
"ipv6_address_description": name,
6551
}),
6652
),
6753
},
6854
{
69-
Config: testAccConfig(map[string]interface{}{}),
55+
Config: testAccConfig(map[string]interface{}{
56+
"ipv6_address_name": name,
57+
}),
7058
Check: resource.ComposeTestCheckFunc(
71-
testAccCheck(map[string]string{}),
59+
testAccCheck(map[string]string{
60+
"ipv6_address_name": name,
61+
}),
7262
),
7363
},
7464
{
75-
Config: testAccConfig(map[string]interface{}{}),
65+
Config: testAccConfig(map[string]interface{}{
66+
"resource_group_id": "${data.alicloud_resource_manager_resource_groups.default.ids.1}",
67+
}),
7668
Check: resource.ComposeTestCheckFunc(
77-
testAccCheck(map[string]string{}),
69+
testAccCheck(map[string]string{
70+
"resource_group_id": CHECKSET,
71+
}),
7872
),
7973
},
8074
{
@@ -129,41 +123,97 @@ func TestAccAliCloudVpcIpv6Address_basic4694(t *testing.T) {
129123
})
130124
}
131125

132-
var AlicloudVpcIpv6AddressMap4694 = map[string]string{
133-
"status": CHECKSET,
134-
"create_time": CHECKSET,
126+
func TestAccAliCloudVpcIpv6Address_basic4694_twin(t *testing.T) {
127+
var v map[string]interface{}
128+
resourceId := "alicloud_vpc_ipv6_address.default"
129+
ra := resourceAttrInit(resourceId, AliCloudVpcIpv6AddressMap4694)
130+
rc := resourceCheckInitWithDescribeMethod(resourceId, &v, func() interface{} {
131+
return &VpcServiceV2{testAccProvider.Meta().(*connectivity.AliyunClient)}
132+
}, "DescribeVpcIpv6Address")
133+
rac := resourceAttrCheckInit(rc, ra)
134+
testAccCheck := rac.resourceAttrMapUpdateSet()
135+
rand := acctest.RandIntRange(1, 999)
136+
name := fmt.Sprintf("tfacc%d", rand)
137+
testAccConfig := resourceTestAccConfigFunc(resourceId, name, AliCloudVpcIpv6AddressBasicDependence4694)
138+
resource.Test(t, resource.TestCase{
139+
PreCheck: func() {
140+
testAccPreCheck(t)
141+
},
142+
IDRefreshName: resourceId,
143+
Providers: testAccProviders,
144+
CheckDestroy: rac.checkResourceDestroy(),
145+
Steps: []resource.TestStep{
146+
{
147+
Config: testAccConfig(map[string]interface{}{
148+
"address_type": "Ipv6Address",
149+
"ipv6_address": "${cidrhost(alicloud_vswitch.default.ipv6_cidr_block, 128)}",
150+
"vswitch_id": "${alicloud_vswitch.default.id}",
151+
"ipv6_address_description": name,
152+
"ipv6_address_name": name,
153+
"resource_group_id": "${data.alicloud_resource_manager_resource_groups.default.ids.1}",
154+
"tags": map[string]string{
155+
"Created": "TF",
156+
"For": "Test",
157+
},
158+
}),
159+
Check: resource.ComposeTestCheckFunc(
160+
testAccCheck(map[string]string{
161+
"address_type": "Ipv6Address",
162+
"ipv6_address": CHECKSET,
163+
"vswitch_id": CHECKSET,
164+
"ipv6_address_description": name,
165+
"ipv6_address_name": name,
166+
"resource_group_id": CHECKSET,
167+
"tags.%": "2",
168+
"tags.Created": "TF",
169+
"tags.For": "Test",
170+
}),
171+
),
172+
},
173+
{
174+
ResourceName: resourceId,
175+
ImportState: true,
176+
ImportStateVerify: true,
177+
ImportStateVerifyIgnore: []string{},
178+
},
179+
},
180+
})
181+
}
182+
183+
var AliCloudVpcIpv6AddressMap4694 = map[string]string{
184+
"address_type": CHECKSET,
185+
"ipv6_address": CHECKSET,
186+
"resource_group_id": CHECKSET,
187+
"create_time": CHECKSET,
188+
"status": CHECKSET,
135189
}
136190

137-
func AlicloudVpcIpv6AddressBasicDependence4694(name string) string {
191+
func AliCloudVpcIpv6AddressBasicDependence4694(name string) string {
138192
return fmt.Sprintf(`
139193
variable "name" {
140194
default = "%s"
141195
}
142196
143-
variable "zone_id" {
144-
default = "cn-beijing-g"
197+
data "alicloud_resource_manager_resource_groups" "default" {
198+
status = "OK"
145199
}
146200
147-
data "alicloud_resource_manager_resource_groups" "default" {}
148-
149201
data "alicloud_zones" "default" {
150-
available_resource_creation = "VSwitch"
151202
}
152203
153-
resource "alicloud_vpc" "vpc" {
154-
cidr_block = "172.16.0.0/12"
204+
resource "alicloud_vpc" "default" {
205+
vpc_name = var.name
206+
cidr_block = "192.168.0.0/16"
155207
enable_ipv6 = true
156208
}
157209
158-
resource "alicloud_vswitch" "vswich" {
159-
vpc_id = alicloud_vpc.vpc.id
160-
cidr_block = "172.16.0.0/24"
210+
resource "alicloud_vswitch" "default" {
211+
vswitch_name = var.name
212+
vpc_id = alicloud_vpc.default.id
213+
cidr_block = "192.168.192.0/24"
161214
zone_id = data.alicloud_zones.default.zones.0.id
162-
vswitch_name = "tf-testacc"
163215
ipv6_cidr_block_mask = "1"
164216
}
165-
166-
167217
`, name)
168218
}
169219

alicloud/service_alicloud_vpc_v2.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2300,15 +2300,18 @@ func (s *VpcServiceV2) DescribeVpcIpv6Address(id string) (object map[string]inte
23002300
}
23012301

23022302
func (s *VpcServiceV2) VpcIpv6AddressStateRefreshFunc(id string, field string, failStates []string) resource.StateRefreshFunc {
2303+
return s.VpcIpv6AddressStateRefreshFuncWithApi(id, field, failStates, s.DescribeVpcIpv6Address)
2304+
}
2305+
2306+
func (s *VpcServiceV2) VpcIpv6AddressStateRefreshFuncWithApi(id string, field string, failStates []string, call func(id string) (map[string]interface{}, error)) resource.StateRefreshFunc {
23032307
return func() (interface{}, string, error) {
2304-
object, err := s.DescribeVpcIpv6Address(id)
2308+
object, err := call(id)
23052309
if err != nil {
23062310
if NotFoundError(err) {
2307-
return nil, "", nil
2311+
return object, "", nil
23082312
}
23092313
return nil, "", WrapError(err)
23102314
}
2311-
23122315
v, err := jsonpath.Get(field, object)
23132316
currentStatus := fmt.Sprint(v)
23142317

website/docs/r/vpc_ipv6_address.html.markdown

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ The following arguments are supported:
7777
- `IPv6Address` (default): indicates that the current instance is a single IPv6 address.
7878
- `IPv6Prefix`: indicates that the current instance is a contiguous block of IPv6 addresses.
7979
* `ipv6_address` - (Optional, ForceNew, Computed) IPv6 address
80-
* `ipv6_address_description` - (Optional, Computed) The description of the IPv6 Address. The description must be 2 to 256 characters in length. It cannot start with http:// or https://.
80+
* `ipv6_address_description` - (Optional) The description of the IPv6 Address. The description must be 2 to 256 characters in length. It cannot start with http:// or https://.
8181
* `ipv6_address_name` - (Optional) The name of the IPv6 Address. The name must be 2 to 128 characters in length, and can contain letters, digits, underscores (_), and hyphens (-). The name must start with a letter but cannot start with http:// or https://.
8282
* `resource_group_id` - (Optional, Computed) The ID of the resource group to which the instance belongs.
8383
* `tags` - (Optional, Map) The tags for the resource.

0 commit comments

Comments
 (0)