diff --git a/alicloud/resource_alicloud_vpc_ipv4_cidr_block.go b/alicloud/resource_alicloud_vpc_ipv4_cidr_block.go index a97fa0d39ce5..7a5058629c21 100644 --- a/alicloud/resource_alicloud_vpc_ipv4_cidr_block.go +++ b/alicloud/resource_alicloud_vpc_ipv4_cidr_block.go @@ -1,4 +1,3 @@ -// Package alicloud. This file is generated automatically. Please do not modify it manually, thank you! package alicloud import ( @@ -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, @@ -47,22 +61,38 @@ 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() @@ -70,15 +100,19 @@ func resourceAliCloudVpcIpv4CidrBlockCreate(d *schema.ResourceData, meta interfa } 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) } @@ -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) @@ -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 } @@ -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) @@ -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) { @@ -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) { diff --git a/alicloud/resource_alicloud_vpc_ipv4_cidr_block_test.go b/alicloud/resource_alicloud_vpc_ipv4_cidr_block_test.go index ffafec43b7a9..f72d9f8472fe 100644 --- a/alicloud/resource_alicloud_vpc_ipv4_cidr_block_test.go +++ b/alicloud/resource_alicloud_vpc_ipv4_cidr_block_test.go @@ -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{ @@ -73,6 +73,10 @@ variable "name" { data "alicloud_vpcs" "default" { name_regex = "^default-NODELETING$" } + +resource "alicloud_vpc" "defaultvpc" { + description = var.name +} `, name) } @@ -278,11 +282,11 @@ 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") @@ -290,9 +294,10 @@ func TestAccAliCloudVpcIpv4CidrBlock_basic3522(t *testing.T) { 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, @@ -301,13 +306,15 @@ 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", }), ), }, @@ -315,29 +322,44 @@ func TestAccAliCloudVpcIpv4CidrBlock_basic3522(t *testing.T) { 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) } diff --git a/alicloud/service_alicloud_vpc_v2.go b/alicloud/service_alicloud_vpc_v2.go index 249e8d2ac21c..7ee20cb24657 100644 --- a/alicloud/service_alicloud_vpc_v2.go +++ b/alicloud/service_alicloud_vpc_v2.go @@ -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{} @@ -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) @@ -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) } @@ -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 } } @@ -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)) diff --git a/website/docs/r/vpc_ipv4_cidr_block.html.markdown b/website/docs/r/vpc_ipv4_cidr_block.html.markdown index 28fc02701463..026f54670ffb 100644 --- a/website/docs/r/vpc_ipv4_cidr_block.html.markdown +++ b/website/docs/r/vpc_ipv4_cidr_block.html.markdown @@ -8,7 +8,9 @@ description: |- # alicloud_vpc_ipv4_cidr_block -Provides a VPC Ipv4 Cidr Block resource. VPC IPv4 additional network segment. +Provides a VPC Ipv4 Cidr Block resource. + +VPC IPv4 additional network segment. For information about VPC Ipv4 Cidr Block and how to use it, see [What is Ipv4 Cidr Block](https://www.alibabacloud.com/help/en/virtual-private-cloud/latest/associatevpccidrblock). @@ -18,12 +20,6 @@ For information about VPC Ipv4 Cidr Block and how to use it, see [What is Ipv4 C Basic Usage -