Public/Get-DMQuota.ps1
|
function Get-DMQuota { <# .SYNOPSIS Gets OceanStor file system / dtree quotas. .DESCRIPTION Queries the FS_QUOTA resource. With -FileSystemName or -DtreeName, scopes the query to that parent (PARENTTYPE/PARENTID). With no scoping parameter, returns every quota on the array. Always paged, since per-user quota counts are unbounded. .PARAMETER WebSession Optional session returned by Connect-deviceManager. The module's cached $script:CurrentOceanstorSession session is used by default. .PARAMETER FileSystemName File system whose quotas should be returned. .PARAMETER DtreeName Dtree (within FileSystemName) whose quotas should be returned. .PARAMETER QuotaType Optional client-side filter: Directory, User, or UserGroup. .PARAMETER Id Composite quota ID (e.g. '34@4@1') to fetch a single quota directly. .INPUTS System.Management.Automation.PSCustomObject .OUTPUTS OceanstorQuota .EXAMPLE PS> Get-DMQuota -FileSystemName 'fs01' .EXAMPLE PS> Get-DMQuota -FileSystemName 'fs01' -DtreeName 'project-a' -QuotaType Directory #> [CmdletBinding(DefaultParameterSetName = 'ByParent')] # String form: class type literals in attributes do not resolve inside module scope. [OutputType('OceanstorQuota')] param( [Parameter(ValueFromPipelineByPropertyName = $true)] [pscustomobject]$WebSession, [Parameter(ParameterSetName = 'ByParent')] [ArgumentCompleter({ param($commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameters) $session = if ($fakeBoundParameters.ContainsKey('WebSession')) { $fakeBoundParameters.WebSession } else { $script:CurrentOceanstorSession } (Get-DMFileSystem -WebSession $session).Name | Sort-Object -Unique | Where-Object { $_ -like "$wordToComplete*" } })] [string]$FileSystemName, [Parameter(ParameterSetName = 'ByParent')] [string]$DtreeName, [ValidateSet('Directory', 'User', 'UserGroup')] [string]$QuotaType, [Parameter(ParameterSetName = 'ById', Mandatory = $true, ValueFromPipelineByPropertyName = $true)] [string]$Id ) process { try { $session = if ($WebSession) { $WebSession } else { $script:CurrentOceanstorSession } if ($PSCmdlet.ParameterSetName -eq 'ById') { # The composite quota ID (e.g. '2671@4097@3') must be sent literally in the # path. URL-encoding the '@' as %40 makes this firmware return 404 Not Found. $response = Invoke-DeviceManager -WebSession $session -Method 'GET' -Resource "FS_QUOTA/$Id" $response = $response | Assert-DMApiSuccess return [OceanstorQuota]::new($response.data, $session) } $resourceQuery = 'FS_QUOTA' if ($FileSystemName) { $fileSystems = @(Get-DMFileSystem -WebSession $session) $matchingFileSystems = @($fileSystems | Where-Object Name -CEQ $FileSystemName) if ($matchingFileSystems.Count -ne 1) { if ($matchingFileSystems.Count -gt 1) { throw "FileSystemName '$FileSystemName' is ambiguous." } throw "Invalid FileSystemName '$FileSystemName'. Valid values are: $($fileSystems.Name -join ', ')" } $fileSystem = $matchingFileSystems[0] if ($DtreeName) { $dtrees = @((Invoke-DeviceManager -WebSession $session -Method 'GET' -Resource "QUOTATREE?PARENTID=$($fileSystem.Id)").data) $matchingDtrees = @($dtrees | Where-Object NAME -CEQ $DtreeName) if ($matchingDtrees.Count -ne 1) { if ($matchingDtrees.Count -gt 1) { throw "DtreeName '$DtreeName' is ambiguous." } throw "Invalid DtreeName '$DtreeName'. Valid values are: $($dtrees.NAME -join ', ')" } $resourceQuery += "?PARENTTYPE=16445&PARENTID=$($matchingDtrees[0].ID)" } else { $resourceQuery += "?PARENTTYPE=40&PARENTID=$($fileSystem.Id)" } } $response = Invoke-DMPagedRequest -WebSession $session -Resource $resourceQuery $quotas = foreach ($item in $response) { [OceanstorQuota]::new($item, $session) } if ($QuotaType) { $quotas = @($quotas | Where-Object { $_.{Quota Type} -eq $QuotaType }) } return $quotas } catch { $PSCmdlet.WriteError($_) } } } |