github.com/ves/terraform@v0.8.0-beta2/builtin/providers/aws/resource_aws_key_pair.go (about) 1 package aws 2 3 import ( 4 "fmt" 5 "strings" 6 7 "github.com/hashicorp/terraform/helper/resource" 8 "github.com/hashicorp/terraform/helper/schema" 9 10 "github.com/aws/aws-sdk-go/aws" 11 "github.com/aws/aws-sdk-go/aws/awserr" 12 "github.com/aws/aws-sdk-go/service/ec2" 13 ) 14 15 func resourceAwsKeyPair() *schema.Resource { 16 return &schema.Resource{ 17 Create: resourceAwsKeyPairCreate, 18 Read: resourceAwsKeyPairRead, 19 Update: nil, 20 Delete: resourceAwsKeyPairDelete, 21 Importer: &schema.ResourceImporter{ 22 State: schema.ImportStatePassthrough, 23 }, 24 25 SchemaVersion: 1, 26 MigrateState: resourceAwsKeyPairMigrateState, 27 28 Schema: map[string]*schema.Schema{ 29 "key_name": &schema.Schema{ 30 Type: schema.TypeString, 31 Optional: true, 32 Computed: true, 33 ForceNew: true, 34 ConflictsWith: []string{"key_name_prefix"}, 35 }, 36 "key_name_prefix": &schema.Schema{ 37 Type: schema.TypeString, 38 Optional: true, 39 ForceNew: true, 40 ValidateFunc: func(v interface{}, k string) (ws []string, errors []error) { 41 value := v.(string) 42 if len(value) > 100 { 43 errors = append(errors, fmt.Errorf( 44 "%q cannot be longer than 100 characters, name is limited to 255", k)) 45 } 46 return 47 }, 48 }, 49 "public_key": &schema.Schema{ 50 Type: schema.TypeString, 51 Required: true, 52 ForceNew: true, 53 StateFunc: func(v interface{}) string { 54 switch v.(type) { 55 case string: 56 return strings.TrimSpace(v.(string)) 57 default: 58 return "" 59 } 60 }, 61 }, 62 "fingerprint": &schema.Schema{ 63 Type: schema.TypeString, 64 Computed: true, 65 }, 66 }, 67 } 68 } 69 70 func resourceAwsKeyPairCreate(d *schema.ResourceData, meta interface{}) error { 71 conn := meta.(*AWSClient).ec2conn 72 73 var keyName string 74 if v, ok := d.GetOk("key_name"); ok { 75 keyName = v.(string) 76 } else if v, ok := d.GetOk("key_name_prefix"); ok { 77 keyName = resource.PrefixedUniqueId(v.(string)) 78 } else { 79 keyName = resource.UniqueId() 80 } 81 82 publicKey := d.Get("public_key").(string) 83 req := &ec2.ImportKeyPairInput{ 84 KeyName: aws.String(keyName), 85 PublicKeyMaterial: []byte(publicKey), 86 } 87 resp, err := conn.ImportKeyPair(req) 88 if err != nil { 89 return fmt.Errorf("Error import KeyPair: %s", err) 90 } 91 92 d.SetId(*resp.KeyName) 93 return nil 94 } 95 96 func resourceAwsKeyPairRead(d *schema.ResourceData, meta interface{}) error { 97 conn := meta.(*AWSClient).ec2conn 98 req := &ec2.DescribeKeyPairsInput{ 99 KeyNames: []*string{aws.String(d.Id())}, 100 } 101 resp, err := conn.DescribeKeyPairs(req) 102 if err != nil { 103 awsErr, ok := err.(awserr.Error) 104 if ok && awsErr.Code() == "InvalidKeyPair.NotFound" { 105 d.SetId("") 106 return nil 107 } 108 return fmt.Errorf("Error retrieving KeyPair: %s", err) 109 } 110 111 for _, keyPair := range resp.KeyPairs { 112 if *keyPair.KeyName == d.Id() { 113 d.Set("key_name", keyPair.KeyName) 114 d.Set("fingerprint", keyPair.KeyFingerprint) 115 return nil 116 } 117 } 118 119 return fmt.Errorf("Unable to find key pair within: %#v", resp.KeyPairs) 120 } 121 122 func resourceAwsKeyPairDelete(d *schema.ResourceData, meta interface{}) error { 123 conn := meta.(*AWSClient).ec2conn 124 125 _, err := conn.DeleteKeyPair(&ec2.DeleteKeyPairInput{ 126 KeyName: aws.String(d.Id()), 127 }) 128 return err 129 }