builder/vmware: Properly detect host IP

This commit is contained in:
Mitchell Hashimoto 2013-06-05 20:40:39 -07:00
parent 34f4086963
commit dfee3eb8ef
4 changed files with 65 additions and 2 deletions

43
builder/vmware/host_ip.go Normal file
View File

@ -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
}

View File

@ -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")
}
}

View File

@ -41,6 +41,7 @@ func (s *stepTypeBootCommand) Run(state map[string]interface{}) multistep.StepAc
ui := state["ui"].(packer.Ui)
vncPort := state["vnc_port"].(uint)
// Connect to VNC
ui.Say("Connecting to VM via VNC")
nc, err := net.Dial("tcp", fmt.Sprintf("127.0.0.1:%d", vncPort))
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)
// 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{
"127.0.0.1",
hostIp,
httpPort,
config.VMName,
}

View File

@ -19,7 +19,7 @@ func (stepWaitForIP) Run(state map[string]interface{}) multistep.StepAction {
ui := state["ui"].(packer.Ui)
ui.Say("Waiting for SSH to become available...")
select{}
select {}
return multistep.ActionContinue
}