Merge pull request #5931 from arizvisa/GH-5916

Fixes the assumption that all the VMware builder's drivers will implement a network mapper for mapping a network name to it's corresponding device.
This commit is contained in:
SwampDragons 2018-02-21 14:56:53 -08:00 committed by GitHub
commit 3ea7fc9876
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 53 additions and 15 deletions

View File

@ -147,6 +147,29 @@ func (d *ESX5Driver) ToolsInstall() error {
} }
func (d *ESX5Driver) Verify() error { func (d *ESX5Driver) Verify() error {
// Ensure that NetworkMapper is nil, since the mapping of device<->network
// is handled by ESX and thus can't be performed by packer unless we
// query things.
// FIXME: If we want to expose the network devices to the user, then we can
// probably use esxcli to enumerate the portgroup and switchId
d.base.NetworkMapper = nil
// Be safe/friendly and overwrite the rest of the utility functions with
// log functions despite the fact that these shouldn't be called anyways.
d.base.DhcpLeasesPath = func(device string) string {
log.Printf("Unexpected error, ESX5 driver attempted to call DhcpLeasesPath(%#v)\n", device)
return ""
}
d.base.DhcpConfPath = func(device string) string {
log.Printf("Unexpected error, ESX5 driver attempted to call DhcpConfPath(%#v)\n", device)
return ""
}
d.base.VmnetnatConfPath = func(device string) string {
log.Printf("Unexpected error, ESX5 driver attempted to call VmnetnatConfPath(%#v)\n", device)
return ""
}
checks := []func() error{ checks := []func() error{
d.connect, d.connect,
d.checkSystemVersion, d.checkSystemVersion,

View File

@ -462,26 +462,41 @@ func (s *stepCreateVMX) Run(_ context.Context, state multistep.StateBag) multist
network := config.Network network := config.Network
driver := state.Get("driver").(vmwcommon.Driver).GetVmwareDriver() driver := state.Get("driver").(vmwcommon.Driver).GetVmwareDriver()
// read netmap config // check to see if the driver implements a network mapper for mapping
netmap, err := driver.NetworkMapper() // the network-type to its device-name.
if err != nil { if driver.NetworkMapper != nil {
state.Put("error", err)
ui.Error(err.Error())
return multistep.ActionHalt
}
// try and convert the specified network to a device // read network map configuration into a NetworkNameMapper.
device, err := netmap.NameIntoDevice(network) netmap, err := driver.NetworkMapper()
if err != nil {
state.Put("error", err)
ui.Error(err.Error())
return multistep.ActionHalt
}
// success. so we know that it's an actual network type inside netmap.conf // try and convert the specified network to a device.
if err == nil { device, err := netmap.NameIntoDevice(network)
templateData.Network_Type = network
templateData.Network_Device = device // success. so we know that it's an actual network type inside netmap.conf
// we were unable to find the type, so assume it's a custom network device. if err == nil {
templateData.Network_Type = network
templateData.Network_Device = device
// otherwise, we were unable to find the type, so assume its a custom device.
} else {
templateData.Network_Type = "custom"
templateData.Network_Device = network
}
// if NetworkMapper is nil, then we're using something like ESX, so fall
// back to the previous logic of using "nat" despite it not mattering to ESX.
} else { } else {
templateData.Network_Type = "custom" templateData.Network_Type = "nat"
templateData.Network_Device = network templateData.Network_Device = network
network = "nat"
} }
// store the network so that we can later figure out what ip address to bind to // store the network so that we can later figure out what ip address to bind to
state.Put("vmnetwork", network) state.Put("vmnetwork", network)