Skip to content

Commit a4dbb01

Browse files
authored
enhancement: improved error handling for vpc subnets (IBM-Cloud#6177)
* enhancement: improved error handling for vpc subnets * resolved review comments
1 parent d8e7dc8 commit a4dbb01

10 files changed

+1016
-370
lines changed

ibm/service/vpc/data_source_ibm_is_subnet.go

Lines changed: 86 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,20 @@
44
package vpc
55

66
import (
7+
"context"
78
"fmt"
89
"log"
910

1011
"github.com/IBM-Cloud/terraform-provider-ibm/ibm/flex"
1112
"github.com/IBM-Cloud/terraform-provider-ibm/ibm/validate"
1213
"github.com/IBM/vpc-go-sdk/vpcv1"
14+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
1315
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
1416
)
1517

1618
func DataSourceIBMISSubnet() *schema.Resource {
1719
return &schema.Resource{
18-
Read: dataSourceIBMISSubnetRead,
20+
ReadContext: dataSourceIBMISSubnetRead,
1921

2022
Schema: map[string]*schema.Schema{
2123

@@ -208,28 +210,32 @@ func DataSourceIBMISSubnetValidator() *validate.ResourceValidator {
208210
return &ibmISSubnetDataSourceValidator
209211
}
210212

211-
func dataSourceIBMISSubnetRead(d *schema.ResourceData, meta interface{}) error {
212-
err := subnetGetByNameOrID(d, meta)
213+
func dataSourceIBMISSubnetRead(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
214+
err := subnetGetByNameOrID(context, d, meta)
213215
if err != nil {
214216
return err
215217
}
216218
return nil
217219
}
218220

219-
func subnetGetByNameOrID(d *schema.ResourceData, meta interface{}) error {
221+
func subnetGetByNameOrID(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
220222
sess, err := vpcClient(meta)
221223
if err != nil {
222-
return err
224+
tfErr := flex.DiscriminatedTerraformErrorf(err, err.Error(), "(Data) ibm_is_subnet", "read", "initialize-client")
225+
log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage())
226+
return tfErr.GetDiag()
223227
}
224228
var subnet *vpcv1.Subnet
225229
if v, ok := d.GetOk("identifier"); ok {
226230
id := v.(string)
227231
getSubnetOptions := &vpcv1.GetSubnetOptions{
228232
ID: &id,
229233
}
230-
subnetinfo, response, err := sess.GetSubnet(getSubnetOptions)
234+
subnetinfo, _, err := sess.GetSubnetWithContext(context, getSubnetOptions)
231235
if err != nil {
232-
return fmt.Errorf("[ERROR] Error Getting Subnet (%s): %s\n%s", id, err, response)
236+
tfErr := flex.TerraformErrorf(err, fmt.Sprintf("GetSubnetWithContext failed: %s", err.Error()), "(Data) ibm_is_subnet", "read")
237+
log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage())
238+
return tfErr.GetDiag()
233239
}
234240
subnet = subnetinfo
235241
} else if v, ok := d.GetOk(isSubnetName); ok {
@@ -245,9 +251,11 @@ func subnetGetByNameOrID(d *schema.ResourceData, meta interface{}) error {
245251
vpcIDOk := vpcIdOk.(string)
246252
getSubnetsListOptions.VPCID = &vpcIDOk
247253
}
248-
subnetsCollection, response, err := sess.ListSubnets(getSubnetsListOptions)
254+
subnetsCollection, _, err := sess.ListSubnetsWithContext(context, getSubnetsListOptions)
249255
if err != nil {
250-
return fmt.Errorf("[ERROR] Error Fetching subnets List %s\n%s", err, response)
256+
tfErr := flex.TerraformErrorf(err, fmt.Sprintf("ListSubnetsWithContext failed: %s", err.Error()), "(Data) ibm_is_subnet", "read")
257+
log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage())
258+
return tfErr.GetDiag()
251259
}
252260
start = flex.GetNext(subnetsCollection.Next)
253261
allrecs = append(allrecs, subnetsCollection.Subnets...)
@@ -263,7 +271,10 @@ func subnetGetByNameOrID(d *schema.ResourceData, meta interface{}) error {
263271
}
264272
}
265273
if subnet == nil {
266-
return fmt.Errorf("[ERROR] No subnet found with name (%s)", name)
274+
err = fmt.Errorf("[ERROR] No subnet found with name (%s)", name)
275+
tfErr := flex.TerraformErrorf(err, fmt.Sprintf("ListSubnetsWithContext failed: %s", err.Error()), "(Data) ibm_is_subnet", "read")
276+
log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage())
277+
return tfErr.GetDiag()
267278
}
268279
}
269280

@@ -272,29 +283,55 @@ func subnetGetByNameOrID(d *schema.ResourceData, meta interface{}) error {
272283
if subnet.RoutingTable != nil {
273284
err = d.Set("routing_table", dataSourceSubnetFlattenroutingTable(*subnet.RoutingTable))
274285
if err != nil {
275-
return fmt.Errorf("Error setting routing_table %s", err)
286+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting available_ipv4_address_count: %s", err), "(Data) ibm_is_subnet", "read", "set-routing_table").GetDiag()
276287
}
277288
}
278-
d.Set(isSubnetName, *subnet.Name)
279-
d.Set(isSubnetIpv4CidrBlock, *subnet.Ipv4CIDRBlock)
280-
d.Set(isSubnetAvailableIpv4AddressCount, *subnet.AvailableIpv4AddressCount)
281-
d.Set(isSubnetTotalIpv4AddressCount, *subnet.TotalIpv4AddressCount)
289+
if err = d.Set("name", subnet.Name); err != nil {
290+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting name: %s", err), "(Data) ibm_is_subnet", "read", "set-name").GetDiag()
291+
}
292+
if err = d.Set("ipv4_cidr_block", subnet.Ipv4CIDRBlock); err != nil {
293+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting ipv4_cidr_block: %s", err), "(Data) ibm_is_subnet", "read", "set-ipv4_cidr_block").GetDiag()
294+
}
295+
if err = d.Set("available_ipv4_address_count", flex.IntValue(subnet.AvailableIpv4AddressCount)); err != nil {
296+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting available_ipv4_address_count: %s", err), "(Data) ibm_is_subnet", "read", "set-available_ipv4_address_count").GetDiag()
297+
}
298+
if err = d.Set("total_ipv4_address_count", flex.IntValue(subnet.TotalIpv4AddressCount)); err != nil {
299+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting total_ipv4_address_count: %s", err), "(Data) ibm_is_subnet", "read", "set-total_ipv4_address_count").GetDiag()
300+
}
282301
if subnet.NetworkACL != nil {
283-
d.Set(isSubnetNetworkACL, *subnet.NetworkACL.ID)
302+
if err = d.Set(isSubnetNetworkACL, *subnet.NetworkACL.ID); err != nil {
303+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting network_acl: %s", err), "(Data) ibm_is_subnet", "read", "set-network_acl").GetDiag()
304+
}
284305
}
285306
if subnet.PublicGateway != nil {
286-
d.Set(isSubnetPublicGateway, *subnet.PublicGateway.ID)
307+
if err = d.Set(isSubnetPublicGateway, *subnet.PublicGateway.ID); err != nil {
308+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting public_gateway: %s", err), "(Data) ibm_is_subnet", "read", "set-public_gateway").GetDiag()
309+
}
287310
} else {
288311
d.Set(isSubnetPublicGateway, nil)
289312
}
290-
d.Set(isSubnetStatus, *subnet.Status)
291-
d.Set(isSubnetZone, *subnet.Zone.Name)
292-
d.Set(isSubnetVPC, *subnet.VPC.ID)
293-
d.Set(isSubnetVPCName, *subnet.VPC.Name)
313+
if err = d.Set("status", subnet.Status); err != nil {
314+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting status: %s", err), "(Data) ibm_is_subnet", "read", "set-status").GetDiag()
315+
}
316+
if subnet.Zone != nil {
317+
if err = d.Set(isSubnetZone, *subnet.Zone.Name); err != nil {
318+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting zone: %s", err), "(Data) ibm_is_subnet", "read", "set-zone").GetDiag()
319+
}
320+
}
321+
if subnet.VPC != nil {
322+
if err = d.Set(isSubnetVPC, *subnet.VPC.ID); err != nil {
323+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting vpc: %s", err), "(Data) ibm_is_subnet", "read", "set-vpc").GetDiag()
324+
}
325+
if err = d.Set(isSubnetVPCName, *subnet.VPC.Name); err != nil {
326+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting vpc_name: %s", err), "(Data) ibm_is_subnet", "read", "set-vpc_name").GetDiag()
327+
}
328+
}
294329

295330
controller, err := flex.GetBaseController(meta)
296331
if err != nil {
297-
return err
332+
tfErr := flex.TerraformErrorf(err, fmt.Sprintf("GetBaseController failed: %s", err.Error()), "(Data) ibm_is_subnet", "read")
333+
log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage())
334+
return tfErr.GetDiag()
298335
}
299336

300337
tags, err := flex.GetGlobalTagsUsingCRN(meta, *subnet.CRN, "", isUserTagType)
@@ -308,17 +345,34 @@ func subnetGetByNameOrID(d *schema.ResourceData, meta interface{}) error {
308345
log.Printf(
309346
"Error on get of resource subnet (%s) access tags: %s", d.Id(), err)
310347
}
311-
312-
d.Set(isSubnetTags, tags)
313-
d.Set(isSubnetAccessTags, accesstags)
314-
d.Set(isSubnetCRN, *subnet.CRN)
315-
d.Set(flex.ResourceControllerURL, controller+"/vpc-ext/network/subnets")
316-
d.Set(flex.ResourceName, *subnet.Name)
317-
d.Set(flex.ResourceCRN, *subnet.CRN)
318-
d.Set(flex.ResourceStatus, *subnet.Status)
348+
if err = d.Set(isSubnetTags, tags); err != nil {
349+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting tags: %s", err), "(Data) ibm_is_subnet", "read", "set-tags").GetDiag()
350+
}
351+
if err = d.Set(isSubnetAccessTags, accesstags); err != nil {
352+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting access_tags: %s", err), "(Data) ibm_is_subnet", "read", "set-access_tags").GetDiag()
353+
}
354+
if err = d.Set("crn", subnet.CRN); err != nil {
355+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting crn: %s", err), "(Data) ibm_is_subnet", "read", "set-crn").GetDiag()
356+
}
357+
if err = d.Set(flex.ResourceControllerURL, controller+"/vpc-ext/network/subnets"); err != nil {
358+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting resource_controller_url: %s", err), "(Data) ibm_is_subnet", "read", "set-resource_controller_url").GetDiag()
359+
}
360+
if err = d.Set(flex.ResourceName, *subnet.Name); err != nil {
361+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting resource_name: %s", err), "(Data) ibm_is_subnet", "read", "set-resource_name").GetDiag()
362+
}
363+
if err = d.Set(flex.ResourceCRN, *subnet.CRN); err != nil {
364+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting resource_crn: %s", err), "(Data) ibm_is_subnet", "read", "set-resource_crn").GetDiag()
365+
}
366+
if err = d.Set(flex.ResourceStatus, *subnet.Status); err != nil {
367+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting resource_status: %s", err), "(Data) ibm_is_subnet", "read", "set-resource_status").GetDiag()
368+
}
319369
if subnet.ResourceGroup != nil {
320-
d.Set(isSubnetResourceGroup, *subnet.ResourceGroup.ID)
321-
d.Set(flex.ResourceGroupName, *subnet.ResourceGroup.Name)
370+
if err = d.Set(isSubnetResourceGroup, *subnet.ResourceGroup.ID); err != nil {
371+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting resource_group: %s", err), "(Data) ibm_is_subnet", "read", "set-resource_group").GetDiag()
372+
}
373+
if err = d.Set(flex.ResourceGroupName, *subnet.ResourceGroup.Name); err != nil {
374+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting resource_group_name: %s", err), "(Data) ibm_is_subnet", "read", "set-resource_group_name").GetDiag()
375+
}
322376
}
323377
return nil
324378
}

ibm/service/vpc/data_source_ibm_is_subnet_reserved_ip.go

Lines changed: 54 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,12 @@
44
package vpc
55

66
import (
7+
"context"
78
"fmt"
9+
"log"
810

11+
"github.com/IBM-Cloud/terraform-provider-ibm/ibm/flex"
12+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
913
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
1014
)
1115

@@ -27,7 +31,7 @@ const (
2731

2832
func DataSourceIBMISReservedIP() *schema.Resource {
2933
return &schema.Resource{
30-
Read: dataSdataSourceIBMISReservedIPRead,
34+
ReadContext: dataSdataSourceIBMISReservedIPRead,
3135
Schema: map[string]*schema.Schema{
3236
/*
3337
Request Parameters
@@ -155,46 +159,74 @@ func DataSourceIBMISReservedIP() *schema.Resource {
155159
}
156160

157161
// dataSdataSourceIBMISReservedIPRead is used when the reserved IPs are read from the vpc
158-
func dataSdataSourceIBMISReservedIPRead(d *schema.ResourceData, meta interface{}) error {
162+
func dataSdataSourceIBMISReservedIPRead(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
159163

160164
sess, err := vpcClient(meta)
161165
if err != nil {
162-
return err
166+
tfErr := flex.DiscriminatedTerraformErrorf(err, err.Error(), "(Data) ibm_is_subnet_reserved_ip", "read", "initialize-client")
167+
log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage())
168+
return tfErr.GetDiag()
163169
}
164170

165171
subnetID := d.Get(isSubNetID).(string)
166172
reservedIPID := d.Get(isReservedIPID).(string)
167173

168174
options := sess.NewGetSubnetReservedIPOptions(subnetID, reservedIPID)
169-
reserveIP, response, err := sess.GetSubnetReservedIP(options)
175+
reservedIP, response, err := sess.GetSubnetReservedIPWithContext(context, options)
170176

171-
if err != nil || response == nil || reserveIP == nil {
172-
return fmt.Errorf("[ERROR] Error fetching the reserved IP %s\n%s", err, response)
177+
if err != nil || response == nil || reservedIP == nil {
178+
tfErr := flex.TerraformErrorf(err, fmt.Sprintf("GetSubnetReservedIPWithContext failed: %s", err.Error()), "(Data) ibm_is_subnet_reserved_ip", "read")
179+
log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage())
180+
return tfErr.GetDiag()
173181
}
174182

175-
d.SetId(*reserveIP.ID)
176-
d.Set(isReservedIPAutoDelete, *reserveIP.AutoDelete)
177-
d.Set(isReservedIPAddress, *reserveIP.Address)
178-
d.Set(isReservedIPCreatedAt, (*reserveIP.CreatedAt).String())
179-
d.Set(isReservedIPhref, *reserveIP.Href)
180-
d.Set(isReservedIPName, *reserveIP.Name)
181-
d.Set(isReservedIPOwner, *reserveIP.Owner)
182-
if reserveIP.LifecycleState != nil {
183-
d.Set(isReservedIPLifecycleState, *reserveIP.LifecycleState)
183+
d.SetId(*reservedIP.ID)
184+
if err = d.Set("auto_delete", reservedIP.AutoDelete); err != nil {
185+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting auto_delete: %s", err), "(Data) ibm_is_subnet_reserved_ip", "read", "set-auto_delete").GetDiag()
186+
}
187+
if err = d.Set("address", reservedIP.Address); err != nil {
188+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting address: %s", err), "(Data) ibm_is_subnet_reserved_ip", "read", "set-address").GetDiag()
189+
}
190+
if err = d.Set("created_at", flex.DateTimeToString(reservedIP.CreatedAt)); err != nil {
191+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting created_at: %s", err), "(Data) ibm_is_subnet_reserved_ip", "read", "set-created_at").GetDiag()
192+
}
193+
if err = d.Set("href", reservedIP.Href); err != nil {
194+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting href: %s", err), "(Data) ibm_is_subnet_reserved_ip", "read", "set-href").GetDiag()
195+
}
196+
if err = d.Set("name", reservedIP.Name); err != nil {
197+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting name: %s", err), "(Data) ibm_is_subnet_reserved_ip", "read", "set-name").GetDiag()
198+
}
199+
if err = d.Set("owner", reservedIP.Owner); err != nil {
200+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting owner: %s", err), "(Data) ibm_is_subnet_reserved_ip", "read", "set-owner").GetDiag()
201+
}
202+
if reservedIP.LifecycleState != nil {
203+
if err = d.Set("lifecycle_state", reservedIP.LifecycleState); err != nil {
204+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting lifecycle_state: %s", err), "(Data) ibm_is_subnet_reserved_ip", "read", "set-lifecycle_state").GetDiag()
205+
}
206+
}
207+
if err = d.Set("resource_type", reservedIP.ResourceType); err != nil {
208+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting resource_type: %s", err), "(Data) ibm_is_subnet_reserved_ip", "read", "set-resource_type").GetDiag()
184209
}
185-
d.Set(isReservedIPType, *reserveIP.ResourceType)
186210
target := []map[string]interface{}{}
187-
if reserveIP.Target != nil {
188-
modelMap, err := dataSourceIBMIsReservedIPReservedIPTargetToMap(reserveIP.Target)
211+
if reservedIP.Target != nil {
212+
modelMap, err := dataSourceIBMIsReservedIPReservedIPTargetToMap(reservedIP.Target)
189213
if err != nil {
190-
return err
214+
return flex.DiscriminatedTerraformErrorf(err, err.Error(), "(Data) ibm_is_subnet_reserved_ip", "read", "target_reference-to-map").GetDiag()
191215
}
192216
target = append(target, modelMap)
193217
}
194-
d.Set("target_reference", target)
218+
if err = d.Set("target_reference", target); err != nil {
219+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting target_reference: %s", err), "(Data) ibm_is_subnet_reserved_ip", "read", "set-target_reference").GetDiag()
220+
}
195221
if len(target) > 0 {
196-
d.Set(isReservedIPTarget, target[0]["id"])
197-
d.Set(isReservedIPTargetCrn, target[0]["crn"])
222+
223+
if err = d.Set(isReservedIPTarget, target[0]["id"]); err != nil {
224+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting target: %s", err), "(Data) ibm_is_subnet_reserved_ip", "read", "set-target").GetDiag()
225+
}
226+
227+
if err = d.Set(isReservedIPTargetCrn, target[0]["crn"]); err != nil {
228+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting target_crn: %s", err), "(Data) ibm_is_subnet_reserved_ip", "read", "set-target_crn").GetDiag()
229+
}
198230
}
199231
return nil // By default there should be no error
200232
}

0 commit comments

Comments
 (0)