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