github.com/danp/terraform@v0.9.5-0.20170426144147-39d740081351/builtin/providers/opc/resource_storage_volume.go (about) 1 package opc 2 3 import ( 4 "fmt" 5 "strconv" 6 7 "github.com/hashicorp/go-oracle-terraform/compute" 8 "github.com/hashicorp/terraform/helper/schema" 9 "github.com/hashicorp/terraform/helper/validation" 10 ) 11 12 func resourceOPCStorageVolume() *schema.Resource { 13 return &schema.Resource{ 14 Create: resourceOPCStorageVolumeCreate, 15 Read: resourceOPCStorageVolumeRead, 16 Update: resourceOPCStorageVolumeUpdate, 17 Delete: resourceOPCStorageVolumeDelete, 18 Importer: &schema.ResourceImporter{ 19 State: schema.ImportStatePassthrough, 20 }, 21 22 Schema: map[string]*schema.Schema{ 23 "name": { 24 Type: schema.TypeString, 25 Required: true, 26 ForceNew: true, 27 }, 28 "description": { 29 Type: schema.TypeString, 30 Optional: true, 31 }, 32 "size": { 33 Type: schema.TypeInt, 34 Required: true, 35 ValidateFunc: validation.IntBetween(1, 2048), 36 }, 37 "storage_type": { 38 Type: schema.TypeString, 39 Optional: true, 40 ForceNew: true, 41 Default: compute.StorageVolumeKindDefault, 42 ValidateFunc: validation.StringInSlice([]string{ 43 string(compute.StorageVolumeKindDefault), 44 string(compute.StorageVolumeKindLatency), 45 }, true), 46 }, 47 48 "snapshot": { 49 Type: schema.TypeString, 50 Optional: true, 51 ForceNew: true, 52 Computed: true, 53 }, 54 55 "snapshot_id": { 56 Type: schema.TypeString, 57 Optional: true, 58 Computed: true, 59 ForceNew: true, 60 }, 61 62 "snapshot_account": { 63 Type: schema.TypeString, 64 Optional: true, 65 ForceNew: true, 66 }, 67 68 "bootable": { 69 Type: schema.TypeBool, 70 Optional: true, 71 Default: false, 72 ForceNew: true, 73 }, 74 75 "image_list": { 76 Type: schema.TypeString, 77 Optional: true, 78 ForceNew: true, 79 }, 80 81 "image_list_entry": { 82 Type: schema.TypeInt, 83 Optional: true, 84 ForceNew: true, 85 Default: -1, 86 }, 87 88 "tags": tagsOptionalSchema(), 89 90 // Computed fields 91 "hypervisor": { 92 Type: schema.TypeString, 93 Optional: true, 94 Computed: true, 95 }, 96 "machine_image": { 97 Type: schema.TypeString, 98 Optional: true, 99 Computed: true, 100 }, 101 "managed": { 102 Type: schema.TypeBool, 103 Optional: true, 104 Computed: true, 105 }, 106 "platform": { 107 Type: schema.TypeString, 108 Optional: true, 109 Computed: true, 110 }, 111 "readonly": { 112 Type: schema.TypeBool, 113 Optional: true, 114 Computed: true, 115 }, 116 "status": { 117 Type: schema.TypeString, 118 Optional: true, 119 Computed: true, 120 }, 121 "storage_pool": { 122 Type: schema.TypeString, 123 Optional: true, 124 Computed: true, 125 }, 126 "uri": { 127 Type: schema.TypeString, 128 Optional: true, 129 Computed: true, 130 }, 131 }, 132 } 133 } 134 135 func resourceOPCStorageVolumeCreate(d *schema.ResourceData, meta interface{}) error { 136 client := meta.(*compute.Client).StorageVolumes() 137 138 name := d.Get("name").(string) 139 description := d.Get("description").(string) 140 size := d.Get("size").(int) 141 storageType := d.Get("storage_type").(string) 142 bootable := d.Get("bootable").(bool) 143 imageList := d.Get("image_list").(string) 144 imageListEntry := d.Get("image_list_entry").(int) 145 146 if bootable == true { 147 if imageList == "" { 148 return fmt.Errorf("Error: A Bootable Volume must have an Image List!") 149 } 150 151 if imageListEntry == -1 { 152 return fmt.Errorf("Error: A Bootable Volume must have an Image List Entry!") 153 } 154 } 155 156 input := compute.CreateStorageVolumeInput{ 157 Name: name, 158 Description: description, 159 Size: strconv.Itoa(size), 160 Properties: []string{storageType}, 161 Bootable: bootable, 162 ImageList: imageList, 163 ImageListEntry: imageListEntry, 164 Tags: getStringList(d, "tags"), 165 } 166 167 if v, ok := d.GetOk("snapshot"); ok { 168 input.Snapshot = v.(string) 169 } 170 if v, ok := d.GetOk("snapshot_account"); ok { 171 input.SnapshotAccount = v.(string) 172 } 173 if v, ok := d.GetOk("snapshot_id"); ok { 174 input.SnapshotID = v.(string) 175 } 176 177 info, err := client.CreateStorageVolume(&input) 178 if err != nil { 179 return fmt.Errorf("Error creating storage volume %s: %s", name, err) 180 } 181 182 d.SetId(info.Name) 183 return resourceOPCStorageVolumeRead(d, meta) 184 } 185 186 func resourceOPCStorageVolumeUpdate(d *schema.ResourceData, meta interface{}) error { 187 client := meta.(*compute.Client).StorageVolumes() 188 189 name := d.Id() 190 description := d.Get("description").(string) 191 size := d.Get("size").(int) 192 storageType := d.Get("storage_type").(string) 193 imageList := d.Get("image_list").(string) 194 imageListEntry := d.Get("image_list_entry").(int) 195 196 input := compute.UpdateStorageVolumeInput{ 197 Name: name, 198 Description: description, 199 Size: strconv.Itoa(size), 200 Properties: []string{storageType}, 201 ImageList: imageList, 202 ImageListEntry: imageListEntry, 203 Tags: getStringList(d, "tags"), 204 } 205 _, err := client.UpdateStorageVolume(&input) 206 if err != nil { 207 return fmt.Errorf("Error updating storage volume %s: %s", name, err) 208 } 209 210 return resourceOPCStorageVolumeRead(d, meta) 211 } 212 213 func resourceOPCStorageVolumeRead(d *schema.ResourceData, meta interface{}) error { 214 sv := meta.(*compute.Client).StorageVolumes() 215 216 name := d.Id() 217 input := compute.GetStorageVolumeInput{ 218 Name: name, 219 } 220 result, err := sv.GetStorageVolume(&input) 221 if err != nil { 222 // Volume doesn't exist 223 if compute.WasNotFoundError(err) { 224 d.SetId("") 225 return nil 226 } 227 return fmt.Errorf("Error reading storage volume %s: %s", name, err) 228 } 229 230 if result == nil { 231 // Volume doesn't exist 232 d.SetId("") 233 return nil 234 } 235 236 d.Set("name", result.Name) 237 d.Set("description", result.Description) 238 d.Set("storage_type", result.Properties[0]) 239 size, err := strconv.Atoi(result.Size) 240 if err != nil { 241 return err 242 } 243 d.Set("size", size) 244 d.Set("bootable", result.Bootable) 245 d.Set("image_list", result.ImageList) 246 d.Set("image_list_entry", result.ImageListEntry) 247 248 d.Set("snapshot", result.Snapshot) 249 d.Set("snapshot_id", result.SnapshotID) 250 d.Set("snapshot_account", result.SnapshotAccount) 251 252 if err := setStringList(d, "tags", result.Tags); err != nil { 253 return err 254 } 255 256 flattenOPCStorageVolumeComputedFields(d, result) 257 258 return nil 259 } 260 261 func resourceOPCStorageVolumeDelete(d *schema.ResourceData, meta interface{}) error { 262 client := meta.(*compute.Client).StorageVolumes() 263 name := d.Id() 264 265 input := compute.DeleteStorageVolumeInput{ 266 Name: name, 267 } 268 err := client.DeleteStorageVolume(&input) 269 if err != nil { 270 return fmt.Errorf("Error deleting storage volume %s: %s", name, err) 271 } 272 273 return nil 274 } 275 276 func flattenOPCStorageVolumeComputedFields(d *schema.ResourceData, result *compute.StorageVolumeInfo) { 277 d.Set("hypervisor", result.Hypervisor) 278 d.Set("machine_image", result.MachineImage) 279 d.Set("managed", result.Managed) 280 d.Set("platform", result.Platform) 281 d.Set("readonly", result.ReadOnly) 282 d.Set("status", result.Status) 283 d.Set("storage_pool", result.StoragePool) 284 d.Set("uri", result.URI) 285 }