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  }