Commit 115d583c authored by Mitchell Hashimoto's avatar Mitchell Hashimoto

helper/communicator: make host more generic

parent 68e4734c
...@@ -10,9 +10,9 @@ import ( ...@@ -10,9 +10,9 @@ import (
"golang.org/x/crypto/ssh" "golang.org/x/crypto/ssh"
) )
// SSHAddress returns a function that can be given to the SSH communicator // SSHHost returns a function that can be given to the SSH communicator
// for determining the SSH address based on the instance DNS name. // for determining the SSH address based on the instance DNS name.
func SSHAddress(e *ec2.EC2, port int, private bool) func(multistep.StateBag) (string, error) { func SSHHost(e *ec2.EC2, private bool) func(multistep.StateBag) (string, error) {
return func(state multistep.StateBag) (string, error) { return func(state multistep.StateBag) (string, error) {
for j := 0; j < 2; j++ { for j := 0; j < 2; j++ {
var host string var host string
...@@ -28,7 +28,7 @@ func SSHAddress(e *ec2.EC2, port int, private bool) func(multistep.StateBag) (st ...@@ -28,7 +28,7 @@ func SSHAddress(e *ec2.EC2, port int, private bool) func(multistep.StateBag) (st
} }
if host != "" { if host != "" {
return fmt.Sprintf("%s:%d", host, port), nil return host, nil
} }
r, err := e.DescribeInstances(&ec2.DescribeInstancesInput{ r, err := e.DescribeInstances(&ec2.DescribeInstancesInput{
......
...@@ -115,9 +115,8 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe ...@@ -115,9 +115,8 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe
}, },
&communicator.StepConnect{ &communicator.StepConnect{
Config: &b.config.RunConfig.Comm, Config: &b.config.RunConfig.Comm,
SSHAddress: awscommon.SSHAddress( Host: awscommon.SSHHost(
ec2conn, ec2conn,
b.config.RunConfig.Comm.SSHPort,
b.config.SSHPrivateIp), b.config.SSHPrivateIp),
SSHConfig: awscommon.SSHConfig( SSHConfig: awscommon.SSHConfig(
b.config.RunConfig.Comm.SSHUsername), b.config.RunConfig.Comm.SSHUsername),
......
...@@ -200,9 +200,8 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe ...@@ -200,9 +200,8 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe
}, },
&communicator.StepConnect{ &communicator.StepConnect{
Config: &b.config.RunConfig.Comm, Config: &b.config.RunConfig.Comm,
SSHAddress: awscommon.SSHAddress( Host: awscommon.SSHHost(
ec2conn, ec2conn,
b.config.RunConfig.Comm.SSHPort,
b.config.SSHPrivateIp), b.config.SSHPrivateIp),
SSHConfig: awscommon.SSHConfig( SSHConfig: awscommon.SSHConfig(
b.config.RunConfig.Comm.SSHUsername), b.config.RunConfig.Comm.SSHUsername),
......
...@@ -54,9 +54,9 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe ...@@ -54,9 +54,9 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe
new(stepCreateDroplet), new(stepCreateDroplet),
new(stepDropletInfo), new(stepDropletInfo),
&communicator.StepConnect{ &communicator.StepConnect{
Config: &b.config.Comm, Config: &b.config.Comm,
SSHAddress: sshAddress, Host: commHost,
SSHConfig: sshConfig, SSHConfig: sshConfig,
}, },
new(common.StepProvision), new(common.StepProvision),
new(stepShutdown), new(stepShutdown),
......
...@@ -2,14 +2,14 @@ package digitalocean ...@@ -2,14 +2,14 @@ package digitalocean
import ( import (
"fmt" "fmt"
"github.com/mitchellh/multistep"
"golang.org/x/crypto/ssh" "golang.org/x/crypto/ssh"
"github.com/mitchellh/multistep"
) )
func sshAddress(state multistep.StateBag) (string, error) { func commHost(state multistep.StateBag) (string, error) {
config := state.Get("config").(Config)
ipAddress := state.Get("droplet_ip").(string) ipAddress := state.Get("droplet_ip").(string)
return fmt.Sprintf("%s:%d", ipAddress, config.Comm.SSHPort), nil return ipAddress, nil
} }
func sshConfig(state multistep.StateBag) (*ssh.ClientConfig, error) { func sshConfig(state multistep.StateBag) (*ssh.ClientConfig, error) {
......
...@@ -62,9 +62,9 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe ...@@ -62,9 +62,9 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe
Debug: b.config.PackerDebug, Debug: b.config.PackerDebug,
}, },
&communicator.StepConnect{ &communicator.StepConnect{
Config: &b.config.Comm, Config: &b.config.Comm,
SSHAddress: sshAddress, Host: commHost,
SSHConfig: sshConfig, SSHConfig: sshConfig,
}, },
new(common.StepProvision), new(common.StepProvision),
new(StepTeardownInstance), new(StepTeardownInstance),
......
...@@ -2,15 +2,14 @@ package googlecompute ...@@ -2,15 +2,14 @@ package googlecompute
import ( import (
"fmt" "fmt"
"github.com/mitchellh/multistep" "github.com/mitchellh/multistep"
"golang.org/x/crypto/ssh" "golang.org/x/crypto/ssh"
) )
// sshAddress returns the ssh address. func commHost(state multistep.StateBag) (string, error) {
func sshAddress(state multistep.StateBag) (string, error) {
config := state.Get("config").(*Config)
ipAddress := state.Get("instance_ip").(string) ipAddress := state.Get("instance_ip").(string)
return fmt.Sprintf("%s:%d", ipAddress, config.Comm.SSHPort), nil return ipAddress, nil
} }
// sshConfig returns the ssh configuration. // sshConfig returns the ssh configuration.
......
...@@ -30,8 +30,7 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe ...@@ -30,8 +30,7 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe
steps := []multistep.Step{ steps := []multistep.Step{
&communicator.StepConnect{ &communicator.StepConnect{
Config: &b.config.CommConfig, Config: &b.config.CommConfig,
SSHAddress: SSHAddress( Host: CommHost(b.config.CommConfig.SSHHost),
b.config.CommConfig.SSHHost, b.config.CommConfig.SSHPort),
SSHConfig: SSHConfig( SSHConfig: SSHConfig(
b.config.CommConfig.SSHUsername, b.config.CommConfig.SSHUsername,
b.config.CommConfig.SSHPassword, b.config.CommConfig.SSHPassword,
......
...@@ -8,11 +8,9 @@ import ( ...@@ -8,11 +8,9 @@ import (
"io/ioutil" "io/ioutil"
) )
// SSHAddress returns a function that can be given to the SSH communicator func CommHost(host string) func(multistep.StateBag) (string, error) {
// for determining the SSH address
func SSHAddress(host string, port int) func(multistep.StateBag) (string, error) {
return func(state multistep.StateBag) (string, error) { return func(state multistep.StateBag) (string, error) {
return fmt.Sprintf("%s:%d", host, port), nil return host, nil
} }
} }
......
...@@ -92,10 +92,9 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe ...@@ -92,10 +92,9 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe
}, },
&communicator.StepConnect{ &communicator.StepConnect{
Config: &b.config.RunConfig.Comm, Config: &b.config.RunConfig.Comm,
SSHAddress: SSHAddress( Host: CommHost(
computeClient, computeClient,
b.config.SSHInterface, b.config.SSHInterface),
b.config.RunConfig.Comm.SSHPort),
SSHConfig: SSHConfig(b.config.RunConfig.Comm.SSHUsername), SSHConfig: SSHConfig(b.config.RunConfig.Comm.SSHUsername),
}, },
&common.StepProvision{}, &common.StepProvision{},
......
...@@ -13,22 +13,21 @@ import ( ...@@ -13,22 +13,21 @@ import (
"golang.org/x/crypto/ssh" "golang.org/x/crypto/ssh"
) )
// SSHAddress returns a function that can be given to the SSH communicator // CommHost looks up the host for the communicator.
// for determining the SSH address based on the server AccessIPv4 setting.. func CommHost(
func SSHAddress(
client *gophercloud.ServiceClient, client *gophercloud.ServiceClient,
sshinterface string, port int) func(multistep.StateBag) (string, error) { sshinterface string) func(multistep.StateBag) (string, error) {
return func(state multistep.StateBag) (string, error) { return func(state multistep.StateBag) (string, error) {
s := state.Get("server").(*servers.Server) s := state.Get("server").(*servers.Server)
// If we have a floating IP, use that // If we have a floating IP, use that
ip := state.Get("access_ip").(*floatingip.FloatingIP) ip := state.Get("access_ip").(*floatingip.FloatingIP)
if ip != nil && ip.IP != "" { if ip != nil && ip.IP != "" {
return fmt.Sprintf("%s:%d", ip.IP, port), nil return ip.IP, nil
} }
if s.AccessIPv4 != "" { if s.AccessIPv4 != "" {
return fmt.Sprintf("%s:%d", s.AccessIPv4, port), nil return s.AccessIPv4, nil
} }
// Get all the addresses associated with this server. This // Get all the addresses associated with this server. This
...@@ -53,7 +52,7 @@ func SSHAddress( ...@@ -53,7 +52,7 @@ func SSHAddress(
} }
} }
if addr != "" { if addr != "" {
return fmt.Sprintf("%s:%d", addr, port), nil return addr, nil
} }
} }
} }
......
package common package common
import ( import (
"fmt"
"github.com/mitchellh/multistep" "github.com/mitchellh/multistep"
commonssh "github.com/mitchellh/packer/common/ssh" commonssh "github.com/mitchellh/packer/common/ssh"
packerssh "github.com/mitchellh/packer/communicator/ssh" packerssh "github.com/mitchellh/packer/communicator/ssh"
"golang.org/x/crypto/ssh" "golang.org/x/crypto/ssh"
) )
func SSHAddress(state multistep.StateBag) (string, error) { func CommHost(state multistep.StateBag) (string, error) {
vmName := state.Get("vmName").(string) vmName := state.Get("vmName").(string)
driver := state.Get("driver").(Driver) driver := state.Get("driver").(Driver)
...@@ -23,7 +21,7 @@ func SSHAddress(state multistep.StateBag) (string, error) { ...@@ -23,7 +21,7 @@ func SSHAddress(state multistep.StateBag) (string, error) {
return "", err return "", err
} }
return fmt.Sprintf("%s:22", ip), nil return ip, nil
} }
func SSHConfigFunc(config SSHConfig) func(multistep.StateBag) (*ssh.ClientConfig, error) { func SSHConfigFunc(config SSHConfig) func(multistep.StateBag) (*ssh.ClientConfig, error) {
......
...@@ -247,9 +247,9 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe ...@@ -247,9 +247,9 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe
Ctx: b.config.ctx, Ctx: b.config.ctx,
}, },
&communicator.StepConnect{ &communicator.StepConnect{
Config: &b.config.SSHConfig.Comm, Config: &b.config.SSHConfig.Comm,
SSHAddress: parallelscommon.SSHAddress, Host: parallelscommon.CommHost,
SSHConfig: parallelscommon.SSHConfigFunc(b.config.SSHConfig), SSHConfig: parallelscommon.SSHConfigFunc(b.config.SSHConfig),
}, },
&parallelscommon.StepUploadVersion{ &parallelscommon.StepUploadVersion{
Path: b.config.PrlctlVersionFile, Path: b.config.PrlctlVersionFile,
......
...@@ -83,9 +83,9 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe ...@@ -83,9 +83,9 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe
Ctx: b.config.ctx, Ctx: b.config.ctx,
}, },
&communicator.StepConnect{ &communicator.StepConnect{
Config: &b.config.SSHConfig.Comm, Config: &b.config.SSHConfig.Comm,
SSHAddress: parallelscommon.SSHAddress, Host: parallelscommon.CommHost,
SSHConfig: parallelscommon.SSHConfigFunc(b.config.SSHConfig), SSHConfig: parallelscommon.SSHConfigFunc(b.config.SSHConfig),
}, },
&parallelscommon.StepUploadVersion{ &parallelscommon.StepUploadVersion{
Path: b.config.PrlctlVersionFile, Path: b.config.PrlctlVersionFile,
......
...@@ -393,9 +393,10 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe ...@@ -393,9 +393,10 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe
&stepBootWait{}, &stepBootWait{},
&stepTypeBootCommand{}, &stepTypeBootCommand{},
&communicator.StepConnect{ &communicator.StepConnect{
Config: &b.config.Comm, Config: &b.config.Comm,
SSHAddress: sshAddress, Host: commHost,
SSHConfig: sshConfig, SSHConfig: sshConfig,
SSHPort: commPort,
}, },
new(common.StepProvision), new(common.StepProvision),
new(stepShutdown), new(stepShutdown),
......
package qemu package qemu
import ( import (
"fmt"
"github.com/mitchellh/multistep" "github.com/mitchellh/multistep"
commonssh "github.com/mitchellh/packer/common/ssh" commonssh "github.com/mitchellh/packer/common/ssh"
"github.com/mitchellh/packer/communicator/ssh" "github.com/mitchellh/packer/communicator/ssh"
gossh "golang.org/x/crypto/ssh" gossh "golang.org/x/crypto/ssh"
) )
func sshAddress(state multistep.StateBag) (string, error) { func commHost(state multistep.StateBag) (string, error) {
return "127.0.0.1", nil
}
func commPort(state multistep.StateBag) (int, error) {
sshHostPort := state.Get("sshHostPort").(uint) sshHostPort := state.Get("sshHostPort").(uint)
return fmt.Sprintf("127.0.0.1:%d", sshHostPort), nil return int(sshHostPort), nil
} }
func sshConfig(state multistep.StateBag) (*gossh.ClientConfig, error) { func sshConfig(state multistep.StateBag) (*gossh.ClientConfig, error) {
......
package common package common
import ( import (
"fmt"
"github.com/mitchellh/multistep" "github.com/mitchellh/multistep"
commonssh "github.com/mitchellh/packer/common/ssh" commonssh "github.com/mitchellh/packer/common/ssh"
"github.com/mitchellh/packer/communicator/ssh" "github.com/mitchellh/packer/communicator/ssh"
gossh "golang.org/x/crypto/ssh" gossh "golang.org/x/crypto/ssh"
) )
func SSHAddress(state multistep.StateBag) (string, error) { func CommHost(state multistep.StateBag) (string, error) {
return "127.0.0.1", nil
}
func SSHPort(state multistep.StateBag) (int, error) {
sshHostPort := state.Get("sshHostPort").(uint) sshHostPort := state.Get("sshHostPort").(uint)
return fmt.Sprintf("127.0.0.1:%d", sshHostPort), nil return int(sshHostPort), nil
} }
func SSHConfigFunc(config SSHConfig) func(multistep.StateBag) (*gossh.ClientConfig, error) { func SSHConfigFunc(config SSHConfig) func(multistep.StateBag) (*gossh.ClientConfig, error) {
......
...@@ -273,9 +273,10 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe ...@@ -273,9 +273,10 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe
Ctx: b.config.ctx, Ctx: b.config.ctx,
}, },
&communicator.StepConnect{ &communicator.StepConnect{
Config: &b.config.SSHConfig.Comm, Config: &b.config.SSHConfig.Comm,
SSHAddress: vboxcommon.SSHAddress, Host: vboxcommon.CommHost,
SSHConfig: vboxcommon.SSHConfigFunc(b.config.SSHConfig), SSHConfig: vboxcommon.SSHConfigFunc(b.config.SSHConfig),
SSHPort: vboxcommon.SSHPort,
}, },
&vboxcommon.StepUploadVersion{ &vboxcommon.StepUploadVersion{
Path: b.config.VBoxVersionFile, Path: b.config.VBoxVersionFile,
......
...@@ -102,9 +102,10 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe ...@@ -102,9 +102,10 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe
Ctx: b.config.ctx, Ctx: b.config.ctx,
}, },
&communicator.StepConnect{ &communicator.StepConnect{
Config: &b.config.SSHConfig.Comm, Config: &b.config.SSHConfig.Comm,
SSHAddress: vboxcommon.SSHAddress, Host: vboxcommon.CommHost,
SSHConfig: vboxcommon.SSHConfigFunc(b.config.SSHConfig), SSHConfig: vboxcommon.SSHConfigFunc(b.config.SSHConfig),
SSHPort: vboxcommon.SSHPort,
}, },
&vboxcommon.StepUploadVersion{ &vboxcommon.StepUploadVersion{
Path: b.config.VBoxVersionFile, Path: b.config.VBoxVersionFile,
......
...@@ -29,9 +29,9 @@ type Driver interface { ...@@ -29,9 +29,9 @@ type Driver interface {
// Checks if the VMX file at the given path is running. // Checks if the VMX file at the given path is running.
IsRunning(string) (bool, error) IsRunning(string) (bool, error)
// SSHAddress returns the SSH address for the VM that is being // CommHost returns the host address for the VM that is being
// managed by this driver. // managed by this driver.
SSHAddress(multistep.StateBag) (string, error) CommHost(multistep.StateBag) (string, error)
// Start starts a VM specified by the path to the VMX given. // Start starts a VM specified by the path to the VMX given.
Start(string, bool) error Start(string, bool) error
......
...@@ -69,8 +69,8 @@ func (d *Fusion5Driver) IsRunning(vmxPath string) (bool, error) { ...@@ -69,8 +69,8 @@ func (d *Fusion5Driver) IsRunning(vmxPath string) (bool, error) {
return false, nil return false, nil
} }
func (d *Fusion5Driver) SSHAddress(state multistep.StateBag) (string, error) { func (d *Fusion5Driver) CommHost(state multistep.StateBag) (string, error) {
return SSHAddressFunc(d.SSHConfig)(state) return CommHost(d.SSHConfig)(state)
} }
func (d *Fusion5Driver) Start(vmxPath string, headless bool) error { func (d *Fusion5Driver) Start(vmxPath string, headless bool) error {
......
...@@ -29,10 +29,10 @@ type DriverMock struct { ...@@ -29,10 +29,10 @@ type DriverMock struct {
IsRunningResult bool IsRunningResult bool
IsRunningErr error IsRunningErr error
SSHAddressCalled bool CommHostCalled bool
SSHAddressState multistep.StateBag CommHostState multistep.StateBag
SSHAddressResult string CommHostResult string
SSHAddressErr error CommHostErr error
StartCalled bool StartCalled bool
StartPath string StartPath string
...@@ -92,10 +92,10 @@ func (d *DriverMock) IsRunning(path string) (bool, error) { ...@@ -92,10 +92,10 @@ func (d *DriverMock) IsRunning(path string) (bool, error) {
return d.IsRunningResult, d.IsRunningErr return d.IsRunningResult, d.IsRunningErr
} }
func (d *DriverMock) SSHAddress(state multistep.StateBag) (string, error) { func (d *DriverMock) CommHost(state multistep.StateBag) (string, error) {
d.SSHAddressCalled = true d.CommHostCalled = true
d.SSHAddressState = state d.CommHostState = state
return d.SSHAddressResult, d.SSHAddressErr return d.CommHostResult, d.CommHostErr
} }
func (d *DriverMock) Start(path string, headless bool) error { func (d *DriverMock) Start(path string, headless bool) error {
......
...@@ -97,8 +97,8 @@ func (d *Player5Driver) IsRunning(vmxPath string) (bool, error) { ...@@ -97,8 +97,8 @@ func (d *Player5Driver) IsRunning(vmxPath string) (bool, error) {
return false, nil return false, nil
} }
func (d *Player5Driver) SSHAddress(state multistep.StateBag) (string, error) { func (d *Player5Driver) CommHost(state multistep.StateBag) (string, error) {
return SSHAddressFunc(d.SSHConfig)(state) return CommHost(d.SSHConfig)(state)
} }
func (d *Player5Driver) Start(vmxPath string, headless bool) error { func (d *Player5Driver) Start(vmxPath string, headless bool) error {
......
...@@ -70,8 +70,8 @@ func (d *Workstation9Driver) IsRunning(vmxPath string) (bool, error) { ...@@ -70,8 +70,8 @@ func (d *Workstation9Driver) IsRunning(vmxPath string) (bool, error) {
return false, nil return false, nil
} }
func (d *Workstation9Driver) SSHAddress(state multistep.StateBag) (string, error) { func (d *Workstation9Driver) CommHost(state multistep.StateBag) (string, error) {
return SSHAddressFunc(d.SSHConfig)(state) return CommHost(d.SSHConfig)(state)
} }
func (d *Workstation9Driver) Start(vmxPath string, headless bool) error { func (d *Workstation9Driver) Start(vmxPath string, headless bool) error {
......
...@@ -13,13 +13,13 @@ import ( ...@@ -13,13 +13,13 @@ import (
gossh "golang.org/x/crypto/ssh" gossh "golang.org/x/crypto/ssh"
) )
func SSHAddressFunc(config *SSHConfig) func(multistep.StateBag) (string, error) { func CommHost(config *SSHConfig) func(multistep.StateBag) (string, error) {
return func(state multistep.StateBag) (string, error) { return func(state multistep.StateBag) (string, error) {
driver := state.Get("driver").(Driver) driver := state.Get("driver").(Driver)
vmxPath := state.Get("vmx_path").(string) vmxPath := state.Get("vmx_path").(string)
if config.Comm.SSHHost != "" { if config.Comm.SSHHost != "" {
return fmt.Sprintf("%s:%d", config.Comm.SSHHost, config.Comm.SSHPort), nil return config.Comm.SSHHost, nil
} }
log.Println("Lookup up IP information...") log.Println("Lookup up IP information...")
...@@ -62,7 +62,7 @@ func SSHAddressFunc(config *SSHConfig) func(multistep.StateBag) (string, error) ...@@ -62,7 +62,7 @@ func SSHAddressFunc(config *SSHConfig) func(multistep.StateBag) (string, error)
} }
log.Printf("Detected IP: %s", ipAddress) log.Printf("Detected IP: %s", ipAddress)
return fmt.Sprintf("%s:%d", ipAddress, config.Comm.SSHPort), nil return ipAddress, nil
} }
} }
......
...@@ -300,9 +300,9 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe ...@@ -300,9 +300,9 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe
Ctx: b.config.ctx, Ctx: b.config.ctx,
}, },
&communicator.StepConnect{ &communicator.StepConnect{
Config: &b.config.SSHConfig.Comm, Config: &b.config.SSHConfig.Comm,
SSHAddress: driver.SSHAddress, Host: driver.CommHost,
SSHConfig: vmwcommon.SSHConfigFunc(&b.config.SSHConfig), SSHConfig: vmwcommon.SSHConfigFunc(&b.config.SSHConfig),
}, },
&vmwcommon.StepUploadTools{ &vmwcommon.StepUploadTools{
RemoteType: b.config.RemoteType, RemoteType: b.config.RemoteType,
......
...@@ -218,7 +218,7 @@ func (d *ESX5Driver) VNCAddress(portMin, portMax uint) (string, uint, error) { ...@@ -218,7 +218,7 @@ func (d *ESX5Driver) VNCAddress(portMin, portMax uint) (string, uint, error) {
return d.Host, vncPort, nil return d.Host, vncPort, nil
} }
func (d *ESX5Driver) SSHAddress(state multistep.StateBag) (string, error) { func (d *ESX5Driver) CommHost(state multistep.StateBag) (string, error) {
config := state.Get("config").(*Config) config := state.Get("config").(*Config)
if address, ok := state.GetOk("vm_address"); ok { if address, ok := state.GetOk("vm_address"); ok {
...@@ -253,7 +253,7 @@ func (d *ESX5Driver) SSHAddress(state multistep.StateBag) (string, error) { ...@@ -253,7 +253,7 @@ func (d *ESX5Driver) SSHAddress(state multistep.StateBag) (string, error) {
return "", errors.New("VM network port found, but no IP address") return "", errors.New("VM network port found, but no IP address")
} }
address := fmt.Sprintf("%s:%d", record["IPAddress"], config.Comm.SSHPort) address := record["IPAddress"]
state.Put("vm_address", address) state.Put("vm_address", address)
return address, nil return address, nil
} }
......
...@@ -92,9 +92,9 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe ...@@ -92,9 +92,9 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe
Ctx: b.config.ctx, Ctx: b.config.ctx,
}, },
&communicator.StepConnect{ &communicator.StepConnect{
Config: &b.config.SSHConfig.Comm, Config: &b.config.SSHConfig.Comm,
SSHAddress: driver.SSHAddress, Host: driver.CommHost,
SSHConfig: vmwcommon.SSHConfigFunc(&b.config.SSHConfig), SSHConfig: vmwcommon.SSHConfigFunc(&b.config.SSHConfig),
}, },
&vmwcommon.StepUploadTools{ &vmwcommon.StepUploadTools{
RemoteType: b.config.RemoteType, RemoteType: b.config.RemoteType,
......
...@@ -15,15 +15,16 @@ type StepConnect struct { ...@@ -15,15 +15,16 @@ type StepConnect struct {
// Config is the communicator config struct // Config is the communicator config struct
Config *Config Config *Config
// Host should return a host that can be connected to for communicator
// connections.
Host func(multistep.StateBag) (string, error)
// The fields below are callbacks to assist with connecting to SSH. // The fields below are callbacks to assist with connecting to SSH.
// //
// SSHAddress should return the default host to connect to for SSH.
// This is only called if ssh_host isn't specified in the config.
//
// SSHConfig should return the default configuration for // SSHConfig should return the default configuration for
// connecting via SSH. // connecting via SSH.
SSHAddress func(multistep.StateBag) (string, error) SSHConfig func(multistep.StateBag) (*gossh.ClientConfig, error)
SSHConfig func(multistep.StateBag) (*gossh.ClientConfig, error) SSHPort func(multistep.StateBag) (int, error)
substep multistep.Step substep multistep.Step
} }
...@@ -32,9 +33,10 @@ func (s *StepConnect) Run(state multistep.StateBag) multistep.StepAction { ...@@ -32,9 +33,10 @@ func (s *StepConnect) Run(state multistep.StateBag) multistep.StepAction {
typeMap := map[string]multistep.Step{ typeMap := map[string]multistep.Step{
"none": nil, "none": nil,
"ssh": &StepConnectSSH{ "ssh": &StepConnectSSH{
Config: s.Config, Config: s.Config,
SSHAddress: s.SSHAddress, Host: s.Host,
SSHConfig: s.SSHConfig, SSHConfig: s.SSHConfig,
SSHPort: s.SSHPort,
}, },
} }
......
...@@ -18,9 +18,10 @@ import ( ...@@ -18,9 +18,10 @@ import (
// In general, you should use StepConnect. // In general, you should use StepConnect.
type StepConnectSSH struct { type StepConnectSSH struct {
// All the fields below are documented on StepConnect // All the fields below are documented on StepConnect
Config *Config Config *Config
SSHAddress func(multistep.StateBag) (string, error) Host func(multistep.StateBag) (string, error)
SSHConfig func(multistep.StateBag) (*gossh.ClientConfig, error) SSHConfig func(multistep.StateBag) (*gossh.ClientConfig, error)
SSHPort func(multistep.StateBag) (int, error)
} }
func (s *StepConnectSSH) Run(state multistep.StateBag) multistep.StepAction { func (s *StepConnectSSH) Run(state multistep.StateBag) multistep.StepAction {
...@@ -95,11 +96,19 @@ func (s *StepConnectSSH) waitForSSH(state multistep.StateBag, cancel <-chan stru ...@@ -95,11 +96,19 @@ func (s *StepConnectSSH) waitForSSH(state multistep.StateBag, cancel <-chan stru
first = false first = false
// First we request the TCP connection information // First we request the TCP connection information
address, err := s.SSHAddress(state) host, err := s.Host(state)
if err != nil { if err != nil {
log.Printf("[DEBUG] Error getting SSH address: %s", err) log.Printf("[DEBUG] Error getting SSH address: %s", err)
continue continue
} }
port := s.Config.SSHPort
if s.SSHPort != nil {
port, err = s.SSHPort(state)
if err != nil {
log.Printf("[DEBUG] Error getting SSH port: %s", err)
continue
}
}
// Retrieve the SSH configuration // Retrieve the SSH configuration
sshConfig, err := s.SSHConfig(state) sshConfig, err := s.SSHConfig(state)
...@@ -108,6 +117,8 @@ func (s *StepConnectSSH) waitForSSH(state multistep.StateBag, cancel <-chan stru ...@@ -108,6 +117,8 @@ func (s *StepConnectSSH) waitForSSH(state multistep.StateBag, cancel <-chan stru
continue continue
} }
address := fmt.Sprintf("%s:%d", host, port)
// Attempt to connect to SSH port // Attempt to connect to SSH port
connFunc := ssh.ConnectFunc("tcp", address) connFunc := ssh.ConnectFunc("tcp", address)
nc, err := connFunc() nc, err := connFunc()
......
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