From 7c28fbc8941587b00121eb284390c1286de6e0f5 Mon Sep 17 00:00:00 2001 From: William Lam Date: Sun, 20 May 2018 05:12:50 -0700 Subject: [PATCH] Adding logic to handle PoweredOn Source VM --- Modules/InstantClone/InstantClone.psm1 | 46 +++++++++++++++++++++----- 1 file changed, 38 insertions(+), 8 deletions(-) diff --git a/Modules/InstantClone/InstantClone.psm1 b/Modules/InstantClone/InstantClone.psm1 index bd36545..b67d0e4 100644 --- a/Modules/InstantClone/InstantClone.psm1 +++ b/Modules/InstantClone/InstantClone.psm1 @@ -51,15 +51,45 @@ # 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)