@@ -510,22 +510,34 @@ function Get-PfavVolStorageArray {
510510function 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
623712Class 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