github.com/jerryclinesmith/packer@v0.3.7/builder/openstack/run_config.go (about) 1 package openstack 2 3 import ( 4 "errors" 5 "fmt" 6 "github.com/mitchellh/packer/packer" 7 "time" 8 ) 9 10 // RunConfig contains configuration for running an instance from a source 11 // image and details on how to access that launched image. 12 type RunConfig struct { 13 SourceImage string `mapstructure:"source_image"` 14 Flavor string `mapstructure:"flavor"` 15 RawSSHTimeout string `mapstructure:"ssh_timeout"` 16 SSHUsername string `mapstructure:"ssh_username"` 17 SSHPort int `mapstructure:"ssh_port"` 18 19 // Unexported fields that are calculated from others 20 sshTimeout time.Duration 21 } 22 23 func (c *RunConfig) Prepare(t *packer.ConfigTemplate) []error { 24 if t == nil { 25 var err error 26 t, err = packer.NewConfigTemplate() 27 if err != nil { 28 return []error{err} 29 } 30 } 31 32 // Defaults 33 if c.SSHUsername == "" { 34 c.SSHUsername = "root" 35 } 36 37 if c.SSHPort == 0 { 38 c.SSHPort = 22 39 } 40 41 if c.RawSSHTimeout == "" { 42 c.RawSSHTimeout = "5m" 43 } 44 45 // Validation 46 var err error 47 errs := make([]error, 0) 48 if c.SourceImage == "" { 49 errs = append(errs, errors.New("A source_image must be specified")) 50 } 51 52 if c.Flavor == "" { 53 errs = append(errs, errors.New("A flavor must be specified")) 54 } 55 56 if c.SSHUsername == "" { 57 errs = append(errs, errors.New("An ssh_username must be specified")) 58 } 59 60 templates := map[string]*string{ 61 "flavlor": &c.Flavor, 62 "ssh_timeout": &c.RawSSHTimeout, 63 "ssh_username": &c.SSHUsername, 64 "source_image": &c.SourceImage, 65 } 66 67 for n, ptr := range templates { 68 var err error 69 *ptr, err = t.Process(*ptr, nil) 70 if err != nil { 71 errs = append( 72 errs, fmt.Errorf("Error processing %s: %s", n, err)) 73 } 74 } 75 76 c.sshTimeout, err = time.ParseDuration(c.RawSSHTimeout) 77 if err != nil { 78 errs = append(errs, fmt.Errorf("Failed parsing ssh_timeout: %s", err)) 79 } 80 81 return errs 82 } 83 84 func (c *RunConfig) SSHTimeout() time.Duration { 85 return c.sshTimeout 86 }