I’ve recently been playing around with the Pure Storage PowerShell modules. I’ve found the Pure cmdlets to be quite extensive and easy to use. Quite a nice change from PowerShell Cmdlets of other traditional storage vendors. One thing, though, that I found a little annoying was that I had to store a connection for a Pure Array into a PowerShell object and constantly reference that object in each cmdlet I ran. Not a big deal normally but where I ran into an issue was wanting to connect to multiple Pure Arrays at the same time and being able to run and iterate against them all at the same time. I quickly came to realise that the cmdlets themselves are designed to run against one Pure Array at a time.
Initially I thought I could store multiple connections to a variable using the += operator. But this lead to the following error.
C:\Code> $arrays = New-PfaArray -EndPoint purearray1 -ApiToken 'b2342442-ebb2-5673-a452-c443f562cb7' -IgnoreCertificateError C:\Code> $arrays += New-PfaArray -EndPoint purearray2 -ApiToken '6523ff23-32ac-2890-9843-2e4e9543672' -IgnoreCertificateError Method invocation failed because [PurePowerShell.PureArray] does not contain a method named 'op_Addition'. At line:1 char:1 + $array += New-PfaArray -EndPoint purearray2 -A ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (op_Addition:String) [], RuntimeException + FullyQualifiedErrorId : MethodNotFound
A quick inspection of the data type of the variable created using GetType shows that it is a System.Object and not an Array. By default creating a connection to a Pure Array using New-PfaArray and storing that to a variable will cast it as an object.
C:\Code> $arrays.GetType() IsPublic IsSerial Name BaseType -------- -------- ---- -------- True False PureArray System.Object
This is easily fixed by setting the data type for our variable to [array] when we create it.
[array]$arrays = New-PfaArray -EndPoint purearray1 -ApiToken 'b2342442-ebb2-5673-a452-c443f562cb7' -IgnoreCertificateError [array]$arrays += New-PfaArray -EndPoint purearray2 -ApiToken '6523ff23-32ac-2890-9843-2e4e9543672' -IgnoreCertificateError
Now when we check the data type we see it’s System.Array.
C:\Code> $arrays.GetType() IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True Object[] System.Array
Checking the variable again we can see we have two records.
C:\Code> $arrays Disposed : False EndPoint : UserName : ApiVersion : 1.7 Role : StorageAdmin ApiToken : b2342442-ebb2-5673-a452-c443f562cb7 Disposed : False EndPoint : UserName : ApiVersion : 1.7 Role : StorageAdmin ApiToken : 6523ff23-32ac-2890-9843-2e4e9543672
Using this new variable with a Pure Storage Cmdlet is just a matter of specify the line in the array representing the Pure Storage Array we want using square brackets.
C:\Code> Get-PfaArrayId -Array $arrays[0] version revision array_name id ------- -------- ---------- -- 4.8.10 201705102013+977fb3c purearray1 b2342442-ebb2-5673-a452-c443f562cb7b
Where this array we created really becomes handy is when using it with foreach loops. We can now rap our Cmdlets in a foreach loop and iterate through all our Pure Storage Arrays.
C:\Code> $results = foreach ($array in $arrays) { Get-PfaArrayId -array $array } C:\Code> $results | ft version revision array_name id ------- -------- ---------- -- 4.8.10 201705102013+977fb3c purearray2 6523ff23-32ac-2890-9843-2e4e9543672 4.8.10 201705102013+977fb3c purearray1 b2342442-ebb2-5673-a452-c443f562cb7
This is just a simple example but now we can start enumerating across all our Pure Storage arrays and easily start manipulating objects returned.
I really like the Pure Storage PowerShell modules but I really hope that a future update allows for easier working with multiple Pure Arrays. Hopefully allowing their Cmdlets to work against multiple arrays at the same time.