From 748adc6f27050119b4846d912fabe2883418ff7d Mon Sep 17 00:00:00 2001 From: Wouter Kursten Date: Wed, 9 May 2018 19:29:20 +0200 Subject: [PATCH 1/4] removed showing of plain password --- Modules/VMware.Hv.Helper/VMware.HV.Helper.psm1 | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Modules/VMware.Hv.Helper/VMware.HV.Helper.psm1 b/Modules/VMware.Hv.Helper/VMware.HV.Helper.psm1 index 4528a40..a0bfb26 100644 --- a/Modules/VMware.Hv.Helper/VMware.HV.Helper.psm1 +++ b/Modules/VMware.Hv.Helper/VMware.HV.Helper.psm1 @@ -10316,9 +10316,8 @@ function register-hvpod { #} $temppw = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($ADPassword) - $PlainPassword = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($temppw) - $plainpassword - $vcPassword = New-Object VMware.Hv.SecureString + $PlainPassword = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($temppw) + $vcPassword = New-Object VMware.Hv.SecureString $enc = [system.Text.Encoding]::UTF8 $vcPassword.Utf8String = $enc.GetBytes($PlainPassword) From 60217aaa5c584347c33aaa86be0ed85d8cbeca13 Mon Sep 17 00:00:00 2001 From: cmcmahonVMW <39139413+cmcmahonVMW@users.noreply.github.com> Date: Thu, 10 May 2018 00:29:15 -0400 Subject: [PATCH 2/4] Updates needed for v2.0 In v2.0 of the tool, the URI for Get-XVCMStatus changed from /api/ping to /api/status, updated line 15. In v2.0 of the tool, there were a number of changes necessary for New-XVCMRequest. Updated the Notes on Lines 145-173 to reflect new parameters, changed behavior and removed parameters. Added $opType on line 176 and 202 for the Operation type new to v2.0. Removed line 181 and 196 for Source Cluster because it is no longer needed. Modified $DstCluster to accept null and removed the String Type definition to allow null to not be converted or the task creation will fail because it expects null as the assigned value. Added $DstHost to line 184 and 199 to allow destination host input to override $DstCluster. --- Modules/CrossvCentervmotion/XVM.psm1 | 32 +++++++++++++++++----------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/Modules/CrossvCentervmotion/XVM.psm1 b/Modules/CrossvCentervmotion/XVM.psm1 index aef65c8..cb9d225 100644 --- a/Modules/CrossvCentervmotion/XVM.psm1 +++ b/Modules/CrossvCentervmotion/XVM.psm1 @@ -1,4 +1,4 @@ -Function Get-XVCMStatus { +Function Get-XVCMStatus { <# .NOTES =========================================================================== @@ -12,7 +12,7 @@ .EXAMPLE Get-XVCMStatus #> - $Uri = "http://localhost:8080/api/ping" + $Uri = "http://localhost:8080/api/status" #Updated for 2.0, Old: "http://localhost:8080/api/ping" $results = Invoke-WebRequest -Uri $Uri -Method GET -TimeoutSec 5 @@ -142,7 +142,9 @@ Function New-XVCMRequest { =========================================================================== .DESCRIPTION This function initiates a migration request - .PARAMETER SrcSite + .PARAMETER opType + The type of task, Relocate or Clone + .PARAMETER SrcSite The name of the source vCenter Server .PARAMETER DstSite The name of the destination vCenter Server @@ -151,31 +153,35 @@ Function New-XVCMRequest { .PARAMETER DstDatacenter The name of the destination vSphere Datacenter .PARAMETER SrcCluster - The name of the source vSphere Cluster + .PARAMETER DstCluster - The name of the destination vSphere Cluster + The name of the destination vSphere Cluster, set to null if DstHost is defined .PARAMETER DstDatastore The name of the destination Datastore - .PARAMETER srcVMs + .PARAMETER DstHost + The name of the destination host. Set to null if DstCluster is defined + .PARAMETER srcVMs List of VMs to migrate .PARAMETER NetworkMapping Hash table of the VM network mappings between your source and destination vCenter Server .EXAMPLE - New-XVCMRequest -SrcSite SiteA -DstSite SiteB ` + New-XVCMRequest -opType Relocate -SrcSite SiteA -DstSite SiteB ` -SrcDatacenter Datacenter-SiteA -DstDatacenter Datacenter-SiteB ` - -SrcCluster Palo-Alto -DstCluster Santa-Barbara ` + -DstCluster $null -DstHost VMhost1.test.lab ` -DstDatastore vsanDatastore ` -srcVMs @("PhotonOS-01","PhotonOS-02","PhotonOS-03","PhotonOS-04") ` -NetworkMapping @{"DVPG-VM Network 1"="DVPG-Internal Network";"DVPG-VM Network 2"="DVPG-External Network"} #> param( + [Parameter(Mandatory=$true)][String]$opType, #Added by CPM for 2.0 [Parameter(Mandatory=$true)][String]$SrcSite, [Parameter(Mandatory=$true)][String]$DstSite, [Parameter(Mandatory=$true)][String]$SrcDatacenter, [Parameter(Mandatory=$true)][String]$DstDatacenter, - [Parameter(Mandatory=$true)][String]$SrcCluster, - [Parameter(Mandatory=$true)][String]$DstCluster, + #[Parameter(Mandatory=$true)][String]$SrcCluster, #Removed by CPM for 2.0 + [Parameter(Mandatory=$true)][AllowNull()] $DstCluster, #Added [AllowNull()], removed [String] by CPM for 2.0 [Parameter(Mandatory=$true)][String]$DstDatastore, + [Parameter(Mandatory=$true)][AllowNull()] $DstHost, #Added by CPM for 2.0 [Parameter(Mandatory=$true)][String[]]$srcVMs, [Parameter(Mandatory=$true)][Hashtable]$NetworkMapping ) @@ -187,11 +193,13 @@ Function New-XVCMRequest { "targetSite"=$DstSite; "sourceDatacenter"=$SrcDatacenter; "targetDatacenter"=$dstDatacenter; - "sourceCluster"=$SrcCluster; + #"sourceCluster"=$SrcCluster; #Removed by CPM for 2.0 "targetCluster"=$DstCluster; "targetDatastore"=$DstDatastore; + "targetHost"=$DstHost; #Added by CPM for 2.0 "networkMap"=$NetworkMapping; "vmList"=$srcVMs; + "operationType"=$opType; #Added by CPM for 2.0 } $body = $body | ConvertTo-Json @@ -287,4 +295,4 @@ Function Get-VMNetwork { } } $results -} \ No newline at end of file +} From 7c28fbc8941587b00121eb284390c1286de6e0f5 Mon Sep 17 00:00:00 2001 From: William Lam Date: Sun, 20 May 2018 05:12:50 -0700 Subject: [PATCH 3/4] 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) From fb5c9e248a5b6cbfc8201d9cc76bc9739916f925 Mon Sep 17 00:00:00 2001 From: William Lam Date: Sun, 20 May 2018 06:39:49 -0700 Subject: [PATCH 4/4] Fixing typo in poweredOn string --- Modules/InstantClone/InstantClone.psm1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/InstantClone/InstantClone.psm1 b/Modules/InstantClone/InstantClone.psm1 index b67d0e4..a54865a 100644 --- a/Modules/InstantClone/InstantClone.psm1 +++ b/Modules/InstantClone/InstantClone.psm1 @@ -44,7 +44,7 @@ } # 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 }