What's New in PureStorage.Pure1 v1.5.0.0

My contribution to the PureStorage.Pure1 PowerShell module

Posted by Adam Mazouz on Tuesday, April 7, 2026
Reading Time: 9 minutes

In the previous blog post, we walked through how to authenticate and connect to Pure1 using the PureStorage.Pure1 PowerShell SDK. We covered RSA key pairs, JWTs, and ran through the initial set of cmdlets to query arrays, volumes, and metrics.

This time, we are going to dive into the v1.5.0.0 release of the module, which I have personally contributed to the open-source project. This release adds 16 new cmdlets that significantly expand what you can do with Pure1 from the command line, covering everything from hardware inventory and replication topology to sustainability metrics.

But before we get into the new cmdlets, I want to take a step back and talk about why this matters.

Why API-First Matters

Pure1 is a powerful platform with a rich UI for fleet management, but the real power lies beneath the surface: the Pure1 REST API.

The API exposes the same data you see in the Pure1 portal, but in a way that can be consumed programmatically. This means you can:

  • Automate reporting instead of manually exporting data from the UI.
  • Build custom dashboards that combine Pure1 data with other sources.
  • Integrate with existing tools like ServiceNow, Splunk, or your own internal platforms.
  • Schedule recurring tasks like fleet health checks, capacity reviews, or compliance audits.

And the reach of the API goes well beyond scripting and reporting. The same Pure1 REST API is what powers Pure1 Workflow Orchestration, enabling you to build automated, event-driven pipelines across your fleet. It is also what makes the Pure1 MCP Server possible, bringing Pure1 data into AI-powered tools. I will be covering both of these topics in upcoming blogs. For now, lets dive into why I spent some time contributing to the PureStorage.Pure1 PowerShell module.

Why PowerShell?

If the API is the foundation, PowerShell is one of the simplest way to build on it.

For storage administrators, infrastructure engineers, and anyone working in a Windows-heavy environment, PowerShell is the natural choice. You do not need to set up a Python virtual environment, install dependencies, or write boilerplate code. With the PureStorage.Pure1 module, you get native cmdlets that follow familiar PowerShell patterns:

# One line to install
Install-Module PureStorage.Pure1

# One line to connect
New-PureOneConnection -PureAppID pure1:apikey:PZoggxxxxx

# One line to get results
Get-PureOneArray

That is three lines to go from zero to querying your entire fleet. And because the output is standard PowerShell objects, you can pipe, filter, sort, group, and export using the tools you already know: Where-Object, Select-Object, Sort-Object, Export-Csv, ConvertTo-Html, and more.

No SDK wrapper classes, no JSON parsing, no token refresh logic. The module handles all of that for you.

What’s New in v1.5.0.0

The v1.5.0.0 release (March 31st, 2026) adds 16 new cmdlets across four categories: Hardware & Inventory, Data Protection & Replication, Storage Resources, and Auditing & Sustainability.

Hardware & Inventory

Cmdlet Description
Get-PureOneController Retrieve array controller information
Get-PureOneDrive Retrieve array drive information
Get-PureOnePort Retrieve array port information
Get-PureOneHardware Retrieve hardware component information
Get-PureOneBlade Retrieve FlashBlade blade information
Get-PureOneHardwareConnector Retrieve hardware connector information

Data Protection & Replication

Cmdlet Description
Get-PureOnePodReplicaLink Retrieve pod replica link information
Get-PureOneTarget Retrieve replication target information
Get-PureOneFileSystemReplicaLink Retrieve file system replica links
Get-PureOneBucketReplicaLink Retrieve bucket replica links

Storage Resources

Cmdlet Description
Get-PureOneBucket Retrieve object store bucket information
Get-PureOneDirectory Retrieve managed directory information
Get-PureOnePolicy Retrieve policy information
Get-PureOneObjectStoreAccount Retrieve object store accounts

Auditing & Sustainability

Cmdlet Description
Get-PureOneAudit Retrieve audit log entries
Get-PureOneSustainability Retrieve energy consumption and sustainability metrics

In addition to the new cmdlets, this release also includes two bug fixes:

  • Fixed a GET-ErrorAction typo (missing space) that caused syntax errors.
  • Fixed openssl path handling for directories containing spaces (e.g., “My Drive”).

Getting started with new cmdlets

If you already followed the authentication steps from the previous blog, you are all set. Just update the module to the latest version:

Update-Module PureStorage.Pure1

Then verify you are on v1.5.0.0:

Get-Module PureStorage.Pure1 | Select-Object Name, Version

Expected output:

Name               Version
----               -------
PureStorage.Pure1  1.5.0.0

If this is your first time, head over to the previous blog for the full authentication walkthrough.

Practical Reporting Examples

Now let’s get to the fun part. Below are what I define as “real-world” reporting scenarios you can run directly from your PowerShell session.

Fleet Hardware Inventory Report

Want a full inventory of controllers, drives, and ports across your entire fleet? With the new cmdlets, this is a one-liner per resource type:

# Get all controllers across the fleet
$controllers = Get-PureOneController
$controllers | Select-Object name, model, mode, status, version,
                              @{N='array';E={$_.arrays.name -join ', '}} | Format-Table

