From 6fdf237c159ab0c99bbd9c5324f12f5d9e2da28e Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Tue, 16 Jul 2013 13:23:40 +0900 Subject: [PATCH] builder/amazon/common: RunConfig for launch info --- builder/amazon/common/access_config.go | 2 +- builder/amazon/common/run_config.go | 68 ++++++++++++++++++++++++++ builder/amazon/ebs/builder.go | 55 ++------------------- 3 files changed, 72 insertions(+), 53 deletions(-) create mode 100644 builder/amazon/common/run_config.go diff --git a/builder/amazon/common/access_config.go b/builder/amazon/common/access_config.go index c3819875a..736d2d190 100644 --- a/builder/amazon/common/access_config.go +++ b/builder/amazon/common/access_config.go @@ -16,6 +16,6 @@ func (c *AccessConfig) Auth() (aws.Auth, error) { return aws.GetAuth(c.AccessKey, c.SecretKey) } -func (c *AccessConfig) Validate() []error { +func (c *AccessConfig) Prepare() []error { return nil } diff --git a/builder/amazon/common/run_config.go b/builder/amazon/common/run_config.go new file mode 100644 index 000000000..bd2186d93 --- /dev/null +++ b/builder/amazon/common/run_config.go @@ -0,0 +1,68 @@ +package common + +import ( + "errors" + "fmt" + "github.com/mitchellh/goamz/aws" + "time" +) + +// RunConfig contains configuration for running an instance from a source +// AMI and details on how to access that launched image. +type RunConfig struct { + Region string + SourceAmi string `mapstructure:"source_ami"` + InstanceType string `mapstructure:"instance_type"` + RawSSHTimeout string `mapstructure:"ssh_timeout"` + SSHUsername string `mapstructure:"ssh_username"` + SSHPort int `mapstructure:"ssh_port"` + SecurityGroupId string `mapstructure:"security_group_id"` + SubnetId string `mapstructure:"subnet_id"` + VpcId string `mapstructure:"vpc_id"` + + // Unexported fields that are calculated from others + sshTimeout time.Duration +} + +func (c *RunConfig) Prepare() []error { + // Defaults + if c.SSHPort == 0 { + c.SSHPort = 22 + } + + if c.RawSSHTimeout == "" { + c.RawSSHTimeout = "1m" + } + + // Validation + var err error + errs := make([]error, 0) + if c.SourceAmi == "" { + errs = append(errs, errors.New("A source_ami must be specified")) + } + + if c.InstanceType == "" { + errs = append(errs, errors.New("An instance_type must be specified")) + } + + if c.Region == "" { + errs = append(errs, errors.New("A region must be specified")) + } else if _, ok := aws.Regions[c.Region]; !ok { + errs = append(errs, fmt.Errorf("Unknown region: %s", c.Region)) + } + + if c.SSHUsername == "" { + errs = append(errs, errors.New("An ssh_username must be specified")) + } + + c.sshTimeout, err = time.ParseDuration(c.RawSSHTimeout) + if err != nil { + errs = append(errs, fmt.Errorf("Failed parsing ssh_timeout: %s", err)) + } + + return errs +} + +func (c *RunConfig) SSHTimeout() time.Duration { + return c.sshTimeout +} diff --git a/builder/amazon/ebs/builder.go b/builder/amazon/ebs/builder.go index 6b39a37ca..2ed179cc2 100644 --- a/builder/amazon/ebs/builder.go +++ b/builder/amazon/ebs/builder.go @@ -16,7 +16,6 @@ import ( "github.com/mitchellh/packer/packer" "log" "text/template" - "time" ) // The unique ID for this builder @@ -24,25 +23,14 @@ const BuilderId = "mitchellh.amazonebs" type config struct { awscommon.AccessConfig `mapstructure:",squash"` - - // Information for the source instance - Region string - SourceAmi string `mapstructure:"source_ami"` - InstanceType string `mapstructure:"instance_type"` - SSHUsername string `mapstructure:"ssh_username"` - SSHPort int `mapstructure:"ssh_port"` - SecurityGroupId string `mapstructure:"security_group_id"` VpcId string `mapstructure:"vpc_id"` SubnetId string `mapstructure:"subnet_id"` + awscommon.RunConfig `mapstructure:",squash"` // Configuration of the resulting AMI AMIName string `mapstructure:"ami_name"` - PackerDebug bool `mapstructure:"packer_debug"` - RawSSHTimeout string `mapstructure:"ssh_timeout"` - - // Unexported fields that are calculated from others - sshTimeout time.Duration + PackerDebug bool `mapstructure:"packer_debug"` } type Builder struct { @@ -59,44 +47,7 @@ func (b *Builder) Prepare(raws ...interface{}) error { // Accumulate any errors errs := common.CheckUnusedConfig(md) - if b.config.SSHPort == 0 { - b.config.SSHPort = 22 - } - - if b.config.RawSSHTimeout == "" { - b.config.RawSSHTimeout = "1m" - } - // Accumulate any errors - if b.config.SourceAmi == "" { - errs = packer.MultiErrorAppend( - errs, errors.New("A source_ami must be specified")) - } - - if b.config.InstanceType == "" { - errs = packer.MultiErrorAppend( - errs, errors.New("An instance_type must be specified")) - } - - if b.config.Region == "" { - errs = packer.MultiErrorAppend( - errs, errors.New("A region must be specified")) - } else if _, ok := aws.Regions[b.config.Region]; !ok { - errs = packer.MultiErrorAppend( - errs, fmt.Errorf("Unknown region: %s", b.config.Region)) - } - - if b.config.SSHUsername == "" { - errs = packer.MultiErrorAppend( - errs, errors.New("An ssh_username must be specified")) - } - - b.config.sshTimeout, err = time.ParseDuration(b.config.RawSSHTimeout) - if err != nil { - errs = packer.MultiErrorAppend( - errs, fmt.Errorf("Failed parsing ssh_timeout: %s", err)) - } - if b.config.AMIName == "" { errs = packer.MultiErrorAppend( errs, errors.New("ami_name must be specified")) @@ -144,7 +95,7 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe &common.StepConnectSSH{ SSHAddress: sshAddress, SSHConfig: sshConfig, - SSHWaitTimeout: b.config.sshTimeout, + SSHWaitTimeout: b.config.SSHTimeout(), }, &common.StepProvision{}, &stepStopInstance{},