Skip to content

Commit e5007a1

Browse files
committed
enhancement: improved error handling for vpc bare metal servers
1 parent bb65f30 commit e5007a1

23 files changed

+2052
-921
lines changed

ibm/service/vpc/data_source_ibm_is_bare_metal_server.go

Lines changed: 170 additions & 131 deletions
Large diffs are not rendered by default.

ibm/service/vpc/data_source_ibm_is_bare_metal_server_disk.go

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@ package vpc
66
import (
77
"context"
88
"fmt"
9+
"log"
910

1011
"github.com/IBM-Cloud/terraform-provider-ibm/ibm/conns"
12+
"github.com/IBM-Cloud/terraform-provider-ibm/ibm/flex"
1113
"github.com/IBM/vpc-go-sdk/vpcv1"
1214
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
1315
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
@@ -74,23 +76,37 @@ func dataSourceIBMISBareMetalServerDiskRead(context context.Context, d *schema.R
7476
bareMetalServerDiskID := d.Get(isBareMetalServerDisk).(string)
7577
sess, err := meta.(conns.ClientSession).VpcV1API()
7678
if err != nil {
77-
return diag.FromErr(err)
79+
tfErr := flex.DiscriminatedTerraformErrorf(err, err.Error(), "(Data) ibm_is_bare_metal_server_disk", "read", "initialize-client")
80+
log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage())
81+
return tfErr.GetDiag()
7882
}
7983
options := &vpcv1.GetBareMetalServerDiskOptions{
8084
BareMetalServerID: &bareMetalServerID,
8185
ID: &bareMetalServerDiskID,
8286
}
8387

84-
disk, response, err := sess.GetBareMetalServerDiskWithContext(context, options)
85-
if err != nil || disk == nil {
86-
return diag.FromErr(fmt.Errorf("[ERROR] Error getting Bare Metal Server (%s) disk (%s): %s\n%s", bareMetalServerID, bareMetalServerDiskID, err, response))
88+
bareMetalServerDisk, _, err := sess.GetBareMetalServerDiskWithContext(context, options)
89+
if err != nil || bareMetalServerDisk == nil {
90+
tfErr := flex.TerraformErrorf(err, fmt.Sprintf("GetBareMetalServerDiskWithContext failed: %s", err.Error()), "(Data) ibm_is_bare_metal_server_disk", "read")
91+
log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage())
92+
return tfErr.GetDiag()
93+
}
94+
d.SetId(*bareMetalServerDisk.ID)
95+
if err = d.Set("href", bareMetalServerDisk.Href); err != nil {
96+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting href: %s", err), "(Data) ibm_is_bare_metal_server_disk", "read", "set-href").GetDiag()
97+
}
98+
if err = d.Set("interface_type", bareMetalServerDisk.InterfaceType); err != nil {
99+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting interface_type: %s", err), "(Data) ibm_is_bare_metal_server_disk", "read", "set-interface_type").GetDiag()
100+
}
101+
if err = d.Set("name", bareMetalServerDisk.Name); err != nil {
102+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting name: %s", err), "(Data) ibm_is_bare_metal_server_disk", "read", "set-name").GetDiag()
103+
}
104+
if err = d.Set("resource_type", bareMetalServerDisk.ResourceType); err != nil {
105+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting resource_type: %s", err), "(Data) ibm_is_bare_metal_server_disk", "read", "set-resource_type").GetDiag()
106+
}
107+
if err = d.Set("size", flex.IntValue(bareMetalServerDisk.Size)); err != nil {
108+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting size: %s", err), "(Data) ibm_is_bare_metal_server_disk", "read", "set-size").GetDiag()
87109
}
88-
d.SetId(*disk.ID)
89-
d.Set(isBareMetalServerDiskHref, *disk.Href)
90-
d.Set(isBareMetalServerDiskInterfaceType, *disk.InterfaceType)
91-
d.Set(isBareMetalServerDiskName, *disk.Name)
92-
d.Set(isBareMetalServerDiskResourceType, *disk.ResourceType)
93-
d.Set(isBareMetalServerDiskSize, *disk.Size)
94110

95111
return nil
96112
}

