github.com/danp/terraform@v0.9.5-0.20170426144147-39d740081351/builtin/providers/rundeck/resource_private_key.go (about) 1 package rundeck 2 3 import ( 4 "crypto/sha1" 5 "encoding/hex" 6 7 "github.com/hashicorp/terraform/helper/schema" 8 9 "github.com/apparentlymart/go-rundeck-api/rundeck" 10 ) 11 12 func resourceRundeckPrivateKey() *schema.Resource { 13 return &schema.Resource{ 14 Create: CreateOrUpdatePrivateKey, 15 Update: CreateOrUpdatePrivateKey, 16 Delete: DeletePrivateKey, 17 Exists: PrivateKeyExists, 18 Read: ReadPrivateKey, 19 20 Schema: map[string]*schema.Schema{ 21 "path": &schema.Schema{ 22 Type: schema.TypeString, 23 Required: true, 24 Description: "Path to the key within the key store", 25 ForceNew: true, 26 }, 27 28 "key_material": &schema.Schema{ 29 Type: schema.TypeString, 30 Required: true, 31 Description: "The private key material to store, in PEM format", 32 StateFunc: func(v interface{}) string { 33 switch v.(type) { 34 case string: 35 hash := sha1.Sum([]byte(v.(string))) 36 return hex.EncodeToString(hash[:]) 37 default: 38 return "" 39 } 40 }, 41 }, 42 }, 43 } 44 } 45 46 func CreateOrUpdatePrivateKey(d *schema.ResourceData, meta interface{}) error { 47 client := meta.(*rundeck.Client) 48 49 path := d.Get("path").(string) 50 keyMaterial := d.Get("key_material").(string) 51 52 var err error 53 54 if d.Id() != "" { 55 err = client.ReplacePrivateKey(path, keyMaterial) 56 } else { 57 err = client.CreatePrivateKey(path, keyMaterial) 58 } 59 60 if err != nil { 61 return err 62 } 63 64 d.SetId(path) 65 66 return ReadPrivateKey(d, meta) 67 } 68 69 func DeletePrivateKey(d *schema.ResourceData, meta interface{}) error { 70 client := meta.(*rundeck.Client) 71 72 path := d.Id() 73 74 // The only "delete" call we have is oblivious to key type, but 75 // that's okay since our Exists implementation makes sure that we 76 // won't try to delete a key of the wrong type since we'll pretend 77 // that it's already been deleted. 78 err := client.DeleteKey(path) 79 if err != nil { 80 return err 81 } 82 83 d.SetId("") 84 return nil 85 } 86 87 func ReadPrivateKey(d *schema.ResourceData, meta interface{}) error { 88 // Nothing to read for a private key: existence is all we need to 89 // worry about, and PrivateKeyExists took care of that. 90 return nil 91 } 92 93 func PrivateKeyExists(d *schema.ResourceData, meta interface{}) (bool, error) { 94 client := meta.(*rundeck.Client) 95 96 path := d.Id() 97 98 key, err := client.GetKeyMeta(path) 99 if err != nil { 100 if _, ok := err.(rundeck.NotFoundError); ok { 101 err = nil 102 } 103 return false, err 104 } 105 106 if key.KeyType != "private" { 107 // If the key type isn't public then as far as this resource is 108 // concerned it doesn't exist. (We'll fail properly when we try to 109 // create a key where one already exists.) 110 return false, nil 111 } 112 113 return true, nil 114 }