github.com/memsql/terraform@v0.7.0-rc2.0.20160706152241-21e2173e0a32/builtin/providers/digitalocean/resource_digitalocean_ssh_key.go (about) 1 package digitalocean 2 3 import ( 4 "fmt" 5 "log" 6 "strconv" 7 8 "github.com/digitalocean/godo" 9 "github.com/hashicorp/terraform/helper/schema" 10 ) 11 12 func resourceDigitalOceanSSHKey() *schema.Resource { 13 return &schema.Resource{ 14 Create: resourceDigitalOceanSSHKeyCreate, 15 Read: resourceDigitalOceanSSHKeyRead, 16 Update: resourceDigitalOceanSSHKeyUpdate, 17 Delete: resourceDigitalOceanSSHKeyDelete, 18 Importer: &schema.ResourceImporter{ 19 State: schema.ImportStatePassthrough, 20 }, 21 22 Schema: map[string]*schema.Schema{ 23 "id": &schema.Schema{ 24 Type: schema.TypeString, 25 Computed: true, 26 }, 27 28 "name": &schema.Schema{ 29 Type: schema.TypeString, 30 Required: true, 31 }, 32 33 "public_key": &schema.Schema{ 34 Type: schema.TypeString, 35 Required: true, 36 ForceNew: true, 37 }, 38 39 "fingerprint": &schema.Schema{ 40 Type: schema.TypeString, 41 Computed: true, 42 }, 43 }, 44 } 45 } 46 47 func resourceDigitalOceanSSHKeyCreate(d *schema.ResourceData, meta interface{}) error { 48 client := meta.(*godo.Client) 49 50 // Build up our creation options 51 opts := &godo.KeyCreateRequest{ 52 Name: d.Get("name").(string), 53 PublicKey: d.Get("public_key").(string), 54 } 55 56 log.Printf("[DEBUG] SSH Key create configuration: %#v", opts) 57 key, _, err := client.Keys.Create(opts) 58 if err != nil { 59 return fmt.Errorf("Error creating SSH Key: %s", err) 60 } 61 62 d.SetId(strconv.Itoa(key.ID)) 63 log.Printf("[INFO] SSH Key: %d", key.ID) 64 65 return resourceDigitalOceanSSHKeyRead(d, meta) 66 } 67 68 func resourceDigitalOceanSSHKeyRead(d *schema.ResourceData, meta interface{}) error { 69 client := meta.(*godo.Client) 70 71 id, err := strconv.Atoi(d.Id()) 72 if err != nil { 73 return fmt.Errorf("invalid SSH key id: %v", err) 74 } 75 76 key, resp, err := client.Keys.GetByID(id) 77 if err != nil { 78 // If the key is somehow already destroyed, mark as 79 // successfully gone 80 if resp != nil && resp.StatusCode == 404 { 81 d.SetId("") 82 return nil 83 } 84 85 return fmt.Errorf("Error retrieving SSH key: %s", err) 86 } 87 88 d.Set("name", key.Name) 89 d.Set("fingerprint", key.Fingerprint) 90 d.Set("public_key", key.PublicKey) 91 92 return nil 93 } 94 95 func resourceDigitalOceanSSHKeyUpdate(d *schema.ResourceData, meta interface{}) error { 96 client := meta.(*godo.Client) 97 98 id, err := strconv.Atoi(d.Id()) 99 if err != nil { 100 return fmt.Errorf("invalid SSH key id: %v", err) 101 } 102 103 var newName string 104 if v, ok := d.GetOk("name"); ok { 105 newName = v.(string) 106 } 107 108 log.Printf("[DEBUG] SSH key update name: %#v", newName) 109 opts := &godo.KeyUpdateRequest{ 110 Name: newName, 111 } 112 _, _, err = client.Keys.UpdateByID(id, opts) 113 if err != nil { 114 return fmt.Errorf("Failed to update SSH key: %s", err) 115 } 116 117 return resourceDigitalOceanSSHKeyRead(d, meta) 118 } 119 120 func resourceDigitalOceanSSHKeyDelete(d *schema.ResourceData, meta interface{}) error { 121 client := meta.(*godo.Client) 122 123 id, err := strconv.Atoi(d.Id()) 124 if err != nil { 125 return fmt.Errorf("invalid SSH key id: %v", err) 126 } 127 128 log.Printf("[INFO] Deleting SSH key: %d", id) 129 _, err = client.Keys.DeleteByID(id) 130 if err != nil { 131 return fmt.Errorf("Error deleting SSH key: %s", err) 132 } 133 134 d.SetId("") 135 return nil 136 }