@@ -42,7 +42,10 @@ function Move-SCVirtualMachineReliably {
4242 [switch ]$Bulletproof ,
4343 [Parameter (ParameterSetName = ' ByHost' )]
4444 [Parameter (ParameterSetName = ' ByVM' )]
45- [switch ]$CrashOnUnmigratable
45+ [switch ]$CrashOnUnmigratable ,
46+ [Parameter (ParameterSetName = ' ByHost' )]
47+ [Parameter (ParameterSetName = ' ByVM' )]
48+ [switch ]$ReturnSourceVMs
4649 )
4750
4851 $ErrorActionPreference = ' Stop'
@@ -63,7 +66,8 @@ function Move-SCVirtualMachineReliably {
6366 Write-Debug - Message (' $VM: '' {0}'' ' -f [string ]$VM.Name )
6467 Write-Debug - Message (' $BackupThreshold: '' {0}'' ' -f [string ]$BackupThreshold )
6568 Write-Debug - Message (' $Bulletproof: '' {0}'' ' -f [string ]$Bulletproof )
66- Write-Debug - Message (' $CrashOnUnmigratable: '' {0}'' ' -f [string ]$CrashOnUnmigratable )
69+ Write-Debug - Message (' $CrashOnUnmigratable = ${0}' -f $CrashOnUnmigratable )
70+ Write-Debug - Message (' $ReturnSourceVMs = ${0}' -f $ReturnSourceVMs )
6771
6872 Write-Debug - Message ' if ($VM)'
6973 if ($VM ) {
@@ -141,26 +145,52 @@ function Move-SCVirtualMachineReliably {
141145 }
142146 Write-Debug - Message (' $LiveMigrationMaximum = {0}' -f $LiveMigrationMaximum )
143147
148+ Write-Debug - Message (' $ReturnSourceVMs = ${0}' -f $ReturnSourceVMs )
149+ Write-Debug - Message (' if ($ReturnSourceVMs)' )
150+ if ($ReturnSourceVMs ) {
151+ Write-Debug - Message ' $FirstRun = $true'
152+ $FirstRun = $true
153+ Write-Debug - Message (' $FirstRun = ${0}' -f $FirstRun )
154+ }
155+
144156 do {
145157 Write-Debug - Message (' $PsCmdlet.ParameterSetName: '' {0}'' ' -f $PsCmdlet.ParameterSetName )
146158 switch ($PsCmdlet.ParameterSetName ) {
147159 ' ByHost' {
160+ Write-Debug - Message ' $Filter = {$_ -notin $UnmigratableVMs}'
148161 $Filter = {$_ -notin $UnmigratableVMs }
149162 }
150163 ' ByVM' {
164+ Write-Debug - Message ' $Filter = {$_ -in $VM -and $_ -notin $UnmigratableVMs}'
151165 $Filter = {$_ -in $VM -and $_ -notin $UnmigratableVMs }
152166 }
153167 }
154- Write-Debug - Message (' $Filter = '' {0} '' ' -f $Filter )
168+ Write-Debug - Message (' $Filter = {{{0}}} ' -f $Filter )
155169
156170 Write-Debug - Message ' Read-SCVMHosts -VMHost ($SourceVMHost, $DestinationVMHost)'
157171 Read-SCVMHosts - VMHost ($SourceVMHost , $DestinationVMHost )
158172
159- Write-Debug - Message ' $SourceSCVMs = Get-SCVirtualMachine -VMHost $SourceVMHost | Where-Object -FilterScript'
173+ Write-Debug - Message ( ' $SourceSCVMs = Get-SCVirtualMachine -VMHost $SourceVMHost | Where-Object -FilterScript {{{0}}} ' -f $Filter )
160174 $SourceSCVMs = Get-SCVirtualMachine - VMHost $SourceVMHost | Where-Object - FilterScript $Filter # Getting those VMs of which we care about
161175 Write-Debug - Message (' $SourceSCVMs: '' {0}'' ' -f [string ]$SourceSCVMs.Name )
176+
162177 Write-Debug - Message ' if ($SourceSCVMs)'
163178 if ($SourceSCVMs ) {
179+ Write-Debug - Message (' $ReturnSourceVMs = ${0}' -f $ReturnSourceVMs )
180+ Write-Debug - Message (' if ($ReturnSourceVMs)' )
181+ if ($ReturnSourceVMs ) {
182+ Write-Debug - Message (' $FirstRun = ${0}' -f $FirstRun )
183+ Write-Debug - Message ' if ($FirstRun)'
184+ if ($FirstRun ) {
185+ Write-Debug - Message ' $SourceVMsOriginal = $SourceSCVMs.Clone()'
186+ $SourceVMsOriginal = $SourceSCVMs.Clone ()
187+ Write-Debug - Message (' $SourceVMsOriginal: '' {0}'' ' -f [string ]$SourceVMsOriginal.Name )
188+ Write-Debug - Message ' $FirstRun = $false'
189+ $FirstRun = $false
190+ Write-Debug - Message (' $FirstRun = ${0}' -f $FirstRun )
191+ }
192+ }
193+
164194 Write-Debug - Message ' $SourceSCVMsMigrating = $SourceSCVMs | Where-Object -FilterScript {$_.Status -in $SCVMStatesMigrating}'
165195 $SourceSCVMsMigrating = $SourceSCVMs | Where-Object - FilterScript {$_.Status -in $SCVMStatesMigrating }
166196 Write-Debug - Message (' $SourceSCVMsMigrating: '' {0}'' ' -f [string ]$SourceSCVMsMigrating.Name )
@@ -210,10 +240,10 @@ function Move-SCVirtualMachineReliably {
210240
211241 Write-Debug - Message ' $SourceVMHostVMs = Get-SCVirtualMachine -VMHost $SourceVMHost'
212242 $SourceVMHostVMs = Get-SCVirtualMachine - VMHost $SourceVMHost
213- Write-Debug - Message (' $SourceVMHostVMs: '' {0}'' ' -f [string ]$SourceSCVMsNotMigratingRunning .Name )
243+ Write-Debug - Message (' $SourceVMHostVMs: '' {0}'' ' -f [string ]$SourceVMHostVMs .Name )
214244 Write-Debug - Message ' $SourceVMHostVMs = Get-SCVirtualMachine -VMHost $DestinationVMHost'
215245 $DestinationVMHostVMs = Get-SCVirtualMachine - VMHost $DestinationVMHost
216- Write-Debug - Message (' $DestinationVMHostVMs: '' {0}'' ' -f [string ]$SourceSCVMsNotMigratingRunning .Name )
246+ Write-Debug - Message (' $DestinationVMHostVMs: '' {0}'' ' -f [string ]$DestinationVMHostVMs .Name )
217247
218248 Write-Debug - Message ' $SourceVMHostMigratingVMs = $SourceVMHostVMs | Where-Object -FilterScript {$_.Status -in $SCVMStatesMigrating}'
219249 $SourceVMHostMigratingVMs = $SourceVMHostVMs | Where-Object - FilterScript {$_.Status -in $SCVMStatesMigrating }
@@ -273,10 +303,15 @@ function Move-SCVirtualMachineReliably {
273303
274304 Write-Debug - Message ' if ($SCVirtualMachineLiveMigrationEligibility.Result -or $SCVirtualMachineLiveMigrationEligibility.Reason -eq '' NotRunning'' )'
275305 if ($SCVirtualMachineLiveMigrationEligibility.Result -or $SCVirtualMachineLiveMigrationEligibility.Reason -eq ' NotRunning' ) {
306+ Write-Debug - Message ' $VMMigrationRetryInfoCount = ($VMMigrationRetryInfo | Where-Object -FilterScript {$_ -eq $SCVM}).Count'
276307 $VMMigrationRetryInfoCount = ($VMMigrationRetryInfo | Where-Object - FilterScript {$_ -eq $SCVM }).Count
308+ Write-Debug - Message (' $VMMigrationRetryInfoCount = {0}' -f $VMMigrationRetryInfoCount )
309+ Write-Debug - Message (' $MaxAttempts = {0}' -f $MaxAttempts )
277310 Write-Debug - Message ' if ($VMMigrationRetryInfoCount -ge $MaxAttempts)'
278311 if ($VMMigrationRetryInfoCount -ge $MaxAttempts ) {
279312 Write-Verbose - Message (' VM {0} is unmigratable' -f $SCVM.Name )
313+ Write-Debug - Message (' $CrashOnUnmigratable = ${0}' -f $CrashOnUnmigratable )
314+ Write-Debug - Message ' if ($CrashOnUnmigratable)'
280315 if ($CrashOnUnmigratable ) {
281316 $Message = (' Tried to migrate VM {0} {1} times - did not succeed' -f $SCVM.Name , $MaxAttempts )
282317 $PSCmdlet.ThrowTerminatingError ((New-Object - TypeName ' System.Management.Automation.ErrorRecord' - ArgumentList ((New-Object - TypeName ' System.ServiceModel.Channels.RetryException' - ArgumentList $Message ), ' RetryException' , [System.Management.Automation.ErrorCategory ]::OperationTimeout, $SCVM )))
@@ -381,6 +416,8 @@ function Move-SCVirtualMachineReliably {
381416 Write-Debug - Message ' if ($CurrentDateTime -gt $BackupDateTimeThreshold)'
382417 if ($CurrentDateTime -gt $BackupDateTimeThreshold ) {
383418 Write-Verbose - Message (' VM {0} is unmigratable' -f $SCVM.Name )
419+ Write-Debug - Message (' $CrashOnUnmigratable = ${0}' -f $CrashOnUnmigratable )
420+ Write-Debug - Message ' if ($CrashOnUnmigratable)'
384421 if ($CrashOnUnmigratable ) {
385422 $Message = (' VM {0} is in backing up state for more than {1} already' -f $SCVM.Name , [string ]$BackupThreshold )
386423 $PSCmdlet.ThrowTerminatingError ((New-Object - TypeName ' System.Management.Automation.ErrorRecord' - ArgumentList ((New-Object - TypeName ' System.TimeoutException' - ArgumentList $Message ), ' TimeoutException' , [System.Management.Automation.ErrorCategory ]::OperationTimeout, $SCVM )))
@@ -431,8 +468,32 @@ function Move-SCVirtualMachineReliably {
431468 $null = $VMMigrationRetryInfo.Add ($SCVM )
432469 Write-Debug - Message (' $VMMigrationRetryInfo: '' {0}'' ' -f [string ]$VMMigrationRetryInfo.Name )
433470 Write-Verbose - Message (' Trying to migrate a powered-down VM {0}' -f $SCVM.Name )
434- Write-Debug - Message (' Move-SCPoweredDownVirtualMachine -VM $SCVM -VMHost $DestinationVMHost -Path '' {0}'' ' -f $Path )
435- Move-SCPoweredDownVirtualMachine - VM $SCVM - VMHost $DestinationVMHost - Path $Path
471+ try {
472+ Write-Debug - Message (' Move-SCPoweredDownVirtualMachine -VM $SCVM -VMHost $DestinationVMHost -Path '' {0}'' ' -f $Path )
473+ Move-SCPoweredDownVirtualMachine - VM $SCVM - VMHost $DestinationVMHost - Path $Path
474+ }
475+ catch {
476+ Write-Debug - Message (' $_.InvocationInfo.MyCommand.Name: {0}' -f $_.InvocationInfo.MyCommand.Name )
477+ Write-Debug - Message ' if ($_.InvocationInfo.MyCommand.Name -eq '' Move-SCVirtualMachine'' )'
478+ if ($_.InvocationInfo.MyCommand.Name -eq ' Move-SCVirtualMachine' ) {
479+ Write-Debug - Message ' Read-SCVMHosts -VMHost ($SourceVMHost, $DestinationVMHost)'
480+ Read-SCVMHosts - VMHost ($SourceVMHost , $DestinationVMHost )
481+ Write-Debug - Message ' $null = Read-SCVirtualMachine -VM $SCVM'
482+ $null = Read-SCVirtualMachine - VM $SCVM
483+ Write-Debug - Message ' $SCVirtualMachineLiveMigrationEligibility = Test-SCVirtualMachineLiveMigrationEligibility -VM $SCVM -VMHost $DestinationVMHost'
484+ $SCVirtualMachineLiveMigrationEligibility = Test-SCVirtualMachineLiveMigrationEligibility - VM $SCVM - VMHost $DestinationVMHost
485+ Write-Debug - Message (' $SCVirtualMachineLiveMigrationEligibility.Reason: '' {0}'' ' -f $SCVirtualMachineLiveMigrationEligibility.Reason )
486+ Write-Debug - Message ' if ($SCVirtualMachineLiveMigrationEligibility.Reason -eq '' Failed'' )'
487+ if ($SCVirtualMachineLiveMigrationEligibility.Reason -eq ' Failed' ) {
488+ Write-Debug - Message ' $null = Repair-SCVirtualMachine -VM $SCVM -Dismiss -Force'
489+ $null = Repair-SCVirtualMachine - VM $SCVM - Dismiss - Force
490+ }
491+ }
492+ else {
493+ Write-Debug - Message (' {0}: $PSCmdlet.ThrowTerminatingError($_)' -f $MyInvocation.MyCommand.Name )
494+ $PSCmdlet.ThrowTerminatingError ($_ )
495+ }
496+ }
436497 Write-Debug - Message ' $LastVMWasPoweredDown = $true'
437498 $LastVMWasPoweredDown = $true
438499 Write-Debug - Message (' $LastVMWasPoweredDown: '' {0}'' ' -f [string ]$LastVMWasPoweredDown )
@@ -488,6 +549,10 @@ function Move-SCVirtualMachineReliably {
488549 Write-Debug - Message ' Read-SCVMHosts -VMHost ($SourceVMHost, $DestinationVMHost)'
489550 Read-SCVMHosts - VMHost ($SourceVMHost , $DestinationVMHost ) # Make sure our VM objects are fresh
490551
552+ Write-Debug - Message ' $ReturnUnmigratableVMs = $false'
553+ $ReturnUnmigratableVMs = $false
554+ Write-Debug - Message (' $ReturnUnmigratableVMs = ${0}' -f $ReturnUnmigratableVMs )
555+
491556 Write-Debug - Message (' $UnmigratableVMs: '' {0}'' ' -f [string ]$UnmigratableVMs.Name )
492557 Write-Debug - Message ' if ($UnmigratableVMs)'
493558 if ($UnmigratableVMs ) {
@@ -507,6 +572,37 @@ function Move-SCVirtualMachineReliably {
507572 Write-Debug - Message ' if ($UnmigratableVMs.Count -gt 0)'
508573 if ($UnmigratableVMs.Count -gt 0 ) {
509574 Write-Debug - Message (' $UnmigratableVMs: '' {0}'' ' -f [string ]$UnmigratableVMs.Name )
575+
576+ Write-Debug - Message ' $ReturnUnmigratableVMs = $true'
577+ $ReturnUnmigratableVMs = $true
578+ Write-Debug - Message (' $ReturnUnmigratableVMs = ${0}' -f $ReturnUnmigratableVMs )
579+ }
580+ }
581+
582+ Write-Debug - Message (' $ReturnUnmigratableVMs = ${0}' -f $ReturnUnmigratableVMs )
583+ Write-Debug - Message (' $UnmigratableVMs: '' {0}'' ' -f [string ]$UnmigratableVMs.Name )
584+ Write-Debug - Message (' $ReturnSourceVMs = ${0}' -f $ReturnSourceVMs )
585+ Write-Debug - Message (' if ($ReturnSourceVMs)' )
586+ if ($ReturnSourceVMs ) {
587+ Write-Debug - Message (' $SourceVMsOriginal: '' {0}'' ' -f [string ]$SourceVMsOriginal.Name )
588+ Write-Debug - Message ' if ($ReturnUnmigratableVMs)'
589+ if ($ReturnUnmigratableVMs ) {
590+ Write-Debug - Message ' @{SourceVMs = $SourceVMsOriginal, UnmigratableVMs = $UnmigratableVMs}'
591+ @ {
592+ SourceVMs = $SourceVMsOriginal
593+ UnmigratableVMs = $UnmigratableVMs
594+ }
595+ }
596+ else {
597+ Write-Debug - Message ' @{SourceVMs = $SourceVMsOriginal}'
598+ @ {
599+ SourceVMs = $SourceVMsOriginal
600+ }
601+ }
602+ }
603+ else {
604+ Write-Debug - Message ' if ($ReturnUnmigratableVMs)'
605+ if ($ReturnUnmigratableVMs ) {
510606 Write-Debug - Message ' $UnmigratableVMs'
511607 $UnmigratableVMs
512608 }
0 commit comments