github.com/i0n/terraform@v0.4.3-0.20150506151324-010a39a58ec1/builtin/providers/aws/resource_aws_ebs_volume.go (about) 1 package aws 2 3 import ( 4 "fmt" 5 6 "github.com/awslabs/aws-sdk-go/aws" 7 "github.com/awslabs/aws-sdk-go/service/ec2" 8 9 "github.com/hashicorp/terraform/helper/schema" 10 ) 11 12 func resourceAwsEbsVolume() *schema.Resource { 13 return &schema.Resource{ 14 Create: resourceAwsEbsVolumeCreate, 15 Read: resourceAwsEbsVolumeRead, 16 Delete: resourceAwsEbsVolumeDelete, 17 18 Schema: map[string]*schema.Schema{ 19 "availability_zone": &schema.Schema{ 20 Type: schema.TypeString, 21 Required: true, 22 ForceNew: true, 23 }, 24 "encrypted": &schema.Schema{ 25 Type: schema.TypeBool, 26 Optional: true, 27 Computed: true, 28 ForceNew: true, 29 }, 30 "iops": &schema.Schema{ 31 Type: schema.TypeInt, 32 Optional: true, 33 Computed: true, 34 ForceNew: true, 35 }, 36 "kms_key_id": &schema.Schema{ 37 Type: schema.TypeString, 38 Optional: true, 39 Computed: true, 40 ForceNew: true, 41 }, 42 "size": &schema.Schema{ 43 Type: schema.TypeInt, 44 Optional: true, 45 Computed: true, 46 ForceNew: true, 47 }, 48 "snapshot_id": &schema.Schema{ 49 Type: schema.TypeString, 50 Optional: true, 51 Computed: true, 52 ForceNew: true, 53 }, 54 "type": &schema.Schema{ 55 Type: schema.TypeString, 56 Optional: true, 57 Computed: true, 58 ForceNew: true, 59 }, 60 }, 61 } 62 } 63 64 func resourceAwsEbsVolumeCreate(d *schema.ResourceData, meta interface{}) error { 65 conn := meta.(*AWSClient).ec2conn 66 67 request := &ec2.CreateVolumeInput{ 68 AvailabilityZone: aws.String(d.Get("availability_zone").(string)), 69 } 70 if value, ok := d.GetOk("encrypted"); ok { 71 request.Encrypted = aws.Boolean(value.(bool)) 72 } 73 if value, ok := d.GetOk("iops"); ok { 74 request.IOPS = aws.Long(int64(value.(int))) 75 } 76 if value, ok := d.GetOk("kms_key_id"); ok { 77 request.KMSKeyID = aws.String(value.(string)) 78 } 79 if value, ok := d.GetOk("size"); ok { 80 request.Size = aws.Long(int64(value.(int))) 81 } 82 if value, ok := d.GetOk("snapshot_id"); ok { 83 request.SnapshotID = aws.String(value.(string)) 84 } 85 if value, ok := d.GetOk("type"); ok { 86 request.VolumeType = aws.String(value.(string)) 87 } 88 89 result, err := conn.CreateVolume(request) 90 if err != nil { 91 return fmt.Errorf("Error creating EC2 volume: %s", err) 92 } 93 return readVolume(d, result) 94 } 95 96 func resourceAwsEbsVolumeRead(d *schema.ResourceData, meta interface{}) error { 97 conn := meta.(*AWSClient).ec2conn 98 99 request := &ec2.DescribeVolumesInput{ 100 VolumeIDs: []*string{aws.String(d.Id())}, 101 } 102 103 response, err := conn.DescribeVolumes(request) 104 if err != nil { 105 if ec2err, ok := err.(aws.APIError); ok && ec2err.Code == "InvalidVolume.NotFound" { 106 d.SetId("") 107 return nil 108 } 109 return fmt.Errorf("Error reading EC2 volume %s: %#v", d.Id(), err) 110 } 111 112 return readVolume(d, response.Volumes[0]) 113 } 114 115 func resourceAwsEbsVolumeDelete(d *schema.ResourceData, meta interface{}) error { 116 conn := meta.(*AWSClient).ec2conn 117 118 request := &ec2.DeleteVolumeInput{ 119 VolumeID: aws.String(d.Id()), 120 } 121 122 _, err := conn.DeleteVolume(request) 123 if err != nil { 124 return fmt.Errorf("Error deleting EC2 volume %s: %s", d.Id(), err) 125 } 126 return nil 127 } 128 129 func readVolume(d *schema.ResourceData, volume *ec2.Volume) error { 130 d.SetId(*volume.VolumeID) 131 132 d.Set("availability_zone", *volume.AvailabilityZone) 133 if volume.Encrypted != nil { 134 d.Set("encrypted", *volume.Encrypted) 135 } 136 if volume.IOPS != nil { 137 d.Set("iops", *volume.IOPS) 138 } 139 if volume.KMSKeyID != nil { 140 d.Set("kms_key_id", *volume.KMSKeyID) 141 } 142 if volume.Size != nil { 143 d.Set("size", *volume.Size) 144 } 145 if volume.SnapshotID != nil { 146 d.Set("snapshot_id", *volume.SnapshotID) 147 } 148 if volume.VolumeType != nil { 149 d.Set("type", *volume.VolumeType) 150 } 151 152 return nil 153 }