diff --git a/Modules/InstantClone/InstantClone.psm1 b/Modules/InstantClone/InstantClone.psm1 index bd36545..a54865a 100644 --- a/Modules/InstantClone/InstantClone.psm1 +++ b/Modules/InstantClone/InstantClone.psm1 @@ -44,22 +44,52 @@ } # SourceVM must either be running or running but in Frozen State - if($vm.PowerState -ne "PoweredOn") { + if($vm.PowerState -ne "poweredOn") { Write-Host -ForegroundColor Red "Instant Cloning is only supported on a PoweredOn or Frozen VM" break } # SourceVM == Powered On if((Get-VM $SourceVM).ExtensionData.Runtime.InstantCloneFrozen -eq $false) { - Write-Host -ForegroundColor Red "Instant Cloning from a PoweredOn VM has not been implemented" - break - } - $spec = New-Object VMware.Vim.VirtualMachineInstantCloneSpec - $locationSpec = New-Object VMware.Vim.VirtualMachineRelocateSpec - $spec.Config = $config - $spec.Location = $locationSpec - $spec.Name = $DestinationVM + # Retrieve all Network Adapters for SourceVM + $vmNetworkAdapters = @() + $devices = $vm.ExtensionData.Config.Hardware.Device + foreach ($device in $devices) { + if($device -is [VMware.Vim.VirtualEthernetCard]) { + $vmNetworkAdapters += $device + } + } + + $spec = New-Object VMware.Vim.VirtualMachineInstantCloneSpec + $locationSpec = New-Object VMware.Vim.VirtualMachineRelocateSpec + + # Disconect all NICs for new Instant Clone to ensure no dupe addresses on network + # post-Instant Clone workflow needs to renable after uypdating GuestOS + foreach ($vmNetworkAdapter in $vmNetworkAdapters) { + $networkName = $vmNetworkAdapter.backing.deviceName + $deviceConfigSpec = New-Object VMware.Vim.VirtualDeviceConfigSpec + $deviceConfigSpec.Operation = "edit" + $deviceConfigSpec.Device = $vmNetworkAdapter + $deviceConfigSpec.Device.backing = New-Object VMware.Vim.VirtualEthernetCardNetworkBackingInfo + $deviceConfigSpec.device.backing.deviceName = $networkName + $connectable = New-Object VMware.Vim.VirtualDeviceConnectInfo + $connectable.MigrateConnect = "disconnect" + $deviceConfigSpec.Device.Connectable = $connectable + $locationSpec.DeviceChange += $deviceConfigSpec + } + + $spec.Config = $config + $spec.Location = $locationSpec + $spec.Name = $DestinationVM + # SourceVM == Frozen + } else { + $spec = New-Object VMware.Vim.VirtualMachineInstantCloneSpec + $locationSpec = New-Object VMware.Vim.VirtualMachineRelocateSpec + $spec.Config = $config + $spec.Location = $locationSpec + $spec.Name = $DestinationVM + } Write-Host "Creating Instant Clone $DestinationVM ..." $task = $vm.ExtensionData.InstantClone_Task($spec)