Recent Discussions
Everpure PowerShell SDK 2.52.323 released! New Cmdlets, Parameters, & More!
If your FlashArray automation has reached the point where every new Purity feature means another wrapper function, another chunk of parameter-validation code, and another comment that says “temporary workaround,” this release is for you. Everpure PowerShell SDK 2.52.323 is the latest GA release of the SDK for FlashArray. 64 new cmdlets and 47 existing cmdlets with new parameters. The more useful way to think about it is this: a whole lot of storage operations that used to sit just outside your PowerShell toolbox are now much closer to first-class automation. And yes, there’s an important footnote before we get too excited - we’re still a bit behind on the API parity with Purity. We’re still working on that.Stay tuned!. Wrappers, Drift, Chaos... Oh My PowerShell is great right up until the API surface you need isn’t represented by a cmdlet yet. Then the usual routine begins: A little REST, a little PowerShell. Authentication, URI construction, JSON bodies, response parsing, and error handling all end up in the same script. A little inventory archaeology. Someone has to remember which array has which policy, which workload belongs to which directory, and whether that “new” script still matches the current API. A little parameter drift. The array supports a capability, but your automation doesn’t expose it because the wrapper was written six months ago. A little naming chaos. Not enough to make the script fail, naturally. Just enough to make the next person stare at it for twenty minutes. The old way works. It’s just not especially fun to maintain, and “works” is doing a lot of heavy lifting there. So what exactly is new in 2.52.323? This release updates the SDK’s cmdlet coverage for Purity REST API versions 2.0 through 2.52. It adds new entry points across object storage, policies, quality of service, protection, identity, realms, workload placement, and more. Here are the areas that stood out to me in the release notes. Object Store gets a much bigger PowerShell surface There are new cmdlets for working with: Buckets and bucket performance/space information Lifecycle rules Object Store access keys, accounts, users, and user policies Object Store virtual hosts Object Store access policy members and rules That includes the basic create, update, remove, and get operations you’d expect in an automation workflow. In other words, Object Store administration is less likely to require a detour into raw REST calls just because the script needs to create a bucket or rotate an access key. Network access policies become scriptable The release adds cmdlets for network access policy objects, members, and rules, along with operations for creating, updating, removing, and inspecting them. There are also new array parameters for associating network access policies by ID, name, or resource type. That’s the kind of small-looking addition that becomes important when you’re trying to make a script reusable across arrays instead of hard-coding one environment’s identifiers into it. QoS coverage expands across the stack New cmdlets expose QoS information for hosts, host groups, volumes, volume groups, and realms. Existing host and host-group creation and update cmdlets also gain bandwidth and IOPS limit parameters. That gives you a more consistent way to describe performance intent in automation. Instead of treating QoS as a manual cleanup step after provisioning, your script can include the limits as part of the object lifecycle. Workload-aware directory and file-system operations A large part of the parameter expansion is about workloads. Directory and file-system cmdlets gain workload IDs, workload names, workload configuration, policy associations, default protection options, and related controls. There are also new workload-oriented parameters for NFS, SMB, snapshot, and quota policies. This is useful if your automation thinks in terms of applications and workloads rather than treating every volume, directory, or file system as an isolated object. Presets and placement recommendations expose more detail New-Pfa2PresetWorkload and Set-Pfa2PresetWorkload gain a substantial set of parameters for naming patterns, directory configurations, export configurations, quota and snapshot behavior, periodic replication, QoS, and placement. The placement recommendation cmdlet also gains parameters for richer result data, including target IDs and names, resource types, capacity, model, placement configuration, replication configuration, warnings, and capacity/load projections. This matters because a placement recommendation is more useful when automation can inspect why a target was selected, what its projected state looks like, and what warnings came back — not just whether a recommendation existed. Tags show up in snapshot workflows The new tag-related parameters on volume snapshot and remote protection group snapshot operations include tag namespace, key, value, copyability, and tag context/resource references. That’s a nice fit for scripts that use tags to carry ownership, application, environment, or operational metadata through protection workflows. More coverage around realms, SSO, offload, and remote resources The release also adds or expands cmdlets around: Realm connections and connection keys Remote realms and remote realm tags Remote pods SSO/SAML configuration Azure offload identity and placement settings Active Directory service testing Array cache inspection Support system manifests This is a broad release, not a single-feature release wearing a new version number. The common thread is that more of the things admins already manage in Purity are now represented in the SDK. 47 new parameters is arguably the more interesting part New cmdlets are easy to spot. New parameters are where existing automation gets more capable without needing a complete rewrite. A few examples from the release notes: ContextName and AllowError are added to several commands, including DNS, network interface, realm, and connection-path operations. QosBandwidthLimit and QosIopsLimit are added to host and host-group creation and update operations. WorkloadIds and WorkloadNames are added to directory, file-system, and policy query paths. Azure client, tenant, secret, and placement settings are added to offload creation. Snapshot operations gain tag-related parameters. SSO/SAML operations gain parameters for trusting other SAML service providers in a fleet and setting the service-provider entity ID. Preset workload operations gain a large set of nested configuration parameters, including naming patterns, export settings, quota rules, snapshot rules, replication rules, and placement configuration. The release notes contain the complete cmdlet-by-cmdlet list. I’d use that list as the migration checklist for existing scripts search for the wrapper functions you wrote around these areas, then see whether the SDK now gives you a direct path. There is a HTML Help file available in the GitHub repository. Check it out for an easy reference. The module can be installed side by side with the PowerShell SDK 1.x line, which is helpful if you have older scripts that aren’t ready for a migration project this week. Nobody needs that surprise in the middle of a maintenance window. Compatibility details that kinda matter The release notes call out these requirements and compatibility points: Purity FlashArray support for REST API versions 2.0 through 2.52, inclusive .NET Core 2.1 or later as the stated requirement A 64-bit operating system Windows PowerShell minimum versions for Windows 10, Windows Server 2016, Windows Server 2019, macOS, and Linux macOS and Linux support is noted as not fully tested The practical takeaway: check the host where your automation actually runs, not just the workstation where you first tested the module. A script that works from a newer admin laptop can still fail when it lands on an older jump host with a different PowerShell runtime. A worked example: turning a storage workflow back into storage automation Imagine a team managing application file systems for several environments. Their current process looks like this: Create the file system from PowerShell. Open a separate tool to add policy associations. Manually set QoS on the host group. Add tags to snapshots later, because the first script doesn’t know about them. Keep a second script around to inspect placement results when the environment gets busy. None of those steps is individually terrible. Together, they create the classic “automation” workflow where the human is still the integration layer. With 2.52.323, the team can start consolidating that process around the SDK’s expanded surface: Use the new workload-oriented directory and file-system parameters to carry workload identity and configuration through provisioning. Include host or host-group QoS limits as part of the create or update operation. Use the expanded preset workload parameters to define naming, protection, export, quota, snapshot, replication, and placement behavior together. Inspect placement recommendation targets, warnings, and projections from PowerShell instead of flattening the response into a yes/no result. Apply snapshot tags as part of the protection workflow rather than as a manual afterthought. The point isn’t that one giant script should own the entire storage universe. Please don’t build that script. The point is that each stage can now express more of the intended state directly, with fewer custom REST wrappers sitting between the operator and the array. The nerdy details A few practical observations from the release notes: The SDK exposes Purity REST API functionality as PowerShell cmdlets, so this release is primarily about keeping the PowerShell surface aligned with the API surface. The release adds 64 cmdlets and expands 47 existing cmdlets with new parameters. The release notes do not report performance testing for this release. The full cmdlet and parameter inventory is long, 472 lines in the published release-notes file, so use the source document as the exhaustive reference instead of treating this post as a replacement for it. Why this matters The best SDK release is not the one that gives you the most commands to memorize. It’s the one that lets you delete the most “temporary” code. PowerShell SDK 2.52.323 gives admins more direct coverage for Object Store, policies, QoS, workload configuration, snapshots, tags, realms, placement, and identity. That means fewer hand-built REST calls, fewer disconnected provisioning steps, and a better chance that the automation describes the desired storage state instead of merely replaying the clicks somebody made last quarter. Start with the parts your scripts already work around. Install from the PowerShell Gallery, update the help, compare your wrappers with the new cmdlets and parameters, and migrate incrementally. You don’t have to boil the ocean. You just have to stop rebuilding the same little piece of ocean in every script. Until next time… Cheers!mikenelson-pure10 days agoCommunity Manager348Views3likes1CommentComing soon! The Pure Fusion MCP Server
Have you tried out the power and flexibility of using MCP Servers in your daily admin life? If you haven't, you shoulld really look into the power that they can provide. Pure has developed it's own MCP server for Pure Fusion and we will be releasing it soon. Check out this blog article to read more about the "sneak peek" into what is coming. And always remember - Automate! Automate! Automate!mikenelson-pure7 months agoCommunity Manager194Views4likes0CommentsAccess Token Not Granted
Hi Folks, I'm trying to access Pure1 through REST API , JWT token is generated using private key and application id . I have verified the JWT through jwt.io. But I'm unable to receive access token from Pure1 using JWT . Getting 405 status codeSD9 months agoDay Hiker II837Views0likes7CommentsFlashBlade 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.mikenelson-pure10 months agoCommunity Manager173Views2likes0CommentsPowerShell 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): ContextNamesmikenelson-pure10 months agoCommunity Manager176Views1like0CommentsPure FlashArray integration with OpenNebula
OpenNebula is an easy-to-use open source cloud computing platform for enterprise, private, hybrid or edge. You can integrate Pure Storage FlashArray via iSCSI as a backend to OpenNebula's LVM Thin datastore. You can find Pure's integration with OpenNebula here. More information can be found at the OpenNebula website.mikenelson-pure11 months agoCommunity Manager167Views2likes0CommentsPowerShell & Pure Fusion blog series by Anthony Nocentino
Anthony Nocentino, a Principal Field Solutions Architect at Pure, has started a blog series on using the PowerShell SDK with Pure Fusion. He has several posts coming, and here is his first. Be sure to bookmark his site!mikenelson-pure1 year agoCommunity Manager354Views0likes1CommentPure 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.mikenelson-pure1 year agoCommunity Manager150Views1like0CommentsNew 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, //Mikemikenelson-pure1 year agoCommunity Manager450Views2likes1CommentSome Fleet Python code using the response module
This is the Python sister script to the posted PowerShell version. This script is a Python script that uses the response module to do the tasks. It does not use the Pure Storage pyClient. 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 Python 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. #!/usr/bin/env python3 import json import requests import urllib3 urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) # Set target array address target = "10.0.0.10" # API version to use # TO-DO: dynamically get the latest version latest_api_version = "2.45" # Authenticate and get x-auth-token session = requests.Session() login_url = f'https://{target}/api/{latest_api_version}/login' session.headers.update({ "api-token": "<your_api_token_here>" }) response = session.post(login_url, verify=False) x_auth_token = response.headers.get("x-auth-token") if x_auth_token: session.headers.update({"x-auth-token": x_auth_token}) else: print("Error: x-auth-token not found in response headers.") print(x_auth_token) Query the fleet: # Get fleet info fleets_url = f'https://{target}/api/{latest_api_version}/fleets' fleets_response = session.get(fleets_url, verify=False) fleets_json = fleets_response.json() fleet_name = fleets_json['items'][0]['name'] print (f"Selected fleet: {fleet_name}") # Get fleet members members_url = f"https://{target}/api/{latest_api_version}/fleets/members?fleet_name={fleet_name}" fleets_response_members = session.get(members_url, verify=False) VAR1 = fleets_response_members.json() VAR_RESULTS = [item['member']['name'] for item in VAR1['items']] print(f"Fleet members: {VAR_RESULTS}") Enumerate volumes and hosts with pagination: # Enumerate all volumes in the fleet with pagination print("\nEnumerating volumes in the fleet:") limit = 10 # Adjust as needed continuation_token = None all_volumes = [] volumes_base_url = f"https://{target}/api/{latest_api_version}/volumes?context_names={','.join(VAR_RESULTS)}" while True: params = {'limit': limit} if continuation_token: params['continuation_token'] = continuation_token volumes_response = session.get(volumes_base_url, params=params, verify=False) volumes_json = volumes_response.json() all_volumes.extend(volumes_json.get('items', [])) continuation_token = volumes_response.headers.get('x-next-token') if not continuation_token: break print(f"Total volumes found: {len(all_volumes)}") print(json.dumps(all_volumes, indent=2)) # Enumerate hosts in the fleet with pagination print("\nEnumerating hosts in the fleet:") limit = 10 # Adjust as needed continuation_token = None all_hosts = [] hosts_base_url = f"https://{target}/api/{latest_api_version}/hosts?context_names={','.join(VAR_RESULTS)}" while True: params = {'limit': limit} if continuation_token: params['continuation_token'] = continuation_token hosts_response = session.get(hosts_base_url, params=params, verify=False) hosts_json = hosts_response.json() all_hosts.extend(hosts_json.get('items', [])) continuation_token = hosts_response.headers.get('x-next-token') if not continuation_token: break print(f"Total hosts found: {len(all_hosts)}") print(json.dumps(all_hosts, indent=2)) Enumerate Presets and Workloads in the fleet: # Enumerate all Presets in the fleet print("\nEnumerating presets in the fleet:") presets_url = f"https://{target}/api/{latest_api_version}/presets?context_names={','.join(VAR_RESULTS)}" presets_response = session.get(presets_url, verify=False) presets_json = presets_response.json() print(f"Total presets found: {len(presets_json.get('items', []))}") # Enumerate all Woorkloads in the fleet print("\nEnumerating workloads in the fleet:") workloads_url = f"https://{target}/api/{latest_api_version}/workloads?context_names={','.join(VAR_RESULTS)}" workloads_response = session.get(workloads_url, verify=False) workloads_json = workloads_response.json() print(f"Total workloads found: {len(workloads_json.get('items', []))}") Create a host on a member array, create a volume, and connect the volume to the host: # Select a member array (not the target) member_array = next((name for name in VAR_RESULTS if name != target), None) if not member_array: print("No other member array found in the fleet.") exit(1) print(f"Selected member array for operations: {member_array}") # Create a new host on the member array host_name = "demo-host-01" host_iqn = "iqn.2025-08.com.fleetdemo:host01" host_payload = { "names": host_name, "iqn": [host_iqn], "context": { "name": member_array } } hosts_url = f"https://{target}/api/{latest_api_version}/hosts" host_resp = session.post(hosts_url, json=host_payload, verify=False) print(f"Host creation response: {host_resp.json()}") # Create a new volume on the member array volume_name = "APIDemo-vol1" volume_payload = { "names": volume_name, "provisioned": 10737418240, # 10 GB in bytes "context": { "name": member_array } } volumes_url = f"https://{target}/api/{latest_api_version}/volumes" volume_resp = session.post(volumes_url, json=volume_payload, verify=False) print(f"Volume creation response: {volume_resp.json()}") # Connect the volume to the host connect_payload = { "volume_names": volume_name, "context_names":member_array, "host_names": host_name, } connections_url = f"https://{target}/api/{latest_api_version}/connections" connect_resp = session.post(connections_url, json=connect_payload, verify=False) print(f"Connection response: {connect_resp.json()}")mikenelson-pure1 year agoCommunity Manager138Views0likes0Comments