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