2013-08-15 17:05:08 -04:00
|
|
|
package common
|
|
|
|
|
|
|
|
import (
|
2015-06-03 17:13:52 -04:00
|
|
|
"github.com/aws/aws-sdk-go/aws"
|
|
|
|
"github.com/aws/aws-sdk-go/service/ec2"
|
2015-05-27 14:35:56 -04:00
|
|
|
"github.com/mitchellh/packer/template/interpolate"
|
2013-08-15 17:05:08 -04:00
|
|
|
)
|
|
|
|
|
|
|
|
// BlockDevice
|
|
|
|
type BlockDevice struct {
|
2014-04-30 18:43:11 -04:00
|
|
|
DeleteOnTermination bool `mapstructure:"delete_on_termination"`
|
2013-08-15 17:05:08 -04:00
|
|
|
DeviceName string `mapstructure:"device_name"`
|
2014-05-22 14:36:22 -04:00
|
|
|
Encrypted bool `mapstructure:"encrypted"`
|
2014-04-30 18:43:11 -04:00
|
|
|
IOPS int64 `mapstructure:"iops"`
|
|
|
|
NoDevice bool `mapstructure:"no_device"`
|
2013-08-15 17:05:08 -04:00
|
|
|
SnapshotId string `mapstructure:"snapshot_id"`
|
2014-04-30 18:43:11 -04:00
|
|
|
VirtualName string `mapstructure:"virtual_name"`
|
2013-08-15 17:05:08 -04:00
|
|
|
VolumeType string `mapstructure:"volume_type"`
|
|
|
|
VolumeSize int64 `mapstructure:"volume_size"`
|
|
|
|
}
|
|
|
|
|
|
|
|
type BlockDevices struct {
|
2013-09-06 14:48:38 -04:00
|
|
|
AMIMappings []BlockDevice `mapstructure:"ami_block_device_mappings"`
|
|
|
|
LaunchMappings []BlockDevice `mapstructure:"launch_block_device_mappings"`
|
2013-08-15 17:05:08 -04:00
|
|
|
}
|
|
|
|
|
2015-04-05 17:58:48 -04:00
|
|
|
func buildBlockDevices(b []BlockDevice) []*ec2.BlockDeviceMapping {
|
|
|
|
var blockDevices []*ec2.BlockDeviceMapping
|
2013-08-15 17:05:08 -04:00
|
|
|
|
|
|
|
for _, blockDevice := range b {
|
2015-04-05 17:58:48 -04:00
|
|
|
ebsBlockDevice := &ec2.EBSBlockDevice{
|
|
|
|
VolumeType: &blockDevice.VolumeType,
|
|
|
|
VolumeSize: &blockDevice.VolumeSize,
|
|
|
|
DeleteOnTermination: &blockDevice.DeleteOnTermination,
|
|
|
|
}
|
2015-06-09 12:38:53 -04:00
|
|
|
|
|
|
|
// IOPS is only valid for SSD Volumes
|
2015-06-10 11:21:25 -04:00
|
|
|
if blockDevice.VolumeType != "" && blockDevice.VolumeType != "standard" && blockDevice.VolumeType != "gp2" {
|
2015-06-09 12:38:53 -04:00
|
|
|
ebsBlockDevice.IOPS = &blockDevice.IOPS
|
|
|
|
}
|
|
|
|
|
|
|
|
// You cannot specify Encrypted if you specify a Snapshot ID
|
|
|
|
if blockDevice.SnapshotId != "" {
|
|
|
|
ebsBlockDevice.SnapshotID = &blockDevice.SnapshotId
|
|
|
|
} else {
|
|
|
|
ebsBlockDevice.Encrypted = &blockDevice.Encrypted
|
|
|
|
}
|
|
|
|
|
2015-04-05 17:58:48 -04:00
|
|
|
mapping := &ec2.BlockDeviceMapping{
|
|
|
|
EBS: ebsBlockDevice,
|
|
|
|
DeviceName: &blockDevice.DeviceName,
|
|
|
|
VirtualName: &blockDevice.VirtualName,
|
|
|
|
}
|
|
|
|
|
|
|
|
if blockDevice.NoDevice {
|
|
|
|
mapping.NoDevice = aws.String("")
|
|
|
|
}
|
|
|
|
|
|
|
|
blockDevices = append(blockDevices, mapping)
|
2013-08-15 17:05:08 -04:00
|
|
|
}
|
|
|
|
return blockDevices
|
|
|
|
}
|
|
|
|
|
2015-05-27 14:35:56 -04:00
|
|
|
func (b *BlockDevices) Prepare(ctx *interpolate.Context) []error {
|
2014-09-05 15:38:19 -04:00
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2015-04-05 17:58:48 -04:00
|
|
|
func (b *BlockDevices) BuildAMIDevices() []*ec2.BlockDeviceMapping {
|
2013-08-15 17:05:08 -04:00
|
|
|
return buildBlockDevices(b.AMIMappings)
|
|
|
|
}
|
|
|
|
|
2015-04-05 17:58:48 -04:00
|
|
|
func (b *BlockDevices) BuildLaunchDevices() []*ec2.BlockDeviceMapping {
|
2013-08-15 17:05:08 -04:00
|
|
|
return buildBlockDevices(b.LaunchMappings)
|
|
|
|
}
|