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:
parent
2415ca2fd2
commit
ac2ddbcbf5
|
@ -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,
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue