Skip to content

Commit 33b69b0

Browse files
committed
New-PfavVolStoragePolicy
Work complete
1 parent 561fd6a commit 33b69b0

1 file changed

Lines changed: 158 additions & 62 deletions

File tree

PureStorage.FlashArray.VMware.VVol.Replication/PureStorage.FlashArray.VMware.VVol.Replication.psm1

Lines changed: 158 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -510,22 +510,34 @@ function Get-PfavVolStorageArray {
510510
function New-PfavVolStoragePolicy {
511511
<#
512512
.SYNOPSIS
513-
Creates a new FlashArray Storage Policy
513+
Creates a new FlashArray vVol Storage Policy
514514
.DESCRIPTION
515-
Creates a new FlashArray Storage Policy with specified capabilities
515+
Creates a new FlashArray vVol Storage Policy with specified capabilities
516516
.INPUTS
517517
Capabilities
518518
.OUTPUTS
519519
New storage policy
520520
.NOTES
521521
Version: 1.0
522522
Author: Cody Hosterman https://codyhosterman.com
523-
Creation Date: 05/17/2020
523+
Creation Date: 05/22/2020
524524
Purpose/Change: Function creation
525525
.EXAMPLE
526-
PS C:\ Get-PfavVolStoragePolicy
526+
PS C:\ New-PfavVolStoragePolicy -policyName
527527
528-
Returns all Pure Storage FlashArray-based storage policies
528+
Creates a new vVol policy with the specified name and default description. The only capability is ensuring it is a FlashArray policy.
529+
.EXAMPLE
530+
PS C:\ $policyConfig = New-PfavVolStoragePolicy -generateDefaultPolicyConfig
531+
532+
Generates a new FlashArray vVol policy configuration object. You can then populate the properties.
533+
.EXAMPLE
534+
PS C:\ New-PfavVolStoragePolicy -policyConfig $policyConfig
535+
536+
Passes in a FlashArray vVol storage policy configuration object (FlashArrayvVolPolicyConfig) and creates a new vVol storage policy with specified capabilities
537+
.EXAMPLE
538+
PS C:\ New-PfavVolStoragePolicy -policyName pure-vvolRep -policyDescription "Replication policy for FlashArray vVol VMs" -replicationEnabled $true -replicationInterval (New-TimeSpan -Hours 1) -replicationRetentionShort (New-TimeSpan -Hours 24) -replicationConcurrency 2 -consistencyGroupName purePG
539+
540+
Creates a replication type vVol storage policy. Ensures VMs are replicated once an hour, and each point in time is kept for 1 day. It also ensures that the VM is replicated to at least 2 target arrays in a consistency group called purePG.
529541
530542
*******Disclaimer:******************************************************
531543
This scripts are offered "as is" with no warranty. While this
@@ -536,115 +548,199 @@ function New-PfavVolStoragePolicy {
536548
************************************************************************
537549
#>
538550

539-
[CmdletBinding()]
551+
[CmdletBinding(DefaultParameterSetName='Manual')]
540552
Param(
541553
[Parameter(Position=0,ParameterSetName='NewConfig',mandatory=$true)]
542-
[Switch]$newConfig,
554+
[Switch]$generateDefaultPolicyConfig,
543555

544556
[Parameter(Position=1,ParameterSetName='Config',mandatory=$true,ValueFromPipeline=$True)]
545-
[FlashArrayvVolPolicyConfig]$config,
557+
[FlashArrayvVolPolicyConfig]$policyConfig,
558+
559+
[Parameter(Position=6,mandatory=$true,ParameterSetName='Manual')]
560+
[String]$policyName,
561+
562+
[Parameter(Position=6,ParameterSetName='Manual')]
563+
[String]$policyDescription,
546564

547565
[Parameter(Position=2,ParameterSetName='Manual')]
548-
[VMware.VimAutomation.Storage.Types.V1.Sms.VasaStorageArray[]]$sourceFlashArrays,
566+
[Nullable[boolean]]$replicationEnabled,
549567

550568
[Parameter(Position=3,ParameterSetName='Manual')]
551-
[Nullable[boolean]]$replicationEnabled,
569+
[System.TimeSpan]$replicationInterval = 0,
552570

553571
[Parameter(Position=4,ParameterSetName='Manual')]
554-
[System.TimeSpan]$replicationInterval,
572+
[System.TimeSpan]$replicationRetentionShort = 0,
555573

556574
[Parameter(Position=5,ParameterSetName='Manual')]
557-
[System.TimeSpan]$replicationRetentionShort,
575+
[int]$replicationConcurrency,
558576

559577
[Parameter(Position=6,ParameterSetName='Manual')]
560-
[int]$replicationConcurrency,
578+
[String]$consistencyGroupName,
561579

562580
[Parameter(Position=7,ParameterSetName='Manual')]
563-
[String]$consistencyGroupName,
581+
[Nullable[boolean]]$localSnapshotEnabled,
564582

565583
[Parameter(Position=8,ParameterSetName='Manual')]
566-
[VMware.VimAutomation.Storage.Types.V1.Sms.VasaStorageArray[]]$targetFlashArrays,
584+
[System.TimeSpan]$localSnapshotInterval = 0,
567585

568586
[Parameter(Position=9,ParameterSetName='Manual')]
569-
[Nullable[boolean]]$localSnapshotEnabled,
587+
[System.TimeSpan]$localSnapshotRetentionShort = 0,
570588

571589
[Parameter(Position=10,ParameterSetName='Manual')]
572-
[System.TimeSpan]$localSnapshotInterval,
590+
[Parameter(Position=10,ParameterSetName='Config')]
591+
[VMware.VimAutomation.ViCore.Types.V1.VIServer]$server
592+
593+
<# Seems to be a bug in PowerCLI where array objects dont work in policies. Looking into this with VMware. Will hide for now (PowerCLI 12.0).
594+
595+
[Parameter(Position=8,ParameterSetName='Manual')]
596+
[VMware.VimAutomation.Storage.Types.V1.Sms.VasaStorageArray[]]$targetFlashArrays, #>
573597

574-
[Parameter(Position=11,ParameterSetName='Manual')]
575-
[System.TimeSpan]$localSnapshotRetentionShort,
598+
599+
<# Seems to be a bug in PowerCLI where array objects dont work in policies. Looking into this with VMware. Will hide for now (PowerCLI 12.0).
576600
577-
[Parameter(Position=12,ParameterSetName='Manual')]
578-
[Parameter(Position=12,ParameterSetName='Config')]
579-
[VMware.VimAutomation.ViCore.Types.V1.VIServer]$server
601+
[Parameter(Position=2,ParameterSetName='Manual')]
602+
[VMware.VimAutomation.Storage.Types.V1.Sms.VasaStorageArray[]]$sourceFlashArrays, #>
580603
)
581-
if ($newConfig -eq $true)
604+
if ($null -ne $server)
582605
{
583-
return ([FlashArrayvVolPolicyConfig]::new($sourceFlashArrays, $replicationEnabled, $replicationInterval, $replicationRetentionShort, $replicationConcurrency, $consistencyGroupName, $targetFlashArrays, $localSnapshotEnabled , $localSnapshotInterval, $localSnapshotRetentionShort))
606+
$checkExisting = Get-SpbmStoragePolicy -Name $policyName -Server $server -ErrorAction SilentlyContinue
607+
if ($null -ne $checkExisting)
608+
{
609+
throw "A storage policy with the name of $($policyName) already exists on vCenter $($server.Name). Please choose a unique name."
610+
}
584611
}
585-
if ($null -eq $config)
612+
else {
613+
$vCenterExists = @()
614+
foreach ($vCenter in $global:DefaultVIServers)
615+
{
616+
$checkExisting = $null
617+
$checkExisting = Get-SpbmStoragePolicy -Name $policyName -Server $vCenter -ErrorAction SilentlyContinue
618+
if ($null -ne $checkExisting)
619+
{
620+
$vCenterExists += $vCenter.name
621+
}
622+
}
623+
if ($vCenterExists.count -gt 0)
624+
{
625+
throw "A storage policy with the name of $($policyName) already exists on the following vCenter(s):`n `n$($vCenterExists -join ",")`n `n Please choose a unique name."
626+
}
627+
}
628+
if ($generateDefaultPolicyConfig -eq $true)
629+
{
630+
return ([FlashArrayvVolPolicyConfig]::new($policyName, $policyDescription,<#$sourceFlashArrays,#> $replicationEnabled, $replicationInterval, $replicationRetentionShort, $replicationConcurrency, $consistencyGroupName, <#$targetFlashArrays,#> $localSnapshotEnabled , $localSnapshotInterval, $localSnapshotRetentionShort))
631+
}
632+
if ($null -eq $policyConfig)
586633
{
587-
config = ([FlashArrayvVolPolicyConfig]::new($sourceFlashArrays, $replicationEnabled, $replicationInterval, $replicationRetentionShort, $replicationConcurrency, $consistencyGroupName, $targetFlashArrays, $localSnapshotEnabled , $localSnapshotInterval, $localSnapshotRetentionShort))
634+
$policyConfig = ([FlashArrayvVolPolicyConfig]::new($policyName, $policyDescription,<#$sourceFlashArrays,#> $replicationEnabled, $replicationInterval, $replicationRetentionShort, $replicationConcurrency, $consistencyGroupName, <#$targetFlashArrays,#> $localSnapshotEnabled , $localSnapshotInterval, $localSnapshotRetentionShort))
588635
}
589636
$rules = @()
637+
<# Seems to be a bug in PowerCLI where array objects dont work in policies. Looking into this with VMware. Will hide for now (PowerCLI 12.0).
638+
$rules += New-SpbmRule `
639+
-Capability (Get-SpbmCapability -Name com.purestorage.storage.policy.FlashArrayGroup |Select-Object -Unique) `
640+
-Value $sourceFlashArrays.Name#>
590641
$rules += New-SpbmRule `
591-
-Capability (Get-SpbmCapability -Name com.purestorage.storage.policy.FlashArrayGroup) `
592-
-Value $sourceFlashArrays.Name
593-
$rules += New-SpbmRule `
594-
-Capability (Get-SpbmCapability -Name com.purestorage.storage.policy.PureFlashArray) `
642+
-Capability (Get-SpbmCapability -Name com.purestorage.storage.policy.PureFlashArray |Select-Object -Unique) `
595643
-Value $true
596-
$rules += New-SpbmRule `
597-
-Capability (Get-SpbmCapability -Name com.purestorage.storage.replication.LocalSnapshotPolicyCapable) `
598-
-Value $localSnapshotEnabled
599-
$rules += New-SpbmRule `
600-
-Capability (Get-SpbmCapability -Name com.purestorage.storage.replication.LocalSnapshotInterval) `
601-
-Value $localSnapshotInterval
602-
$rules += New-SpbmRule `
603-
-Capability (Get-SpbmCapability -Name com.purestorage.storage.replication.LocalSnapshotRetention) `
604-
-Value $localSnapshotRetentionShort
605-
$rules += New-SpbmRule `
606-
-Capability (Get-SpbmCapability -Name com.purestorage.storage.replication.ReplicationTarget) `
644+
if ($null -ne $policyConfig.localSnapshotEnabled)
645+
{
646+
$rules += New-SpbmRule `
647+
-Capability (Get-SpbmCapability -Name com.purestorage.storage.replication.LocalSnapshotPolicyCapable |Select-Object -Unique) `
648+
-Value $policyConfig.localSnapshotEnabled
649+
}
650+
if ($policyConfig.localSnapshotInterval -ne 0)
651+
{
652+
$rules += New-SpbmRule `
653+
-Capability (Get-SpbmCapability -Name com.purestorage.storage.replication.LocalSnapshotInterval |Select-Object -Unique) `
654+
-Value $policyConfig.localSnapshotInterval
655+
}
656+
if ($policyConfig.localSnapshotRetentionShort -ne 0)
657+
{
658+
$rules += New-SpbmRule `
659+
-Capability (Get-SpbmCapability -Name com.purestorage.storage.replication.LocalSnapshotRetention |Select-Object -Unique) `
660+
-Value $policyConfig.localSnapshotRetentionShort
661+
}
662+
<# Seems to be a bug in PowerCLI where array objects dont work in policies. Looking into this with VMware. Will hide for now (PowerCLI 12.0).
663+
$rules += New-SpbmRule `
664+
-Capability (Get-SpbmCapability -Name com.purestorage.storage.replication.ReplicationTarget |Select-Object -Unique) `
607665
-Value $targetFlashArrays.Name
666+
#>
667+
if ($null -ne $policyConfig.replicationEnabled)
668+
{
669+
$rules += New-SpbmRule `
670+
-Capability (Get-SpbmCapability -Name com.purestorage.storage.replication.RemoteReplicationCapable |Select-Object -Unique) `
671+
-Value $policyConfig.replicationEnabled
672+
}
673+
if ($policyConfig.replicationInterval -ne 0)
674+
{
608675
$rules += New-SpbmRule `
609-
-Capability (Get-SpbmCapability -Name com.purestorage.storage.replication.RemoteReplicationCapable) `
610-
-Value $replicationEnabled
611-
$rules += New-SpbmRule `
612-
-Capability (Get-SpbmCapability -Name com.purestorage.storage.replication.RemoteReplicationInterval) `
613-
-Value $replicationInterval
614-
$rules += New-SpbmRule `
615-
-Capability (Get-SpbmCapability -Name com.purestorage.storage.replication.RemoteReplicationRetention) `
616-
-Value $replicationRetentionShort
617-
$rules += New-SpbmRule `
618-
-Capability (Get-SpbmCapability -Name com.purestorage.storage.replication.ReplicationConsistencyGroup) `
619-
-Value $consistencyGroupName
676+
-Capability (Get-SpbmCapability -Name com.purestorage.storage.replication.RemoteReplicationInterval |Select-Object -Unique) `
677+
-Value $policyConfig.replicationInterval
678+
}
679+
if ($policyConfig.replicationRetentionShort -ne 0)
680+
{
681+
$rules += New-SpbmRule `
682+
-Capability (Get-SpbmCapability -Name com.purestorage.storage.replication.RemoteReplicationRetention |Select-Object -Unique) `
683+
-Value $policyConfig.replicationRetentionShort
684+
}
685+
if (!([string]::IsNullOrWhiteSpace($policyConfig.consistencyGroupName)))
686+
{
687+
$rules += New-SpbmRule `
688+
-Capability (Get-SpbmCapability -Name com.purestorage.storage.replication.ReplicationConsistencyGroup |Select-Object -Unique) `
689+
-Value $policyConfig.consistencyGroupName
690+
}
691+
#create policy
692+
$ruleSet = New-SpbmRuleSet -AllOfRules $rules
693+
if ([string]::IsNullOrWhiteSpace($policyConfig.policyDescription))
694+
{
695+
$policyConfig.policyDescription = "Pure Storage vVol Storage Policy created from PowerCLI"
696+
}
697+
if ($null -eq $server)
698+
{
699+
$policy = @()
700+
foreach ($vCenter in $global:DefaultVIServers)
701+
{
702+
$policy += New-SpbmStoragePolicy -Name $policyConfig.policyName -Description $policyConfig.policyDescription -AnyOfRuleSets $ruleSet -Server $vCenter
703+
}
704+
}
705+
else {
706+
$policy = New-SpbmStoragePolicy -Name $policyConfig.policyName -Description $policyConfig.policyDescription -AnyOfRuleSets $ruleSet -Server $server
707+
}
708+
return $policy
620709
}
621710

622711
#Custom Classes
623712
Class FlashArrayvVolPolicyConfig{
624713
static [String] $version = "1.1.0"
625714
static [String] $vendor = "Pure Storage"
626-
static [String] $name = "vVol Storage Policy Configuration"
715+
static [String] $objectName = "vVol Storage Policy Configuration"
627716
static [String] $model = "FlashArray"
628717
static [System.Boolean]$flasharray = $true
629-
[VMware.VimAutomation.Storage.Types.V1.Sms.VasaStorageArray[]]$sourceFlashArrays = $null
718+
[String]$policyName = ""
719+
[String]$policyDescription = ""
720+
<# Seems to be a bug in PowerCLI where array objects dont work in policies. Looking into this with VMware. Will hide for now (PowerCLI 12.0).
721+
[VMware.VimAutomation.Storage.Types.V1.Sms.VasaStorageArray[]]$sourceFlashArrays = $null #>
630722
[Nullable[boolean]]$replicationEnabled = $null
631-
[System.TimeSpan]$replicationInterval = $null
632-
[System.TimeSpan]$replicationRetentionShort = $null
723+
[System.TimeSpan]$replicationInterval = 0
724+
[System.TimeSpan]$replicationRetentionShort = 0
633725
[int]$replicationConcurrency = $null
726+
[ValidatePattern('(?# MUST BE 3+ digits, alphanumeric, also dashes or underscores can be in the middle)^[A-Za-z][a-zA-Z0-9\-_]+[a-zA-Z0-9]$|^$')]
634727
[String]$consistencyGroupName = ""
635-
[VMware.VimAutomation.Storage.Types.V1.Sms.VasaStorageArray[]]$targetFlashArrays = $null
728+
<# Seems to be a bug in PowerCLI where array objects dont work in policies. Looking into this with VMware. Will hide for now (PowerCLI 12.0).
729+
[VMware.VimAutomation.Storage.Types.V1.Sms.VasaStorageArray[]]$targetFlashArrays = $null #>
636730
[Nullable[boolean]]$localSnapshotEnabled = $null
637-
[System.TimeSpan]$localSnapshotInterval = $null
638-
[System.TimeSpan]$localSnapshotRetentionShort = $null
639-
FlashArrayvVolPolicyConfig ([VMware.VimAutomation.Storage.Types.V1.Sms.VasaStorageArray[]]$sourceFlashArrays, [Nullable[boolean]]$replicationEnabled, [System.TimeSpan]$replicationInterval, [System.TimeSpan]$replicationRetentionShort, [int]$replicationConcurrency, [String]$consistencyGroupName, [VMware.VimAutomation.Storage.Types.V1.Sms.VasaStorageArray[]]$targetFlashArrays, [Nullable[boolean]]$localSnapshotEnabled , [System.TimeSpan]$localSnapshotInterval, [System.TimeSpan]$localSnapshotRetentionShort)
731+
[System.TimeSpan]$localSnapshotInterval = 0
732+
[System.TimeSpan]$localSnapshotRetentionShort = 0
733+
FlashArrayvVolPolicyConfig ([String]$policyName, [String]$policyDescription, <#[VMware.VimAutomation.Storage.Types.V1.Sms.VasaStorageArray[]]$sourceFlashArrays,#> [Nullable[boolean]]$replicationEnabled, [System.TimeSpan]$replicationInterval, [System.TimeSpan]$replicationRetentionShort, [int]$replicationConcurrency, [String]$consistencyGroupName, <#[VMware.VimAutomation.Storage.Types.V1.Sms.VasaStorageArray[]]$targetFlashArrays,#> [Nullable[boolean]]$localSnapshotEnabled , [System.TimeSpan]$localSnapshotInterval, [System.TimeSpan]$localSnapshotRetentionShort)
640734
{
641-
$this.sourceFlashArrays = $sourceFlashArrays
735+
#$this.sourceFlashArrays = $sourceFlashArrays
736+
$this.policyName = $policyName
737+
$this.policyDescription = $policyDescription
642738
$this.replicationEnabled = $replicationEnabled
643739
$this.replicationInterval = $replicationInterval
644740
$this.replicationRetentionShort = $replicationRetentionShort
645741
$this.replicationConcurrency = $replicationConcurrency
646742
$this.consistencyGroupName = $consistencyGroupName
647-
$this.targetFlashArrays = $targetFlashArrays
743+
#$this.targetFlashArrays = $targetFlashArrays
648744
$this.localSnapshotEnabled = $localSnapshotEnabled
649745
$this.localSnapshotInterval = $localSnapshotInterval
650746
$this.localSnapshotRetentionShort = $localSnapshotRetentionShort

0 commit comments

Comments
 (0)