Skip to content

Commit 40abaca

Browse files
authored
enhancement: improved error handling for vpc placement groups (IBM-Cloud#6148)
1 parent 553fad9 commit 40abaca

File tree

3 files changed

+98
-49
lines changed

3 files changed

+98
-49
lines changed

ibm/service/vpc/data_source_ibm_is_placement_group.go

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,9 @@ func DataSourceIbmIsPlacementGroup() *schema.Resource {
101101
func dataSourceIbmIsPlacementGroupRead(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
102102
vpcClient, err := meta.(conns.ClientSession).VpcV1API()
103103
if err != nil {
104-
return diag.FromErr(err)
104+
tfErr := flex.DiscriminatedTerraformErrorf(err, err.Error(), "(Data) ibm_is_placement_group", "read", "initialize-client")
105+
log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage())
106+
return tfErr.GetDiag()
105107
}
106108
pgname := d.Get("name").(string)
107109
listPlacementGroupsOptions := &vpcv1.ListPlacementGroupsOptions{}
@@ -111,10 +113,11 @@ func dataSourceIbmIsPlacementGroupRead(context context.Context, d *schema.Resour
111113
if start != "" {
112114
listPlacementGroupsOptions.Start = &start
113115
}
114-
placementGroupCollection, response, err := vpcClient.ListPlacementGroupsWithContext(context, listPlacementGroupsOptions)
116+
placementGroupCollection, _, err := vpcClient.ListPlacementGroupsWithContext(context, listPlacementGroupsOptions)
115117
if err != nil {
116-
log.Printf("[DEBUG] ListPlacementGroupsWithContext failed %s\n%s", err, response)
117-
return diag.FromErr(err)
118+
tfErr := flex.TerraformErrorf(err, fmt.Sprintf("ListPlacementGroupsWithContext failed: %s", err.Error()), "(Data) ibm_is_placement_group", "read")
119+
log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage())
120+
return tfErr.GetDiag()
118121
}
119122
start = flex.GetNext(placementGroupCollection.Next)
120123
allrecs = append(allrecs, placementGroupCollection.PlacementGroups...)
@@ -126,33 +129,33 @@ func dataSourceIbmIsPlacementGroupRead(context context.Context, d *schema.Resour
126129
if *placementGroup.Name == pgname {
127130

128131
d.SetId(*placementGroup.ID)
129-
if err = d.Set("created_at", placementGroup.CreatedAt.String()); err != nil {
130-
return diag.FromErr(fmt.Errorf("[ERROR] Error setting created_at: %s", err))
132+
if err = d.Set("created_at", flex.DateTimeToString(placementGroup.CreatedAt)); err != nil {
133+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting created_at: %s", err), "(Data) ibm_is_placement_group", "read", "set-created_at").GetDiag()
131134
}
132135
if err = d.Set("crn", placementGroup.CRN); err != nil {
133-
return diag.FromErr(fmt.Errorf("[ERROR] Error setting crn: %s", err))
136+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting crn: %s", err), "(Data) ibm_is_placement_group", "read", "set-crn").GetDiag()
134137
}
135138
if err = d.Set("href", placementGroup.Href); err != nil {
136-
return diag.FromErr(fmt.Errorf("[ERROR] Error setting href: %s", err))
139+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting href: %s", err), "(Data) ibm_is_placement_group", "read", "set-href").GetDiag()
137140
}
138141
if err = d.Set("lifecycle_state", placementGroup.LifecycleState); err != nil {
139-
return diag.FromErr(fmt.Errorf("[ERROR] Error setting lifecycle_state: %s", err))
142+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting lifecycle_state: %s", err), "(Data) ibm_is_placement_group", "read", "set-lifecycle_state").GetDiag()
140143
}
141144
if err = d.Set("name", placementGroup.Name); err != nil {
142-
return diag.FromErr(fmt.Errorf("[ERROR] Error setting name: %s", err))
145+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting name: %s", err), "(Data) ibm_is_placement_group", "read", "set-name").GetDiag()
143146
}
144147

145148
if placementGroup.ResourceGroup != nil {
146149
err = d.Set("resource_group", dataSourcePlacementGroupFlattenResourceGroup(*placementGroup.ResourceGroup))
147150
if err != nil {
148-
return diag.FromErr(fmt.Errorf("[ERROR] Error setting resource_group %s", err))
151+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting resource_group: %s", err), "(Data) ibm_is_placement_group", "read", "set-resource_group").GetDiag()
149152
}
150153
}
151154
if err = d.Set("resource_type", placementGroup.ResourceType); err != nil {
152-
return diag.FromErr(fmt.Errorf("[ERROR] Error setting resource_type: %s", err))
155+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting resource_type: %s", err), "(Data) ibm_is_placement_group", "read", "set-resource_type").GetDiag()
153156
}
154157
if err = d.Set("strategy", placementGroup.Strategy); err != nil {
155-
return diag.FromErr(fmt.Errorf("[ERROR] Error setting strategy: %s", err))
158+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting strategy: %s", err), "(Data) ibm_is_placement_group", "read", "set-strategy").GetDiag()
156159
}
157160
tags, err := flex.GetGlobalTagsUsingCRN(meta, *placementGroup.CRN, "", isUserTagType)
158161
if err != nil {
@@ -167,7 +170,13 @@ func dataSourceIbmIsPlacementGroupRead(context context.Context, d *schema.Resour
167170
}
168171

169172
d.Set(isPlacementGroupTags, tags)
173+
if err = d.Set("tags", tags); err != nil {
174+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting tags: %s", err), "(Data) ibm_is_placement_group", "read", "set-tags").GetDiag()
175+
}
170176
d.Set(isPlacementGroupAccessTags, accesstags)
177+
if err = d.Set("access_tags", accesstags); err != nil {
178+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting access_tags: %s", err), "(Data) ibm_is_placement_group", "read", "set-access_tags").GetDiag()
179+
}
171180
return nil
172181
}
173182
}

ibm/service/vpc/data_source_ibm_is_placement_groups.go

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,9 @@ func DataSourceIbmIsPlacementGroups() *schema.Resource {
121121
func dataSourceIbmIsPlacementGroupsRead(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
122122
vpcClient, err := meta.(conns.ClientSession).VpcV1API()
123123
if err != nil {
124-
return diag.FromErr(err)
124+
tfErr := flex.DiscriminatedTerraformErrorf(err, err.Error(), "(Data) ibm_is_placement_groups", "read", "initialize-client")
125+
log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage())
126+
return tfErr.GetDiag()
125127
}
126128

127129
listPlacementGroupsOptions := &vpcv1.ListPlacementGroupsOptions{}
@@ -131,10 +133,11 @@ func dataSourceIbmIsPlacementGroupsRead(context context.Context, d *schema.Resou
131133
if start != "" {
132134
listPlacementGroupsOptions.Start = &start
133135
}
134-
placementGroupCollection, response, err := vpcClient.ListPlacementGroupsWithContext(context, listPlacementGroupsOptions)
136+
placementGroupCollection, _, err := vpcClient.ListPlacementGroupsWithContext(context, listPlacementGroupsOptions)
135137
if err != nil {
136-
log.Printf("[DEBUG] ListPlacementGroupsWithContext failed %s\n%s", err, response)
137-
return diag.FromErr(err)
138+
tfErr := flex.TerraformErrorf(err, fmt.Sprintf("ListPlacementGroupsWithContext failed %s", err), "(Data) ibm_is_placement_groups", "read")
139+
log.Printf("[DEBUG] %s", tfErr.GetDebugMessage())
140+
return tfErr.GetDiag()
138141
}
139142
start = flex.GetNext(placementGroupCollection.Next)
140143
allrecs = append(allrecs, placementGroupCollection.PlacementGroups...)
@@ -146,10 +149,10 @@ func dataSourceIbmIsPlacementGroupsRead(context context.Context, d *schema.Resou
146149
d.SetId(dataSourceIbmIsPlacementGroupsID(d))
147150
err = d.Set("placement_groups", dataSourcePlacementGroupCollectionFlattenPlacementGroups(meta, allrecs))
148151
if err != nil {
149-
return diag.FromErr(fmt.Errorf("[ERROR] Error setting placement_groups %s", err))
152+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting placement_groups %s", err), "(Data) ibm_is_placement_groups", "read", "placement_groups-set").GetDiag()
150153
}
151154
if err = d.Set("total_count", len(allrecs)); err != nil {
152-
return diag.FromErr(fmt.Errorf("[ERROR] Error setting total_count: %s", err))
155+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting total_count %s", err), "(Data) ibm_is_placement_groups", "read", "total_count-set").GetDiag()
153156
}
154157
return nil
155158
}

ibm/service/vpc/resource_ibm_is_placement_group.go

Lines changed: 67 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
1818
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
1919

20+
"github.com/IBM/go-sdk-core/v5/core"
2021
"github.com/IBM/vpc-go-sdk/vpcv1"
2122
)
2223

@@ -165,7 +166,9 @@ func ResourceIbmIsPlacementGroupValidator() *validate.ResourceValidator {
165166
func resourceIbmIsPlacementGroupCreate(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
166167
vpcClient, err := meta.(conns.ClientSession).VpcV1API()
167168
if err != nil {
168-
return diag.FromErr(err)
169+
tfErr := flex.DiscriminatedTerraformErrorf(err, err.Error(), "ibm_is_placement_group", "create", "initialize-client")
170+
log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage())
171+
return tfErr.GetDiag()
169172
}
170173

171174
createPlacementGroupOptions := &vpcv1.CreatePlacementGroupOptions{}
@@ -181,17 +184,20 @@ func resourceIbmIsPlacementGroupCreate(context context.Context, d *schema.Resour
181184
createPlacementGroupOptions.SetResourceGroup(resourceGroupIdentity)
182185
}
183186

184-
placementGroup, response, err := vpcClient.CreatePlacementGroupWithContext(context, createPlacementGroupOptions)
187+
placementGroup, _, err := vpcClient.CreatePlacementGroupWithContext(context, createPlacementGroupOptions)
185188
if err != nil {
186-
log.Printf("[DEBUG] CreatePlacementGroupWithContext failed %s\n%s", err, response)
187-
return diag.FromErr(err)
189+
tfErr := flex.TerraformErrorf(err, fmt.Sprintf("CreatePlacementGroupWithContext failed: %s", err.Error()), "ibm_is_placement_group", "create")
190+
log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage())
191+
return tfErr.GetDiag()
188192
}
189193

190194
d.SetId(*placementGroup.ID)
191195

192196
_, err = isWaitForPlacementGroupAvailable(vpcClient, d.Id(), d.Timeout(schema.TimeoutCreate), d)
193197
if err != nil {
194-
return diag.FromErr(fmt.Errorf("[ERROR] Error waiting for placement group to be available %s", err))
198+
tfErr := flex.TerraformErrorf(err, fmt.Sprintf("isWaitForPlacementGroupAvailable failed: %s", err.Error()), "ibm_is_placement_group", "create")
199+
log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage())
200+
return tfErr.GetDiag()
195201
}
196202
if _, ok := d.GetOk(isPlacementGroupTags); ok {
197203
oldList, newList := d.GetChange(isPlacementGroupTags)
@@ -218,7 +224,9 @@ func resourceIbmIsPlacementGroupCreate(context context.Context, d *schema.Resour
218224
func resourceIbmIsPlacementGroupRead(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
219225
vpcClient, err := meta.(conns.ClientSession).VpcV1API()
220226
if err != nil {
221-
return diag.FromErr(err)
227+
tfErr := flex.DiscriminatedTerraformErrorf(err, err.Error(), "ibm_is_placement_group", "read", "initialize-client")
228+
log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage())
229+
return tfErr.GetDiag()
222230
}
223231

224232
getPlacementGroupOptions := &vpcv1.GetPlacementGroupOptions{}
@@ -231,35 +239,46 @@ func resourceIbmIsPlacementGroupRead(context context.Context, d *schema.Resource
231239
d.SetId("")
232240
return nil
233241
}
234-
log.Printf("[DEBUG] GetPlacementGroupWithContext failed %s\n%s", err, response)
235-
return diag.FromErr(err)
242+
tfErr := flex.TerraformErrorf(err, fmt.Sprintf("GetPlacementGroupWithContext failed: %s", err.Error()), "ibm_is_placement_group", "read")
243+
log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage())
244+
return tfErr.GetDiag()
236245
}
237246

238247
if err = d.Set("strategy", placementGroup.Strategy); err != nil {
239-
return diag.FromErr(fmt.Errorf("[ERROR] Error setting strategy: %s", err))
248+
err = fmt.Errorf("Error setting strategy: %s", err)
249+
return flex.DiscriminatedTerraformErrorf(err, err.Error(), "ibm_is_placement_group", "read", "set-strategy").GetDiag()
240250
}
241-
if err = d.Set("name", placementGroup.Name); err != nil {
242-
return diag.FromErr(fmt.Errorf("[ERROR] Error setting name: %s", err))
251+
if !core.IsNil(placementGroup.Name) {
252+
if err = d.Set("name", placementGroup.Name); err != nil {
253+
err = fmt.Errorf("Error setting name: %s", err)
254+
return flex.DiscriminatedTerraformErrorf(err, err.Error(), "ibm_is_placement_group", "read", "set-name").GetDiag()
255+
}
243256
}
244257
if placementGroup.ResourceGroup != nil {
245258
if err = d.Set("resource_group", *placementGroup.ResourceGroup.ID); err != nil {
246-
return diag.FromErr(fmt.Errorf("[ERROR] Error setting resource_group: %s", err))
259+
err = fmt.Errorf("Error setting resource_group: %s", err)
260+
return flex.DiscriminatedTerraformErrorf(err, err.Error(), "ibm_is_placement_group", "read", "set-resource_group").GetDiag()
247261
}
248262
}
249-
if err = d.Set("created_at", placementGroup.CreatedAt.String()); err != nil {
250-
return diag.FromErr(fmt.Errorf("[ERROR] Error setting created_at: %s", err))
263+
if err = d.Set("created_at", flex.DateTimeToString(placementGroup.CreatedAt)); err != nil {
264+
err = fmt.Errorf("Error setting created_at: %s", err)
265+
return flex.DiscriminatedTerraformErrorf(err, err.Error(), "ibm_is_placement_group", "read", "set-created_at").GetDiag()
251266
}
252267
if err = d.Set("crn", placementGroup.CRN); err != nil {
253-
return diag.FromErr(fmt.Errorf("[ERROR] Error setting crn: %s", err))
268+
err = fmt.Errorf("Error setting crn: %s", err)
269+
return flex.DiscriminatedTerraformErrorf(err, err.Error(), "ibm_is_placement_group", "read", "set-crn").GetDiag()
254270
}
255271
if err = d.Set("href", placementGroup.Href); err != nil {
256-
return diag.FromErr(fmt.Errorf("[ERROR] Error setting href: %s", err))
272+
err = fmt.Errorf("Error setting href: %s", err)
273+
return flex.DiscriminatedTerraformErrorf(err, err.Error(), "ibm_is_placement_group", "read", "set-href").GetDiag()
257274
}
258275
if err = d.Set("lifecycle_state", placementGroup.LifecycleState); err != nil {
259-
return diag.FromErr(fmt.Errorf("[ERROR] Error setting lifecycle_state: %s", err))
276+
err = fmt.Errorf("Error setting lifecycle_state: %s", err)
277+
return flex.DiscriminatedTerraformErrorf(err, err.Error(), "ibm_is_placement_group", "read", "set-lifecycle_state").GetDiag()
260278
}
261279
if err = d.Set("resource_type", placementGroup.ResourceType); err != nil {
262-
return diag.FromErr(fmt.Errorf("[ERROR] Error setting resource_type: %s", err))
280+
err = fmt.Errorf("Error setting resource_type: %s", err)
281+
return flex.DiscriminatedTerraformErrorf(err, err.Error(), "ibm_is_placement_group", "read", "set-resource_type").GetDiag()
263282
}
264283
tags, err := flex.GetGlobalTagsUsingCRN(meta, *placementGroup.CRN, "", isUserTagType)
265284
if err != nil {
@@ -273,15 +292,23 @@ func resourceIbmIsPlacementGroupRead(context context.Context, d *schema.Resource
273292
"Error getting placement group (%s) access tags: %s", d.Id(), err)
274293
}
275294

276-
d.Set(isPlacementGroupTags, tags)
277-
d.Set(isPlacementGroupAccessTags, accesstags)
295+
if err = d.Set("tags", tags); err != nil {
296+
err = fmt.Errorf("Error setting tags: %s", err)
297+
return flex.DiscriminatedTerraformErrorf(err, err.Error(), "ibm_is_placement_group", "read", "set-tags").GetDiag()
298+
}
299+
if err = d.Set("access_tags", accesstags); err != nil {
300+
err = fmt.Errorf("Error setting access_tags: %s", err)
301+
return flex.DiscriminatedTerraformErrorf(err, err.Error(), "ibm_is_placement_group", "read", "set-access_tags").GetDiag()
302+
}
278303
return nil
279304
}
280305

281306
func resourceIbmIsPlacementGroupUpdate(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
282307
vpcClient, err := meta.(conns.ClientSession).VpcV1API()
283308
if err != nil {
284-
return diag.FromErr(err)
309+
tfErr := flex.DiscriminatedTerraformErrorf(err, err.Error(), "ibm_is_placement_group", "update", "initialize-client")
310+
log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage())
311+
return tfErr.GetDiag()
285312
}
286313

287314
updatePlacementGroupOptions := &vpcv1.UpdatePlacementGroupOptions{}
@@ -299,14 +326,16 @@ func resourceIbmIsPlacementGroupUpdate(context context.Context, d *schema.Resour
299326
if hasChange {
300327
placementGroupPatch, err := placementGroupPatchModel.AsPatch()
301328
if err != nil {
302-
log.Printf("[DEBUG] Error calling AsPatch for PlacementGroupPatch %s", err)
303-
return diag.FromErr(err)
329+
tfErr := flex.TerraformErrorf(err, fmt.Sprintf("placementGroupPatchModel.AsPatch failed: %s", err.Error()), "ibm_is_placement_group", "update")
330+
log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage())
331+
return tfErr.GetDiag()
304332
}
305333
updatePlacementGroupOptions.SetPlacementGroupPatch(placementGroupPatch)
306-
_, response, err := vpcClient.UpdatePlacementGroupWithContext(context, updatePlacementGroupOptions)
334+
_, _, err = vpcClient.UpdatePlacementGroupWithContext(context, updatePlacementGroupOptions)
307335
if err != nil {
308-
log.Printf("[DEBUG] UpdatePlacementGroupWithContext failed %s\n%s", err, response)
309-
return diag.FromErr(err)
336+
tfErr := flex.TerraformErrorf(err, fmt.Sprintf("UpdatePlacementGroupWithContext failed: %s", err.Error()), "ibm_is_placement_group", "update")
337+
log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage())
338+
return tfErr.GetDiag()
310339
}
311340
}
312341
if d.HasChange(isPlacementGroupTags) {
@@ -332,7 +361,9 @@ func resourceIbmIsPlacementGroupUpdate(context context.Context, d *schema.Resour
332361
func resourceIbmIsPlacementGroupDelete(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
333362
vpcClient, err := meta.(conns.ClientSession).VpcV1API()
334363
if err != nil {
335-
return diag.FromErr(err)
364+
tfErr := flex.DiscriminatedTerraformErrorf(err, err.Error(), "ibm_is_placement_group", "delete", "initialize-client")
365+
log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage())
366+
return tfErr.GetDiag()
336367
}
337368

338369
deletePlacementGroupOptions := &vpcv1.DeletePlacementGroupOptions{}
@@ -344,15 +375,21 @@ func resourceIbmIsPlacementGroupDelete(context context.Context, d *schema.Resour
344375
if response.StatusCode == 409 {
345376
_, err = isWaitForPlacementGroupDeleteRetry(vpcClient, d, d.Id())
346377
if err != nil {
347-
return diag.FromErr(fmt.Errorf("[ERROR] Error deleting PLacementGroup: %s", err))
378+
tfErr := flex.TerraformErrorf(err, fmt.Sprintf("isWaitForPlacementGroupDeleteRetry failed: %s", err.Error()), "ibm_is_placement_group", "delete")
379+
log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage())
380+
return tfErr.GetDiag()
348381
}
349382
} else {
350-
return diag.FromErr(fmt.Errorf("[ERROR] Error deleting PLacementGroup: %s\n%s", err, response))
383+
tfErr := flex.TerraformErrorf(err, fmt.Sprintf("DeletePlacementGroupWithContext failed: %s", err.Error()), "ibm_is_placement_group", "delete")
384+
log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage())
385+
return tfErr.GetDiag()
351386
}
352387
}
353388
_, err = isWaitForPlacementGroupDelete(vpcClient, d, d.Id())
354389
if err != nil {
355-
return diag.FromErr(err)
390+
tfErr := flex.TerraformErrorf(err, fmt.Sprintf("isWaitForPlacementGroupDelete failed: %s", err.Error()), "ibm_is_placement_group", "delete")
391+
log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage())
392+
return tfErr.GetDiag()
356393
}
357394
d.SetId("")
358395

0 commit comments

Comments
 (0)