From 5db91c84bf0d83eb0d628e202a02ec4810013611 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Fri, 5 Sep 2014 12:38:19 -0700 Subject: [PATCH] builder/amazon: string fields on device mappings can use variables --- CHANGELOG.md | 1 + builder/amazon/common/block_device.go | 48 +++++++++++++++++++++++++++ builder/amazon/ebs/builder.go | 1 + builder/amazon/instance/builder.go | 1 + 4 files changed, 51 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4b04d207f..eb7fc3894 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,6 +30,7 @@ IMPROVEMENTS: set with the `token` configuration. [GH-1236] * builder/amazon/all: Can force SSH on the private IP address with `ssh_private_ip`. [GH-1229] + * builder/amazon/all: String fields in device mappings can use variables. [GH-1090] * builder/amazon-instance: EBS AMIs can be used as a source. [GH-1453] * builder/digitalocean: Can set API URL endpoint. [GH-1448] * builder/digitalocean: Region supports variables. [GH-1452] diff --git a/builder/amazon/common/block_device.go b/builder/amazon/common/block_device.go index a17fab82f..dc87c07fb 100644 --- a/builder/amazon/common/block_device.go +++ b/builder/amazon/common/block_device.go @@ -1,7 +1,10 @@ package common import ( + "fmt" + "github.com/mitchellh/goamz/ec2" + "github.com/mitchellh/packer/packer" ) // BlockDevice @@ -41,6 +44,51 @@ func buildBlockDevices(b []BlockDevice) []ec2.BlockDeviceMapping { return blockDevices } +func (b *BlockDevices) Prepare(t *packer.ConfigTemplate) []error { + if t == nil { + var err error + t, err = packer.NewConfigTemplate() + if err != nil { + return []error{err} + } + } + + lists := map[string][]BlockDevice{ + "ami_block_device_mappings": b.AMIMappings, + "launch_block_device_mappings": b.LaunchMappings, + } + + var errs []error + for outer, bds := range lists { + for i, bd := range bds { + templates := map[string]*string{ + "device_name": &bd.DeviceName, + "snapshot_id": &bd.SnapshotId, + "virtual_name": &bd.VirtualName, + "volume_type": &bd.VolumeType, + } + + errs := make([]error, 0) + for n, ptr := range templates { + var err error + *ptr, err = t.Process(*ptr, nil) + if err != nil { + errs = append( + errs, fmt.Errorf( + "Error processing %s[%d].%s: %s", + outer, i, n, err)) + } + } + } + } + + if len(errs) > 0 { + return errs + } + + return nil +} + func (b *BlockDevices) BuildAMIDevices() []ec2.BlockDeviceMapping { return buildBlockDevices(b.AMIMappings) } diff --git a/builder/amazon/ebs/builder.go b/builder/amazon/ebs/builder.go index feabc1d4c..84d44859a 100644 --- a/builder/amazon/ebs/builder.go +++ b/builder/amazon/ebs/builder.go @@ -50,6 +50,7 @@ func (b *Builder) Prepare(raws ...interface{}) ([]string, error) { // Accumulate any errors errs := common.CheckUnusedConfig(md) errs = packer.MultiErrorAppend(errs, b.config.AccessConfig.Prepare(b.config.tpl)...) + errs = packer.MultiErrorAppend(errs, b.config.BlockDevices.Prepare(b.config.tpl)...) errs = packer.MultiErrorAppend(errs, b.config.AMIConfig.Prepare(b.config.tpl)...) errs = packer.MultiErrorAppend(errs, b.config.RunConfig.Prepare(b.config.tpl)...) diff --git a/builder/amazon/instance/builder.go b/builder/amazon/instance/builder.go index b1d04960b..2ead3b319 100644 --- a/builder/amazon/instance/builder.go +++ b/builder/amazon/instance/builder.go @@ -99,6 +99,7 @@ func (b *Builder) Prepare(raws ...interface{}) ([]string, error) { // Accumulate any errors errs := common.CheckUnusedConfig(md) errs = packer.MultiErrorAppend(errs, b.config.AccessConfig.Prepare(b.config.tpl)...) + errs = packer.MultiErrorAppend(errs, b.config.BlockDevices.Prepare(b.config.tpl)...) errs = packer.MultiErrorAppend(errs, b.config.AMIConfig.Prepare(b.config.tpl)...) errs = packer.MultiErrorAppend(errs, b.config.RunConfig.Prepare(b.config.tpl)...)