builder/vmware: Properly detect host IP
This commit is contained in:
parent
34f4086963
commit
dfee3eb8ef
|
@ -0,0 +1,43 @@
|
||||||
|
package vmware
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"errors"
|
||||||
|
"os/exec"
|
||||||
|
"regexp"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Interface to help find the host IP that is available from within
|
||||||
|
// the VMware virtual machines.
|
||||||
|
type HostIPFinder interface {
|
||||||
|
HostIP() (string, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
// IfconfigIPFinder finds the host IP based on the output of `ifconfig`.
|
||||||
|
type IfconfigIPFinder struct {
|
||||||
|
Device string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *IfconfigIPFinder) HostIP() (string, error) {
|
||||||
|
ifconfigPath, err := exec.LookPath("ifconfig")
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
stdout := new(bytes.Buffer)
|
||||||
|
|
||||||
|
cmd := exec.Command(ifconfigPath, f.Device)
|
||||||
|
cmd.Stdout = stdout
|
||||||
|
cmd.Stderr = new(bytes.Buffer)
|
||||||
|
if err := cmd.Run(); err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
re := regexp.MustCompile(`inet\s*(.+?)\s`)
|
||||||
|
matches := re.FindStringSubmatch(stdout.String())
|
||||||
|
if matches == nil {
|
||||||
|
return "", errors.New("IP not found in ifconfig output...")
|
||||||
|
}
|
||||||
|
|
||||||
|
return matches[1], nil
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
package vmware
|
||||||
|
|
||||||
|
import "testing"
|
||||||
|
|
||||||
|
func TestIfconfigIPFinder_Impl(t *testing.T) {
|
||||||
|
var raw interface{}
|
||||||
|
raw = &IfconfigIPFinder{}
|
||||||
|
if _, ok := raw.(HostIPFinder); !ok {
|
||||||
|
t.Fatalf("IfconfigIPFinder is not a host IP finder")
|
||||||
|
}
|
||||||
|
}
|
|
@ -41,6 +41,7 @@ func (s *stepTypeBootCommand) Run(state map[string]interface{}) multistep.StepAc
|
||||||
ui := state["ui"].(packer.Ui)
|
ui := state["ui"].(packer.Ui)
|
||||||
vncPort := state["vnc_port"].(uint)
|
vncPort := state["vnc_port"].(uint)
|
||||||
|
|
||||||
|
// Connect to VNC
|
||||||
ui.Say("Connecting to VM via VNC")
|
ui.Say("Connecting to VM via VNC")
|
||||||
nc, err := net.Dial("tcp", fmt.Sprintf("127.0.0.1:%d", vncPort))
|
nc, err := net.Dial("tcp", fmt.Sprintf("127.0.0.1:%d", vncPort))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -58,8 +59,16 @@ func (s *stepTypeBootCommand) Run(state map[string]interface{}) multistep.StepAc
|
||||||
|
|
||||||
log.Printf("Connected to VNC desktop: %s", c.DesktopName)
|
log.Printf("Connected to VNC desktop: %s", c.DesktopName)
|
||||||
|
|
||||||
|
// Determine the host IP
|
||||||
|
ipFinder := &IfconfigIPFinder{"vmnet8"}
|
||||||
|
hostIp, err := ipFinder.HostIP()
|
||||||
|
if err != nil {
|
||||||
|
ui.Error(fmt.Sprintf("Error detecting host IP: %s", err))
|
||||||
|
return multistep.ActionHalt
|
||||||
|
}
|
||||||
|
|
||||||
tplData := &bootCommandTemplateData{
|
tplData := &bootCommandTemplateData{
|
||||||
"127.0.0.1",
|
hostIp,
|
||||||
httpPort,
|
httpPort,
|
||||||
config.VMName,
|
config.VMName,
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,7 +19,7 @@ func (stepWaitForIP) Run(state map[string]interface{}) multistep.StepAction {
|
||||||
ui := state["ui"].(packer.Ui)
|
ui := state["ui"].(packer.Ui)
|
||||||
|
|
||||||
ui.Say("Waiting for SSH to become available...")
|
ui.Say("Waiting for SSH to become available...")
|
||||||
select{}
|
select {}
|
||||||
|
|
||||||
return multistep.ActionContinue
|
return multistep.ActionContinue
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue