Skip to content

Commit 9352c93

Browse files
authored
enhancement: improved error handling for vpc images (IBM-Cloud#6151)
1 parent dad556a commit 9352c93

File tree

6 files changed

+499
-227
lines changed

6 files changed

+499
-227
lines changed

ibm/service/vpc/data_source_ibm_is_image.go

Lines changed: 128 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,15 @@
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"
13+
"github.com/IBM/go-sdk-core/v5/core"
1214
"github.com/IBM/vpc-go-sdk/vpcv1"
15+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
1316
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
1417
)
1518

@@ -24,7 +27,7 @@ const (
2427

2528
func DataSourceIBMISImage() *schema.Resource {
2629
return &schema.Resource{
27-
Read: dataSourceIBMISImageRead,
30+
ReadContext: dataSourceIBMISImageRead,
2831

2932
Schema: map[string]*schema.Schema{
3033

@@ -266,7 +269,7 @@ func DataSourceIBMISImage() *schema.Resource {
266269
}
267270
}
268271

269-
func dataSourceIBMISImageRead(d *schema.ResourceData, meta interface{}) error {
272+
func dataSourceIBMISImageRead(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
270273

271274
name := d.Get("name").(string)
272275
identifier := d.Get("identifier").(string)
@@ -275,12 +278,12 @@ func dataSourceIBMISImageRead(d *schema.ResourceData, meta interface{}) error {
275278
visibility = v.(string)
276279
}
277280
if name != "" {
278-
err := imageGetByName(d, meta, name, visibility)
281+
err := imageGetByName(context, d, meta, name, visibility)
279282
if err != nil {
280283
return err
281284
}
282285
} else if identifier != "" {
283-
err := imageGetById(d, meta, identifier)
286+
err := imageGetById(context, d, meta, identifier)
284287
if err != nil {
285288
return err
286289
}
@@ -289,10 +292,12 @@ func dataSourceIBMISImageRead(d *schema.ResourceData, meta interface{}) error {
289292
return nil
290293
}
291294

292-
func imageGetByName(d *schema.ResourceData, meta interface{}, name, visibility string) error {
295+
func imageGetByName(context context.Context, d *schema.ResourceData, meta interface{}, name, visibility string) diag.Diagnostics {
293296
sess, err := vpcClient(meta)
294297
if err != nil {
295-
return err
298+
tfErr := flex.DiscriminatedTerraformErrorf(err, err.Error(), "(Data) ibm_is_image", "read", "initialize-client")
299+
log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage())
300+
return tfErr.GetDiag()
296301
}
297302
listImagesOptions := &vpcv1.ListImagesOptions{
298303
Name: &name,
@@ -301,137 +306,208 @@ func imageGetByName(d *schema.ResourceData, meta interface{}, name, visibility s
301306
if visibility != "" {
302307
listImagesOptions.Visibility = &visibility
303308
}
304-
availableImages, response, err := sess.ListImages(listImagesOptions)
309+
availableImages, _, err := sess.ListImagesWithContext(context, listImagesOptions)
305310
if err != nil {
306-
return fmt.Errorf("[ERROR] Error Fetching Images %s\n%s", err, response)
311+
tfErr := flex.TerraformErrorf(err, fmt.Sprintf("ListImagesWithContext failed: %s", err.Error()), "(Data) ibm_is_image", "read")
312+
log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage())
313+
return tfErr.GetDiag()
307314
}
308315
allrecs := availableImages.Images
309316

310317
if len(allrecs) == 0 {
311-
return fmt.Errorf("[ERROR] No image found with name %s", name)
318+
tfErr := flex.TerraformErrorf(err, fmt.Sprintf("No image found with name: %s", name), "(Data) ibm_is_image", "read")
319+
log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage())
320+
return tfErr.GetDiag()
312321
}
313322
image := allrecs[0]
314323
d.SetId(*image.ID)
315-
d.Set(isImageUserDataFormat, *image.UserDataFormat)
316-
d.Set("status", *image.Status)
324+
if err = d.Set("user_data_format", image.UserDataFormat); err != nil {
325+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting user_data_format: %s", err), "(Data) ibm_is_image", "read", "set-user_data_format").GetDiag()
326+
}
327+
if err = d.Set("status", image.Status); err != nil {
328+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting status: %s", err), "(Data) ibm_is_image", "read", "set-status").GetDiag()
329+
}
317330
if *image.Status == "deprecated" {
318331
fmt.Printf("[WARN] Given image %s is deprecated and soon will be obsolete.", name)
319332
}
320333
if len(image.StatusReasons) > 0 {
321-
d.Set("status_reasons", dataSourceIBMIsImageFlattenStatusReasons(image.StatusReasons))
334+
if err = d.Set("status_reasons", dataSourceIBMIsImageFlattenStatusReasons(image.StatusReasons)); err != nil {
335+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting status_reasons: %s", err), "(Data) ibm_is_image", "read", "set-status_reasons").GetDiag()
336+
}
337+
}
338+
if err = d.Set("name", image.Name); err != nil {
339+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting name: %s", err), "(Data) ibm_is_image", "read", "set-name").GetDiag()
322340
}
323-
d.Set("name", *image.Name)
324341
accesstags, err := flex.GetGlobalTagsUsingCRN(meta, *image.CRN, "", isImageAccessTagType)
325342
if err != nil {
326343
log.Printf(
327344
"Error on get of resource image (%s) access tags: %s", d.Id(), err)
328345
}
329-
d.Set(isImageAccessTags, accesstags)
330-
d.Set("visibility", *image.Visibility)
346+
if err = d.Set("access_tags", accesstags); err != nil {
347+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting access_tags: %s", err), "(Data) ibm_is_image", "read", "set-access_tags").GetDiag()
348+
}
349+
if err = d.Set("visibility", image.Visibility); err != nil {
350+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting visibility: %s", err), "(Data) ibm_is_image", "read", "set-visibility").GetDiag()
351+
}
331352

332353
if image.OperatingSystem != nil {
333354
operatingSystemList := []map[string]interface{}{}
334355
operatingSystemMap := dataSourceIBMISImageOperatingSystemToMap(*image.OperatingSystem)
335356
operatingSystemList = append(operatingSystemList, operatingSystemMap)
336-
d.Set("operating_system", operatingSystemList)
357+
if err = d.Set("operating_system", operatingSystemList); err != nil {
358+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting operating_system: %s", err), "(Data) ibm_is_image", "read", "set-operating_system").GetDiag()
359+
}
337360
}
338361
if image.ResourceGroup != nil {
339362
resourceGroupList := []map[string]interface{}{}
340363
resourceGroupMap := dataSourceImageResourceGroupToMap(*image.ResourceGroup)
341364
resourceGroupList = append(resourceGroupList, resourceGroupMap)
342-
d.Set("resource_group", resourceGroupList)
365+
if err = d.Set("resource_group", resourceGroupList); err != nil {
366+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting resource_group: %s", err), "(Data) ibm_is_image", "read", "set-resource_group").GetDiag()
367+
}
343368
}
344-
d.Set("os", *image.OperatingSystem.Name)
345-
d.Set("architecture", *image.OperatingSystem.Architecture)
346-
d.Set("crn", *image.CRN)
347-
if image.Encryption != nil {
348-
d.Set("encryption", *image.Encryption)
369+
if err = d.Set("os", image.OperatingSystem.Name); err != nil {
370+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting os: %s", err), "(Data) ibm_is_image", "read", "set-os").GetDiag()
371+
}
372+
if err = d.Set("architecture", image.OperatingSystem.Architecture); err != nil {
373+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting architecture: %s", err), "(Data) ibm_is_image", "read", "set-architecture").GetDiag()
374+
}
375+
if err = d.Set("crn", image.CRN); err != nil {
376+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting crn: %s", err), "(Data) ibm_is_image", "read", "set-crn").GetDiag()
377+
}
378+
if err = d.Set("encryption", image.Encryption); err != nil {
379+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting encryption: %s", err), "(Data) ibm_is_image", "read", "set-encryption").GetDiag()
349380
}
350381
if image.EncryptionKey != nil {
351-
d.Set("encryption_key", *image.EncryptionKey.CRN)
382+
if err = d.Set("encryption_key", *image.EncryptionKey.CRN); err != nil {
383+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting encryption_key: %s", err), "(Data) ibm_is_image", "read", "set-encryption_key").GetDiag()
384+
}
352385
}
353386
if image.File != nil && image.File.Checksums != nil {
354-
d.Set(isImageCheckSum, *image.File.Checksums.Sha256)
387+
if err = d.Set("checksum", *image.File.Checksums.Sha256); err != nil {
388+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting checksum: %s", err), "(Data) ibm_is_image", "read", "set-checksum").GetDiag()
389+
}
355390
}
356391
if image.SourceVolume != nil {
357-
d.Set("source_volume", *image.SourceVolume.ID)
392+
if err = d.Set("source_volume", *image.SourceVolume.ID); err != nil {
393+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting source_volume: %s", err), "(Data) ibm_is_image", "read", "set-source_volume").GetDiag()
394+
}
358395
}
359-
if image.CreatedAt != nil {
360-
d.Set(isImageCreatedAt, image.CreatedAt.String())
396+
if err = d.Set("created_at", flex.DateTimeToString(image.CreatedAt)); err != nil {
397+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting created_at: %s", err), "(Data) ibm_is_image", "read", "set-created_at").GetDiag()
361398
}
362-
if image.DeprecationAt != nil {
363-
d.Set(isImageDeprecationAt, image.DeprecationAt.String())
399+
if !core.IsNil(image.DeprecationAt) {
400+
if err = d.Set("deprecation_at", flex.DateTimeToString(image.DeprecationAt)); err != nil {
401+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting deprecation_at: %s", err), "(Data) ibm_is_image", "read", "set-deprecation_at").GetDiag()
402+
}
364403
}
365-
if image.ObsolescenceAt != nil {
366-
d.Set(isImageObsolescenceAt, image.ObsolescenceAt.String())
404+
if !core.IsNil(image.ObsolescenceAt) {
405+
if err = d.Set("obsolescence_at", flex.DateTimeToString(image.ObsolescenceAt)); err != nil {
406+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting obsolescence_at: %s", err), "(Data) ibm_is_image", "read", "set-obsolescence_at").GetDiag()
407+
}
367408
}
368409
if image.CatalogOffering != nil {
369410
catalogOfferingList := []map[string]interface{}{}
370411
catalogOfferingMap := dataSourceImageCollectionCatalogOfferingToMap(*image.CatalogOffering)
371412
catalogOfferingList = append(catalogOfferingList, catalogOfferingMap)
372-
d.Set(isImageCatalogOffering, catalogOfferingList)
413+
if err = d.Set("catalog_offering", catalogOfferingList); err != nil {
414+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting catalog_offering: %s", err), "(Data) ibm_is_image", "read", "set-catalog_offering").GetDiag()
415+
}
373416
}
374417
return nil
375418

376419
}
377-
func imageGetById(d *schema.ResourceData, meta interface{}, identifier string) error {
420+
func imageGetById(context context.Context, d *schema.ResourceData, meta interface{}, identifier string) diag.Diagnostics {
378421
sess, err := vpcClient(meta)
379422
if err != nil {
380-
return err
423+
tfErr := flex.DiscriminatedTerraformErrorf(err, err.Error(), "(Data) ibm_is_image", "read", "initialize-client")
424+
log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage())
425+
return tfErr.GetDiag()
381426
}
382427

383428
getImageOptions := &vpcv1.GetImageOptions{
384429
ID: &identifier,
385430
}
386431

387-
image, response, err := sess.GetImage(getImageOptions)
432+
image, _, err := sess.GetImageWithContext(context, getImageOptions)
388433
if err != nil {
389-
return fmt.Errorf("[ERROR] Error fetching image with id(%s) %s\n%s", identifier, err, response)
434+
tfErr := flex.TerraformErrorf(err, fmt.Sprintf("GetImageWithContext failed: %s", err.Error()), "(Data) ibm_is_image", "read")
435+
log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage())
436+
return tfErr.GetDiag()
390437
}
391438

392439
d.SetId(*image.ID)
393-
d.Set("status", *image.Status)
440+
if err = d.Set("status", image.Status); err != nil {
441+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting status: %s", err), "(Data) ibm_is_image", "read", "set-status").GetDiag()
442+
}
394443
if *image.Status == "deprecated" {
395444
fmt.Printf("[WARN] Given image %s is deprecated and soon will be obsolete.", name)
396445
}
397446
if len(image.StatusReasons) > 0 {
398-
d.Set("status_reasons", dataSourceIBMIsImageFlattenStatusReasons(image.StatusReasons))
447+
if err = d.Set("status_reasons", dataSourceIBMIsImageFlattenStatusReasons(image.StatusReasons)); err != nil {
448+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting status_reasons: %s", err), "(Data) ibm_is_image", "read", "set-status_reasons").GetDiag()
449+
}
450+
}
451+
if err = d.Set("name", image.Name); err != nil {
452+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting name: %s", err), "(Data) ibm_is_image", "read", "set-name").GetDiag()
453+
}
454+
if err = d.Set("user_data_format", image.UserDataFormat); err != nil {
455+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting user_data_format: %s", err), "(Data) ibm_is_image", "read", "set-user_data_format").GetDiag()
456+
}
457+
if err = d.Set("visibility", image.Visibility); err != nil {
458+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting visibility: %s", err), "(Data) ibm_is_image", "read", "set-visibility").GetDiag()
399459
}
400-
d.Set("name", *image.Name)
401-
d.Set(isImageUserDataFormat, *image.UserDataFormat)
402-
d.Set("visibility", *image.Visibility)
403460
if image.OperatingSystem != nil {
404461
operatingSystemList := []map[string]interface{}{}
405462
operatingSystemMap := dataSourceIBMISImageOperatingSystemToMap(*image.OperatingSystem)
406463
operatingSystemList = append(operatingSystemList, operatingSystemMap)
407-
d.Set("operating_system", operatingSystemList)
464+
if err = d.Set("operating_system", operatingSystemList); err != nil {
465+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting operating_system: %s", err), "(Data) ibm_is_image", "read", "set-operating_system").GetDiag()
466+
}
408467
}
409468
if image.ResourceGroup != nil {
410469
resourceGroupList := []map[string]interface{}{}
411470
resourceGroupMap := dataSourceImageResourceGroupToMap(*image.ResourceGroup)
412471
resourceGroupList = append(resourceGroupList, resourceGroupMap)
413-
d.Set("resource_group", resourceGroupList)
472+
if err = d.Set("resource_group", resourceGroupList); err != nil {
473+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting resource_group: %s", err), "(Data) ibm_is_image", "read", "set-resource_group").GetDiag()
474+
}
414475
}
415-
d.Set("os", *image.OperatingSystem.Name)
416-
d.Set("architecture", *image.OperatingSystem.Architecture)
417-
d.Set("crn", *image.CRN)
418-
if image.Encryption != nil {
419-
d.Set("encryption", *image.Encryption)
476+
if err = d.Set("os", image.OperatingSystem.Name); err != nil {
477+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting os: %s", err), "(Data) ibm_is_image", "read", "set-os").GetDiag()
478+
}
479+
if err = d.Set("architecture", image.OperatingSystem.Architecture); err != nil {
480+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting architecture: %s", err), "(Data) ibm_is_image", "read", "set-architecture").GetDiag()
481+
}
482+
if err = d.Set("crn", image.CRN); err != nil {
483+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting crn: %s", err), "(Data) ibm_is_image", "read", "set-crn").GetDiag()
484+
}
485+
486+
if err = d.Set("encryption", image.Encryption); err != nil {
487+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting encryption: %s", err), "(Data) ibm_is_image", "read", "set-encryption").GetDiag()
420488
}
421489
if image.EncryptionKey != nil {
422-
d.Set("encryption_key", *image.EncryptionKey.CRN)
490+
if err = d.Set("encryption_key", *image.EncryptionKey.CRN); err != nil {
491+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting encryption_key: %s", err), "(Data) ibm_is_image", "read", "set-encryption_key").GetDiag()
492+
}
423493
}
424494
if image.File != nil && image.File.Checksums != nil {
425-
d.Set(isImageCheckSum, *image.File.Checksums.Sha256)
495+
if err = d.Set("checksum", *image.File.Checksums.Sha256); err != nil {
496+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting checksum: %s", err), "(Data) ibm_is_image", "read", "set-checksum").GetDiag()
497+
}
426498
}
427499
if image.SourceVolume != nil {
428-
d.Set("source_volume", *image.SourceVolume.ID)
500+
if err = d.Set("source_volume", *image.SourceVolume.ID); err != nil {
501+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting source_volume: %s", err), "(Data) ibm_is_image", "read", "set-source_volume").GetDiag()
502+
}
429503
}
430504
if image.CatalogOffering != nil {
431505
catalogOfferingList := []map[string]interface{}{}
432506
catalogOfferingMap := dataSourceImageCollectionCatalogOfferingToMap(*image.CatalogOffering)
433507
catalogOfferingList = append(catalogOfferingList, catalogOfferingMap)
434-
d.Set(isImageCatalogOffering, catalogOfferingList)
508+
if err = d.Set("catalog_offering", catalogOfferingList); err != nil {
509+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting catalog_offering: %s", err), "(Data) ibm_is_image", "read", "set-catalog_offering").GetDiag()
510+
}
435511
}
436512
return nil
437513
}

0 commit comments

Comments
 (0)