diff --git a/ibm/service/vpc/data_source_ibm_is_vpc.go b/ibm/service/vpc/data_source_ibm_is_vpc.go index b133ea84ce..13bdbf9452 100644 --- a/ibm/service/vpc/data_source_ibm_is_vpc.go +++ b/ibm/service/vpc/data_source_ibm_is_vpc.go @@ -4,6 +4,7 @@ package vpc import ( + "context" "fmt" "log" "reflect" @@ -12,14 +13,78 @@ import ( "github.com/IBM-Cloud/terraform-provider-ibm/ibm/validate" "github.com/IBM/go-sdk-core/v5/core" "github.com/IBM/vpc-go-sdk/vpcv1" + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) func DataSourceIBMISVPC() *schema.Resource { return &schema.Resource{ - Read: dataSourceIBMISVPCRead, + ReadContext: dataSourceIBMISVPCRead, Schema: map[string]*schema.Schema{ + "address_prefixes": { + Type: schema.TypeList, + Computed: true, + Description: "Collection of address prefixes.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "cidr": { + Type: schema.TypeString, + Computed: true, + Description: "The CIDR block for this prefix.", + }, + "created_at": { + Type: schema.TypeString, + Computed: true, + Description: "The date and time that the prefix was created.", + }, + "has_subnets": { + Type: schema.TypeBool, + Computed: true, + Description: "Indicates whether subnets exist with addresses from this prefix.", + }, + "href": { + Type: schema.TypeString, + Computed: true, + Description: "The URL for this address prefix.", + }, + "id": { + Type: schema.TypeString, + Computed: true, + Description: "The unique identifier for this address prefix.", + }, + "is_default": { + Type: schema.TypeBool, + Computed: true, + Description: "Indicates whether this is the default prefix for this zone in this VPC. If a default prefix was automatically created when the VPC was created, the prefix is automatically named using a hyphenated list of randomly-selected words, but may be updated with a user-specified name.", + }, + "name": { + Type: schema.TypeString, + Computed: true, + Description: "The user-defined name for this address prefix. Names must be unique within the VPC the address prefix resides in.", + }, + "zone": { + Type: schema.TypeList, + Computed: true, + Description: "The zone this address prefix resides in.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "href": { + Type: schema.TypeString, + Computed: true, + Description: "The URL for this zone.", + }, + "name": { + Type: schema.TypeString, + Computed: true, + Description: "The globally unique name for this zone.", + }, + }, + }, + }, + }, + }, + }, isVPCDefaultNetworkACL: { Type: schema.TypeString, Computed: true, @@ -497,17 +562,17 @@ func DataSourceIBMISVpcValidator() *validate.ResourceValidator { return &ibmISVpcDataSourceValidator } -func dataSourceIBMISVPCRead(d *schema.ResourceData, meta interface{}) error { +func dataSourceIBMISVPCRead(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { name := d.Get(isVPCName).(string) id := d.Get("identifier").(string) - err := vpcGetByNameOrId(d, meta, name, id) + err := vpcGetByNameOrId(context, d, meta, name, id) if err != nil { - return err + return diag.FromErr(err) } return nil } -func vpcGetByNameOrId(d *schema.ResourceData, meta interface{}, name, id string) error { +func vpcGetByNameOrId(context context.Context, d *schema.ResourceData, meta interface{}, name, id string) error { sess, err := vpcClient(meta) if err != nil { return err @@ -522,7 +587,7 @@ func vpcGetByNameOrId(d *schema.ResourceData, meta interface{}, name, id string) return fmt.Errorf("[ERROR] Error Fetching vpc %s\n%s", err, response) } flag = true - setVpcDetails(d, vpcGet, meta, sess) + setVpcDetails(context, d, vpcGet, meta, sess) } else { start := "" allrecs := []vpcv1.VPC{} @@ -544,7 +609,7 @@ func vpcGetByNameOrId(d *schema.ResourceData, meta interface{}, name, id string) for _, v := range allrecs { if *v.Name == name { flag = true - setVpcDetails(d, &v, meta, sess) + setVpcDetails(context, d, &v, meta, sess) } } } @@ -554,9 +619,18 @@ func vpcGetByNameOrId(d *schema.ResourceData, meta interface{}, name, id string) return nil } -func setVpcDetails(d *schema.ResourceData, vpc *vpcv1.VPC, meta interface{}, sess *vpcv1.VpcV1) error { +func setVpcDetails(context context.Context, d *schema.ResourceData, vpc *vpcv1.VPC, meta interface{}, sess *vpcv1.VpcV1) diag.Diagnostics { if vpc != nil { d.SetId(*vpc.ID) + + addressPrefixes, diagError := GetAddressPrefixPaginatedList(context, sess, *vpc.ID) + if diagError != nil { + return diagError + } + err := d.Set("address_prefixes", dataSourceAddressPrefixCollectionFlattenAddressPrefixes(addressPrefixes)) + if err != nil { + return diag.FromErr(fmt.Errorf("[ERROR] Error setting address_prefixes %s", err)) + } d.Set("identifier", *vpc.ID) d.Set(isVPCName, *vpc.Name) d.Set(isVPCClassicAccess, *vpc.ClassicAccess) @@ -601,22 +675,22 @@ func setVpcDetails(d *schema.ResourceData, vpc *vpcv1.VPC, meta interface{}, ses for _, modelItem := range vpc.HealthReasons { modelMap, err := dataSourceIBMIsVPCVPCHealthReasonToMap(&modelItem) if err != nil { - return err + return diag.FromErr(err) } healthReasons = append(healthReasons, modelMap) } } if err = d.Set("health_reasons", healthReasons); err != nil { - return fmt.Errorf("[ERROR] Error setting health_reasons %s", err) + return diag.FromErr(fmt.Errorf("[ERROR] Error setting health_reasons %s", err)) } if err = d.Set("health_state", vpc.HealthState); err != nil { - return fmt.Errorf("[ERROR] Error setting health_state: %s", err) + return diag.FromErr(fmt.Errorf("[ERROR] Error setting health_state: %s", err)) } controller, err := flex.GetBaseController(meta) if err != nil { - return err + return diag.FromErr(err) } d.Set(flex.ResourceControllerURL, controller+"/vpc-ext/network/vpcs") d.Set(flex.ResourceName, *vpc.Name) @@ -651,7 +725,7 @@ func setVpcDetails(d *schema.ResourceData, vpc *vpcv1.VPC, meta interface{}, ses } s, response, err := sess.ListSubnets(options) if err != nil { - return fmt.Errorf("[ERROR] Error fetching subnets %s\n%s", err, response) + return diag.FromErr(fmt.Errorf("[ERROR] Error fetching subnets %s\n%s", err, response)) } startSub = flex.GetNext(s.Next) allrecsSub = append(allrecsSub, s.Subnets...) @@ -692,7 +766,7 @@ func setVpcDetails(d *schema.ResourceData, vpc *vpcv1.VPC, meta interface{}, ses } sgs, response, err := sess.ListSecurityGroups(listSgOptions) if err != nil || sgs == nil { - return fmt.Errorf("[ERROR] Error fetching Security Groups %s\n%s", err, response) + return diag.FromErr(fmt.Errorf("[ERROR] Error fetching Security Groups %s\n%s", err, response)) } if *sgs.TotalCount == int64(0) { break @@ -813,10 +887,10 @@ func setVpcDetails(d *schema.ResourceData, vpc *vpcv1.VPC, meta interface{}, ses if !core.IsNil(vpc.Dns) { dnsMap, err := dataSourceIBMIsVPCVpcdnsToMap(vpc.Dns) if err != nil { - return err + return diag.FromErr(err) } if err = d.Set(isVPCDns, []map[string]interface{}{dnsMap}); err != nil { - return fmt.Errorf("[ERROR] Error setting dns: %s", err) + return diag.FromErr(fmt.Errorf("[ERROR] Error setting dns: %s", err)) } } return nil diff --git a/ibm/service/vpc/data_source_ibm_is_vpc_address_prefixes.go b/ibm/service/vpc/data_source_ibm_is_vpc_address_prefixes.go index 719f63bfc5..067c8587d3 100644 --- a/ibm/service/vpc/data_source_ibm_is_vpc_address_prefixes.go +++ b/ibm/service/vpc/data_source_ibm_is_vpc_address_prefixes.go @@ -98,20 +98,13 @@ func DataSourceIbmIsVpcAddressPrefixes() *schema.Resource { }, } } - -func dataSourceIbmIsVpcAddressPrefixRead(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - - vpcClient, err := meta.(conns.ClientSession).VpcV1API() - if err != nil { - return diag.FromErr(err) - } - +func GetAddressPrefixPaginatedList(context context.Context, vpcClient *vpcv1.VpcV1, vpc string) ([]vpcv1.AddressPrefix, diag.Diagnostics) { start := "" allrecs := []vpcv1.AddressPrefix{} for { listVpcAddressPrefixesOptions := &vpcv1.ListVPCAddressPrefixesOptions{} - listVpcAddressPrefixesOptions.SetVPCID(d.Get("vpc").(string)) + listVpcAddressPrefixesOptions.SetVPCID(vpc) if start != "" { listVpcAddressPrefixesOptions.Start = &start @@ -119,7 +112,7 @@ func dataSourceIbmIsVpcAddressPrefixRead(context context.Context, d *schema.Reso addressPrefixCollection, response, err := vpcClient.ListVPCAddressPrefixesWithContext(context, listVpcAddressPrefixesOptions) if err != nil { log.Printf("[DEBUG] ListVpcAddressPrefixesWithContext failed %s\n%s", err, response) - return diag.FromErr(fmt.Errorf("ListVpcAddressPrefixesWithContext failed %s\n%s", err, response)) + return nil, diag.FromErr(fmt.Errorf("ListVpcAddressPrefixesWithContext failed %s\n%s", err, response)) } start = flex.GetNext(addressPrefixCollection.Next) allrecs = append(allrecs, addressPrefixCollection.AddressPrefixes...) @@ -127,6 +120,19 @@ func dataSourceIbmIsVpcAddressPrefixRead(context context.Context, d *schema.Reso break } } + return allrecs, nil +} +func dataSourceIbmIsVpcAddressPrefixRead(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + + vpcClient, err := meta.(conns.ClientSession).VpcV1API() + if err != nil { + return diag.FromErr(err) + } + + allrecs, diagError := GetAddressPrefixPaginatedList(context, vpcClient, d.Get("vpc").(string)) + if diagError != nil { + return diagError + } // Use the provided filter argument and construct a new list with only the requested resource(s) var matchAddressPrefixes []vpcv1.AddressPrefix diff --git a/ibm/service/vpc/data_source_ibm_is_vpc_test.go b/ibm/service/vpc/data_source_ibm_is_vpc_test.go index 99ba4eaf97..5305b6ad2e 100644 --- a/ibm/service/vpc/data_source_ibm_is_vpc_test.go +++ b/ibm/service/vpc/data_source_ibm_is_vpc_test.go @@ -38,6 +38,8 @@ func TestAccIBMISVPCDatasource_basic(t *testing.T) { resource.TestCheckResourceAttrSet("data.ibm_is_vpc.ds_vpc_by_id", "default_network_acl_name"), resource.TestCheckResourceAttrSet("data.ibm_is_vpc.ds_vpc_by_id", "default_security_group_name"), resource.TestCheckResourceAttrSet("data.ibm_is_vpc.ds_vpc_by_id", "default_routing_table_name"), + resource.TestCheckResourceAttrSet("data.ibm_is_vpc.ds_vpc_by_id", "address_prefixes.#"), + resource.TestCheckResourceAttrSet("data.ibm_is_vpc.ds_vpc_by_id", "address_prefixes.0.cidr"), ), }, }, diff --git a/ibm/service/vpc/data_source_ibm_is_vpcs.go b/ibm/service/vpc/data_source_ibm_is_vpcs.go index af5a2694d2..171009d51a 100644 --- a/ibm/service/vpc/data_source_ibm_is_vpcs.go +++ b/ibm/service/vpc/data_source_ibm_is_vpcs.go @@ -45,6 +45,69 @@ func DataSourceIBMISVPCs() *schema.Resource { Computed: true, Elem: &schema.Resource{ Schema: map[string]*schema.Schema{ + "address_prefixes": { + Type: schema.TypeList, + Computed: true, + Description: "Collection of address prefixes.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "cidr": { + Type: schema.TypeString, + Computed: true, + Description: "The CIDR block for this prefix.", + }, + "created_at": { + Type: schema.TypeString, + Computed: true, + Description: "The date and time that the prefix was created.", + }, + "has_subnets": { + Type: schema.TypeBool, + Computed: true, + Description: "Indicates whether subnets exist with addresses from this prefix.", + }, + "href": { + Type: schema.TypeString, + Computed: true, + Description: "The URL for this address prefix.", + }, + "id": { + Type: schema.TypeString, + Computed: true, + Description: "The unique identifier for this address prefix.", + }, + "is_default": { + Type: schema.TypeBool, + Computed: true, + Description: "Indicates whether this is the default prefix for this zone in this VPC. If a default prefix was automatically created when the VPC was created, the prefix is automatically named using a hyphenated list of randomly-selected words, but may be updated with a user-specified name.", + }, + "name": { + Type: schema.TypeString, + Computed: true, + Description: "The user-defined name for this address prefix. Names must be unique within the VPC the address prefix resides in.", + }, + "zone": { + Type: schema.TypeList, + Computed: true, + Description: "The zone this address prefix resides in.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "href": { + Type: schema.TypeString, + Computed: true, + Description: "The URL for this zone.", + }, + "name": { + Type: schema.TypeString, + Computed: true, + Description: "The globally unique name for this zone.", + }, + }, + }, + }, + }, + }, + }, isVPCDefaultNetworkACL: { Type: schema.TypeString, Computed: true, @@ -556,6 +619,11 @@ func dataSourceIBMISVPCListRead(context context.Context, d *schema.ResourceData, flex.ResourceStatus: *vpc.Status, isVPCResourceGroup: *vpc.ResourceGroup.ID, } + addressPrefixes, diagError := GetAddressPrefixPaginatedList(context, sess, *vpc.ID) + if diagError != nil { + return diagError + } + l["address_prefixes"] = dataSourceAddressPrefixCollectionFlattenAddressPrefixes(addressPrefixes) if vpc.DefaultNetworkACL != nil { l[isVPCDefaultNetworkACL] = *vpc.DefaultNetworkACL.ID diff --git a/ibm/service/vpc/resource_ibm_is_vpc.go b/ibm/service/vpc/resource_ibm_is_vpc.go index a9ad0a99a0..52f88846f1 100644 --- a/ibm/service/vpc/resource_ibm_is_vpc.go +++ b/ibm/service/vpc/resource_ibm_is_vpc.go @@ -15,6 +15,7 @@ import ( "github.com/IBM/go-sdk-core/v5/core" "github.com/IBM/vpc-go-sdk/vpcv1" + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/customdiff" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" @@ -92,12 +93,12 @@ const ( func ResourceIBMISVPC() *schema.Resource { return &schema.Resource{ - Create: resourceIBMISVPCCreate, - Read: resourceIBMISVPCRead, - Update: resourceIBMISVPCUpdate, - Delete: resourceIBMISVPCDelete, - Exists: resourceIBMISVPCExists, - Importer: &schema.ResourceImporter{}, + CreateContext: resourceIBMISVPCCreate, + ReadContext: resourceIBMISVPCRead, + UpdateContext: resourceIBMISVPCUpdate, + DeleteContext: resourceIBMISVPCDelete, + Exists: resourceIBMISVPCExists, + Importer: &schema.ResourceImporter{}, Timeouts: &schema.ResourceTimeout{ Create: schema.DefaultTimeout(10 * time.Minute), @@ -126,7 +127,69 @@ func ResourceIBMISVPC() *schema.Resource { ValidateFunc: validate.InvokeValidator("ibm_is_vpc", isVPCAddressPrefixManagement), Description: "Address Prefix management value", }, - + "address_prefixes": { + Type: schema.TypeList, + Computed: true, + Description: "Collection of address prefixes.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "cidr": { + Type: schema.TypeString, + Computed: true, + Description: "The CIDR block for this prefix.", + }, + "created_at": { + Type: schema.TypeString, + Computed: true, + Description: "The date and time that the prefix was created.", + }, + "has_subnets": { + Type: schema.TypeBool, + Computed: true, + Description: "Indicates whether subnets exist with addresses from this prefix.", + }, + "href": { + Type: schema.TypeString, + Computed: true, + Description: "The URL for this address prefix.", + }, + "id": { + Type: schema.TypeString, + Computed: true, + Description: "The unique identifier for this address prefix.", + }, + "is_default": { + Type: schema.TypeBool, + Computed: true, + Description: "Indicates whether this is the default prefix for this zone in this VPC. If a default prefix was automatically created when the VPC was created, the prefix is automatically named using a hyphenated list of randomly-selected words, but may be updated with a user-specified name.", + }, + "name": { + Type: schema.TypeString, + Computed: true, + Description: "The user-defined name for this address prefix. Names must be unique within the VPC the address prefix resides in.", + }, + "zone": { + Type: schema.TypeList, + Computed: true, + Description: "The zone this address prefix resides in.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "href": { + Type: schema.TypeString, + Computed: true, + Description: "The URL for this zone.", + }, + "name": { + Type: schema.TypeString, + Computed: true, + Description: "The globally unique name for this zone.", + }, + }, + }, + }, + }, + }, + }, isVPCDefaultNetworkACL: { Type: schema.TypeString, Computed: true, @@ -660,7 +723,7 @@ func ResourceIBMISVPCValidator() *validate.ResourceValidator { return &ibmISVPCResourceValidator } -func resourceIBMISVPCCreate(d *schema.ResourceData, meta interface{}) error { +func resourceIBMISVPCCreate(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { log.Printf("[DEBUG] VPC create") name := d.Get(isVPCName).(string) @@ -680,9 +743,9 @@ func resourceIBMISVPCCreate(d *schema.ResourceData, meta interface{}) error { } err := vpcCreate(d, meta, name, apm, rg, isClassic) if err != nil { - return err + return diag.FromErr(err) } - return resourceIBMISVPCRead(d, meta) + return resourceIBMISVPCRead(context, d, meta) } func vpcCreate(d *schema.ResourceData, meta interface{}, name, apm, rg string, isClassic bool) error { @@ -911,19 +974,19 @@ func isVPCRefreshFunc(vpc *vpcv1.VpcV1, id string) resource.StateRefreshFunc { } } -func resourceIBMISVPCRead(d *schema.ResourceData, meta interface{}) error { +func resourceIBMISVPCRead(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { id := d.Id() - err := vpcGet(d, meta, id) + err := vpcGet(context, d, meta, id) if err != nil { return err } return nil } -func vpcGet(d *schema.ResourceData, meta interface{}, id string) error { +func vpcGet(context context.Context, d *schema.ResourceData, meta interface{}, id string) diag.Diagnostics { sess, err := vpcClient(meta) if err != nil { - return err + return diag.FromErr(err) } getvpcOptions := &vpcv1.GetVPCOptions{ ID: &id, @@ -934,9 +997,16 @@ func vpcGet(d *schema.ResourceData, meta interface{}, id string) error { d.SetId("") return nil } - return fmt.Errorf("[ERROR] Error getting VPC : %s\n%s", err, response) + return diag.FromErr(fmt.Errorf("[ERROR] Error getting VPC : %s\n%s", err, response)) + } + addressPrefixes, diagError := GetAddressPrefixPaginatedList(context, sess, d.Id()) + if diagError != nil { + return diagError + } + err = d.Set("address_prefixes", dataSourceAddressPrefixCollectionFlattenAddressPrefixes(addressPrefixes)) + if err != nil { + return diag.FromErr(fmt.Errorf("[ERROR] Error setting address_prefixes %s", err)) } - d.Set(isVPCName, *vpc.Name) d.Set(isVPCClassicAccess, *vpc.ClassicAccess) d.Set(isVPCStatus, *vpc.Status) @@ -968,17 +1038,17 @@ func vpcGet(d *schema.ResourceData, meta interface{}, id string) error { for _, modelItem := range vpc.HealthReasons { modelMap, err := dataSourceIBMIsVPCVPCHealthReasonToMap(&modelItem) if err != nil { - return err + return diag.FromErr(err) } healthReasons = append(healthReasons, modelMap) } } if err = d.Set("health_reasons", healthReasons); err != nil { - return fmt.Errorf("[ERROR] Error setting health_reasons %s", err) + return diag.FromErr(fmt.Errorf("[ERROR] Error setting health_reasons %s", err)) } if err = d.Set("health_state", vpc.HealthState); err != nil { - return fmt.Errorf("[ERROR] Error setting health_state: %s", err) + return diag.FromErr(fmt.Errorf("[ERROR] Error setting health_state: %s", err)) } if !core.IsNil(vpc.Dns) { vpcCrn := d.Get("dns.0.resolver.0.vpc_crn").(string) @@ -986,7 +1056,7 @@ func vpcGet(d *schema.ResourceData, meta interface{}, id string) error { dnsMap, err := resourceIBMIsVPCVpcdnsToMap(vpc.Dns, vpcId, vpcCrn) if err != nil { - return err + return diag.FromErr(err) } resolverMapArray := dnsMap["resolver"].([]map[string]interface{}) resolverMap := resolverMapArray[0] @@ -1000,13 +1070,13 @@ func vpcGet(d *schema.ResourceData, meta interface{}, id string) error { pager, err := sess.NewVPCDnsResolutionBindingsPager(listVPCDnsResolutionBindingOptions) if err != nil { - return fmt.Errorf("[ERROR] Error getting VPC dns bindings: %s", err) + return diag.FromErr(fmt.Errorf("[ERROR] Error getting VPC dns bindings: %s", err)) } var allResults []vpcv1.VpcdnsResolutionBinding for pager.HasNext() { nextPage, err := pager.GetNext() if err != nil { - return fmt.Errorf("[ERROR] Error getting VPC dns bindings pager next: %s", err) + return diag.FromErr(fmt.Errorf("[ERROR] Error getting VPC dns bindings pager next: %s", err)) } allResults = append(allResults, nextPage...) } @@ -1021,7 +1091,7 @@ func vpcGet(d *schema.ResourceData, meta interface{}, id string) error { } } if err = d.Set(isVPCDns, []map[string]interface{}{dnsMap}); err != nil { - return fmt.Errorf("[ERROR] Error setting dns: %s", err) + return diag.FromErr(fmt.Errorf("[ERROR] Error setting dns: %s", err)) } } tags, err := flex.GetGlobalTagsUsingCRN(meta, *vpc.CRN, "", isVPCUserTagType) @@ -1038,7 +1108,7 @@ func vpcGet(d *schema.ResourceData, meta interface{}, id string) error { d.Set(isVPCAccessTags, accesstags) controller, err := flex.GetBaseController(meta) if err != nil { - return err + return diag.FromErr(err) } d.Set(isVPCCRN, *vpc.CRN) @@ -1073,7 +1143,7 @@ func vpcGet(d *schema.ResourceData, meta interface{}, id string) error { } s, response, err := sess.ListSubnets(options) if err != nil { - return fmt.Errorf("[ERROR] Error Fetching subnets %s\n%s", err, response) + return diag.FromErr(fmt.Errorf("[ERROR] Error Fetching subnets %s\n%s", err, response)) } start = flex.GetNext(s.Next) allrecs = append(allrecs, s.Subnets...) @@ -1104,7 +1174,7 @@ func vpcGet(d *schema.ResourceData, meta interface{}, id string) error { } sgs, _, err := sess.ListSecurityGroups(listSgOptions) if err != nil { - return err + return diag.FromErr(err) } securityGroupList := make([]map[string]interface{}, 0) @@ -1219,7 +1289,7 @@ func vpcGet(d *schema.ResourceData, meta interface{}, id string) error { return nil } -func resourceIBMISVPCUpdate(d *schema.ResourceData, meta interface{}) error { +func resourceIBMISVPCUpdate(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { id := d.Id() name := "" @@ -1231,9 +1301,9 @@ func resourceIBMISVPCUpdate(d *schema.ResourceData, meta interface{}) error { } err := vpcUpdate(d, meta, id, name, hasChanged) if err != nil { - return err + return diag.FromErr(err) } - return resourceIBMISVPCRead(d, meta) + return resourceIBMISVPCRead(context, d, meta) } func vpcUpdate(d *schema.ResourceData, meta interface{}, id, name string, hasChanged bool) error { @@ -1438,11 +1508,11 @@ func vpcUpdate(d *schema.ResourceData, meta interface{}, id, name string, hasCha return nil } -func resourceIBMISVPCDelete(d *schema.ResourceData, meta interface{}) error { +func resourceIBMISVPCDelete(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { id := d.Id() err := vpcDelete(d, meta, id) if err != nil { - return err + return diag.FromErr(err) } d.SetId("") return nil diff --git a/website/docs/d/is_vpc.html.markdown b/website/docs/d/is_vpc.html.markdown index 6ca18f4fb2..0e668f4605 100644 --- a/website/docs/d/is_vpc.html.markdown +++ b/website/docs/d/is_vpc.html.markdown @@ -38,6 +38,21 @@ Review the argument references that you can specify for your data source. ## Attribute reference In addition to all argument reference list, you can access the following attribute references after your data source is created. - `access_tags` - (List) Access management tags associated for the volume. +- `address_prefixes` - (List) Collection of the address prefixes. + + Nested `address_prefixes` blocks have the following structure: + - `created_at` - (Timestamp) The date and time that the prefix was created. + - `cidr` - (String) The CIDR block for this prefix. + - `has_subnets` - (String) Indicates whether subnets exist with addresses from this prefix. + - `href` - (String) The URL for this address prefix. + - `id` - (String) The unique identifier for this address prefix. + - `is_default` - (String) Indicates whether this is the default prefix for this zone in this VPC. If a default prefix was automatically created when the VPC was created, the prefix is automatically named using a hyphenated list of randomly-selected words, but may be updated with a user-specified name. + - `name` - (String) The user-defined name for this address prefix. Names must be unique within the VPC the address prefix resides in. + - `zone` - (List) The zone this address prefix resides in. + + Nested `zone` blocks have the following structure: + - `href` - (String) The URL for this zone. + - `name` - (String) The globally unique name for this zone. - `available_ipv4_address_count`- (Integer) The number of IPv4 addresses in the subnet that are available for you to be used. - `classic_access`- (Bool) Indicates whether this VPC is connected to Classic Infrastructure. diff --git a/website/docs/d/is_vpcs.html.markdown b/website/docs/d/is_vpcs.html.markdown index 2455c93b7a..c386a7411c 100644 --- a/website/docs/d/is_vpcs.html.markdown +++ b/website/docs/d/is_vpcs.html.markdown @@ -40,6 +40,21 @@ You can access the following attribute references after your data source is crea Nested scheme for `vpcs`: - `access_tags` - (List) Access management tags associated for the volume. + - `address_prefixes` - (List) Collection of the address prefixes. + + Nested `address_prefixes` blocks have the following structure: + - `created_at` - (Timestamp) The date and time that the prefix was created. + - `cidr` - (String) The CIDR block for this prefix. + - `has_subnets` - (String) Indicates whether subnets exist with addresses from this prefix. + - `href` - (String) The URL for this address prefix. + - `id` - (String) The unique identifier for this address prefix. + - `is_default` - (String) Indicates whether this is the default prefix for this zone in this VPC. If a default prefix was automatically created when the VPC was created, the prefix is automatically named using a hyphenated list of randomly-selected words, but may be updated with a user-specified name. + - `name` - (String) The user-defined name for this address prefix. Names must be unique within the VPC the address prefix resides in. + - `zone` - (List) The zone this address prefix resides in. + + Nested `zone` blocks have the following structure: + - `href` - (String) The URL for this zone. + - `name` - (String) The globally unique name for this zone. - `available_ipv4_address_count`- (Integer) The number of IPv4 addresses in the subnet that are available for you to be used. - `classic_access`- (Bool) Indicates whether this VPC is connected to the Classic Infrastructure. diff --git a/website/docs/r/is_vpc.html.markdown b/website/docs/r/is_vpc.html.markdown index a3d68f424f..b10cdba1a8 100644 --- a/website/docs/r/is_vpc.html.markdown +++ b/website/docs/r/is_vpc.html.markdown @@ -182,6 +182,21 @@ Review the argument references that you can specify for your resource. ## Attribute reference In addition to all argument reference list, you can access the following attribute reference after your resource is created. +- `address_prefixes` - (List) Collection of the address prefixes. + + Nested `address_prefixes` blocks have the following structure: + - `created_at` - (Timestamp) The date and time that the prefix was created. + - `cidr` - (String) The CIDR block for this prefix. + - `has_subnets` - (String) Indicates whether subnets exist with addresses from this prefix. + - `href` - (String) The URL for this address prefix. + - `id` - (String) The unique identifier for this address prefix. + - `is_default` - (String) Indicates whether this is the default prefix for this zone in this VPC. If a default prefix was automatically created when the VPC was created, the prefix is automatically named using a hyphenated list of randomly-selected words, but may be updated with a user-specified name. + - `name` - (String) The user-defined name for this address prefix. Names must be unique within the VPC the address prefix resides in. + - `zone` - (List) The zone this address prefix resides in. + + Nested `zone` blocks have the following structure: + - `href` - (String) The URL for this zone. + - `name` - (String) The globally unique name for this zone. - `crn` - (String) The CRN of the VPC. - `cse_source_addresses`- (List) A list of the cloud service endpoints that are associated with your VPC, including their source IP address and zone. - `address` - (String) The IP address of the cloud service endpoint.