Merge pull request #107 from gdbarron/invoke-move-updates
Invoke-ZertoMove parameter, pipeline, and restructuring updates
This commit is contained in:
@@ -5,17 +5,18 @@ $global:function = ((Split-Path -leaf $PSCommandPath).Split('.'))[0]
|
|||||||
Describe $global:function -Tag 'Unit', 'Source', 'Built' {
|
Describe $global:function -Tag 'Unit', 'Source', 'Built' {
|
||||||
|
|
||||||
Context "$global:function::Parameter Unit Tests" {
|
Context "$global:function::Parameter Unit Tests" {
|
||||||
It "$global:function should have exactly 20 parameters defined" {
|
It "$global:function should have exactly 21 parameters defined" {
|
||||||
(Get-Command $global:function).Parameters.Count | Should -Be 20
|
(Get-Command $global:function).Parameters.Count | Should -Be 21
|
||||||
}
|
}
|
||||||
|
|
||||||
$ParameterTestCases = @(
|
$ParameterTestCases = @(
|
||||||
|
@{ParameterName = 'vpgIdentifier'; Type = 'Guid[]'; Mandatory = $true; Validation = 'NotNullOrEmpty' }
|
||||||
@{ParameterName = 'vpgName'; Type = 'String[]'; Mandatory = $true; Validation = 'NotNullOrEmpty' }
|
@{ParameterName = 'vpgName'; Type = 'String[]'; Mandatory = $true; Validation = 'NotNullOrEmpty' }
|
||||||
@{ParameterName = 'commitPolicy'; Type = 'String'; Mandatory = $false; Validation = 'Set' }
|
@{ParameterName = 'commitPolicy'; Type = 'String'; Mandatory = $false; Validation = 'Set' }
|
||||||
@{ParameterName = 'commitPolicyTimeout'; Type = 'Int'; Mandatory = $false; Validation = 'Range' }
|
@{ParameterName = 'commitPolicyTimeout'; Type = 'Int'; Mandatory = $false; Validation = 'Range' }
|
||||||
@{ParameterName = 'forceShutdown'; Type = 'Switch'; Mandatory = $false; Validation = $null }
|
@{ParameterName = 'forceShutdown'; Type = 'Switch'; Mandatory = $false; Validation = $null }
|
||||||
@{ParameterName = 'disableReverseProtection'; Type = 'Switch'; Mandatory = $true; Validation = $null }
|
@{ParameterName = 'disableReverseProtection'; Type = 'Switch'; Mandatory = $false; Validation = $null }
|
||||||
@{ParameterName = 'keepSourceVms'; Type = 'Switch'; Mandatory = $true; Validation = $null }
|
@{ParameterName = 'keepSourceVms'; Type = 'Switch'; Mandatory = $false; Validation = $null }
|
||||||
@{ParameterName = 'ContinueOnPreScriptFailure'; Type = 'Switch'; Mandatory = $false; Validation = $null }
|
@{ParameterName = 'ContinueOnPreScriptFailure'; Type = 'Switch'; Mandatory = $false; Validation = $null }
|
||||||
@{ParameterName = 'whatIf'; Type = 'Switch'; Mandatory = $false; Validation = 'ShouldProcess' }
|
@{ParameterName = 'whatIf'; Type = 'Switch'; Mandatory = $false; Validation = 'ShouldProcess' }
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,22 +1,57 @@
|
|||||||
<# .ExternalHelp ./en-us/ZertoApiWrapper-help.xml #>
|
<# .ExternalHelp ./en-us/ZertoApiWrapper-help.xml #>
|
||||||
function Invoke-ZertoMove {
|
function Invoke-ZertoMove {
|
||||||
[CmdletBinding( DefaultParameterSetName = "main", SupportsShouldProcess = $true )]
|
[CmdletBinding( DefaultParameterSetName = "id", SupportsShouldProcess = $true )]
|
||||||
param(
|
param(
|
||||||
[Parameter(
|
[Parameter(
|
||||||
|
ParameterSetName = 'name',
|
||||||
|
HelpMessage = "Name(s) of the VPG(s) you want to move.",
|
||||||
|
Mandatory
|
||||||
|
)]
|
||||||
|
[Parameter(
|
||||||
|
ParameterSetName = 'commitName',
|
||||||
HelpMessage = "Name(s) of the VPG(s) you want to move.",
|
HelpMessage = "Name(s) of the VPG(s) you want to move.",
|
||||||
Mandatory
|
Mandatory
|
||||||
)]
|
)]
|
||||||
[ValidateNotNullOrEmpty()]
|
[ValidateNotNullOrEmpty()]
|
||||||
[string[]]$vpgName,
|
[string[]]$vpgName,
|
||||||
[Parameter(
|
[Parameter(
|
||||||
|
ParameterSetName = 'id',
|
||||||
|
HelpMessage = "ID(s) of the VPG(s) you want to move.",
|
||||||
|
Mandatory,
|
||||||
|
ValueFromPipelineByPropertyName
|
||||||
|
)]
|
||||||
|
[Parameter(
|
||||||
|
ParameterSetName = 'commitId',
|
||||||
|
HelpMessage = "ID(s) of the VPG(s) you want to move.",
|
||||||
|
Mandatory,
|
||||||
|
ValueFromPipelineByPropertyName
|
||||||
|
)]
|
||||||
|
[ValidateNotNullOrEmpty()]
|
||||||
|
[guid[]]$vpgIdentifier,
|
||||||
|
[Parameter(
|
||||||
|
ParameterSetName = 'commitName',
|
||||||
HelpMessage = "'Rollback': After the seconds specified in the commitValue setting have elapsed, the failover is rolled back.
|
HelpMessage = "'Rollback': After the seconds specified in the commitValue setting have elapsed, the failover is rolled back.
|
||||||
'Commit': After the seconds specified in the commitValue setting have elapsed, the failover continues, committing the virtual machines in the recovery site.
|
'Commit': After the seconds specified in the commitValue setting have elapsed, the failover continues, committing the virtual machines in the recovery site.
|
||||||
'None': The virtual machines in the VPG being failed over remain in the Before Commit state until either they are committed with Commit a failover, or rolled back with Roll back a failover.
|
'None': The virtual machines in the VPG being failed over remain in the Before Commit state until either they are committed with Commit a failover, or rolled back with Roll back a failover.
|
||||||
Default is the Site Settings setting."
|
Default is the Site Settings setting.",
|
||||||
|
Mandatory
|
||||||
|
)]
|
||||||
|
[Parameter(
|
||||||
|
ParameterSetName = 'commitId',
|
||||||
|
HelpMessage = "'Rollback': After the seconds specified in the commitValue setting have elapsed, the failover is rolled back.
|
||||||
|
'Commit': After the seconds specified in the commitValue setting have elapsed, the failover continues, committing the virtual machines in the recovery site.
|
||||||
|
'None': The virtual machines in the VPG being failed over remain in the Before Commit state until either they are committed with Commit a failover, or rolled back with Roll back a failover.
|
||||||
|
Default is the Site Settings setting.",
|
||||||
|
Mandatory
|
||||||
)]
|
)]
|
||||||
[ValidateSet("Rollback", "Commit", "None")]
|
[ValidateSet("Rollback", "Commit", "None")]
|
||||||
[string]$commitPolicy,
|
[string]$commitPolicy,
|
||||||
[Parameter(
|
[Parameter(
|
||||||
|
ParameterSetName = 'commitName',
|
||||||
|
HelpMessage = "The amount of time, in seconds, the Move is in a 'Before Commit' state, before performing the commitPolicy setting. If omitted, the site settings default will be applied."
|
||||||
|
)]
|
||||||
|
[Parameter(
|
||||||
|
ParameterSetName = 'commitId',
|
||||||
HelpMessage = "The amount of time, in seconds, the Move is in a 'Before Commit' state, before performing the commitPolicy setting. If omitted, the site settings default will be applied."
|
HelpMessage = "The amount of time, in seconds, the Move is in a 'Before Commit' state, before performing the commitPolicy setting. If omitted, the site settings default will be applied."
|
||||||
)]
|
)]
|
||||||
# Min 5 Minutes, Max 24 Hours, Default Site Settigns.
|
# Min 5 Minutes, Max 24 Hours, Default Site Settigns.
|
||||||
@@ -27,15 +62,11 @@ function Invoke-ZertoMove {
|
|||||||
)]
|
)]
|
||||||
[switch]$forceShutdown,
|
[switch]$forceShutdown,
|
||||||
[Parameter(
|
[Parameter(
|
||||||
ParameterSetName = "disableReverseProtection",
|
HelpMessage = "Do not enable reverse protection. The VPG definition is kept with the status Needs Configuration and the reverse settings in the VPG definition are not set."
|
||||||
HelpMessage = "Do not enable reverse protection. The VPG definition is kept with the status Needs Configuration and the reverse settings in the VPG definition are not set.",
|
|
||||||
Mandatory
|
|
||||||
)]
|
)]
|
||||||
[switch]$disableReverseProtection,
|
[switch]$disableReverseProtection,
|
||||||
[Parameter(
|
[Parameter(
|
||||||
ParameterSetName = "keepSourceVms",
|
HelpMessage = "Prevent the protected virtual machines from being deleted in the protected site. Using this setting disables reverse protection."
|
||||||
HelpMessage = "Prevent the protected virtual machines from being deleted in the protected site. Using this setting disables reverse protection.",
|
|
||||||
Mandatory
|
|
||||||
)]
|
)]
|
||||||
[switch]$keepSourceVms,
|
[switch]$keepSourceVms,
|
||||||
[Parameter(
|
[Parameter(
|
||||||
@@ -46,54 +77,52 @@ function Invoke-ZertoMove {
|
|||||||
|
|
||||||
begin {
|
begin {
|
||||||
$baseUri = "vpgs"
|
$baseUri = "vpgs"
|
||||||
|
$body = @{
|
||||||
|
forceShutdown = $forceShutdown.IsPresent
|
||||||
|
ContinueOnPreScriptFailure = $ContinueOnPreScriptFailure.IsPresent
|
||||||
|
keepSourceVms = $keepSourceVms.IsPresent
|
||||||
|
reverseProtection = -not $disableReverseProtection.IsPresent
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( $keepSourceVms.IsPresent -and -not $disableReverseProtection.IsPresent ) {
|
||||||
|
Write-Verbose 'Disabling reverse protection as keepSourceVms requires it'
|
||||||
|
$body['reverseProtection'] = $false
|
||||||
}
|
}
|
||||||
|
|
||||||
process {
|
|
||||||
$body = @{ }
|
|
||||||
#TODO - use a foreach loop to populate the body without all the if statments
|
|
||||||
if ($PSBoundParameters.ContainsKey('commitPolicy')) {
|
if ($PSBoundParameters.ContainsKey('commitPolicy')) {
|
||||||
$body['commitPolicy'] = $commitPolicy
|
$body['commitPolicy'] = $commitPolicy
|
||||||
}
|
|
||||||
if ($PSBoundParameters.ContainsKey('commitPolicyTimeout')) {
|
if ($PSBoundParameters.ContainsKey('commitPolicyTimeout')) {
|
||||||
$body['commitPolicyTimeout'] = $commitPolicyTimeout
|
$body['commitPolicyTimeout'] = $commitPolicyTimeout
|
||||||
}
|
}
|
||||||
if ($PSBoundParameters.ContainsKey('forceShutdown')) {
|
|
||||||
$body['forceShutdown'] = $true
|
|
||||||
} else {
|
|
||||||
$body['forceShutdown'] = $false
|
|
||||||
}
|
}
|
||||||
if ($PSBoundParameters.ContainsKey('ContinueOnPreScriptFailure')) {
|
|
||||||
$body['ContinueOnPreScriptFailure'] = $true
|
|
||||||
} else {
|
|
||||||
$body['ContinueOnPreScriptFailure'] = $false
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
process {
|
||||||
|
|
||||||
switch ($PSCmdlet.ParameterSetName) {
|
switch ($PSCmdlet.ParameterSetName) {
|
||||||
"disableReverseProtection" {
|
{ $_ -in 'name', 'commitName' } {
|
||||||
$body['reverseProtection'] = $false
|
$vpgIds = foreach ($name in $vpgName) {
|
||||||
$body['keepSourceVms'] = $false
|
|
||||||
}
|
|
||||||
|
|
||||||
"keepSourceVms" {
|
|
||||||
$body['reverseProtection'] = $false
|
|
||||||
$body['keepSourceVms'] = $true
|
|
||||||
}
|
|
||||||
|
|
||||||
"main" {
|
|
||||||
$body['reverseProtection'] = $true
|
|
||||||
$body['keepSourceVms'] = $false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
foreach ($name in $vpgName) {
|
|
||||||
$vpgId = $(Get-ZertoVpg -name $name).vpgIdentifier
|
$vpgId = $(Get-ZertoVpg -name $name).vpgIdentifier
|
||||||
if ( -not $vpgId ) {
|
if ( -not $vpgId ) {
|
||||||
Write-Error "VPG: $name not found. Please check the name and try again. Skipping"
|
Write-Error "VPG: '$name' not found. Please check the name and try again. Skipping"
|
||||||
} else {
|
} else {
|
||||||
$uri = "{0}/{1}/move" -f $baseUri, $vpgId
|
Write-Verbose "VPG: $name, ID: $vpgId"
|
||||||
if ($PSCmdlet.ShouldProcess("Moving VPG: $name with settings: $($body | convertto-json)")) {
|
$vpgId
|
||||||
Invoke-ZertoRestRequest -uri $uri -method "POST" -body $($body | ConvertTo-Json)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{ $_ -in 'id', 'commitId' } {
|
||||||
|
$vpgIds = $vpgIdentifier
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($thisId in $vpgIds) {
|
||||||
|
$uri = "{0}/{1}/move" -f $baseUri, $thisId
|
||||||
|
if ($PSCmdlet.ShouldProcess("Moving VPG: $thisId with settings: $($body | ConvertTo-Json)")) {
|
||||||
|
Invoke-ZertoRestRequest -uri $uri -method "POST" -body $($body | ConvertTo-Json)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
end {
|
end {
|
||||||
|
|||||||
+55
-18
@@ -12,22 +12,30 @@ Start a move of a VPG.
|
|||||||
|
|
||||||
## SYNTAX
|
## SYNTAX
|
||||||
|
|
||||||
### main (Default)
|
### id (Default)
|
||||||
```
|
```
|
||||||
Invoke-ZertoMove -vpgName <String[]> [-commitPolicy <String>] [-commitPolicyTimeout <Int32>] [-forceShutdown]
|
Invoke-ZertoMove -vpgIdentifier <Guid[]> [-forceShutdown] [-disableReverseProtection] [-keepSourceVms]
|
||||||
[-ContinueOnPreScriptFailure] [-WhatIf] [-Confirm] [<CommonParameters>]
|
[-ContinueOnPreScriptFailure] [-WhatIf] [-Confirm] [<CommonParameters>]
|
||||||
```
|
```
|
||||||
|
|
||||||
### disableReverseProtection
|
### commitName
|
||||||
```
|
```
|
||||||
Invoke-ZertoMove -vpgName <String[]> [-commitPolicy <String>] [-commitPolicyTimeout <Int32>] [-forceShutdown]
|
Invoke-ZertoMove -vpgName <String[]> -commitPolicy <String> [-commitPolicyTimeout <Int32>] [-forceShutdown]
|
||||||
[-disableReverseProtection] [-ContinueOnPreScriptFailure] [-WhatIf] [-Confirm] [<CommonParameters>]
|
[-disableReverseProtection] [-keepSourceVms] [-ContinueOnPreScriptFailure] [-WhatIf] [-Confirm]
|
||||||
|
[<CommonParameters>]
|
||||||
```
|
```
|
||||||
|
|
||||||
### keepSourceVms
|
### name
|
||||||
```
|
```
|
||||||
Invoke-ZertoMove -vpgName <String[]> [-commitPolicy <String>] [-commitPolicyTimeout <Int32>] [-forceShutdown]
|
Invoke-ZertoMove -vpgName <String[]> [-forceShutdown] [-disableReverseProtection] [-keepSourceVms]
|
||||||
[-keepSourceVms] [-ContinueOnPreScriptFailure] [-WhatIf] [-Confirm] [<CommonParameters>]
|
[-ContinueOnPreScriptFailure] [-WhatIf] [-Confirm] [<CommonParameters>]
|
||||||
|
```
|
||||||
|
|
||||||
|
### commitId
|
||||||
|
```
|
||||||
|
Invoke-ZertoMove -vpgIdentifier <Guid[]> -commitPolicy <String> [-commitPolicyTimeout <Int32>] [-forceShutdown]
|
||||||
|
[-disableReverseProtection] [-keepSourceVms] [-ContinueOnPreScriptFailure] [-WhatIf] [-Confirm]
|
||||||
|
[<CommonParameters>]
|
||||||
```
|
```
|
||||||
|
|
||||||
## DESCRIPTION
|
## DESCRIPTION
|
||||||
@@ -37,10 +45,24 @@ Start a move of a VPG.
|
|||||||
|
|
||||||
### Example 1
|
### Example 1
|
||||||
```powershell
|
```powershell
|
||||||
PS C:\> Invoke-ZertoMove -vpgName "MyVpg"
|
PS C:\> Invoke-ZertoMove -vpgName 'MyVpg'
|
||||||
```
|
```
|
||||||
|
|
||||||
Starts a move operation of VPG "MyVpg"
|
Specify the name of a vpg to move
|
||||||
|
|
||||||
|
### Example 2
|
||||||
|
```powershell
|
||||||
|
PS C:\> Invoke-ZertoMove -vpgIdentifier '2fbbf6b5-cddc-4653-b1fe-564f069eeb64'
|
||||||
|
```
|
||||||
|
|
||||||
|
Specify the identifier of a vpg to move
|
||||||
|
|
||||||
|
### Example 3
|
||||||
|
```powershell
|
||||||
|
PS C:\> Get-ZertoVpg | Invoke-ZertoMove
|
||||||
|
```
|
||||||
|
|
||||||
|
Utilize the pipeline to move multiple vpgs
|
||||||
|
|
||||||
## PARAMETERS
|
## PARAMETERS
|
||||||
|
|
||||||
@@ -55,11 +77,11 @@ Default is the Site Settings setting.
|
|||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
Type: String
|
Type: String
|
||||||
Parameter Sets: (All)
|
Parameter Sets: commitName, commitId
|
||||||
Aliases:
|
Aliases:
|
||||||
Accepted values: Rollback, Commit, None
|
Accepted values: Rollback, Commit, None
|
||||||
|
|
||||||
Required: False
|
Required: True
|
||||||
Position: Named
|
Position: Named
|
||||||
Default value: None
|
Default value: None
|
||||||
Accept pipeline input: False
|
Accept pipeline input: False
|
||||||
@@ -72,7 +94,7 @@ If omitted, the site settings default will be applied.
|
|||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
Type: Int32
|
Type: Int32
|
||||||
Parameter Sets: (All)
|
Parameter Sets: commitName, commitId
|
||||||
Aliases:
|
Aliases:
|
||||||
|
|
||||||
Required: False
|
Required: False
|
||||||
@@ -102,10 +124,10 @@ Do not enable reverse protection. The VPG definition is kept with the status Nee
|
|||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
Type: SwitchParameter
|
Type: SwitchParameter
|
||||||
Parameter Sets: disableReverseProtection
|
Parameter Sets: (All)
|
||||||
Aliases:
|
Aliases:
|
||||||
|
|
||||||
Required: True
|
Required: False
|
||||||
Position: Named
|
Position: Named
|
||||||
Default value: None
|
Default value: None
|
||||||
Accept pipeline input: False
|
Accept pipeline input: False
|
||||||
@@ -132,13 +154,28 @@ Use this switch to Prevent the protected virtual machines from being deleted in
|
|||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
Type: SwitchParameter
|
Type: SwitchParameter
|
||||||
Parameter Sets: keepSourceVms
|
Parameter Sets: (All)
|
||||||
|
Aliases:
|
||||||
|
|
||||||
|
Required: False
|
||||||
|
Position: Named
|
||||||
|
Default value: None
|
||||||
|
Accept pipeline input: False
|
||||||
|
Accept wildcard characters: False
|
||||||
|
```
|
||||||
|
|
||||||
|
### -vpgIdentifier
|
||||||
|
ID(s) of the VPG(s) you want to move.
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
Type: Guid[]
|
||||||
|
Parameter Sets: id, commitId
|
||||||
Aliases:
|
Aliases:
|
||||||
|
|
||||||
Required: True
|
Required: True
|
||||||
Position: Named
|
Position: Named
|
||||||
Default value: None
|
Default value: None
|
||||||
Accept pipeline input: False
|
Accept pipeline input: True (ByPropertyName)
|
||||||
Accept wildcard characters: False
|
Accept wildcard characters: False
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -147,7 +184,7 @@ Name(s) of the VPG(s) you want to move.
|
|||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
Type: String[]
|
Type: String[]
|
||||||
Parameter Sets: (All)
|
Parameter Sets: commitName, name
|
||||||
Aliases:
|
Aliases:
|
||||||
|
|
||||||
Required: True
|
Required: True
|
||||||
|
|||||||
Reference in New Issue
Block a user