github.com/koding/terraform@v0.6.4-0.20170608090606-5d7e0339779d/builtin/providers/digitalocean/resource_digitalocean_volume.go (about) 1 package digitalocean 2 3 import ( 4 "context" 5 "fmt" 6 "log" 7 8 "github.com/digitalocean/godo" 9 "github.com/hashicorp/terraform/helper/schema" 10 ) 11 12 func resourceDigitalOceanVolume() *schema.Resource { 13 return &schema.Resource{ 14 Create: resourceDigitalOceanVolumeCreate, 15 Read: resourceDigitalOceanVolumeRead, 16 Delete: resourceDigitalOceanVolumeDelete, 17 Importer: &schema.ResourceImporter{ 18 State: resourceDigitalOceanVolumeImport, 19 }, 20 21 Schema: map[string]*schema.Schema{ 22 "region": { 23 Type: schema.TypeString, 24 Required: true, 25 ForceNew: true, 26 }, 27 28 "id": { 29 Type: schema.TypeString, 30 Computed: true, 31 }, 32 33 "name": { 34 Type: schema.TypeString, 35 Required: true, 36 ForceNew: true, 37 }, 38 39 "droplet_ids": { 40 Type: schema.TypeSet, 41 Elem: &schema.Schema{Type: schema.TypeInt}, 42 Computed: true, 43 }, 44 45 "size": { 46 Type: schema.TypeInt, 47 Required: true, 48 ForceNew: true, // Update-ability Coming Soon ™ 49 }, 50 51 "description": { 52 Type: schema.TypeString, 53 Optional: true, 54 ForceNew: true, // Update-ability Coming Soon ™ 55 }, 56 }, 57 } 58 } 59 60 func resourceDigitalOceanVolumeCreate(d *schema.ResourceData, meta interface{}) error { 61 client := meta.(*godo.Client) 62 63 opts := &godo.VolumeCreateRequest{ 64 Region: d.Get("region").(string), 65 Name: d.Get("name").(string), 66 Description: d.Get("description").(string), 67 SizeGigaBytes: int64(d.Get("size").(int)), 68 } 69 70 log.Printf("[DEBUG] Volume create configuration: %#v", opts) 71 volume, _, err := client.Storage.CreateVolume(context.Background(), opts) 72 if err != nil { 73 return fmt.Errorf("Error creating Volume: %s", err) 74 } 75 76 d.SetId(volume.ID) 77 log.Printf("[INFO] Volume name: %s", volume.Name) 78 79 return resourceDigitalOceanVolumeRead(d, meta) 80 } 81 82 func resourceDigitalOceanVolumeRead(d *schema.ResourceData, meta interface{}) error { 83 client := meta.(*godo.Client) 84 85 volume, resp, err := client.Storage.GetVolume(context.Background(), d.Id()) 86 if err != nil { 87 // If the volume is somehow already destroyed, mark as 88 // successfully gone 89 if resp.StatusCode == 404 { 90 d.SetId("") 91 return nil 92 } 93 94 return fmt.Errorf("Error retrieving volume: %s", err) 95 } 96 97 d.Set("id", volume.ID) 98 99 dids := make([]interface{}, 0, len(volume.DropletIDs)) 100 for _, did := range volume.DropletIDs { 101 dids = append(dids, did) 102 } 103 d.Set("droplet_ids", schema.NewSet( 104 func(dropletID interface{}) int { return dropletID.(int) }, 105 dids, 106 )) 107 108 return nil 109 } 110 111 func resourceDigitalOceanVolumeDelete(d *schema.ResourceData, meta interface{}) error { 112 client := meta.(*godo.Client) 113 114 log.Printf("[INFO] Deleting volume: %s", d.Id()) 115 _, err := client.Storage.DeleteVolume(context.Background(), d.Id()) 116 if err != nil { 117 return fmt.Errorf("Error deleting volume: %s", err) 118 } 119 120 d.SetId("") 121 return nil 122 } 123 124 func resourceDigitalOceanVolumeImport(rs *schema.ResourceData, v interface{}) ([]*schema.ResourceData, error) { 125 client := v.(*godo.Client) 126 volume, _, err := client.Storage.GetVolume(context.Background(), rs.Id()) 127 if err != nil { 128 return nil, err 129 } 130 131 rs.Set("id", volume.ID) 132 rs.Set("name", volume.Name) 133 rs.Set("region", volume.Region.Slug) 134 rs.Set("description", volume.Description) 135 rs.Set("size", int(volume.SizeGigaBytes)) 136 137 dids := make([]interface{}, 0, len(volume.DropletIDs)) 138 for _, did := range volume.DropletIDs { 139 dids = append(dids, did) 140 } 141 rs.Set("droplet_ids", schema.NewSet( 142 func(dropletID interface{}) int { return dropletID.(int) }, 143 dids, 144 )) 145 146 return []*schema.ResourceData{rs}, nil 147 }