Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
106 changes: 90 additions & 16 deletions ibm/service/vpc/data_source_ibm_is_vpc.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
package vpc

import (
"context"
"fmt"
"log"
"reflect"
Expand All @@ -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,
Expand Down Expand Up @@ -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
Expand All @@ -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{}
Expand All @@ -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)
}
}
}
Expand All @@ -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)
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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...)
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
26 changes: 16 additions & 10 deletions ibm/service/vpc/data_source_ibm_is_vpc_address_prefixes.go
Original file line number Diff line number Diff line change
Expand Up @@ -98,35 +98,41 @@ 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
}
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...)
if start == "" {
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
Expand Down
2 changes: 2 additions & 0 deletions ibm/service/vpc/data_source_ibm_is_vpc_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"),
),
},
},
Expand Down
68 changes: 68 additions & 0 deletions ibm/service/vpc/data_source_ibm_is_vpcs.go
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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
Expand Down
Loading
Loading