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 +} 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) diff --git a/Modules/VMware.Hv.Helper/VMware.HV.Helper.psm1 b/Modules/VMware.Hv.Helper/VMware.HV.Helper.psm1 index 5d20bb6..fa5ed36 100644 --- a/Modules/VMware.Hv.Helper/VMware.HV.Helper.psm1 +++ b/Modules/VMware.Hv.Helper/VMware.HV.Helper.psm1 @@ -10481,9 +10481,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)