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.

The ESX5 driver doesn't have a way of mapping the network name to its device name because a .vmx template uses different field names for it and so packer let's ESX handle filling this in. This patch will check to see if the driver that packer determines is missing a NetworkMapper implementation (by checking for nil). If it is, then fall back to using "nat" despite ESX not using the network type at all. This is what packer did prior to exposing the network type to the user back in version 1.1.3.

This closes issue #5916.
This commit is contained in:
Ali Rizvi-Santiago 2018-02-20 19:42:45 -06:00
parent 2415ca2fd2
commit ac2ddbcbf5
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)