FlashCrew London & Glasgow May/June 2025 !!!! Register NOW...
I'd like to invite you to our upcoming FlashCrew Customer User Group in London on May 15th, from midday. Throughout May, we'll be taking our FlashCrew User Group on the road to share ideas, best practices and network on all things Pure over some drinks and food. Plus, as a thank you for your continued support and attendance we will of course have the latest FlashCrew branded gifts for you to take with you! If you can make it, please register at this link below. London 10-11 Carlton House Terrace Thursday 15th May: REGISTER HERE for FLASHCREW LONDON Glasgow Radisson Blu Hotel Thursday 5th June: REGISTER HERE for FLASHCREW GLASGOW These are user group meetings, targeted at a technical audience across Pure's existing customers. Not only will you hear the latest news on the Pure Enterprise Data Cloud, but will also get to network with other like-minded users and exchange ideas and experiences. Agenda: 12:00 - 12:50 Arrival, Lunch and Welcome 13:00 - 14:00 Pure Platform: Features and Roadmap: with demo 14:00 - 14:15 Break 14:15 - 14:45 SQL Databases and Pure 14:45 - 15:15 Voice of the Customer 15:15 - 15:30 Break 15:30 - 16:15 Portworx and the Enterprise Data Cloud 16:15 - 16:45 Modern Virtualisation 16:45 - 17:00 Open Floor Q&A, Raffle, Wrap Up 17:00 - 19:00 Drinks and Networking79Views5likes0CommentsAsk Us Everything Recap: Making Purity Upgrades Simple
At our recent Ask Us Everything session, we put a spotlight on something every storage admin has an opinion about: software upgrades. Traditionally, storage upgrades have been dreaded — late nights, service windows, and the fear of downtime. But as attendees quickly learned, Pure Storage Purity upgrades are designed to be a very different experience. Our panel of Pure Storage experts included our host Don Poorman, Technical Evangelist, and special guests Sean Kennedy and Rob Quast, Principal Technologists. Here are the questions that sparked the most conversation, and the insights our panel shared. “Are Purity upgrades really non-disruptive?” This one came up right away, and for good reason. Many admins have scars from upgrade events at other vendors. Pure experts emphasized that non-disruptive upgrades (NDUs) are the default. With thousands performed in the field — even for mission-critical applications — upgrades run safely in the background. Customers don’t need to schedule middle-of-the-night windows just to stay current. “Do I need to wait for a major release?” Attendees wanted to know how often they should upgrade, and whether “dot-zero” releases are safe. The advice: don’t wait too long. With Pure’s long-life releases (like Purity 6.9), you can stay current without chasing every new feature release. And because Purity upgrades are included in your Evergreen subscription, you’re not paying extra to get value — you just need to install the latest version. Session attendees found this slide helpful, illustrating the different kinds of Purity releases. “How do self-service upgrades work?” Admins were curious about how much they can do themselves versus involving Pure Storage support. The good news: self-service upgrades are straightforward through Pure1, but you’re never on your own. Pure Technical Services knows that you're running an upgrade, and if an issue arises you’re automatically moved to the front of the queue. If you want a co-pilot, then of course Pure Storage support can walk you through it live. Either way, the process is fast, repeatable, and built for confidence. Upgrading your Purity version has never been easier, now that Self Service Upgrades lets you modernize on your schedule. “Why should I upgrade regularly?” This is where the conversation shifted from fear to excitement. Staying current doesn’t just keep systems secure — it unlocks new capabilities like: Pure Fusion™: a unified, fleet-wide control plane for storage. FlashArray™ Files: modern file services, delivered from the same trusted platform. Ongoing performance, security, and automation enhancements that come with every release. One attendee summed it up perfectly: “Upgrading isn’t about fixing problems — it’s about getting new toys.” The Takeaway The biggest lesson from this session? Purity upgrades aren’t something to fear — they’re something to look forward to. They’re included with your Evergreen subscription, they don’t disrupt your environment, and they unlock powerful features that make storage easier to manage. So if you’ve been putting off your next upgrade, take a fresh look. Chances are, Fusion, Files, or another feature you’ve been waiting for is already there — you just need to turn it on. 👉 Want to keep the conversation going? Join the discussion in the Pure Community and share your own upgrade tips and stories. Be sure to join our next Ask Us Everything session, and catch up with past sessions here!108Views3likes2CommentsNew Pure Code site is live!
After many months of messing with some very old code, we have launched a revised site for the Pure Code Portal. It is much more minimalistic and cleaner than the old one, and we have plans to add our Code videos and Pure Employee website links in the near future. Have a look and feel free to leave a comment if you would like to see something on the site. https://code.purestorage.com/ Cheers, //Mike67Views2likes1CommentSome Fleet PowerShell code using Invoke-RestMethod
Hello fellow scripters! This script is a PowerShell script that uses native PowerShell cmdlets to do the tasks. It does not use the Pure Storage PowerShell SDK2. This is for folks who do raw API calls using automation packages, runbooks, and scripts. It is not intended to use in it's entirety, but rather to be used as code snippets and starters for your own scripts. The full script is available in this GitHub repository. This script will: Use native PowerShell (non-SDK) Invoke-RestMethod calls to the FlashArray API Authenticates an API Token user and gets the x-auth-token for requests Query a fleet and determine the fleet members Query fleet Presets & Workloads List fleet volumes and hosts (top X, configurable) Create a host, volume, and then connect the volume to the host on a member array. <# .SYNOPSIS Authenticates to Pure Storage FlashArray REST API and retrieves session token. .DESCRIPTION - Authenticates using API token. - Retrieves the x-auth-token from response headers for subsequent requests. - Dynamically queries the FlashArray for the latest available API version and uses it for requests. .PARAMETER Target Required. The FQDN or IP address of the FlashArray to target for REST API calls. .PARAMETER ApiToken Required. The API token used for authentication with the FlashArray REST API. .EXAMPLE .\Connect-FAApi.ps1 -Target "10.0.0.100" -ApiToken "<Your API Token here>" .NOTES Author: mnelson@purestorage.com Origin Date: 10/23/2023 Version: 1.1 #> param ( [Parameter(Mandatory = $true)] [string]$Target, [Parameter(Mandatory = $true)] [string]$ApiToken ) ################ SETUP ################ # Query the array for the latest available API version try { $apiVersions = Invoke-RestMethod -Uri "https://$Target/api/api_version" -Method Get -SkipCertificateCheck $numericApiVersions = $apiVersions.version | Where-Object { $_ -match '^\d+(\.\d+)*$' -and $_ -notmatch '^2\.x$' } $latestApiVersion = ($numericApiVersions | Sort-Object { [version]$_ } -Descending)[0] Write-Host "Latest API Version detected:" $latestApiVersion } catch { Write-Host "Could not retrieve API version, defaulting to 2.45" $latestApiVersion = "2.45" } # Set the Base Uri if ($latestApiVersion) { $baseUrl = "https://$Target/api/$latestApiVersion" } # Prepare headers for authentication $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers["api-token"] = $ApiToken # Authenticate and get session token $response = Invoke-RestMethod "https://$Target/api/$latestApiVersion/login" -Method 'POST' -Headers $headers -SkipCertificateCheck -ResponseHeadersVariable "respHeaders" # Display the value of "username" from the response, if present if ($response.items -and $response.items[0].username) { Write-Host "Username:" $response.items[0].username } else { Write-Host "Username field not found in response." } # TO-DO: Check if user is LDAP or local # Parse "x-auth-token" from response headers and store in $xAuthHeader $xAuthHeader = $respHeaders["x-auth-token"] Write-Host "x-auth-token:" $xAuthHeader # Add x-auth-token to headers for subsequent requests $headers.Add("x-auth-token", $xAuthHeader) # You can now use $headers for further authenticated requests to the FA API ########################################################################### Add pagination, query the fleet: # optional pagination & limit code $continuation_token = $null $limit = 10 # Adjust as needed ################ FLEETS ################ # Get Fleet name $fleetsResponse = Invoke-RestMethod -Uri "$baseUrl/fleets" -Method Get -Headers $headers -SkipCertificateCheck $fleetName = $fleetsResponse.items[0].name #Write-Host "Fleet Name: $fleetName" # Get fleet members $membersUrl = "$baseUrl/fleets/members?fleet_name=$fleetName" $membersResponse = Invoke-RestMethod -Uri $membersUrl -Method Get -Headers $headers -SkipCertificateCheck if (-not $membersResponse.items -or $membersResponse.items.Count -eq 0) { Write-Error "No fleet members found." exit 1 } # Extract Fleet member names $VAR_RESULTS = @() foreach ($item in $membersResponse.items) { if ($item.member -and $item.member.name) { $VAR_RESULTS += $item.member.name } elseif ($item.name) { $VAR_RESULTS += $item.name } } if ($VAR_RESULTS.Count -eq 0) { Write-Error "No member names found in fleet members response." exit 1 } # Write out the fleet members #Write-Host "Extracted Member Names: $($VAR_RESULTS -join ', ')" Query for volumes, hosts: ################ FLEET VOLUMES QUERY ################ # Query volumes for extracted member names $volumesUrl = "$baseUrl/volumes?context_names=$($VAR_RESULTS -join ',')" ## uncomment for full response - no limit, and comment out pagination code below #$volumesResponse = Invoke-RestMethod -Uri $volumesUrl -Method Get -Headers $headers -SkipCertificateCheck #$volumesResponse | ConvertTo-Json -Depth 5 ## with paginated reponse do { ## Build the query string for pagination $queryString = "?limit=$limit" if ($continuation_token) { $queryString += "&continuation_token=$continuation_token" } $volumesUrl = "$baseUrl/volumes$queryString" ## Invoke REST method and capture response headers $volumesResponse = Invoke-RestMethod -Uri $volumesUrl -Method Get -Headers $headers -SkipCertificateCheck -ResponseHeadersVariable respHeaders ## Output volumes data $volumesResponse | ConvertTo-Json -Depth 5 ## Extract x-next-token from response headers for next page $continuation_token = $respHeaders["x-next-token"] ## Continue if x-next-token is present } while ($continuation_token) ################ FLEET HOSTS QUERY ################ # Query hosts for extracted member names $hostsUrl = "$baseUrl/hosts?context_names=$($VAR_RESULTS -join ',')" ## full response - no limit, and comment out pagination code below #$hostsResponse = Invoke-RestMethod -Uri $hostsUrl -Method Get -Headers $headers -SkipCertificateCheck #$hostsResponse | ConvertTo-Json -Depth 5 ## with paginated reponse do { ## Build the query string for pagination $queryString = "?limit=$limit" if ($continuation_token) { $queryString += "&continuation_token=$continuation_token" } $hostsUrl = "$baseUrl/hosts$queryString" ## Invoke REST method and capture response headers $hostsResponse = Invoke-RestMethod -Uri $hostsUrl -Method Get -Headers $headers -SkipCertificateCheck -ResponseHeadersVariable respHeaders ## Output hosts data $hostsResponse | ConvertTo-Json -Depth 5 ## Extract x-next-token from response headers for next page $continuation_token = $respHeaders["x-next-token"] ## Continue if x-next-token is present } while ($continuation_token) Query for Presets & Workloads: ################ FLEET PRESETS QUERY ################ $presetsUrl = "$baseUrl/presets?context_names=$($VAR_RESULTS -join ',')" $presetsResponse = Invoke-RestMethod -Uri $presetsUrl -Method Get -Headers $headers -SkipCertificateCheck -ResponseHeadersVariable respHeaders $presetsResponse | ConvertTo-Json -Depth 5 ################ FLEET WORKLOADS QUERY ################ $workloadsUrl = "$baseUrl/workloads?context_names=$($VAR_RESULTS -join ',')" $workloadsResponse = Invoke-RestMethod -Uri $workloadsUrl -Method Get -Headers $headers -SkipCertificateCheck -ResponseHeadersVariable respHeaders $workloadsResponse | ConvertTo-Json -Depth 5 Create a Host on a fleet member array, create a volume, connect the volume to the host: ################ CREATE VOLUME, HOST, AND CONNECT THEM ON ANOTHER FLASHARRAY IN THE FLEET ################ # Select a secondary FlashArray in the fleet $otherArrayName = $VAR_RESULTS | Where-Object { $_ -ne $Target } | Select-Object -First 1 if (-not $otherArrayName) { Write-Error "No other FlashArray found in the fleet." exit 1 } Write-Host "Selected secondary FlashArray for operations: $otherArrayName" # Create a new volume on the secondary FlashArray $newVolumeName = "APIDemo-Vol01" $volumePayload = @{ name = $newVolumeName size = 10737418240 # 10 GiB in bytes context = @{ name = $otherArrayName } } $createVolumeUrl = "$baseUrl/volumes" $createVolumeResponse = Invoke-RestMethod -Uri $createVolumeUrl -Method Post -Headers $headers -Body ($volumePayload | ConvertTo-Json) -ContentType "application/json" -SkipCertificateCheck Write-Host "Created volume:" $newVolumeName "on" $otherArrayName # Create a new host on the secondary FlashArray $newHostName = "FleetDemoHost01" $IQN = "iqn.2023-07.com.fleetdemo:host01" $hostPayload = @{ name = $newHostName iqn = @($IQN) context = @{ name = $otherArrayName } } $createHostUrl = "$baseUrl/hosts" $createHostResponse = Invoke-RestMethod -Uri $createHostUrl -Method Post -Headers $headers -Body ($hostPayload | ConvertTo-Json) -ContentType "application/json" -SkipCertificateCheck Write-Host "Created host:" $newHostName "with IQN:" $IQN "on" $otherArrayName # Connect the newly created volume to the newly created host $connectPayload = @{ volume = @{ name = $newVolumeName context = @{ name = $otherArrayName } } host = @{ name = $newHostName context = @{ name = $otherArrayName } } } $connectUrl = "$baseUrl/host-volume-connections" $connectResponse = Invoke-RestMethod -Uri $connectUrl -Method Post -Headers $headers -Body ($connectPayload | ConvertTo-Json) -ContentType "application/json" -SkipCertificateCheck Write-Host "Connected volume" $newVolumeName "to host" $newHostName "on" $otherArrayName # Output results $createVolumeResponse | ConvertTo-Json -Depth 5 $createHostResponse | ConvertTo-Json -Depth 5 $connectResponse | ConvertTo-Json -Depth 542Views2likes0CommentsFlashBlade Ansible Collection 1.22.0 released!
🎊 FlashBlade Ansible Collection 1.22.0 THIS IS A SIGNIFICANT RELEASE as removes all REST v1 components from the collection and adds Fusion support! Update your collections! Download the Collection via Ansible command: ansible-galaxy collection install purestorage.flashblade Download it from Ansible Galaxy here Read the Release Notes here.12Views1like0CommentsPowerShell SDK v2.44.111 released with REST API 2.44 support!
🎉 The Pure PowerShell SDK v2 version 2.44.111 has been released! This release marks the full compatibility with Purity REST API version 2.44 and it contains many additions, changes, and deprecations for cmdlets. Please read the Release Notes for more detailed release information. To install the updated module: Install-Module -Name PureStoragePowerShellSDK2 Here is a brief review of the newest additions and changes: In this release, we added the cmdlets for managing Directories, DirectoryServices, Policies, ProtectionGroupSnapshot tags and Servers. Multiple endpoints got new parameters. Find detailed information about the cmdlets in the sections below. On this release we added the following 31 new cmdlet(s): Get-Pfa2DirectoryGroup Get-Pfa2DirectoryPolicyUserGroupQuota New-Pfa2DirectoryPolicyUserGroupQuota Remove-Pfa2DirectoryPolicyUserGroupQuota Get-Pfa2DirectoryUser Get-Pfa2DirectoryGroupQuota New-Pfa2DirectoryService Remove-Pfa2DirectoryService Get-Pfa2DirectoryServiceLocalDirectoryService New-Pfa2DirectoryServiceLocalDirectoryService Update-Pfa2DirectoryServiceLocalDirectoryService Remove-Pfa2DirectoryServiceLocalDirectoryService Get-Pfa2DirectoryUserQuota Get-Pfa2PolicyUserGroupQuota New-Pfa2PolicyUserGroupQuota Update-Pfa2PolicyUserGroupQuota Remove-Pfa2PolicyUserGroupQuota Get-Pfa2PolicyUserGroupQuotaMember New-Pfa2PolicyUserGroupQuotaMember Remove-Pfa2PolicyUserGroupQuotaMember Get-Pfa2PolicyUserGroupQuotaRule New-Pfa2PolicyUserGroupQuotaRule Update-Pfa2PolicyUserGroupQuotaRule Remove-Pfa2PolicyUserGroupQuotaRule Get-Pfa2ProtectionGroupSnapshotTag Remove-Pfa2ProtectionGroupSnapshotTag Set-Pfa2ProtectionGroupSnapshotTagBatch Get-Pfa2Servers New-Pfa2Servers Update-Pfa2Servers Remove-Pfa2Servers The following 29 cmdlet(s) have new parameters: 'New-Pfa2ActiveDirectory' have the following new parameter(s): SourcesId SourcesName 'Update-Pfa2ActiveDirectory' have the following new parameter(s): SourcesId SourcesName 'New-Pfa2DirectoryPolicyNfs' have the following new parameter(s): PoliciesServerId PoliciesServerName 'New-Pfa2DirectoryPolicySmb' have the following new parameter(s): PoliciesServerId PoliciesServerName 'Get-Pfa2DirectoryExport' have the following new parameter(s): Name 'New-Pfa2DirectoryExport' have the following new parameter(s): Name ServerId ServerName 'Remove-Pfa2DirectoryExport' have the following new parameter(s): Name 'Get-Pfa2DirectoryService' have the following new parameter(s): Id 'Update-Pfa2DirectoryService' have the following new parameter(s): Id CaCertificateRefId CaCertificateRefName CaCertificateRefResourceType SourcesId SourcesName 'Get-Pfa2DirectoryServiceLocalGroup' have the following new parameter(s): AllowErrors ContextName 'New-Pfa2DirectoryServiceLocalGroup' have the following new parameter(s): ContextName LocalDirectoryServiceIds LocalDirectoryServiceNames 'Update-Pfa2DirectoryServiceLocalGroup' have the following new parameter(s): ContextName LocalDirectoryServiceIds LocalDirectoryServiceNames ContextId 'Remove-Pfa2DirectoryServiceLocalGroup' have the following new parameter(s): ContextName LocalDirectoryServiceIds LocalDirectoryServiceNames 'Get-Pfa2DirectoryServiceLocalGroupMember' have the following new parameter(s): AllowErrors ContextName 'New-Pfa2DirectoryServiceLocalGroupMember' have the following new parameter(s): ContextName LocalDirectoryServiceIds LocalDirectoryServiceNames 'Remove-Pfa2DirectoryServiceLocalGroupMember' have the following new parameter(s): ContextName LocalDirectoryServiceIds LocalDirectoryServiceNames 'Get-Pfa2DirectoryServiceLocalUser' have the following new parameter(s): AllowErrors ContextName 'New-Pfa2DirectoryServiceLocalUser' have the following new parameter(s): ContextName LocalDirectoryServiceIds LocalDirectoryServiceNames 'Update-Pfa2DirectoryServiceLocalUser' have the following new parameter(s): ContextName LocalDirectoryServiceIds LocalDirectoryServiceNames 'Remove-Pfa2DirectoryServiceLocalUser' have the following new parameter(s): ContextName LocalDirectoryServiceIds LocalDirectoryServiceNames 'Get-Pfa2DirectoryServiceLocalUserMember' have the following new parameter(s): AllowErrors ContextName 'New-Pfa2DirectoryServiceLocalUserMember' have the following new parameter(s): ContextName LocalDirectoryServiceIds LocalDirectoryServiceNames 'Remove-Pfa2DirectoryServiceLocalUserMember' have the following new parameter(s): ContextName LocalDirectoryServiceIds LocalDirectoryServiceNames 'New-Pfa2NetworkInterface' have the following new parameter(s): AttachedServersId AttachedServersName 'Update-Pfa2NetworkInterface' have the following new parameter(s): AttachedServersId AttachedServersName 'New-Pfa2PolicyNfsMember' have the following new parameter(s): MembersServerId MembersServerName 'New-Pfa2PolicySmbMember' have the following new parameter(s): MembersServerId MembersServerName 'New-Pfa2ProtectionGroupSnapshot' have the following new parameter(s): TagsCopyable TagsKey TagsNamespace TagsValue TagsContextId TagsContextName TagsResourceId TagsResourceName 'New-Pfa2ProtectionGroupSnapshotTest' have the following new parameter(s): TagsCopyable TagsKey TagsNamespace TagsValue TagsContextId TagsContextName TagsResourceId TagsResourceName The following 16 cmdlet(s) had parameters dropped: 'Update-Pfa2Array' dropped the following parameter(s): ContextNames 'Update-Pfa2ContainerDefaultProtection' dropped the following parameter(s): ContextNames 'Update-Pfa2DirectoryService' dropped the following parameter(s): ContextNames 'Update-Pfa2DirectoryServiceRole' dropped the following parameter(s): ContextNames 'Set-Pfa2PresetWorkload' dropped the following parameter(s): ContextNames 'New-Pfa2ProtectionGroupSnapshot' dropped the following parameter(s): ContextNames 'Update-Pfa2ProtectionGroupSnapshot' dropped the following parameter(s): ContextNames 'New-Pfa2ProtectionGroupSnapshotTest' dropped the following parameter(s): ContextNames 'Update-Pfa2ProtectionGroup' dropped the following parameter(s): ContextNames 'New-Pfa2RemoteProtectionGroupSnapshot' dropped the following parameter(s): ContextNames 'New-Pfa2RemoteProtectionGroupSnapshotTest' dropped the following parameter(s): ContextNames 'Update-Pfa2RemoteProtectionGroup' dropped the following parameter(s): ContextNames 'New-Pfa2SyslogServer' dropped the following parameter(s): ContextNames 'Update-Pfa2SyslogServer' dropped the following parameter(s): ContextNames 'Update-Pfa2SyslogServerSetting' dropped the following parameter(s): ContextNames 'New-Pfa2WorkloadPlacementRecommendation' dropped the following parameter(s): ContextNames23Views1like0CommentsFlashcrew Manchester
🤝 Flashcrew Pure Usergroup | Manchester | For our amazing customers! Connect with fellow Pure users and dive deep into the //Accelerate announcements. Learn how to extract even more value from the Pure ecosystem and get your technical questions answered by the experts. Register here: https://info.purestorage.com/2025-Q2EMEA-UKREPLHCOFY26Q3-FlashCrew-Manchester-LP_01---Registration-Page.html We also open these up to non-customers interested in Pure, helping you learn from those already benefitting from the Pure Enterprise Data Platform. Please DM me if you would like an invite.41Views1like0CommentsPure Storage PowerShell SDK2 version 2.43.46 released!
We released the Pure Storage PowerShell SDK version 2.43.30 not too long ago. We have since received reports of users having issue with the Connect-Pfa2Array cmdlet only when using PowerShell version 5.x. The error would something similar to this: Could not load file or assembly 'System.ComponentModel.Annotations, Version=4.2.0.0, Culture=neutral, PublicKeyToken=someToken' or one of its dependencies. We have released a fix for this in the PowerShell Gallery. https://www.powershellgallery.com/packages/PureStoragePowerShellSDK2/2.43.46. This was the only fix for this release and the issue does not affect the cmdlet when used with PowerShell version 7.x. To upgrade, run Install-Module: Install-Module -Name PureStoragePowerShellSDK2 -Repository PSGallery -RequiredVersion 2.43.46 -Verbose -Force We do apologize for any inconvenience this may have caused.23Views1like0CommentsPowerShell SDK v2.43.30 released!
The Pure PowerShell SDK version 2.43.30 has been released! There are a boatload of changes in this release, and all of those changes can be found in the release notes. New cmdlets for Fleets, tags, realms, and more. New parameters for context_names (fleets) and Allow_Errors. Install the SDK today! Install-Module PureStoragePowerShellSDK2 Update your current version: Update-Module PureStoragePowerShellSDK2 PowerShell Gallery Link33Views1like0Comments