# encoding: ascii
# api: powershell
# title: Set-dvSwitch
# description: More info can be found here: http://ict-freak.nl/2009/10/06/powercli-set-dvswitch/
# version: 0.1
# type: function
# license: CC0
# function: Set-dvSwitch
# x-poshcode-id: 1373
# x-archived: 2010-04-30T07:11:51
#
# Set-dvSwitch VirtualMachine dvSwitchPortgroup
#
Function Set-dvSwitch {
	param($vmName,$dvPG) # the two parameters.

	$nic = "Network adapter 1"	# change this line if you want to change network adapter 2

	# Find the NIC
	$vm = Get-VM $vmName | Get-View
	foreach($tempdev in $vm.Config.Hardware.Device){
		if($tempdev.DeviceInfo.Label -eq $nic){
			$tgtdev = $tempdev
		}
	}

	# Find the dvSwitch & dvPortGroup
	$esx = Get-View -Id $vm.Runtime.Host
	foreach($netMoRef in $esx.Network){
		if($netMoRef.Type -eq "DistributedVirtualPortGroup"){
			$net = Get-View -Id $netMoRef
			if($net.Name -eq $dvPg){
				$dvPGKey = $net.MoRef.Value
				$dvSwitchUuid = (Get-View -Id $net.Config.DistributedVirtualSwitch).Summary.Uuid
			}
		}
	}

	# Prepare Spec
	$spec = New-Object VMware.Vim.VirtualMachineConfigSpec
	$devChange = New-Object VMware.Vim.VirtualDeviceConfigSpec
	$devChange.operation = "edit"

	$dev = New-Object ("VMware.Vim." + $tgtdev.GetType().Name)
	$dev.deviceInfo = New-Object VMware.Vim.Description
	$dev.deviceInfo.label = $tgtdev.DeviceInfo.Label
	$dev.deviceInfo.summary = $tgtdev.DeviceInfo.Summary
	$dev.Backing = New-Object VMware.Vim.VirtualEthernetCardDistributedVirtualPortBackingInfo
	$dev.Backing.Port = New-Object VMware.Vim.DistributedVirtualSwitchPortConnection
	$dev.Backing.Port.PortgroupKey = $dvPGKey
	$dev.Backing.Port.SwitchUuid = $dvSwitchUuid
	$dev.Key = $tgtdev.Key

	$devChange.Device = $dev
	$spec.deviceChange = $devChange

	$taskMoRef = $vm.ReconfigVM_Task($spec)
}
