From b99611fa44b7cce4eed37393358d44819c24d848 Mon Sep 17 00:00:00 2001 From: Paul Hinze Date: Thu, 30 Apr 2015 07:26:17 -0500 Subject: [PATCH] provider/aws: allow key_pair name to be generated As a module author, I'd like to be able to create a module that includes a key_pair. I don't care about the name, I only know I don't want it to collide with anything else in the account. This allows my module to be used multiple times in the same account without having to do anything funky like adding a user-specified unique name parameter. --- .../providers/aws/resource_aws_key_pair.go | 7 +++- .../aws/resource_aws_key_pair_test.go | 35 +++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/builtin/providers/aws/resource_aws_key_pair.go b/builtin/providers/aws/resource_aws_key_pair.go index 86e65421c65d..b9c406467506 100644 --- a/builtin/providers/aws/resource_aws_key_pair.go +++ b/builtin/providers/aws/resource_aws_key_pair.go @@ -3,6 +3,7 @@ package aws import ( "fmt" + "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/helper/schema" "github.com/awslabs/aws-sdk-go/aws" @@ -19,7 +20,8 @@ func resourceAwsKeyPair() *schema.Resource { Schema: map[string]*schema.Schema{ "key_name": &schema.Schema{ Type: schema.TypeString, - Required: true, + Optional: true, + Computed: true, ForceNew: true, }, "public_key": &schema.Schema{ @@ -39,6 +41,9 @@ func resourceAwsKeyPairCreate(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).ec2conn keyName := d.Get("key_name").(string) + if keyName == "" { + keyName = resource.UniqueId() + } publicKey := d.Get("public_key").(string) req := &ec2.ImportKeyPairInput{ KeyName: aws.String(keyName), diff --git a/builtin/providers/aws/resource_aws_key_pair_test.go b/builtin/providers/aws/resource_aws_key_pair_test.go index 33b4351c5ece..62c1b57cf068 100644 --- a/builtin/providers/aws/resource_aws_key_pair_test.go +++ b/builtin/providers/aws/resource_aws_key_pair_test.go @@ -2,6 +2,7 @@ package aws import ( "fmt" + "strings" "testing" "github.com/awslabs/aws-sdk-go/aws" @@ -29,6 +30,34 @@ func TestAccAWSKeyPair_normal(t *testing.T) { }) } +func TestAccAWSKeyPair_generatedName(t *testing.T) { + var conf ec2.KeyPairInfo + + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckAWSKeyPairDestroy, + Steps: []resource.TestStep{ + resource.TestStep{ + Config: testAccAWSKeyPairConfig_generatedName, + Check: resource.ComposeTestCheckFunc( + testAccCheckAWSKeyPairExists("aws_key_pair.a_key_pair", &conf), + testAccCheckAWSKeyPairFingerprint("d7:ff:a6:63:18:64:9c:57:a1:ee:ca:a4:ad:c2:81:62", &conf), + func(s *terraform.State) error { + if conf.KeyName == nil { + return fmt.Errorf("bad: No SG name") + } + if !strings.HasPrefix(*conf.KeyName, "terraform-") { + return fmt.Errorf("No terraform- prefix: %s", *conf.KeyName) + } + return nil + }, + ), + }, + }, + }) +} + func testAccCheckAWSKeyPairDestroy(s *terraform.State) error { ec2conn := testAccProvider.Meta().(*AWSClient).ec2conn @@ -106,3 +135,9 @@ resource "aws_key_pair" "a_key_pair" { public_key = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD3F6tyPEFEzV0LX3X8BsXdMsQz1x2cEikKDEY0aIj41qgxMCP/iteneqXSIFZBp5vizPvaoIR3Um9xK7PGoW8giupGn+EPuxIA4cDM4vzOqOkiMPhz5XK0whEjkVzTo4+S0puvDZuwIsdiW9mxhJc7tgBNL0cYlWSYVkz4G/fslNfRPW5mYAM49f4fhtxPb5ok4Q2Lg9dPKVHO/Bgeu5woMc7RY0p1ej6D4CKFE6lymSDJpW0YHX/wqE9+cfEauh7xZcG0q9t2ta6F6fmX0agvpFyZo8aFbXeUBr7osSCJNgvavWbM/06niWrOvYX2xwWdhXmXSrbX8ZbabVohBK41 phodgson@thoughtworks.com" } ` + +const testAccAWSKeyPairConfig_generatedName = ` +resource "aws_key_pair" "a_key_pair" { + public_key = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD3F6tyPEFEzV0LX3X8BsXdMsQz1x2cEikKDEY0aIj41qgxMCP/iteneqXSIFZBp5vizPvaoIR3Um9xK7PGoW8giupGn+EPuxIA4cDM4vzOqOkiMPhz5XK0whEjkVzTo4+S0puvDZuwIsdiW9mxhJc7tgBNL0cYlWSYVkz4G/fslNfRPW5mYAM49f4fhtxPb5ok4Q2Lg9dPKVHO/Bgeu5woMc7RY0p1ej6D4CKFE6lymSDJpW0YHX/wqE9+cfEauh7xZcG0q9t2ta6F6fmX0agvpFyZo8aFbXeUBr7osSCJNgvavWbM/06niWrOvYX2xwWdhXmXSrbX8ZbabVohBK41 phodgson@thoughtworks.com" +} +`