# Get all drives across the fleet
$drives = Get-PureOneDrive
$drives | Select-Object name, type,
                         @{N='capacity_TB';E={[math]::Round($_.capacity/1TB,2)}},
                         status | Format-Table

# Get all ports (covers FC, iSCSI, and NVMe-oF)
$ports = Get-PureOnePort
$ports | Select-Object name, wwn, iqn, nqn, portal | Format-Table

# Get all hardware components
$hardware = Get-PureOneHardware
$hardware | Select-Object name, type, model, status | Format-Table 

You can also export this to a CSV for offline analysis or sharing with your team:

Get-PureOneController | Export-Csv -Path "fleet_controllers.csv" -NoTypeInformation
Get-PureOneDrive | Export-Csv -Path "fleet_drives.csv" -NoTypeInformation

Replication Topology Overview

Understanding your replication topology across the fleet used to require navigating multiple arrays in the UI. Now you can get the full picture in seconds:

# Pod replica links (FlashArray ActiveCluster and/or ActiveDR)
$podLinks = Get-PureOnePodReplicaLink
$podLinks | Select-Object @{N='source';E={$_.sources.name -join ', '}},
                          @{N='target';E={$_.targets.name -join ', '}},
                          status, lag, paused | Format-Table

Object Store and Directory Report

If you are running FlashBlade or FlashArray with S3-compatible object storage, the new cmdlets let you pull account, bucket, and Managed directory (FlashArray File only) information across the fleet:

# List all object store accounts
Get-PureOneObjectStoreAccount | Select-Object name, object_count,
                                               @{N='array';E={$_.arrays.name -join ', '}} | Format-Table

# List all buckets
Get-PureOneBucket | Select-Object name, object_count, versioning,
                                  @{N='account';E={$_.account.name}},
                                  @{N='array';E={$_.arrays.name -join ', '}} | Format-Table

# List all managed directories
Get-PureOneDirectory | Select-Object directory_name, path,
                                     @{N='file_system';E={$_.file_system.name}},
                                     @{N='array';E={$_.arrays.name -join ', '}} | Format-Table

Audit Log Review

The new Get-PureOneAudit cmdlet is a game-changer for security and compliance teams. You can now pull audit logs programmatically.

Note: The audit log can be very large across a fleet (hundreds of thousands of entries). Use -User to apply a server-side filter, or scope client-side with Where-Object after fetching.

# Pull audit entries for a specific user
$audits = Get-PureOneAudit -User fusion_admin
$audits | Select-Object user,
                         @{N='action';E={"$($_.command) $($_.subcommand)".Trim()}},
                         arguments,
                         @{N='array';E={$_.arrays.name -join ', '}},
                         @{N='time';E={[DateTimeOffset]::FromUnixTimeMilliseconds($_.time).LocalDateTime}} | Format-Table

# Filter client-side for destructive operations
$audits | Where-Object { $_.subcommand -in "delete","eradicate","disconnect" } |
    Select-Object user,
                  @{N='action';E={"$($_.command) $($_.subcommand)".Trim()}},
                  arguments,
                  @{N='array';E={$_.arrays.name -join ', '}},
                  @{N='time';E={[DateTimeOffset]::FromUnixTimeMilliseconds($_.time).LocalDateTime}} |
    Sort-Object -Property time -Descending | Format-Table

Or export it for compliance archiving:

Get-PureOneAudit -User pureuser |
    Select-Object user,
                  @{N='action';E={"$($_.command) $($_.subcommand)".Trim()}},
                  arguments,
                  @{N='array';E={$_.arrays.name -join ', '}},
                  @{N='time';E={[DateTimeOffset]::FromUnixTimeMilliseconds($_.time).LocalDateTime}} |
    Export-Csv -Path "audit_log_$(Get-Date -Format 'yyyyMMdd').csv" -NoTypeInformation

Sustainability Report

One of the most exciting additions is Get-PureOneSustainability. As organizations increasingly track energy consumption and carbon footprint, this cmdlet provides direct access to sustainability metrics from Pure1:

$sustainability = Get-PureOneSustainability
$sustainability | Select-Object name,
                               reporting_status,
                               @{N='level';E={$_.assessment.assessment_level}},
                               @{N='power_avg_W';E={$_.assessment.power_average}},
                               @{N='heat_avg';E={$_.assessment.heat_average}},
                               @{N='data_reduction';E={$_.assessment.array_data_reduction}} | Format-Table

Building a Fleet Report

Combining multiple cmdlets into a reusable function is where the I bliever most of the PowerShell users will see the true power of this module. Below is an Invoke-Pure1FleetReport function that collects health data across your fleet, prints a colour-coded summary to the console, and exports timestamped CSV files to a directory of your choice.

