diff --git a/ibm/service/vpc/data_source_ibm_is_ssh_key.go b/ibm/service/vpc/data_source_ibm_is_ssh_key.go index de35dcfd67..a4e9d274e7 100644 --- a/ibm/service/vpc/data_source_ibm_is_ssh_key.go +++ b/ibm/service/vpc/data_source_ibm_is_ssh_key.go @@ -22,6 +22,12 @@ func DataSourceIBMISSSHKey() *schema.Resource { Optional: true, Description: "Resource group ID", }, + "id": { + Type: schema.TypeString, + Optional: true, + ExactlyOneOf: []string{"name", "id"}, + Description: "SSH key ID", + }, "tags": { Type: schema.TypeSet, @@ -32,9 +38,10 @@ func DataSourceIBMISSSHKey() *schema.Resource { }, isKeyName: { - Type: schema.TypeString, - Required: true, - Description: "The name of the ssh key", + Type: schema.TypeString, + Optional: true, + ExactlyOneOf: []string{"name", "id"}, + Description: "The name of the ssh key", }, // missing schema added "created_at": &schema.Schema{ @@ -113,81 +120,106 @@ func DataSourceIBMISSSHKey() *schema.Resource { } func dataSourceIBMISSSHKeyRead(d *schema.ResourceData, meta interface{}) error { - name := d.Get(isKeyName).(string) + name := "" + if nameOk, ok := d.GetOk(isKeyName); ok { + name = nameOk.(string) + } + id := "" + if idOk, ok := d.GetOk("id"); ok { + id = idOk.(string) + } - err := keyGetByName(d, meta, name) + err := keyGetByNameOrId(d, meta, name, id) if err != nil { return err } return nil } -func keyGetByName(d *schema.ResourceData, meta interface{}, name string) error { +func keyGetByNameOrId(d *schema.ResourceData, meta interface{}, name, id string) error { sess, err := vpcClient(meta) if err != nil { return err } - listKeysOptions := &vpcv1.ListKeysOptions{} + var key vpcv1.Key - start := "" - allrecs := []vpcv1.Key{} - for { - if start != "" { - listKeysOptions.Start = &start + if id != "" { + getKeyOptions := &vpcv1.GetKeyOptions{ + ID: &id, } - - keys, response, err := sess.ListKeys(listKeysOptions) + keyintf, response, err := sess.GetKey(getKeyOptions) if err != nil { - return fmt.Errorf("[ERROR] Error fetching Keys %s\n%s", err, response) - } - start = flex.GetNext(keys.Next) - allrecs = append(allrecs, keys.Keys...) - if start == "" { - break + return fmt.Errorf("[ERROR] Error GetKey %s\n%s", err, response) } - } + key = *keyintf - for _, key := range allrecs { - if *key.Name == name { - d.SetId(*key.ID) - d.Set("name", *key.Name) - d.Set(isKeyType, *key.Type) - d.Set(isKeyFingerprint, *key.Fingerprint) - d.Set(isKeyLength, *key.Length) - controller, err := flex.GetBaseController(meta) - if err != nil { - return err - } - if err = d.Set("created_at", flex.DateTimeToString(key.CreatedAt)); err != nil { - return err - } - if err = d.Set("href", key.Href); err != nil { - return err - } - d.Set(flex.ResourceControllerURL, controller+"/vpc/compute/sshKeys") - d.Set(flex.ResourceName, *key.Name) - d.Set(flex.ResourceCRN, *key.CRN) - d.Set(IsKeyCRN, *key.CRN) - if key.ResourceGroup != nil { - d.Set(flex.ResourceGroupName, *key.ResourceGroup.ID) - } - if key.PublicKey != nil { - d.Set(isKeyPublicKey, *key.PublicKey) + } else { + listKeysOptions := &vpcv1.ListKeysOptions{} + + start := "" + allrecs := []vpcv1.Key{} + for { + if start != "" { + listKeysOptions.Start = &start } - tags, err := flex.GetGlobalTagsUsingCRN(meta, *key.CRN, "", isUserTagType) + + keys, response, err := sess.ListKeys(listKeysOptions) if err != nil { - log.Printf( - "Error on get of resource vpc ssh key (%s) tags: %s", d.Id(), err) + return fmt.Errorf("[ERROR] Error fetching Keys %s\n%s", err, response) } - d.Set("tags", tags) - accesstags, err := flex.GetGlobalTagsUsingCRN(meta, *key.CRN, "", isKeyAccessTagType) - if err != nil { - log.Printf( - "Error on get of resource SSH Key (%s) access tags: %s", d.Id(), err) + start = flex.GetNext(keys.Next) + allrecs = append(allrecs, keys.Keys...) + if start == "" { + break + } + } + found := false + for _, keyintf := range allrecs { + if *keyintf.Name == name { + key = keyintf + found = true } - d.Set(isKeyAccessTags, accesstags) - return nil } + if !found { + return fmt.Errorf("[ERROR] No SSH Key found with name %s", name) + } + } + d.SetId(*key.ID) + d.Set("name", *key.Name) + d.Set(isKeyType, *key.Type) + d.Set(isKeyFingerprint, *key.Fingerprint) + d.Set(isKeyLength, *key.Length) + controller, err := flex.GetBaseController(meta) + if err != nil { + return err + } + if err = d.Set("created_at", flex.DateTimeToString(key.CreatedAt)); err != nil { + return err + } + if err = d.Set("href", key.Href); err != nil { + return err + } + d.Set(flex.ResourceControllerURL, controller+"/vpc/compute/sshKeys") + d.Set(flex.ResourceName, *key.Name) + d.Set(flex.ResourceCRN, *key.CRN) + d.Set(IsKeyCRN, *key.CRN) + if key.ResourceGroup != nil { + d.Set(flex.ResourceGroupName, *key.ResourceGroup.ID) + } + if key.PublicKey != nil { + d.Set(isKeyPublicKey, *key.PublicKey) + } + tags, err := flex.GetGlobalTagsUsingCRN(meta, *key.CRN, "", isUserTagType) + if err != nil { + log.Printf( + "Error on get of resource vpc ssh key (%s) tags: %s", d.Id(), err) + } + d.Set("tags", tags) + accesstags, err := flex.GetGlobalTagsUsingCRN(meta, *key.CRN, "", isKeyAccessTagType) + if err != nil { + log.Printf( + "Error on get of resource SSH Key (%s) access tags: %s", d.Id(), err) } - return fmt.Errorf("[ERROR] No SSH Key found with name %s", name) + d.Set(isKeyAccessTags, accesstags) + return nil } diff --git a/ibm/service/vpc/data_source_ibm_is_ssh_key_test.go b/ibm/service/vpc/data_source_ibm_is_ssh_key_test.go index afe68c7b5f..27b39d2143 100644 --- a/ibm/service/vpc/data_source_ibm_is_ssh_key_test.go +++ b/ibm/service/vpc/data_source_ibm_is_ssh_key_test.go @@ -50,6 +50,60 @@ ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCKVmnMOlHKcZK8tpt3MP1lqOLAcqcJzhsvJcjscgVE }, }) } +func TestAccIBMISSSHKeyDatasource_basicidname(t *testing.T) { + name1 := fmt.Sprintf("tfssh-name-%d", acctest.RandIntRange(10, 100)) + publicKey := strings.TrimSpace(` +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCKVmnMOlHKcZK8tpt3MP1lqOLAcqcJzhsvJcjscgVERRN7/9484SOBJ3HSKxxNG5JN8owAjy5f9yYwcUg+JaUVuytn5Pv3aeYROHGGg+5G346xaq3DAwX6Y5ykr2fvjObgncQBnuU5KHWCECO/4h8uWuwh/kfniXPVjFToc+gnkqA+3RKpAecZhFXwfalQ9mMuYGFxn+fwn8cYEApsJbsEmb0iJwPiZ5hjFC8wREuiTlhPHDgkBLOiycd20op2nXzDbHfCHInquEe/gYxEitALONxm0swBOwJZwlTDOB7C6y2dzlrtxr1L59m7pCkWI4EtTRLvleehBoj3u7jB4usR +`) + + resource.Test(t, resource.TestCase{ + PreCheck: func() { acc.TestAccPreCheck(t) }, + Providers: acc.TestAccProviders, + Steps: []resource.TestStep{ + { + Config: testDSCheckIBMISSSHKeyIdNameConfig(publicKey, name1), + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttr( + "data.ibm_is_ssh_key.ds_key", "name", name1), + resource.TestCheckResourceAttrSet( + "data.ibm_is_ssh_key.ds_key", "crn"), + resource.TestCheckResourceAttrSet( + "data.ibm_is_ssh_key.ds_key", "fingerprint"), + resource.TestCheckResourceAttrSet( + "data.ibm_is_ssh_key.ds_key", "id"), + resource.TestCheckResourceAttrSet( + "data.ibm_is_ssh_key.ds_key", "length"), + resource.TestCheckResourceAttrSet( + "data.ibm_is_ssh_key.ds_key", "public_key"), + resource.TestCheckResourceAttrSet( + "data.ibm_is_ssh_key.ds_key", "type"), + resource.TestCheckResourceAttrSet( + "data.ibm_is_ssh_key.ds_key", "tags.#"), + resource.TestCheckResourceAttr( + "data.ibm_is_ssh_key.ds_key", "tags.#", "3"), + resource.TestCheckResourceAttr( + "data.ibm_is_ssh_key.ds_key_id", "name", name1), + resource.TestCheckResourceAttrSet( + "data.ibm_is_ssh_key.ds_key_id", "crn"), + resource.TestCheckResourceAttrSet( + "data.ibm_is_ssh_key.ds_key_id", "fingerprint"), + resource.TestCheckResourceAttrSet( + "data.ibm_is_ssh_key.ds_key_id", "id"), + resource.TestCheckResourceAttrSet( + "data.ibm_is_ssh_key.ds_key_id", "length"), + resource.TestCheckResourceAttrSet( + "data.ibm_is_ssh_key.ds_key_id", "public_key"), + resource.TestCheckResourceAttrSet( + "data.ibm_is_ssh_key.ds_key_id", "type"), + resource.TestCheckResourceAttrSet( + "data.ibm_is_ssh_key.ds_key_id", "tags.#"), + resource.TestCheckResourceAttr( + "data.ibm_is_ssh_key.ds_key_id", "tags.#", "3"), + ), + }, + }, + }) +} func TestAccIBMISSSHKeyDatasource_CreatedAtHref(t *testing.T) { name1 := fmt.Sprintf("tfssh-name-%d", acctest.RandIntRange(10, 100)) @@ -103,3 +157,19 @@ func testDSCheckIBMISSSHKeyConfig(publicKey, name string) string { name = "${ibm_is_ssh_key.key.name}" }`, name, publicKey) } +func testDSCheckIBMISSSHKeyIdNameConfig(publicKey, name string) string { + return fmt.Sprintf(` + resource "ibm_is_ssh_key" "key" { + name = "%s" + public_key = "%s" + tags = ["test:1", "test:2", "test:3"] + } + data "ibm_is_ssh_key" "ds_key" { + name = "${ibm_is_ssh_key.key.name}" + } + data "ibm_is_ssh_key" "ds_key_id" { + id = "${ibm_is_ssh_key.key.id}" + } + + `, name, publicKey) +} diff --git a/website/docs/d/is_ssh_key.html.markdown b/website/docs/d/is_ssh_key.html.markdown index 37ee0591cc..f6bc009316 100644 --- a/website/docs/d/is_ssh_key.html.markdown +++ b/website/docs/d/is_ssh_key.html.markdown @@ -33,7 +33,8 @@ data "ibm_is_ssh_key" "example" { ## Argument reference Review the argument references that you can specify for your data source. -- `name` - (Required, String) The name of the SSH key. +- `id` - (Optional, String) The id of the SSH key. {Exactly one of `id` or `name` is required} +- `name` - (Optional, String) The name of the SSH key. {Exactly one of `id` or `name` is required} ## Attribute reference In addition to all argument reference list, you can access the following attribute references after your data source is created.