ibm/service/vpc/data_source_ibm_is_bare_metal_server_disks.go

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,11 @@ package vpc
66
import (
77
"context"
88
"fmt"
9+
"log"
910
"time"
1011

1112
"github.com/IBM-Cloud/terraform-provider-ibm/ibm/conns"
13+
"github.com/IBM-Cloud/terraform-provider-ibm/ibm/flex"
1214
"github.com/IBM/vpc-go-sdk/vpcv1"
1315
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
1416
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
@@ -80,16 +82,20 @@ func dataSourceIBMISBareMetalServerDisksRead(context context.Context, d *schema.
8082
bareMetalServerID := d.Get(isBareMetalServerID).(string)
8183
sess, err := meta.(conns.ClientSession).VpcV1API()
8284
if err != nil {
83-
return diag.FromErr(err)
85+
tfErr := flex.DiscriminatedTerraformErrorf(err, err.Error(), "(Data) ibm_is_bare_metal_server_disks", "read", "initialize-client")
86+
log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage())
87+
return tfErr.GetDiag()
8488
}
8589
options := &vpcv1.ListBareMetalServerDisksOptions{
8690
BareMetalServerID: &bareMetalServerID,
8791
}
8892

89-
diskCollection, response, err := sess.ListBareMetalServerDisksWithContext(context, options)
93+
diskCollection, _, err := sess.ListBareMetalServerDisksWithContext(context, options)
9094
disks := diskCollection.Disks
9195
if err != nil || disks == nil {
92-
return diag.FromErr(fmt.Errorf("[ERROR] Error getting Bare Metal Server (%s) disks: %s\n%s", bareMetalServerID, err, response))
96+
tfErr := flex.TerraformErrorf(err, fmt.Sprintf("ListBareMetalServerDisksWithContext failed: %s", err.Error()), "(Data) ibm_is_bare_metal_server_disks", "read")
97+
log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage())
98+
return tfErr.GetDiag()
9399
}
94100
disksInfo := make([]map[string]interface{}, 0)
95101
for _, disk := range disks {
@@ -104,7 +110,9 @@ func dataSourceIBMISBareMetalServerDisksRead(context context.Context, d *schema.
104110
disksInfo = append(disksInfo, l)
105111
}
106112
d.SetId(dataSourceIBMISBMSDisksID(d))
107-
d.Set(isBareMetalServerDisks, disksInfo)
113+
if err = d.Set(isBareMetalServerDisks, disksInfo); err != nil {
114+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting disks: %s", err), "(Data) ibm_is_bare_metal_server_disks", "read", "set-disks").GetDiag()
115+
}
108116
return nil
109117
}
110118

ibm/service/vpc/data_source_ibm_is_bare_metal_server_initialization.go

Lines changed: 39 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"encoding/base64"
1212
"encoding/pem"
1313
"fmt"
14+
"log"
1415

1516
"github.com/IBM-Cloud/terraform-provider-ibm/ibm/conns"
1617
"github.com/IBM-Cloud/terraform-provider-ibm/ibm/flex"
@@ -120,20 +121,30 @@ func dataSourceIBMISBareMetalServerInitializationRead(context context.Context, d
120121
bareMetalServerID := d.Get(isBareMetalServerID).(string)
121122
sess, err := meta.(conns.ClientSession).VpcV1API()
122123
if err != nil {
123-
return diag.FromErr(err)
124+
tfErr := flex.DiscriminatedTerraformErrorf(err, err.Error(), "(Data) ibm_is_bare_metal_server_initialization", "read", "initialize-client")
125+
log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage())
126+
return tfErr.GetDiag()
124127
}
125128
options := &vpcv1.GetBareMetalServerInitializationOptions{
126129
ID: &bareMetalServerID,
127130
}
128131

129-
initialization, response, err := sess.GetBareMetalServerInitializationWithContext(context, options)
132+
initialization, _, err := sess.GetBareMetalServerInitializationWithContext(context, options)
130133
if err != nil || initialization == nil {
131-
return diag.FromErr(fmt.Errorf("[ERROR] Error getting Bare Metal Server (%s) initialization : %s\n%s", bareMetalServerID, err, response))
134+
tfErr := flex.TerraformErrorf(err, fmt.Sprintf("GetBareMetalServerInitializationWithContext failed: %s", err.Error()), "(Data) ibm_is_bare_metal_server_initialization", "read")
135+
log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage())
136+
return tfErr.GetDiag()
132137
}
133138
d.SetId(bareMetalServerID)
134139
if initialization.Image != nil {
135-
d.Set(isBareMetalServerImage, initialization.Image.ID)
136-
d.Set(isBareMetalServerImageName, initialization.Image.Name)
140+
141+
if err = d.Set(isBareMetalServerImage, initialization.Image.ID); err != nil {
142+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting image: %s", err), "(Data) ibm_is_bare_metal_server_initialization", "read", "set-image").GetDiag()
143+
}
144+
145+
if err = d.Set(isBareMetalServerImageName, initialization.Image.Name); err != nil {
146+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting image_name: %s", err), "(Data) ibm_is_bare_metal_server_initialization", "read", "set-image_name").GetDiag()
147+
}
137148
}
138149

