github.com/emate/packer@v0.8.1-0.20150625195101-fe0fde195dc6/builder/amazon/common/block_device.go (about) 1 package common 2 3 import ( 4 "github.com/aws/aws-sdk-go/aws" 5 "github.com/aws/aws-sdk-go/service/ec2" 6 "github.com/mitchellh/packer/template/interpolate" 7 ) 8 9 // BlockDevice 10 type BlockDevice struct { 11 DeleteOnTermination bool `mapstructure:"delete_on_termination"` 12 DeviceName string `mapstructure:"device_name"` 13 Encrypted bool `mapstructure:"encrypted"` 14 IOPS int64 `mapstructure:"iops"` 15 NoDevice bool `mapstructure:"no_device"` 16 SnapshotId string `mapstructure:"snapshot_id"` 17 VirtualName string `mapstructure:"virtual_name"` 18 VolumeType string `mapstructure:"volume_type"` 19 VolumeSize int64 `mapstructure:"volume_size"` 20 } 21 22 type BlockDevices struct { 23 AMIMappings []BlockDevice `mapstructure:"ami_block_device_mappings"` 24 LaunchMappings []BlockDevice `mapstructure:"launch_block_device_mappings"` 25 } 26 27 func buildBlockDevices(b []BlockDevice) []*ec2.BlockDeviceMapping { 28 var blockDevices []*ec2.BlockDeviceMapping 29 30 for _, blockDevice := range b { 31 ebsBlockDevice := &ec2.EBSBlockDevice{ 32 VolumeType: aws.String(blockDevice.VolumeType), 33 VolumeSize: aws.Long(blockDevice.VolumeSize), 34 DeleteOnTermination: aws.Boolean(blockDevice.DeleteOnTermination), 35 } 36 37 // IOPS is only valid for SSD Volumes 38 if blockDevice.VolumeType != "" && blockDevice.VolumeType != "standard" && blockDevice.VolumeType != "gp2" { 39 ebsBlockDevice.IOPS = aws.Long(blockDevice.IOPS) 40 } 41 42 // You cannot specify Encrypted if you specify a Snapshot ID 43 if blockDevice.SnapshotId != "" { 44 ebsBlockDevice.SnapshotID = aws.String(blockDevice.SnapshotId) 45 } else if blockDevice.Encrypted { 46 ebsBlockDevice.Encrypted = aws.Boolean(blockDevice.Encrypted) 47 } 48 49 mapping := &ec2.BlockDeviceMapping{ 50 EBS: ebsBlockDevice, 51 DeviceName: aws.String(blockDevice.DeviceName), 52 VirtualName: aws.String(blockDevice.VirtualName), 53 } 54 55 if blockDevice.NoDevice { 56 mapping.NoDevice = aws.String("") 57 } 58 59 blockDevices = append(blockDevices, mapping) 60 } 61 return blockDevices 62 } 63 64 func (b *BlockDevices) Prepare(ctx *interpolate.Context) []error { 65 return nil 66 } 67 68 func (b *BlockDevices) BuildAMIDevices() []*ec2.BlockDeviceMapping { 69 return buildBlockDevices(b.AMIMappings) 70 } 71 72 func (b *BlockDevices) BuildLaunchDevices() []*ec2.BlockDeviceMapping { 73 return buildBlockDevices(b.LaunchMappings) 74 }