function Invoke-Pure1FleetReport {
    param(
        [Parameter(Mandatory)]
        [string]$PureAppID,

        [Parameter()]
        [string]$OutputPath = "."
    )

    try {
        New-PureOneConnection -PureAppID $PureAppID
    } catch {
        if ($_.Exception.Message -notlike "*is already connected*") { throw }
        Write-Verbose "Pure1 connection already active — reusing existing session."
    }

    $date   = Get-Date -Format "yyyyMMdd"
    $outDir = New-Item -ItemType Directory -Path $OutputPath -Force

    # ── Collect ──────────────────────────────────────────────────────
    $arrays            = Get-PureOneArray
    $alerts            = Get-PureOneAlert | Where-Object { $_.state -eq "open" }
    $controllers       = Get-PureOneController
    $unhealthyDrives   = Get-PureOneDrive | Where-Object { $_.status -ne "healthy" }
    $replicationIssues = Get-PureOnePodReplicaLink | Where-Object { $_.status -ne "replicating" }
    $sustainability    = Get-PureOneSustainability | Where-Object { $_.assessment.assessment_level -notin @('excellent', 'good') }

    # ── Console summary ──────────────────────────────────────────────
    Write-Host ""
    Write-Host "===== Pure1 Fleet Health Report — $date =====" -ForegroundColor Cyan
    Write-Host "  Arrays                  : $($arrays.Count)"
    Write-Host "  Open Alerts             : $($alerts.Count)"            -ForegroundColor $(if ($alerts.Count -gt 0) { 'Yellow' } else { 'Green' })
    Write-Host "  Unhealthy Drives        : $($unhealthyDrives.Count)"   -ForegroundColor $(if ($unhealthyDrives.Count -gt 0) { 'Yellow' } else { 'Green' })
    Write-Host "  Replication Issues      : $($replicationIssues.Count)" -ForegroundColor $(if ($replicationIssues.Count -gt 0) { 'Red' } else { 'Green' })
    Write-Host "  Sustainability Warnings : $($sustainability.Count)"    -ForegroundColor $(if ($sustainability.Count -gt 0) { 'Yellow' } else { 'Green' })
    Write-Host "=============================================="
    Write-Host ""

    # ── Export CSVs ──────────────────────────────────────────────────
    $arrays | Export-Csv -Path (Join-Path $outDir "${date}_arrays.csv") -NoTypeInformation

    $alerts | Export-Csv -Path (Join-Path $outDir "${date}_alerts.csv") -NoTypeInformation

    $controllers | Select-Object name, model, mode, status, version,
                                 @{N='array';E={$_.arrays.name -join ', '}} |
        Export-Csv -Path (Join-Path $outDir "${date}_controllers.csv") -NoTypeInformation

    $unhealthyDrives | Select-Object name, type,
                                     @{N='capacity_TB';E={[math]::Round($_.capacity/1TB,2)}},
                                     status |
        Export-Csv -Path (Join-Path $outDir "${date}_unhealthy_drives.csv") -NoTypeInformation

    $replicationIssues | Select-Object @{N='source';E={$_.sources.name -join ', '}},
                                       @{N='target';E={$_.targets.name -join ', '}},
                                       status, lag, paused |
        Export-Csv -Path (Join-Path $outDir "${date}_replication_issues.csv") -NoTypeInformation

    $sustainability | Select-Object name, reporting_status,
                                   @{N='level';E={$_.assessment.assessment_level}},
                                   @{N='power_avg_W';E={$_.assessment.power_average}},
                                   @{N='heat_avg';E={$_.assessment.heat_average}},
                                   @{N='data_reduction';E={$_.assessment.array_data_reduction}} |
        Export-Csv -Path (Join-Path $outDir "${date}_sustainability.csv") -NoTypeInformation

    Write-Host "Reports saved to: $($outDir.FullName)" -ForegroundColor Green
}

Running it interactively:

Invoke-Pure1FleetReport -PureAppID "pure1:apikey:PZoggxxxxx" -OutputPath "~/Reports/Pure1"

Scheduling it

Save the function definition and the call above into a .ps1 file — for example Pure1FleetReport.ps1 — then schedule it using the method that fits your environment.

On Windows with Task Scheduler (runs every Monday at 07:00 as SYSTEM):

schtasks /create /tn "Pure1 Weekly Fleet Report" /tr "pwsh -NonInteractive -File C:\Scripts\Pure1FleetReport.ps1" /sc WEEKLY /d MON /st 07:00 /ru SYSTEM /f

On macOS or Linux, add a crontab entry with crontab -e:

# Run every Monday at 07:00
0 7 * * 1 /usr/local/bin/pwsh -NonInteractive -File /opt/scripts/Pure1FleetReport.ps1

Each run drops a dated set of CSV files into your output folder — 20260407_arrays.csv, 20260407_alerts.csv, and so on — giving you a rolling archive you can feed into Excel, Power BI, or any reporting tool your team already uses.

What’s Ahead

This was not my first time wrapping API calls into PowerShell cmdlets, but this one has been a special one as I am contributing to the legacy started by Cody Hosterman for this project. And second, bringing the PowerShell module to parity with the REST API.

In the next blog, I plan to cover how to interact with the Pure1 REST API using the MCP server, where I have to convince myself (and you dear reader) how I will never query raw HTTP calls.

In the meantime, update your module, explore the new cmdlets, and start building the reports that your team needs.

Resources


comments powered by Disqus