139150
var keys []string
@@ -143,7 +154,10 @@ func dataSourceIBMISBareMetalServerInitializationRead(context context.Context, d
143154
keys = append(keys, *key.ID)
144155
}
145156
}
146-
d.Set(isBareMetalServerKeys, flex.NewStringSet(schema.HashString, keys))
157+
158+
if err = d.Set(isBareMetalServerKeys, flex.NewStringSet(schema.HashString, keys)); err != nil {
159+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting keys: %s", err), "(Data) ibm_is_bare_metal_server_initialization", "read", "set-keys").GetDiag()
160+
}
147161
accList := make([]map[string]interface{}, 0)
148162
if initialization.UserAccounts != nil {
149163

@@ -165,14 +179,17 @@ func dataSourceIBMISBareMetalServerInitializationRead(context context.Context, d
165179
if keyFlag != "" {
166180
block, err := pem.Decode(keybytes)
167181
if block == nil {
168-
return diag.FromErr(fmt.Errorf("[ERROR] Failed to load the private key from the given key contents. Instead of the key file path, please make sure the private key is pem format (%v)", err))
182+
err := fmt.Errorf("[ERROR] Failed to load the private key from the given key contents. Instead of the key file path, please make sure the private key is pem format (%v)", err)
183+
return flex.DiscriminatedTerraformErrorf(err, err.Error(), "(Data) ibm_is_bare_metal_server_initialization", "read", "decode-pem").GetDiag()
184+
169185
}
170186
isEncrypted := false
171187
if block.Type == "OPENSSH PRIVATE KEY" {
172188
var err error
173189
isEncrypted, err = isOpenSSHPrivKeyEncrypted(block.Bytes)
174190
if err != nil {
175-
return diag.FromErr(fmt.Errorf("[ERROR] Failed to check if the provided open ssh key is encrypted or not %s", err))
191+
err = fmt.Errorf("[ERROR] Failed to check if the provided open ssh key is encrypted or not %s", err)
192+
return flex.DiscriminatedTerraformErrorf(err, err.Error(), "(Data) ibm_is_bare_metal_server_initialization", "read", "check-encryption").GetDiag()
176193
}
177194
} else {
178195
isEncrypted = x509.IsEncryptedPEMBlock(block)
@@ -183,24 +200,28 @@ func dataSourceIBMISBareMetalServerInitializationRead(context context.Context, d
183200
if pass, ok := d.GetOk(isBareMetalServerPassphrase); ok {
184201
passphrase = pass.(string)
185202
} else {
186-
return diag.FromErr(fmt.Errorf("[ERROR] Mandatory field 'passphrase' not provided"))
203+
err := fmt.Errorf("[ERROR] Mandatory field 'passphrase' not provided")
204+
return flex.DiscriminatedTerraformErrorf(err, err.Error(), "(Data) ibm_is_bare_metal_server_initialization", "read", "missing-passphrase").GetDiag()
187205
}
188206
var err error
189207
privateKey, err = sshkeys.ParseEncryptedRawPrivateKey(keybytes, []byte(passphrase))
190208
if err != nil {
191-
return diag.FromErr(fmt.Errorf("[ERROR] Fail to decrypting the private key: %s", err))
209+
err := fmt.Errorf("[ERROR] Fail to decrypting the private key: %s", err)
210+
return flex.DiscriminatedTerraformErrorf(err, err.Error(), "(Data) ibm_is_bare_metal_server_initialization", "read", "decrypt-private_key").GetDiag()
192211
}
193212
} else {
194213
var err error
195214
privateKey, err = sshkeys.ParseEncryptedRawPrivateKey(keybytes, nil)
196215
if err != nil {
197-
return diag.FromErr(fmt.Errorf("[ERROR] Fail to decrypting the private key: %s", err))
216+
err := fmt.Errorf("[ERROR] Fail to decrypting the private key: %s", err)
217+
return flex.DiscriminatedTerraformErrorf(err, err.Error(), "(Data) ibm_is_bare_metal_server_initialization", "read", "fail-decrypt-private_key").GetDiag()
198218
}
199219
}
200220
var ok bool
201221
rsaKey, ok = privateKey.(*rsa.PrivateKey)
202222
if !ok {
203-
return diag.FromErr(fmt.Errorf("[ERROR] Failed to convert to RSA private key"))
223+
err := fmt.Errorf("[ERROR] Failed to convert to RSA private key")
224+
return flex.DiscriminatedTerraformErrorf(err, err.Error(), "(Data) ibm_is_bare_metal_server_initialization", "read", "convert-rsa").GetDiag()
204225
}
205226
}
206227
}
@@ -212,15 +233,19 @@ func dataSourceIBMISBareMetalServerInitializationRead(context context.Context, d
212233
rng := rand.Reader
213234
clearPassword, err := rsa.DecryptPKCS1v15(rng, rsaKey, ciphertext)
214235
if err != nil {
215-
return diag.FromErr(fmt.Errorf("[ERROR] Can not decrypt the password with the given key, %s", err))
236+
err := fmt.Errorf("[ERROR] Can not decrypt the password with the given key, %s", err)
237+
return flex.DiscriminatedTerraformErrorf(err, err.Error(), "(Data) ibm_is_bare_metal_server_initialization", "read", "decrypt-password").GetDiag()
216238
}
217239
password = string(clearPassword)
218240
}
219241
currAccount[isBareMetalServerUserAccountPassword] = password
220242
}
221243
accList = append(accList, currAccount)
222244
}
223-
d.Set(isBareMetalServerUserAccounts, accList)
245+
246+
if err = d.Set(isBareMetalServerUserAccounts, accList); err != nil {
247+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting user_accounts: %s", err), "(Data) ibm_is_bare_metal_server_initialization", "read", "set-user_accounts").GetDiag()
248+
}
224249
}
225250
return nil
226251
}

0 commit comments

Comments
 (0)