99 lines
2.6 KiB
Go
99 lines
2.6 KiB
Go
package common
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/mitchellh/goamz/ec2"
|
|
"github.com/mitchellh/packer/packer"
|
|
)
|
|
|
|
// BlockDevice
|
|
type BlockDevice struct {
|
|
DeleteOnTermination bool `mapstructure:"delete_on_termination"`
|
|
DeviceName string `mapstructure:"device_name"`
|
|
Encrypted bool `mapstructure:"encrypted"`
|
|
IOPS int64 `mapstructure:"iops"`
|
|
NoDevice bool `mapstructure:"no_device"`
|
|
SnapshotId string `mapstructure:"snapshot_id"`
|
|
VirtualName string `mapstructure:"virtual_name"`
|
|
VolumeType string `mapstructure:"volume_type"`
|
|
VolumeSize int64 `mapstructure:"volume_size"`
|
|
}
|
|
|
|
type BlockDevices struct {
|
|
AMIMappings []BlockDevice `mapstructure:"ami_block_device_mappings"`
|
|
LaunchMappings []BlockDevice `mapstructure:"launch_block_device_mappings"`
|
|
}
|
|
|
|
func buildBlockDevices(b []BlockDevice) []ec2.BlockDeviceMapping {
|
|
var blockDevices []ec2.BlockDeviceMapping
|
|
|
|
for _, blockDevice := range b {
|
|
blockDevices = append(blockDevices, ec2.BlockDeviceMapping{
|
|
DeviceName: blockDevice.DeviceName,
|
|
VirtualName: blockDevice.VirtualName,
|
|
SnapshotId: blockDevice.SnapshotId,
|
|
VolumeType: blockDevice.VolumeType,
|
|
VolumeSize: blockDevice.VolumeSize,
|
|
DeleteOnTermination: blockDevice.DeleteOnTermination,
|
|
IOPS: blockDevice.IOPS,
|
|
NoDevice: blockDevice.NoDevice,
|
|
Encrypted: blockDevice.Encrypted,
|
|
})
|
|
}
|
|
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)
|
|
}
|
|
|
|
func (b *BlockDevices) BuildLaunchDevices() []ec2.BlockDeviceMapping {
|
|
return buildBlockDevices(b.LaunchMappings)
|
|
}
|