added mac address parameter (#6966)
This commit is contained in:
parent
38fd8d5d71
commit
2e49042d10
|
@ -36,6 +36,7 @@ type networkInterface struct {
|
|||
ipv6PrefixLength int
|
||||
ipv6Gateway string
|
||||
adapterType string // TODO: Make "adapter_type" argument
|
||||
macAddress string
|
||||
}
|
||||
|
||||
type hardDisk struct {
|
||||
|
@ -317,6 +318,12 @@ func resourceVSphereVirtualMachine() *schema.Resource {
|
|||
Optional: true,
|
||||
ForceNew: true,
|
||||
},
|
||||
|
||||
"mac_address": &schema.Schema{
|
||||
Type: schema.TypeString,
|
||||
Optional: true,
|
||||
Computed: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
|
@ -719,6 +726,9 @@ func resourceVSphereVirtualMachineCreate(d *schema.ResourceData, meta interface{
|
|||
if v, ok := network["ipv6_gateway"].(string); ok && v != "" {
|
||||
networks[i].ipv6Gateway = v
|
||||
}
|
||||
if v, ok := network["mac_address"].(string); ok && v != "" {
|
||||
networks[i].macAddress = v
|
||||
}
|
||||
}
|
||||
vm.networkInterfaces = networks
|
||||
log.Printf("[DEBUG] network_interface init: %v", networks)
|
||||
|
@ -963,6 +973,7 @@ func resourceVSphereVirtualMachineRead(d *schema.ResourceData, meta interface{})
|
|||
log.Printf("[DEBUG] v.Network - %#v", v.Network)
|
||||
networkInterface := make(map[string]interface{})
|
||||
networkInterface["label"] = v.Network
|
||||
networkInterface["mac_address"] = v.MacAddress
|
||||
for _, ip := range v.IpConfig.IpAddress {
|
||||
p := net.ParseIP(ip.IpAddress)
|
||||
if p.To4() != nil {
|
||||
|
@ -1221,7 +1232,7 @@ func addCdrom(vm *object.VirtualMachine, datastore, path string) error {
|
|||
}
|
||||
|
||||
// buildNetworkDevice builds VirtualDeviceConfigSpec for Network Device.
|
||||
func buildNetworkDevice(f *find.Finder, label, adapterType string) (*types.VirtualDeviceConfigSpec, error) {
|
||||
func buildNetworkDevice(f *find.Finder, label, adapterType string, macAddress string) (*types.VirtualDeviceConfigSpec, error) {
|
||||
network, err := f.Network(context.TODO(), "*"+label)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
@ -1232,6 +1243,13 @@ func buildNetworkDevice(f *find.Finder, label, adapterType string) (*types.Virtu
|
|||
return nil, err
|
||||
}
|
||||
|
||||
var address_type string
|
||||
if macAddress == "" {
|
||||
address_type = string(types.VirtualEthernetCardMacTypeGenerated)
|
||||
} else {
|
||||
address_type = string(types.VirtualEthernetCardMacTypeManual)
|
||||
}
|
||||
|
||||
if adapterType == "vmxnet3" {
|
||||
return &types.VirtualDeviceConfigSpec{
|
||||
Operation: types.VirtualDeviceConfigSpecOperationAdd,
|
||||
|
@ -1242,7 +1260,8 @@ func buildNetworkDevice(f *find.Finder, label, adapterType string) (*types.Virtu
|
|||
Key: -1,
|
||||
Backing: backing,
|
||||
},
|
||||
AddressType: string(types.VirtualEthernetCardMacTypeGenerated),
|
||||
AddressType: address_type,
|
||||
MacAddress: macAddress,
|
||||
},
|
||||
},
|
||||
},
|
||||
|
@ -1256,7 +1275,8 @@ func buildNetworkDevice(f *find.Finder, label, adapterType string) (*types.Virtu
|
|||
Key: -1,
|
||||
Backing: backing,
|
||||
},
|
||||
AddressType: string(types.VirtualEthernetCardMacTypeGenerated),
|
||||
AddressType: address_type,
|
||||
MacAddress: macAddress,
|
||||
},
|
||||
},
|
||||
}, nil
|
||||
|
@ -1575,10 +1595,11 @@ func (vm *virtualMachine) setupVirtualMachine(c *govmomi.Client) error {
|
|||
} else {
|
||||
networkDeviceType = "vmxnet3"
|
||||
}
|
||||
nd, err := buildNetworkDevice(finder, network.label, networkDeviceType)
|
||||
nd, err := buildNetworkDevice(finder, network.label, networkDeviceType, network.macAddress)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
log.Printf("[DEBUG] network device: %+v", nd.Device)
|
||||
networkDevices = append(networkDevices, nd)
|
||||
|
||||
if vm.template != "" {
|
||||
|
@ -1632,8 +1653,8 @@ func (vm *virtualMachine) setupVirtualMachine(c *govmomi.Client) error {
|
|||
networkConfigs = append(networkConfigs, config)
|
||||
}
|
||||
}
|
||||
log.Printf("[DEBUG] network devices: %v", networkDevices)
|
||||
log.Printf("[DEBUG] network configs: %v", networkConfigs)
|
||||
log.Printf("[DEBUG] network devices: %#v", networkDevices)
|
||||
log.Printf("[DEBUG] network configs: %#v", networkConfigs)
|
||||
|
||||
var task *object.Task
|
||||
if vm.template == "" {
|
||||
|
|
|
@ -201,6 +201,65 @@ func TestAccVSphereVirtualMachine_dhcp(t *testing.T) {
|
|||
})
|
||||
}
|
||||
|
||||
func TestAccVSphereVirtualMachine_mac_address(t *testing.T) {
|
||||
var vm virtualMachine
|
||||
var locationOpt string
|
||||
var datastoreOpt string
|
||||
|
||||
if v := os.Getenv("VSPHERE_DATACENTER"); v != "" {
|
||||
locationOpt += fmt.Sprintf(" datacenter = \"%s\"\n", v)
|
||||
}
|
||||
if v := os.Getenv("VSPHERE_CLUSTER"); v != "" {
|
||||
locationOpt += fmt.Sprintf(" cluster = \"%s\"\n", v)
|
||||
}
|
||||
if v := os.Getenv("VSPHERE_RESOURCE_POOL"); v != "" {
|
||||
locationOpt += fmt.Sprintf(" resource_pool = \"%s\"\n", v)
|
||||
}
|
||||
if v := os.Getenv("VSPHERE_DATASTORE"); v != "" {
|
||||
datastoreOpt = fmt.Sprintf(" datastore = \"%s\"\n", v)
|
||||
}
|
||||
template := os.Getenv("VSPHERE_TEMPLATE")
|
||||
label := os.Getenv("VSPHERE_NETWORK_LABEL_DHCP")
|
||||
macAddress := os.Getenv("VSPHERE_NETWORK_MAC_ADDRESS")
|
||||
|
||||
resource.Test(t, resource.TestCase{
|
||||
PreCheck: func() { testAccPreCheck(t) },
|
||||
Providers: testAccProviders,
|
||||
CheckDestroy: testAccCheckVSphereVirtualMachineDestroy,
|
||||
Steps: []resource.TestStep{
|
||||
resource.TestStep{
|
||||
Config: fmt.Sprintf(
|
||||
testAccCheckVSphereVirtualMachineConfig_mac_address,
|
||||
locationOpt,
|
||||
label,
|
||||
macAddress,
|
||||
datastoreOpt,
|
||||
template,
|
||||
),
|
||||
Check: resource.ComposeTestCheckFunc(
|
||||
testAccCheckVSphereVirtualMachineExists("vsphere_virtual_machine.mac_address", &vm),
|
||||
resource.TestCheckResourceAttr(
|
||||
"vsphere_virtual_machine.mac_address", "name", "terraform-mac-address"),
|
||||
resource.TestCheckResourceAttr(
|
||||
"vsphere_virtual_machine.mac_address", "vcpu", "2"),
|
||||
resource.TestCheckResourceAttr(
|
||||
"vsphere_virtual_machine.mac_address", "memory", "4096"),
|
||||
resource.TestCheckResourceAttr(
|
||||
"vsphere_virtual_machine.mac_address", "disk.#", "1"),
|
||||
resource.TestCheckResourceAttr(
|
||||
"vsphere_virtual_machine.mac_address", "disk.2166312600.template", template),
|
||||
resource.TestCheckResourceAttr(
|
||||
"vsphere_virtual_machine.mac_address", "network_interface.#", "1"),
|
||||
resource.TestCheckResourceAttr(
|
||||
"vsphere_virtual_machine.mac_address", "network_interface.0.label", label),
|
||||
resource.TestCheckResourceAttr(
|
||||
"vsphere_virtual_machine.mac_address", "network_interface.0.mac_address", macAddress),
|
||||
),
|
||||
},
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
func TestAccVSphereVirtualMachine_custom_configs(t *testing.T) {
|
||||
var vm virtualMachine
|
||||
var locationOpt string
|
||||
|
@ -1181,6 +1240,23 @@ resource "vsphere_virtual_machine" "bar" {
|
|||
}
|
||||
`
|
||||
|
||||
const testAccCheckVSphereVirtualMachineConfig_mac_address = `
|
||||
resource "vsphere_virtual_machine" "mac_address" {
|
||||
name = "terraform-mac-address"
|
||||
%s
|
||||
vcpu = 2
|
||||
memory = 4096
|
||||
network_interface {
|
||||
label = "%s"
|
||||
mac_address = "%s"
|
||||
}
|
||||
disk {
|
||||
%s
|
||||
template = "%s"
|
||||
}
|
||||
}
|
||||
`
|
||||
|
||||
const testAccCheckVSphereVirtualMachineConfig_custom_configs = `
|
||||
resource "vsphere_virtual_machine" "car" {
|
||||
name = "terraform-test-custom"
|
||||
|
|
|
@ -161,6 +161,7 @@ set to valid values for your VMware vSphere environment:
|
|||
* VSPHERE\_NETWORK\_LABEL
|
||||
* VSPHERE\_NETWORK\_LABEL\_DHCP
|
||||
* VSPHERE\_TEMPLATE
|
||||
* VSPHERE\_MAC\_ADDRESS
|
||||
|
||||
The following environment variables depend on your vSphere environment:
|
||||
|
||||
|
|
|
@ -90,6 +90,7 @@ The `network_interface` block supports:
|
|||
* `ipv6_address` - (Optional) Static IPv6 to assign to this network interface. Interface will use DHCPv6 if this is left blank.
|
||||
* `ipv6_prefix_length` - (Optional) prefix length to use when statically assigning an IPv6.
|
||||
* `ipv6_gateway` - (Optional) IPv6 gateway IP address to use.
|
||||
* `mac_address` - (Optional) Manual MAC address to assign to this network interface. Will be generated by VMware if not set. ([VMware KB: Setting a static MAC address for a virtual NIC (219)](https://kb.vmware.com/selfservice/microsites/search.do?cmd=displayKC&externalId=219))
|
||||
|
||||
The following arguments are maintained for backwards compatibility and may be
|
||||
removed in a future version:
|
||||
|
|
Loading…
Reference in New Issue