Skip to content

Commit 7796b3d

Browse files
authored
enhancement: improved error handling for is_ssh_key (IBM-Cloud#6124)
1 parent fe90075 commit 7796b3d

7 files changed

+379
-92
lines changed

GNUmakefile

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ TEST_TIMEOUT?=700m
55
VERSION ?= 0.0.1
66
OS_ARCH := $(shell go env GOOS)_$(shell go env GOARCH)
77
PLUGIN_DIR := $(HOME)/.terraform.d/plugins/registry.terraform.io/ibm-cloud/ibm/$(VERSION)/$(OS_ARCH)
8+
TEST_NAME ?= ""
89

910
default: build
1011

@@ -36,6 +37,14 @@ test: fmtcheck
3637
testacc: fmtcheck
3738
TF_ACC=1 go test $(TEST) -v $(TESTARGS) -timeout $(TEST_TIMEOUT)
3839

40+
test-vpc:
41+
@if [ "$(TEST_NAME)" = "" ]; then \
42+
echo "Error: Please provide a test name using TEST_NAME=YourTestName"; \
43+
exit 1; \
44+
fi
45+
@echo "Running VPC test: $(TEST_NAME)"
46+
@$(MAKE) testacc TEST=./ibm/service/vpc TESTARGS='-run=$(TEST_NAME)'
47+
3948
testrace: fmtcheck
4049
TF_ACC= go test -race $(TEST) $(TESTARGS)
4150

ibm/service/vpc/data_source_ibm_is_ssh_key.go

Lines changed: 50 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,19 @@
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/vpc-go-sdk/vpcv1"
13+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
1214
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
1315
)
1416

1517
func DataSourceIBMISSSHKey() *schema.Resource {
1618
return &schema.Resource{
17-
Read: dataSourceIBMISSSHKeyRead,
19+
ReadContext: dataSourceIBMISSSHKeyRead,
1820

1921
Schema: map[string]*schema.Schema{
2022
"resource_group": {
@@ -119,7 +121,7 @@ func DataSourceIBMISSSHKey() *schema.Resource {
119121
}
120122
}
121123

122-
func dataSourceIBMISSSHKeyRead(d *schema.ResourceData, meta interface{}) error {
124+
func dataSourceIBMISSSHKeyRead(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
123125
name := ""
124126
if nameOk, ok := d.GetOk(isKeyName); ok {
125127
name = nameOk.(string)
@@ -129,27 +131,31 @@ func dataSourceIBMISSSHKeyRead(d *schema.ResourceData, meta interface{}) error {
129131
id = idOk.(string)
130132
}
131133

132-
err := keyGetByNameOrId(d, meta, name, id)
133-
if err != nil {
134-
return err
134+
diag := keyGetByNameOrId(context, d, meta, name, id)
135+
if diag != nil {
136+
return diag
135137
}
136138
return nil
137139
}
138140

139-
func keyGetByNameOrId(d *schema.ResourceData, meta interface{}, name, id string) error {
141+
func keyGetByNameOrId(context context.Context, d *schema.ResourceData, meta interface{}, name, id string) diag.Diagnostics {
140142
sess, err := vpcClient(meta)
141143
if err != nil {
142-
return err
144+
tfErr := flex.DiscriminatedTerraformErrorf(err, err.Error(), "(Data) ibm_is_ssh_key", "read", "initialize-client")
145+
log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage())
146+
return tfErr.GetDiag()
143147
}
144148
var key vpcv1.Key
145149

146150
if id != "" {
147151
getKeyOptions := &vpcv1.GetKeyOptions{
148152
ID: &id,
149153
}
150-
keyintf, response, err := sess.GetKey(getKeyOptions)
154+
keyintf, _, err := sess.GetKeyWithContext(context, getKeyOptions)
151155
if err != nil {
152-
return fmt.Errorf("[ERROR] Error GetKey %s\n%s", err, response)
156+
tfErr := flex.TerraformErrorf(err, fmt.Sprintf("GetKeyWithContext failed: %s", err.Error()), "(Data) ibm_is_ssh_key", "read")
157+
log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage())
158+
return tfErr.GetDiag()
153159
}
154160
key = *keyintf
155161

@@ -163,9 +169,11 @@ func keyGetByNameOrId(d *schema.ResourceData, meta interface{}, name, id string)
163169
listKeysOptions.Start = &start
164170
}
165171

166-
keys, response, err := sess.ListKeys(listKeysOptions)
172+
keys, _, err := sess.ListKeysWithContext(context, listKeysOptions)
167173
if err != nil {
168-
return fmt.Errorf("[ERROR] Error fetching Keys %s\n%s", err, response)
174+
tfErr := flex.TerraformErrorf(err, fmt.Sprintf("ListKeysWithContext failed: %s", err.Error()), "(Data) ibm_is_ssh_key", "read")
175+
log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage())
176+
return tfErr.GetDiag()
169177
}
170178
start = flex.GetNext(keys.Next)
171179
allrecs = append(allrecs, keys.Keys...)
@@ -181,33 +189,50 @@ func keyGetByNameOrId(d *schema.ResourceData, meta interface{}, name, id string)
181189
}
182190
}
183191
if !found {
184-
return fmt.Errorf("[ERROR] No SSH Key found with name %s", name)
192+
err = fmt.Errorf("[ERROR] No SSH Key found with name %s", name)
193+
tfErr := flex.TerraformErrorf(err, fmt.Sprintf("Not found: %s", err.Error()), "(Data) ibm_is_ssh_key", "read")
194+
log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage())
195+
return tfErr.GetDiag()
185196
}
186197
}
187198
d.SetId(*key.ID)
188-
d.Set("name", *key.Name)
189-
d.Set(isKeyType, *key.Type)
190-
d.Set(isKeyFingerprint, *key.Fingerprint)
191-
d.Set(isKeyLength, *key.Length)
199+
if err = d.Set("name", key.Name); err != nil {
200+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting name: %s", err), "(Data) ibm_is_ssh_key", "read", "set-name").GetDiag()
201+
}
202+
if err = d.Set("type", key.Type); err != nil {
203+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting type: %s", err), "(Data) ibm_is_ssh_key", "read", "set-type").GetDiag()
204+
}
205+
if err = d.Set("fingerprint", key.Fingerprint); err != nil {
206+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting fingerprint: %s", err), "(Data) ibm_is_ssh_key", "read", "set-fingerprint").GetDiag()
207+
}
208+
if err = d.Set("length", flex.IntValue(key.Length)); err != nil {
209+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting length: %s", err), "(Data) ibm_is_ssh_key", "read", "set-length").GetDiag()
210+
}
192211
controller, err := flex.GetBaseController(meta)
193212
if err != nil {
194-
return err
213+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting resource_controller_url: %s", err), "(Data) ibm_is_ssh_key", "read", "set-resource_controller_url").GetDiag()
195214
}
215+
d.Set(flex.ResourceControllerURL, controller+"/vpc/compute/sshKeys")
196216
if err = d.Set("created_at", flex.DateTimeToString(key.CreatedAt)); err != nil {
197-
return err
217+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting created_at: %s", err), "(Data) ibm_is_ssh_key", "read", "set-created_at").GetDiag()
198218
}
199219
if err = d.Set("href", key.Href); err != nil {
200-
return err
220+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting href: %s", err), "(Data) ibm_is_ssh_key", "read", "set-href").GetDiag()
221+
}
222+
if err = d.Set(flex.ResourceName, key.Name); err != nil {
223+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting resource_name: %s", err), "(Data) ibm_is_ssh_key", "read", "set-resource_name").GetDiag()
224+
}
225+
if err = d.Set(flex.ResourceCRN, key.CRN); err != nil {
226+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting resource_crn: %s", err), "(Data) ibm_is_ssh_key", "read", "set-resource_crn").GetDiag()
227+
}
228+
if err = d.Set("crn", key.CRN); err != nil {
229+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting crn: %s", err), "(Data) ibm_is_ssh_key", "read", "set-crn").GetDiag()
201230
}
202-
d.Set(flex.ResourceControllerURL, controller+"/vpc/compute/sshKeys")
203-
d.Set(flex.ResourceName, *key.Name)
204-
d.Set(flex.ResourceCRN, *key.CRN)
205-
d.Set(IsKeyCRN, *key.CRN)
206231
if key.ResourceGroup != nil {
207232
d.Set(flex.ResourceGroupName, *key.ResourceGroup.ID)
208233
}
209-
if key.PublicKey != nil {
210-
d.Set(isKeyPublicKey, *key.PublicKey)
234+
if err = d.Set("public_key", key.PublicKey); err != nil {
235+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting public_key: %s", err), "(Data) ibm_is_ssh_key", "read", "set-public_key").GetDiag()
211236
}
212237
tags, err := flex.GetGlobalTagsUsingCRN(meta, *key.CRN, "", isUserTagType)
213238
if err != nil {

ibm/service/vpc/data_source_ibm_is_ssh_key_test.go

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,18 +29,32 @@ ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCKVmnMOlHKcZK8tpt3MP1lqOLAcqcJzhsvJcjscgVE
2929
Check: resource.ComposeTestCheckFunc(
3030
resource.TestCheckResourceAttr(
3131
"data.ibm_is_ssh_key.ds_key", "name", name1),
32+
resource.TestCheckResourceAttrSet(
33+
"data.ibm_is_ssh_key.ds_key", "id"),
3234
resource.TestCheckResourceAttrSet(
3335
"data.ibm_is_ssh_key.ds_key", "crn"),
3436
resource.TestCheckResourceAttrSet(
3537
"data.ibm_is_ssh_key.ds_key", "fingerprint"),
36-
resource.TestCheckResourceAttrSet(
37-
"data.ibm_is_ssh_key.ds_key", "id"),
3838
resource.TestCheckResourceAttrSet(
3939
"data.ibm_is_ssh_key.ds_key", "length"),
4040
resource.TestCheckResourceAttrSet(
4141
"data.ibm_is_ssh_key.ds_key", "public_key"),
4242
resource.TestCheckResourceAttrSet(
4343
"data.ibm_is_ssh_key.ds_key", "type"),
44+
resource.TestCheckResourceAttrSet(
45+
"data.ibm_is_ssh_key.ds_key", "created_at"),
46+
resource.TestCheckResourceAttrSet(
47+
"data.ibm_is_ssh_key.ds_key", "href"),
48+
resource.TestCheckResourceAttrSet(
49+
"data.ibm_is_ssh_key.ds_key", "resource_controller_url"),
50+
resource.TestCheckResourceAttrSet(
51+
"data.ibm_is_ssh_key.ds_key", "resource_crn"),
52+
// resource.TestCheckResourceAttrSet(
53+
// "data.ibm_is_ssh_key.ds_key", "resource_group"),
54+
resource.TestCheckResourceAttrSet(
55+
"data.ibm_is_ssh_key.ds_key", "resource_group_name"),
56+
resource.TestCheckResourceAttrSet(
57+
"data.ibm_is_ssh_key.ds_key", "resource_name"),
4458
resource.TestCheckResourceAttrSet(
4559
"data.ibm_is_ssh_key.ds_key", "tags.#"),
4660
resource.TestCheckResourceAttr(

ibm/service/vpc/data_source_ibm_is_ssh_keys.go

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,9 @@ func DataSourceIBMIsSshKeys() *schema.Resource {
133133
func dataSourceIBMIsSshKeysRead(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
134134
vpcClient, err := meta.(conns.ClientSession).VpcV1API()
135135
if err != nil {
136-
return diag.FromErr(err)
136+
tfErr := flex.DiscriminatedTerraformErrorf(err, err.Error(), "(Data) ibm_is_ssh_keys", "read", "initialize-client")
137+
log.Printf("[DEBUG]\n%s", tfErr.GetDebugMessage())
138+
return tfErr.GetDiag()
137139
}
138140

139141
start := ""
@@ -145,10 +147,11 @@ func dataSourceIBMIsSshKeysRead(context context.Context, d *schema.ResourceData,
145147
listKeysOptions.Start = &start
146148
}
147149

148-
keyCollection, response, err := vpcClient.ListKeysWithContext(context, listKeysOptions)
149-
if err != nil || keyCollection == nil {
150-
log.Printf("[DEBUG] ListKeysWithContext failed %s\n%s", err, response)
151-
return diag.FromErr(fmt.Errorf("ListKeysWithContext failed %s\n%s", err, response))
150+
keyCollection, _, err := vpcClient.ListKeysWithContext(context, listKeysOptions)
151+
if err != nil {
152+
tfErr := flex.TerraformErrorf(err, fmt.Sprintf("ListKeysWithContext failed %s", err), "(Data) ibm_is_ssh_keys", "read")
153+
log.Printf("[DEBUG] %s", tfErr.GetDebugMessage())
154+
return tfErr.GetDiag()
152155
}
153156

154157
start = flex.GetNext(keyCollection.Next)
@@ -163,7 +166,7 @@ func dataSourceIBMIsSshKeysRead(context context.Context, d *schema.ResourceData,
163166
d.SetId(dataSourceIBMIsSshKeysID(d))
164167
err = d.Set(isKeys, dataSourceKeyCollectionFlattenKeys(allrecs, d, meta))
165168
if err != nil {
166-
return diag.FromErr(fmt.Errorf("Error setting keys %s", err))
169+
return flex.DiscriminatedTerraformErrorf(err, fmt.Sprintf("Error setting keys %s", err), "(Data) ibm_is_ssh_keys", "read", "keys-set").GetDiag()
167170
}
168171

169172
return nil

ibm/service/vpc/data_source_ibm_is_ssh_keys_test.go

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,54 @@ func TestAccIBMIsSshKeysDataSourceBasic(t *testing.T) {
2828
},
2929
})
3030
}
31+
func TestAccIBMIsSshKeysDataSourceComprehensive(t *testing.T) {
32+
name1 := fmt.Sprintf("tfssh-name-%d", acctest.RandIntRange(10, 100))
33+
publicKey := strings.TrimSpace(`
34+
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCKVmnMOlHKcZK8tpt3MP1lqOLAcqcJzhsvJcjscgVERRN7/9484SOBJ3HSKxxNG5JN8owAjy5f9yYwcUg+JaUVuytn5Pv3aeYROHGGg+5G346xaq3DAwX6Y5ykr2fvjObgncQBnuU5KHWCECO/4h8uWuwh/kfniXPVjFToc+gnkqA+3RKpAecZhFXwfalQ9mMuYGFxn+fwn8cYEApsJbsEmb0iJwPiZ5hjFC8wREuiTlhPHDgkBLOiycd20op2nXzDbHfCHInquEe/gYxEitALONxm0swBOwJZwlTDOB7C6y2dzlrtxr1L59m7pCkWI4EtTRLvleehBoj3u7jB4usR
35+
`)
36+
resource.Test(t, resource.TestCase{
37+
PreCheck: func() { acc.TestAccPreCheck(t) },
38+
Providers: acc.TestAccProviders,
39+
Steps: []resource.TestStep{
40+
{
41+
Config: testAccCheckIBMIsSshKeysDataSourceConfigComprehensive(publicKey, name1),
42+
Check: resource.ComposeTestCheckFunc(
43+
resource.TestCheckResourceAttr(
44+
"ibm_is_ssh_key.key", "name", name1),
45+
resource.TestCheckResourceAttr(
46+
"ibm_is_ssh_key.key", "tags.#", "3"),
47+
resource.TestCheckResourceAttrSet("data.ibm_is_ssh_keys.is_ssh_keys", "id"),
48+
resource.TestCheckResourceAttrSet("data.ibm_is_ssh_keys.is_ssh_keys", "keys.#"),
49+
// Check all fields in the first key in the list
50+
resource.TestCheckResourceAttrSet("data.ibm_is_ssh_keys.is_ssh_keys", "keys.0.id"),
51+
resource.TestCheckResourceAttrSet("data.ibm_is_ssh_keys.is_ssh_keys", "keys.0.name"),
52+
resource.TestCheckResourceAttrSet("data.ibm_is_ssh_keys.is_ssh_keys", "keys.0.crn"),
53+
resource.TestCheckResourceAttrSet("data.ibm_is_ssh_keys.is_ssh_keys", "keys.0.fingerprint"),
54+
resource.TestCheckResourceAttrSet("data.ibm_is_ssh_keys.is_ssh_keys", "keys.0.length"),
55+
resource.TestCheckResourceAttrSet("data.ibm_is_ssh_keys.is_ssh_keys", "keys.0.type"),
56+
resource.TestCheckResourceAttrSet("data.ibm_is_ssh_keys.is_ssh_keys", "keys.0.public_key"),
57+
resource.TestCheckResourceAttrSet("data.ibm_is_ssh_keys.is_ssh_keys", "keys.0.created_at"),
58+
resource.TestCheckResourceAttrSet("data.ibm_is_ssh_keys.is_ssh_keys", "keys.0.href"),
59+
resource.TestCheckResourceAttrSet("data.ibm_is_ssh_keys.is_ssh_keys", "keys.0.resource_group.0.id"),
60+
resource.TestCheckResourceAttrSet("data.ibm_is_ssh_keys.is_ssh_keys", "keys.0.resource_group.0.name"),
61+
resource.TestCheckResourceAttrSet("data.ibm_is_ssh_keys.is_ssh_keys", "keys.0.resource_group.0.href"),
62+
),
63+
},
64+
},
65+
})
66+
}
67+
func testAccCheckIBMIsSshKeysDataSourceConfigComprehensive(publicKey, name1 string) string {
68+
return fmt.Sprintf(`
69+
resource "ibm_is_ssh_key" "key" {
70+
name = "%s"
71+
public_key = "%s"
72+
tags = ["test:1", "test:2", "test:3"]
73+
}
74+
data "ibm_is_ssh_keys" "is_ssh_keys" {
75+
depends_on = [ibm_is_ssh_key.key]
76+
}
77+
`, name1, publicKey)
78+
}
3179
func TestAccIBMIsSshKeysDataSourceTags(t *testing.T) {
3280
name1 := fmt.Sprintf("tfssh-name-%d", acctest.RandIntRange(10, 100))
3381
publicKey := strings.TrimSpace(`

0 commit comments

Comments
 (0)