class Chef::Knife::VsphereVmNetworkAdd

Public Instance Methods

run() click to toggle source
# File lib/chef/knife/vsphere_vm_network_add.rb, line 33
def run
  $stdout.sync = true
  vmname = @name_args[0]
  if vmname.nil?
    show_usage
    fatal_exit("You must specify a virtual machine name")
  end

  networkname = @name_args[1]
  if networkname.nil?
    show_usage
    fatal_exit("You must specify the network name")
  end

  vm = get_vm_by_name(vmname, get_config(:folder)) || fatal_exit("Could not find #{vmname}")

  network = find_network(networkname)

  case network
  when RbVmomi::VIM::DistributedVirtualPortgroup
    switch, pg_key = network.collect "config.distributedVirtualSwitch", "key"
    port = RbVmomi::VIM.DistributedVirtualSwitchPortConnection(
      switchUuid: switch.uuid,
      portgroupKey: pg_key
    )
    summary = network.name
    backing = RbVmomi::VIM.VirtualEthernetCardDistributedVirtualPortBackingInfo(port: port)
  when RbVmomi::VIM::Network
    summary = network.name
    backing = RbVmomi::VIM.VirtualEthernetCardNetworkBackingInfo(deviceName: network.name)
  else raise
  end

  device_type = case get_config(:adapter_type)
  when "e1000"
    :VirtualE1000
  when "vmxnet3"
    :VirtualVmxnet3
  when *
    fatal_exit("The adapter must be either e1000 or vmxnet3")
                end

  if get_config(:mac_address).nil?
    address_type = "generated"
    mac_address = ""
  else
    address_type = "manual"
    mac_address = get_config(:mac_address)
  end

  vm.ReconfigVM_Task(
    spec: {
      deviceChange: [{
        operation: :add,
        fileOperation: nil,
        device: RbVmomi::VIM.send(device_type,
          key: -1,
          deviceInfo: { summary: summary, label: "" },
          backing: backing,
          addressType: address_type,
          macAddress: mac_address),
      }],
    }
  ).wait_for_completion
end