Private/AWS/New-SilkTCOAWSFSxList.ps1

function New-SilkTCOAWSFSxList {
    param(
        [Parameter()]
        [string] $Region,
        [Parameter()]
        [string] $inputFile,
        [Parameter()]
        [string] $TagKey,
        [Parameter()]
        [string] $TagValue,
        [Parameter()]
        [switch] $allFileSystems
    )

    $requiredModules = @('AWS.Tools.FSx')
    foreach ($module in $requiredModules) {
        if (-not (Get-Module -ListAvailable -Name $module)) {
            throw "Required module '$module' is not installed. Install it with: Install-Module $module"
        }
        if (-not (Get-Module -Name $module)) {
            Import-Module $module -ErrorAction Stop
        }
    }

    $fsxParams = @{}
    if ($Region) {
        $fsxParams['Region'] = $Region
    }

    if ($inputFile) {
        # feed in a list of FileSystemIds
        $fsIds = Get-Content $inputFile
        $fslist = @()
        foreach ($id in $fsIds) {
            $fslist += Get-FSXFileSystem -FileSystemId $id.Trim() @fsxParams
        }
    } else {
        $fslist = Get-FSXFileSystem @fsxParams
    }

    # only ontap here. windows/lustre/openzfs are a different animal entirely
    $fslist = $fslist | Where-Object { $_.FileSystemType -eq 'ONTAP' }

    # no server side tag filter on DescribeFileSystems, so match client side like we do for RDS
    if ($TagKey -and $TagValue) {
        $fslist = $fslist | Where-Object {
            ($_.Tags | Where-Object { $_.Key -eq $TagKey -and $_.Value -eq $TagValue })
        }
    }

    if (-not $allFileSystems) {
        $fslist = $fslist | Where-Object { $_.Lifecycle -eq 'AVAILABLE' }
    }

    if (-not $fslist) {
        return
    }

    # hang the volumes + svms off each filesystem so downstream doesnt have to re-query
    $thelist = @()
    foreach ($fs in $fslist) {
        $fsId = $fs.FileSystemId

        $vols = @()
        $svms = @()
        try {
            $vols = @(Get-FSXVolume -Filter @{ Name = 'file-system-id'; Values = @($fsId) } @fsxParams)
        } catch {
            Write-Warning "Could not list volumes for $fsId : $($_.Exception.Message)"
        }
        try {
            $svms = @(Get-FSXStorageVirtualMachine -Filter @{ Name = 'file-system-id'; Values = @($fsId) } @fsxParams)
        } catch {
            Write-Verbose "-> no svm detail for $fsId" -Verbose
        }

        # root volumes are plumbing, not customer data. skip em unless asked
        if (-not $allFileSystems) {
            $vols = $vols | Where-Object { -not $_.OntapConfiguration.StorageVirtualMachineRoot }
        }

        $fs | Add-Member -MemberType NoteProperty -Name SilkVolumes -Value @($vols) -Force
        $fs | Add-Member -MemberType NoteProperty -Name SilkSVMs -Value @($svms) -Force
        $thelist += $fs
    }

    return $thelist
}