Commit 820bad69 authored by Mitchell Hashimoto's avatar Mitchell Hashimoto

builder/parallels: convert to new comm type

parent f55e2d2c
...@@ -29,13 +29,13 @@ func SSHAddress(state multistep.StateBag) (string, error) { ...@@ -29,13 +29,13 @@ func SSHAddress(state multistep.StateBag) (string, error) {
func SSHConfigFunc(config SSHConfig) func(multistep.StateBag) (*ssh.ClientConfig, error) { func SSHConfigFunc(config SSHConfig) func(multistep.StateBag) (*ssh.ClientConfig, error) {
return func(state multistep.StateBag) (*ssh.ClientConfig, error) { return func(state multistep.StateBag) (*ssh.ClientConfig, error) {
auth := []ssh.AuthMethod{ auth := []ssh.AuthMethod{
ssh.Password(config.SSHPassword), ssh.Password(config.Comm.SSHPassword),
ssh.KeyboardInteractive( ssh.KeyboardInteractive(
packerssh.PasswordKeyboardInteractive(config.SSHPassword)), packerssh.PasswordKeyboardInteractive(config.Comm.SSHPassword)),
} }
if config.SSHKeyPath != "" { if config.SSHKeyPath != "" {
signer, err := commonssh.FileSigner(config.SSHKeyPath) signer, err := commonssh.FileSigner(config.Comm.SSHPrivateKey)
if err != nil { if err != nil {
return nil, err return nil, err
} }
...@@ -44,7 +44,7 @@ func SSHConfigFunc(config SSHConfig) func(multistep.StateBag) (*ssh.ClientConfig ...@@ -44,7 +44,7 @@ func SSHConfigFunc(config SSHConfig) func(multistep.StateBag) (*ssh.ClientConfig
} }
return &ssh.ClientConfig{ return &ssh.ClientConfig{
User: config.SSHUser, User: config.Comm.SSHUsername,
Auth: auth, Auth: auth,
}, nil }, nil
} }
......
package common package common
import ( import (
"errors"
"fmt"
"os"
"time" "time"
commonssh "github.com/mitchellh/packer/common/ssh" "github.com/mitchellh/packer/helper/communicator"
"github.com/mitchellh/packer/template/interpolate" "github.com/mitchellh/packer/template/interpolate"
) )
type SSHConfig struct { type SSHConfig struct {
SSHKeyPath string `mapstructure:"ssh_key_path"` Comm communicator.Config `mapstructure:",squash"`
SSHPassword string `mapstructure:"ssh_password"`
SSHPort uint `mapstructure:"ssh_port"`
SSHUser string `mapstructure:"ssh_username"`
RawSSHWaitTimeout string `mapstructure:"ssh_wait_timeout"`
SSHWaitTimeout time.Duration // These are deprecated, but we keep them around for BC
// TODO(@mitchellh): remove
SSHKeyPath string `mapstructure:"ssh_key_path"`
SSHWaitTimeout time.Duration `mapstructure:"ssh_wait_timeout"`
} }
func (c *SSHConfig) Prepare(ctx *interpolate.Context) []error { func (c *SSHConfig) Prepare(ctx *interpolate.Context) []error {
if c.SSHPort == 0 { // TODO: backwards compatibility, write fixer instead
c.SSHPort = 22
}
if c.RawSSHWaitTimeout == "" {
c.RawSSHWaitTimeout = "20m"
}
var errs []error
if c.SSHKeyPath != "" { if c.SSHKeyPath != "" {
if _, err := os.Stat(c.SSHKeyPath); err != nil { c.Comm.SSHPrivateKey = c.SSHKeyPath
errs = append(errs, fmt.Errorf("ssh_key_path is invalid: %s", err))
} else if _, err := commonssh.FileSigner(c.SSHKeyPath); err != nil {
errs = append(errs, fmt.Errorf("ssh_key_path is invalid: %s", err))
}
} }
if c.SSHWaitTimeout != 0 {
if c.SSHUser == "" { c.Comm.SSHTimeout = c.SSHWaitTimeout
errs = append(errs, errors.New("An ssh_username must be specified."))
}
var err error
c.SSHWaitTimeout, err = time.ParseDuration(c.RawSSHWaitTimeout)
if err != nil {
errs = append(errs, fmt.Errorf("Failed parsing ssh_wait_timeout: %s", err))
} }
return errs return c.Comm.Prepare(ctx)
} }
...@@ -4,11 +4,15 @@ import ( ...@@ -4,11 +4,15 @@ import (
"io/ioutil" "io/ioutil"
"os" "os"
"testing" "testing"
"github.com/mitchellh/packer/helper/communicator"
) )
func testSSHConfig() *SSHConfig { func testSSHConfig() *SSHConfig {
return &SSHConfig{ return &SSHConfig{
SSHUser: "foo", Comm: communicator.Config{
SSHUsername: "foo",
},
} }
} }
...@@ -19,8 +23,8 @@ func TestSSHConfigPrepare(t *testing.T) { ...@@ -19,8 +23,8 @@ func TestSSHConfigPrepare(t *testing.T) {
t.Fatalf("err: %#v", errs) t.Fatalf("err: %#v", errs)
} }
if c.SSHPort != 22 { if c.Comm.SSHPort != 22 {
t.Errorf("bad ssh port: %d", c.SSHPort) t.Errorf("bad ssh port: %d", c.Comm.SSHPort)
} }
} }
...@@ -78,46 +82,14 @@ func TestSSHConfigPrepare_SSHUser(t *testing.T) { ...@@ -78,46 +82,14 @@ func TestSSHConfigPrepare_SSHUser(t *testing.T) {
var errs []error var errs []error
c = testSSHConfig() c = testSSHConfig()
c.SSHUser = "" c.Comm.SSHUsername = ""
errs = c.Prepare(testConfigTemplate(t)) errs = c.Prepare(testConfigTemplate(t))
if len(errs) == 0 { if len(errs) == 0 {
t.Fatalf("should have error") t.Fatalf("should have error")
} }
c = testSSHConfig() c = testSSHConfig()
c.SSHUser = "exists" c.Comm.SSHUsername = "exists"
errs = c.Prepare(testConfigTemplate(t))
if len(errs) > 0 {
t.Fatalf("should not have error: %#v", errs)
}
}
func TestSSHConfigPrepare_SSHWaitTimeout(t *testing.T) {
var c *SSHConfig
var errs []error
// Defaults
c = testSSHConfig()
c.RawSSHWaitTimeout = ""
errs = c.Prepare(testConfigTemplate(t))
if len(errs) > 0 {
t.Fatalf("should not have error: %#v", errs)
}
if c.RawSSHWaitTimeout != "20m" {
t.Fatalf("bad value: %s", c.RawSSHWaitTimeout)
}
// Test with a bad value
c = testSSHConfig()
c.RawSSHWaitTimeout = "this is not good"
errs = c.Prepare(testConfigTemplate(t))
if len(errs) == 0 {
t.Fatal("should have error")
}
// Test with a good one
c = testSSHConfig()
c.RawSSHWaitTimeout = "5s"
errs = c.Prepare(testConfigTemplate(t)) errs = c.Prepare(testConfigTemplate(t))
if len(errs) > 0 { if len(errs) > 0 {
t.Fatalf("should not have error: %#v", errs) t.Fatalf("should not have error: %#v", errs)
......
...@@ -9,6 +9,7 @@ import ( ...@@ -9,6 +9,7 @@ import (
"github.com/mitchellh/multistep" "github.com/mitchellh/multistep"
parallelscommon "github.com/mitchellh/packer/builder/parallels/common" parallelscommon "github.com/mitchellh/packer/builder/parallels/common"
"github.com/mitchellh/packer/common" "github.com/mitchellh/packer/common"
"github.com/mitchellh/packer/helper/communicator"
"github.com/mitchellh/packer/helper/config" "github.com/mitchellh/packer/helper/config"
"github.com/mitchellh/packer/packer" "github.com/mitchellh/packer/packer"
"github.com/mitchellh/packer/template/interpolate" "github.com/mitchellh/packer/template/interpolate"
...@@ -245,10 +246,10 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe ...@@ -245,10 +246,10 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe
VMName: b.config.VMName, VMName: b.config.VMName,
Ctx: b.config.ctx, Ctx: b.config.ctx,
}, },
&common.StepConnectSSH{ &communicator.StepConnect{
SSHAddress: parallelscommon.SSHAddress, Config: &b.config.SSHConfig.Comm,
SSHConfig: parallelscommon.SSHConfigFunc(b.config.SSHConfig), SSHAddress: parallelscommon.SSHAddress,
SSHWaitTimeout: b.config.SSHWaitTimeout, SSHConfig: parallelscommon.SSHConfigFunc(b.config.SSHConfig),
}, },
&parallelscommon.StepUploadVersion{ &parallelscommon.StepUploadVersion{
Path: b.config.PrlctlVersionFile, Path: b.config.PrlctlVersionFile,
......
...@@ -3,11 +3,13 @@ package pvm ...@@ -3,11 +3,13 @@ package pvm
import ( import (
"errors" "errors"
"fmt" "fmt"
"log"
"github.com/mitchellh/multistep" "github.com/mitchellh/multistep"
parallelscommon "github.com/mitchellh/packer/builder/parallels/common" parallelscommon "github.com/mitchellh/packer/builder/parallels/common"
"github.com/mitchellh/packer/common" "github.com/mitchellh/packer/common"
"github.com/mitchellh/packer/helper/communicator"
"github.com/mitchellh/packer/packer" "github.com/mitchellh/packer/packer"
"log"
) )
// Builder implements packer.Builder and builds the actual Parallels // Builder implements packer.Builder and builds the actual Parallels
...@@ -80,10 +82,10 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe ...@@ -80,10 +82,10 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe
VMName: b.config.VMName, VMName: b.config.VMName,
Ctx: b.config.ctx, Ctx: b.config.ctx,
}, },
&common.StepConnectSSH{ &communicator.StepConnect{
SSHAddress: parallelscommon.SSHAddress, Config: &b.config.SSHConfig.Comm,
SSHConfig: parallelscommon.SSHConfigFunc(b.config.SSHConfig), SSHAddress: parallelscommon.SSHAddress,
SSHWaitTimeout: b.config.SSHWaitTimeout, SSHConfig: parallelscommon.SSHConfigFunc(b.config.SSHConfig),
}, },
&parallelscommon.StepUploadVersion{ &parallelscommon.StepUploadVersion{
Path: b.config.PrlctlVersionFile, Path: b.config.PrlctlVersionFile,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment