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  }