diff --git a/builder/openstack/builder.go b/builder/openstack/builder.go index ab60afc0e..6d178c6ef 100644 --- a/builder/openstack/builder.go +++ b/builder/openstack/builder.go @@ -5,10 +5,11 @@ package openstack import ( "fmt" - "github.com/mitchellh/multistep" - "github.com/mitchellh/packer/common" "log" + "github.com/mitchellh/multistep" + "github.com/mitchellh/packer/common" + "github.com/mitchellh/packer/helper/communicator" "github.com/mitchellh/packer/helper/config" "github.com/mitchellh/packer/packer" "github.com/mitchellh/packer/template/interpolate" @@ -19,9 +20,10 @@ const BuilderId = "mitchellh.openstack" type Config struct { common.PackerConfig `mapstructure:",squash"` - AccessConfig `mapstructure:",squash"` - ImageConfig `mapstructure:",squash"` - RunConfig `mapstructure:",squash"` + + AccessConfig `mapstructure:",squash"` + ImageConfig `mapstructure:",squash"` + RunConfig `mapstructure:",squash"` ctx interpolate.Context } @@ -88,10 +90,13 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe FloatingIpPool: b.config.FloatingIpPool, FloatingIp: b.config.FloatingIp, }, - &common.StepConnectSSH{ - SSHAddress: SSHAddress(computeClient, b.config.SSHInterface, b.config.SSHPort), - SSHConfig: SSHConfig(b.config.SSHUsername), - SSHWaitTimeout: b.config.SSHTimeout(), + &communicator.StepConnect{ + Config: &b.config.RunConfig.Comm, + SSHAddress: SSHAddress( + computeClient, + b.config.SSHInterface, + b.config.RunConfig.Comm.SSHPort), + SSHConfig: SSHConfig(b.config.RunConfig.Comm.SSHUsername), }, &common.StepProvision{}, &stepCreateImage{}, diff --git a/builder/openstack/run_config.go b/builder/openstack/run_config.go index 4a6a1b81f..a758b0dd1 100644 --- a/builder/openstack/run_config.go +++ b/builder/openstack/run_config.go @@ -2,21 +2,19 @@ package openstack import ( "errors" - "fmt" - "time" + "github.com/mitchellh/packer/helper/communicator" "github.com/mitchellh/packer/template/interpolate" ) // RunConfig contains configuration for running an instance from a source // image and details on how to access that launched image. type RunConfig struct { + Comm communicator.Config `mapstructure:",squash"` + SSHInterface string `mapstructure:"ssh_interface"` + SourceImage string `mapstructure:"source_image"` Flavor string `mapstructure:"flavor"` - RawSSHTimeout string `mapstructure:"ssh_timeout"` - SSHUsername string `mapstructure:"ssh_username"` - SSHPort int `mapstructure:"ssh_port"` - SSHInterface string `mapstructure:"ssh_interface"` AvailabilityZone string `mapstructure:"availability_zone"` RackconnectWait bool `mapstructure:"rackconnect_wait"` FloatingIpPool string `mapstructure:"floating_ip_pool"` @@ -27,23 +25,12 @@ type RunConfig struct { // Not really used, but here for BC OpenstackProvider string `mapstructure:"openstack_provider"` UseFloatingIp bool `mapstructure:"use_floating_ip"` - - // Unexported fields that are calculated from others - sshTimeout time.Duration } func (c *RunConfig) Prepare(ctx *interpolate.Context) []error { // Defaults - if c.SSHUsername == "" { - c.SSHUsername = "root" - } - - if c.SSHPort == 0 { - c.SSHPort = 22 - } - - if c.RawSSHTimeout == "" { - c.RawSSHTimeout = "5m" + if c.Comm.SSHUsername == "" { + c.Comm.SSHUsername = "root" } if c.UseFloatingIp && c.FloatingIpPool == "" { @@ -51,8 +38,7 @@ func (c *RunConfig) Prepare(ctx *interpolate.Context) []error { } // Validation - var err error - errs := make([]error, 0) + errs := c.Comm.Prepare(ctx) if c.SourceImage == "" { errs = append(errs, errors.New("A source_image must be specified")) } @@ -61,18 +47,5 @@ func (c *RunConfig) Prepare(ctx *interpolate.Context) []error { errs = append(errs, errors.New("A flavor 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 -} diff --git a/builder/openstack/run_config_test.go b/builder/openstack/run_config_test.go index 16b89b352..113934a29 100644 --- a/builder/openstack/run_config_test.go +++ b/builder/openstack/run_config_test.go @@ -3,6 +3,8 @@ package openstack import ( "os" "testing" + + "github.com/mitchellh/packer/helper/communicator" ) func init() { @@ -17,7 +19,10 @@ func testRunConfig() *RunConfig { return &RunConfig{ SourceImage: "abcd", Flavor: "m1.small", - SSHUsername: "root", + + Comm: communicator.Config{ + SSHUsername: "foo", + }, } } @@ -47,41 +52,28 @@ func TestRunConfigPrepare_SourceImage(t *testing.T) { func TestRunConfigPrepare_SSHPort(t *testing.T) { c := testRunConfig() - c.SSHPort = 0 + c.Comm.SSHPort = 0 if err := c.Prepare(nil); len(err) != 0 { t.Fatalf("err: %s", err) } - if c.SSHPort != 22 { - t.Fatalf("invalid value: %d", c.SSHPort) + if c.Comm.SSHPort != 22 { + t.Fatalf("invalid value: %d", c.Comm.SSHPort) } - c.SSHPort = 44 + c.Comm.SSHPort = 44 if err := c.Prepare(nil); len(err) != 0 { t.Fatalf("err: %s", err) } - if c.SSHPort != 44 { - t.Fatalf("invalid value: %d", c.SSHPort) - } -} - -func TestRunConfigPrepare_SSHTimeout(t *testing.T) { - c := testRunConfig() - c.RawSSHTimeout = "" - if err := c.Prepare(nil); len(err) != 0 { - t.Fatalf("err: %s", err) - } - - c.RawSSHTimeout = "bad" - if err := c.Prepare(nil); len(err) != 1 { - t.Fatalf("err: %s", err) + if c.Comm.SSHPort != 44 { + t.Fatalf("invalid value: %d", c.Comm.SSHPort) } } func TestRunConfigPrepare_SSHUsername(t *testing.T) { c := testRunConfig() - c.SSHUsername = "" + c.Comm.SSHUsername = "" if err := c.Prepare(nil); len(err) != 0 { t.Fatalf("err: %s", err) }