Skip to content

Commit

Permalink
resource/alicloud_vpc_ipv4_cidr_block: add new attribute ipv4_ipam_po…
Browse files Browse the repository at this point in the history
…ol_id, secondary_cidr_mask.
  • Loading branch information
ChenHanZhang committed Jan 20, 2025
1 parent 0bcd1c3 commit fce0eb8
Show file tree
Hide file tree
Showing 4 changed files with 124 additions and 52 deletions.
71 changes: 60 additions & 11 deletions alicloud/resource_alicloud_vpc_ipv4_cidr_block.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
// Package alicloud. This file is generated automatically. Please do not modify it manually, thank you!
package alicloud

import (
Expand All @@ -17,20 +16,35 @@ func resourceAliCloudVpcIpv4CidrBlock() *schema.Resource {
return &schema.Resource{
Create: resourceAliCloudVpcIpv4CidrBlockCreate,
Read: resourceAliCloudVpcIpv4CidrBlockRead,
Update: resourceAliCloudVpcIpv4CidrBlockUpdate,
Delete: resourceAliCloudVpcIpv4CidrBlockDelete,
Importer: &schema.ResourceImporter{
State: schema.ImportStatePassthrough,
},
Timeouts: &schema.ResourceTimeout{
Create: schema.DefaultTimeout(5 * time.Minute),
Update: schema.DefaultTimeout(5 * time.Minute),
Delete: schema.DefaultTimeout(5 * time.Minute),
},
Schema: map[string]*schema.Schema{
"ipv4_ipam_pool_id": {
Type: schema.TypeString,
Optional: true,
},
"region_id": {
Type: schema.TypeString,
Computed: true,
},
"secondary_cidr_block": {
Type: schema.TypeString,
Required: true,
Optional: true,
Computed: true,
ForceNew: true,
},
"secondary_cidr_mask": {
Type: schema.TypeInt,
Optional: true,
},
"vpc_id": {
Type: schema.TypeString,
Required: true,
Expand All @@ -47,38 +61,58 @@ func resourceAliCloudVpcIpv4CidrBlockCreate(d *schema.ResourceData, meta interfa
action := "AssociateVpcCidrBlock"
var request map[string]interface{}
var response map[string]interface{}
query := make(map[string]interface{})
conn, err := client.NewVpcClient()
if err != nil {
return WrapError(err)
}
request = make(map[string]interface{})
request["VpcId"] = d.Get("vpc_id")
request["SecondaryCidrBlock"] = d.Get("secondary_cidr_block")
if v, ok := d.GetOk("vpc_id"); ok {
request["VpcId"] = v
}
if v, ok := d.GetOk("secondary_cidr_block"); ok {
request["SecondaryCidrBlock"] = v
}
request["RegionId"] = client.RegionId

if v, ok := d.GetOk("ipv6_isp"); ok {
request["Ipv6Isp"] = v
}
if v, ok := d.GetOk("ipv6_cidr_block"); ok {
request["IPv6CidrBlock"] = v
}
if v, ok := d.GetOk("ipv4_ipam_pool_id"); ok {
request["IpamPoolId"] = v
}
if v, ok := d.GetOk("secondary_cidr_mask"); ok {
request["SecondaryCidrMask"] = v
}
request["IpVersion"] = "IPV4"
runtime := util.RuntimeOptions{}
runtime.SetAutoretry(true)
wait := incrementalWait(3*time.Second, 5*time.Second)
err = resource.Retry(d.Timeout(schema.TimeoutCreate), func() *resource.RetryError {
response, err = conn.DoRequest(StringPointer(action), nil, StringPointer("POST"), StringPointer("2016-04-28"), StringPointer("AK"), nil, request, &runtime)

response, err = conn.DoRequest(StringPointer(action), nil, StringPointer("POST"), StringPointer("2016-04-28"), StringPointer("AK"), query, request, &runtime)
if err != nil {
if IsExpectedErrors(err, []string{"IncorrectStatus.Vpc", "OperationConflict", "IncorrectStatus", "ServiceUnavailable", "SystemBusy", "LastTokenProcessing"}) || NeedRetry(err) {
wait()
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
addDebug(action, response, request)
return nil
})
addDebug(action, response, request)

if err != nil {
return WrapErrorf(err, DefaultErrorMsg, "alicloud_vpc_ipv4_cidr_block", action, AlibabaCloudSdkGoERROR)
}

d.SetId(fmt.Sprintf("%v:%v", request["VpcId"], request["SecondaryCidrBlock"]))
if response["CidrBlock"] != nil {
d.SetId(fmt.Sprintf("%v:%v", request["VpcId"], response["CidrBlock"]))
} else {
d.SetId(fmt.Sprintf("%v:%v", request["VpcId"], request["SecondaryCidrBlock"]))
}

return resourceAliCloudVpcIpv4CidrBlockRead(d, meta)
}
Expand All @@ -87,7 +121,7 @@ func resourceAliCloudVpcIpv4CidrBlockRead(d *schema.ResourceData, meta interface
client := meta.(*connectivity.AliyunClient)
vpcServiceV2 := VpcServiceV2{client}

_, err := vpcServiceV2.DescribeVpcIpv4CidrBlock(d.Id())
objectRaw, err := vpcServiceV2.DescribeVpcIpv4CidrBlock(d.Id())
if err != nil {
if !d.IsNewResource() && NotFoundError(err) {
log.Printf("[DEBUG] Resource alicloud_vpc_ipv4_cidr_block DescribeVpcIpv4CidrBlock Failed!!! %s", err)
Expand All @@ -97,13 +131,24 @@ func resourceAliCloudVpcIpv4CidrBlockRead(d *schema.ResourceData, meta interface
return WrapError(err)
}

if objectRaw["RegionId"] != nil {
d.Set("region_id", objectRaw["RegionId"])
}
if objectRaw["VpcId"] != nil {
d.Set("vpc_id", objectRaw["VpcId"])
}

parts, err := ParseResourceId(d.Id(), 2)
if err != nil {
return WrapError(err)
}
d.Set("secondary_cidr_block", parts[1])
d.Set("vpc_id", parts[0])
return nil
}

func resourceAliCloudVpcIpv4CidrBlockUpdate(d *schema.ResourceData, meta interface{}) error {
log.Printf("[INFO] Cannot update resource Alicloud Resource Ipv4 Cidr Block.")
return nil
}

Expand All @@ -114,6 +159,7 @@ func resourceAliCloudVpcIpv4CidrBlockDelete(d *schema.ResourceData, meta interfa
action := "UnassociateVpcCidrBlock"
var request map[string]interface{}
var response map[string]interface{}
query := make(map[string]interface{})
conn, err := client.NewVpcClient()
if err != nil {
return WrapError(err)
Expand All @@ -123,11 +169,14 @@ func resourceAliCloudVpcIpv4CidrBlockDelete(d *schema.ResourceData, meta interfa
request["SecondaryCidrBlock"] = parts[1]
request["RegionId"] = client.RegionId

if v, ok := d.GetOk("ipv6_cidr_block"); ok {
request["IPv6CidrBlock"] = v
}
runtime := util.RuntimeOptions{}
runtime.SetAutoretry(true)
wait := incrementalWait(3*time.Second, 5*time.Second)
err = resource.Retry(d.Timeout(schema.TimeoutDelete), func() *resource.RetryError {
response, err = conn.DoRequest(StringPointer(action), nil, StringPointer("POST"), StringPointer("2016-04-28"), StringPointer("AK"), nil, request, &runtime)
response, err = conn.DoRequest(StringPointer(action), nil, StringPointer("POST"), StringPointer("2016-04-28"), StringPointer("AK"), query, request, &runtime)

if err != nil {
if IsExpectedErrors(err, []string{"IncorrectStatus.Vpc", "OperationConflict", "IncorrectStatus", "ServiceUnavailable", "SystemBusy", "LastTokenProcessing", "OperationFailed.CidrInUse"}) || NeedRetry(err) {
Expand All @@ -136,9 +185,9 @@ func resourceAliCloudVpcIpv4CidrBlockDelete(d *schema.ResourceData, meta interfa
}
return resource.NonRetryableError(err)
}
addDebug(action, response, request)
return nil
})
addDebug(action, response, request)

if err != nil {
if NotFoundError(err) {
Expand Down
60 changes: 41 additions & 19 deletions alicloud/resource_alicloud_vpc_ipv4_cidr_block_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ func TestAccAliCloudVPCIpv4CidrBlock_basic0(t *testing.T) {
{
Config: testAccConfig(map[string]interface{}{
"secondary_cidr_block": "192.164.0.0/16",
"vpc_id": "${data.alicloud_vpcs.default.ids.0}",
"vpc_id": "${alicloud_vpc.defaultvpc.id}",
}),
Check: resource.ComposeTestCheckFunc(
testAccCheck(map[string]string{
Expand Down Expand Up @@ -73,6 +73,10 @@ variable "name" {
data "alicloud_vpcs" "default" {
name_regex = "^default-NODELETING$"
}
resource "alicloud_vpc" "defaultvpc" {
description = var.name
}
`, name)
}

Expand Down Expand Up @@ -278,21 +282,22 @@ func TestUnitAccAlicloudVpcIpv4CidrBlock(t *testing.T) {
}

// Test Vpc Ipv4CidrBlock. >>> Resource test cases, automatically generated.
// Case 3522
func TestAccAliCloudVpcIpv4CidrBlock_basic3522(t *testing.T) {
// Case Ipv4CidrBlock资源测试用例_通过ipamPool添加地址段_mask 9804
func TestAccAliCloudVpcIpv4CidrBlock_basic9804(t *testing.T) {
var v map[string]interface{}
resourceId := "alicloud_vpc_ipv4_cidr_block.default"
ra := resourceAttrInit(resourceId, AlicloudVpcIpv4CidrBlockMap3522)
ra := resourceAttrInit(resourceId, AlicloudVpcIpv4CidrBlockMap9804)
rc := resourceCheckInitWithDescribeMethod(resourceId, &v, func() interface{} {
return &VpcServiceV2{testAccProvider.Meta().(*connectivity.AliyunClient)}
}, "DescribeVpcIpv4CidrBlock")
rac := resourceAttrCheckInit(rc, ra)
testAccCheck := rac.resourceAttrMapUpdateSet()
rand := acctest.RandIntRange(10000, 99999)
name := fmt.Sprintf("tf-testacc%svpcipv4cidrblock%d", defaultRegionToTest, rand)
testAccConfig := resourceTestAccConfigFunc(resourceId, name, AlicloudVpcIpv4CidrBlockBasicDependence3522)
testAccConfig := resourceTestAccConfigFunc(resourceId, name, AlicloudVpcIpv4CidrBlockBasicDependence9804)
resource.Test(t, resource.TestCase{
PreCheck: func() {
testAccPreCheckWithRegions(t, true, []connectivity.Region{"ap-southeast-3"})
testAccPreCheck(t)
},
IDRefreshName: resourceId,
Expand All @@ -301,43 +306,60 @@ func TestAccAliCloudVpcIpv4CidrBlock_basic3522(t *testing.T) {
Steps: []resource.TestStep{
{
Config: testAccConfig(map[string]interface{}{
"secondary_cidr_block": "192.168.0.0/16",
"vpc_id": "${alicloud_vpc.default.id}",
"vpc_id": "${alicloud_vpc.vpc.id}",
"ipv4_ipam_pool_id": "${alicloud_vpc_ipam_ipam_pool_cidr.defaultIpamPoolCidr.ipam_pool_id}",
"secondary_cidr_mask": "16",
}),
Check: resource.ComposeTestCheckFunc(
testAccCheck(map[string]string{
"secondary_cidr_block": "192.168.0.0/16",
"vpc_id": CHECKSET,
"vpc_id": CHECKSET,
"ipv4_ipam_pool_id": CHECKSET,
"secondary_cidr_mask": "16",
}),
),
},
{
ResourceName: resourceId,
ImportState: true,
ImportStateVerify: true,
ImportStateVerifyIgnore: []string{},
ImportStateVerifyIgnore: []string{"ipv4_ipam_pool_id", "secondary_cidr_mask"},
},
},
})
}

var AlicloudVpcIpv4CidrBlockMap3522 = map[string]string{
"secondary_cidr_block": CHECKSET,
var AlicloudVpcIpv4CidrBlockMap9804 = map[string]string{
"region_id": CHECKSET,
}

func AlicloudVpcIpv4CidrBlockBasicDependence3522(name string) string {
func AlicloudVpcIpv4CidrBlockBasicDependence9804(name string) string {
return fmt.Sprintf(`
variable "name" {
default = "%s"
}
resource "alicloud_vpc" "default" {
ipv6_isp = "BGP"
description = "test"
cidr_block = "172.16.0.0/12"
vpc_name = var.name
enable_ipv6 = true
resource "alicloud_vpc" "vpc" {
cidr_block = "192.168.0.0/16"
}
resource "alicloud_vpc_ipam_ipam" "defaultIpam" {
operating_region_list = ["ap-southeast-3"]
ipam_name = format("%%s1", var.name)
}
resource "alicloud_vpc_ipam_ipam_pool" "defaultIpamPool" {
ipam_scope_id = alicloud_vpc_ipam_ipam.defaultIpam.private_default_scope_id
ipam_pool_description = "This is the ipam pool for testing the vpc ipv4 cidr block."
pool_region_id = alicloud_vpc_ipam_ipam.defaultIpam.region_id
ip_version = "IPv4"
}
resource "alicloud_vpc_ipam_ipam_pool_cidr" "defaultIpamPoolCidr" {
cidr = "10.0.0.0/8"
ipam_pool_id = alicloud_vpc_ipam_ipam_pool.defaultIpamPool.id
}
`, name)
}

Expand Down
24 changes: 14 additions & 10 deletions alicloud/service_alicloud_vpc_v2.go
Original file line number Diff line number Diff line change
Expand Up @@ -2243,7 +2243,6 @@ func (s *VpcServiceV2) VpcRouteTableAttachmentStateRefreshFunc(id string, field
// DescribeVpcIpv4CidrBlock <<< Encapsulated get interface for Vpc Ipv4CidrBlock.

func (s *VpcServiceV2) DescribeVpcIpv4CidrBlock(id string) (object map[string]interface{}, err error) {

client := s.client
var request map[string]interface{}
var response map[string]interface{}
Expand All @@ -2252,15 +2251,15 @@ func (s *VpcServiceV2) DescribeVpcIpv4CidrBlock(id string) (object map[string]in
if len(parts) != 2 {
err = WrapError(fmt.Errorf("invalid Resource Id %s. Expected parts' length %d, got %d", id, 2, len(parts)))
}
action := "DescribeVpcs"
conn, err := client.NewVpcClient()
if err != nil {
return object, WrapError(err)
}
request = make(map[string]interface{})
query = make(map[string]interface{})
query["VpcId"] = parts[0]
request["VpcId"] = parts[0]
request["RegionId"] = client.RegionId
action := "DescribeVpcs"

runtime := util.RuntimeOptions{}
runtime.SetAutoretry(true)
Expand All @@ -2275,14 +2274,10 @@ func (s *VpcServiceV2) DescribeVpcIpv4CidrBlock(id string) (object map[string]in
}
return resource.NonRetryableError(err)
}
addDebug(action, response, request)
return nil
})

addDebug(action, response, request)
if err != nil {
if IsExpectedErrors(err, []string{"Throttling.User", "OperationFailure.OperationFailed"}) {
return object, WrapErrorf(Error(GetNotFoundMessage("Ipv4CidrBlock", id)), NotFoundMsg, response)
}
return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR)
}

Expand Down Expand Up @@ -2312,7 +2307,7 @@ func (s *VpcServiceV2) DescribeVpcIpv4CidrBlock(id string) (object map[string]in
if found {
return item, nil
}
if item["VpcId"] != parts[0] {
if fmt.Sprint(item["VpcId"]) != parts[0] {
continue
}
}
Expand All @@ -2329,7 +2324,16 @@ func (s *VpcServiceV2) VpcIpv4CidrBlockStateRefreshFunc(id string, field string,
return nil, "", WrapError(err)
}

currentStatus := fmt.Sprint(object[field])
v, err := jsonpath.Get(field, object)
currentStatus := fmt.Sprint(v)

if strings.HasPrefix(field, "#") {
v, _ := jsonpath.Get(strings.TrimPrefix(field, "#"), object)
if v != nil {
currentStatus = "#CHECKSET"
}
}

for _, failState := range failStates {
if currentStatus == failState {
return object, currentStatus, WrapError(Error(FailedToReachTargetStatus, currentStatus))
Expand Down
Loading

0 comments on commit fce0eb8

Please sign in to comment.