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  }