package common import ( "errors" "fmt" "time" ) // RunConfig contains configuration for running an instance from a source // AMI and details on how to access that launched image. type RunConfig struct { SourceAmi string `mapstructure:"source_ami"` IamInstanceProfile string `mapstructure:"iam_instance_profile"` 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.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 }