diff --git a/Private/Assert-PfbSelectorNotCoerced.ps1 b/Private/Assert-PfbSelectorNotCoerced.ps1 new file mode 100644 index 00000000..ba8b34dd --- /dev/null +++ b/Private/Assert-PfbSelectorNotCoerced.ps1 @@ -0,0 +1,126 @@ +function Assert-PfbSelectorNotCoerced { + <# + .SYNOPSIS + Reject a selector value that is the ToString() of a whole piped object. + .DESCRIPTION + PowerShell resolves pipeline binding in FOUR passes: ByValue-without-coercion, + ByPropertyName-without-coercion, ByValue-WITH-coercion, then + ByPropertyName-WITH-coercion. A parameter that declares ValueFromPipeline is + therefore reachable at pass 3 by ANY object, whatever its shape. + + Eighteen read cmdlets declare ValueFromPipeline on a name selector so that a + bare string can be piped ('policy1' | Get-PfbNfsExportRule). When the piped item + is an OBJECT that matches none of the cmdlet's parameters by property name, + pass 2 misses and pass 3 fires, ToString()-ing the entire object into the + [string[]] selector. The result is a garbage filter such as + + policy_names=@{name=nfs-01; enabled=True; rules=} + + which the array answers with HTTP 200 and the UNFILTERED collection, so the + caller believes they are looking at one policy's rules when they are looking at + every policy's rules. That silent mis-filtering is the issue-90 defect. + + Several of these cmdlets Add-Member a lifted top-level property (PolicyName, + RoleName, GroupName) onto the items they return, which makes the self-chain + (Get-PfbNfsExportRule | Get-PfbNfsExportRule) bind at pass 2 and never reach this + guard. The lift cannot help the CROSS-endpoint chain + (Get-PfbNfsExportPolicy | Get-PfbNfsExportRule), because a policy item carries + `name`, not `PolicyName`. That residual is what this guard closes. + + Note also that removing ValueFromPipeline does not make coercion impossible: a + ValueFromPipelineByPropertyName-only parameter whose ALIAS matches an + object-valued property still binds that object stringified at pass 4. This guard + covers that case too, since it inspects the bound value rather than the pass that + produced it. + + Deliberately called imperatively from each cmdlet's process block rather than + wired as [ValidateScript({ ... })]. That was tried and reverted under issue #64: + a ValidateScript failure on a PIPELINE-bound argument is a NON-terminating + per-item binding error, so the cmdlet's end block still runs and still issues the + request -- with no selector key at all, i.e. the silently-unfiltered result this + guard exists to eliminate. The imperative throw terminates the pipeline, which is + the required behaviour. + + Returns NOTHING on success, matching Assert-PfbAdminNameNotCoerced. Do not add a + `return $true`: callers invoke this bare, so a return value leaks into each + cmdlet's success stream. + .PARAMETER Value + The bound selector value. May be $null, a scalar, or a collection; every element + is checked. $null and an empty collection are accepted silently -- a parameter + that was never bound is not a defect. + .PARAMETER OriginalInput + The original process-block pipeline item. When it is a non-string object whose + ToString() result exactly equals the bound selector, and it exposes no property that + could bind this parameter, the whole item was coerced at pass 3. A directly supplied + selector has no process input and a piped resource name is already a string, so neither + is rejected. Callers must pass $PSItem from process; this is structural evidence and + avoids guessing from type-looking resource names. + .PARAMETER ParameterName + The parameter name WITHOUT its leading dash, e.g. 'PolicyName'. The dash is added + when the message is built. + .PARAMETER BindingPropertyName + Additional property names, normally parameter aliases, that can bind the selector. + Their presence suppresses the whole-input comparison because false rejection is worse + than a missed ambiguous case. + + KNOWN GAP, stated rather than papered over: the '@{' signal catches an object-valued + property only when that value's ToString() contains '@{', which is true of a + PSCustomObject and false of a Hashtable or a generic Dictionary. So piping + [pscustomobject]@{ Group = @{ name = 'g1' } } binds at pass 4 via the Group alias, + yields the bare type name as the selector, and passes both signals -- the whole-input + comparison cannot help either, because the item's own ToString() is not the bound + value. Closing it means comparing against each binding property's ToString() too, + which widens the false-positive surface and is a maintainer's call rather than a + drive-by change. Reachability is low in practice: ConvertFrom-Json produces + PSCustomObject values, so a response object piped from a real cmdlet stays covered. + .PARAMETER Hint + Caller-facing, cmdlet-specific advice naming the property to pipe instead. Each + call site writes its own against what that family's producer actually returns. + #> + param( + [Parameter(Mandatory)] [AllowNull()] [AllowEmptyCollection()] [object]$Value, + [Parameter()] [AllowNull()] [object]$OriginalInput, + [Parameter(Mandatory)] [string]$ParameterName, + [Parameter()] [string[]]$BindingPropertyName = @(), + [Parameter(Mandatory)] [string]$Hint + ) + + if ($null -eq $Value) { return } + + $inputPropertyNames = @($ParameterName) + @($BindingPropertyName) + $inputHasBindingProperty = $false + if ($null -ne $OriginalInput -and $OriginalInput -isnot [string]) { + foreach ($propertyName in $inputPropertyNames) { + if ($OriginalInput.PSObject.Properties[$propertyName]) { + $inputHasBindingProperty = $true + break + } + } + } + + foreach ($v in @($Value)) { + # The original process item proves pass-3 whole-object coercion without interpreting + # resource-name text. Hashtable and generic-dictionary ToString() values are type names, + # so the previous '@{' signal missed them; prefix/type-resolution patterns would instead + # reject legitimate names such as 'System.backup'. Exact equality to this non-string + # input's own ToString() has no such naming heuristic. If a matching property exists, the + # binder may have selected it at pass 2 or pass 4, so do not infer whole-item coercion. + $wholeInputWasStringified = $v -is [string] -and + $null -ne $OriginalInput -and + $OriginalInput -isnot [string] -and + -not $inputHasBindingProperty -and + $v -ceq [string]$OriginalInput + + # Keep the established PSCustomObject/pass-4 signal. .Contains() rather than -like: a + # literal test needs no wildcard semantics and cannot be broken by caller text. + if (($v -is [string] -and $v.Contains('@{')) -or $wholeInputWasStringified) { + # Built in one -f call: the format operator binds tighter than '+', so + # splitting this across concatenated literals silently formats only the last. + $message = '-{0} received a stringified object (''{1}'') instead of a name. ' + + 'A piped object that matches none of this cmdlet''s parameters by property ' + + 'name is coerced whole into -{0}, which sends a garbage filter and returns ' + + 'the UNFILTERED collection. {2}' + throw ($message -f $ParameterName, $v, $Hint) + } + } +} diff --git a/Public/Bucket/Get-PfbBucketAccessPolicy.ps1 b/Public/Bucket/Get-PfbBucketAccessPolicy.ps1 index 7f48690f..60196e08 100644 --- a/Public/Bucket/Get-PfbBucketAccessPolicy.ps1 +++ b/Public/Bucket/Get-PfbBucketAccessPolicy.ps1 @@ -6,23 +6,21 @@ function Get-PfbBucketAccessPolicy { Returns one or more bucket access policies from the FlashBlade array. Bucket access policies define S3 bucket-level access controls. Filter results by fully-qualified name (bucket/account:policy), or by bucket - member name/ID and policy name/ID separately. + name or bucket ID. - NOTE: The FlashBlade API requires at least one of -Name, -Id, - -MemberName, or -PolicyName to be specified. + GET /buckets/bucket-access-policies declares no policy-level selector; + 'policy_names' exists only on the /rules variant, so use + Get-PfbBucketAccessPolicyRule -PolicyName for + that. It also declares no 'ids' selector, so there is no -Id parameter: + the endpoint silently ignored the key and returned the unfiltered + collection. .PARAMETER Name One or more fully-qualified bucket access policy names (e.g. 'mybucket/myaccount:mypolicy'). - .PARAMETER Id - One or more bucket access policy IDs. - .PARAMETER MemberName + .PARAMETER BucketName One or more bucket names to retrieve access policies for. - .PARAMETER MemberId + .PARAMETER BucketId One or more bucket IDs to retrieve access policies for. - .PARAMETER PolicyName - One or more access policy names to retrieve. - .PARAMETER PolicyId - One or more access policy IDs to retrieve. .PARAMETER Filter A server-side filter expression to narrow results. .PARAMETER Sort @@ -32,7 +30,7 @@ function Get-PfbBucketAccessPolicy { .PARAMETER Array The FlashBlade connection object. If not specified, the default connection is used. .EXAMPLE - Get-PfbBucketAccessPolicy -MemberName "mybucket" + Get-PfbBucketAccessPolicy -BucketName "mybucket" Returns access policies for the bucket named 'mybucket'. .EXAMPLE @@ -40,29 +38,27 @@ function Get-PfbBucketAccessPolicy { Returns the specific bucket access policy by fully-qualified name. .EXAMPLE - Get-PfbBucketAccessPolicy -PolicyName "read-only-policy" -MemberName "mybucket" + Get-PfbBucketAccessPolicy -BucketId "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" - Returns a specific access policy for a specific bucket. + Returns access policies for the bucket with the given ID. #> - [CmdletBinding(DefaultParameterSetName = 'ByMemberName')] + [CmdletBinding(DefaultParameterSetName = 'ByBucketName')] param( [Parameter(ParameterSetName = 'ByName')] [string[]]$Name, - [Parameter(ParameterSetName = 'ById')] - [string[]]$Id, + # Within this family, the cross-endpoint chain from Get-PfbBucket into Get-PfbBucketAccessPolicy cannot + # filter correctly: a producer's bare `name` bound to -BucketName / `bucket_names` is the defect + # because `name` means different things by endpoint and metadata cannot identify its producer, + # so no correct generic binding exists. An undeclared or non-matching query key returns HTTP 200 + # with the unfiltered collection; the guard's loud failure is therefore best. Do NOT remove it + # or add an alias: that flips WrongScalar to Bound while sending the wrong name; revisit only if + # the consumer can establish its producer, which parameter metadata alone cannot. Issue #90. + [Parameter(ParameterSetName = 'ByBucketName', ValueFromPipeline, ValueFromPipelineByPropertyName)] + [string[]]$BucketName, - [Parameter(ParameterSetName = 'ByMemberName', ValueFromPipeline, ValueFromPipelineByPropertyName)] - [string[]]$MemberName, - - [Parameter(ParameterSetName = 'ByMemberId')] - [string[]]$MemberId, - - [Parameter()] - [string[]]$PolicyName, - - [Parameter()] - [string[]]$PolicyId, + [Parameter(ParameterSetName = 'ByBucketId')] + [string[]]$BucketId, [Parameter()] [string]$Filter, [Parameter()] [string]$Sort, @@ -73,32 +69,31 @@ function Get-PfbBucketAccessPolicy { begin { Assert-PfbConnection -Array ([ref]$Array) $allNames = [System.Collections.Generic.List[string]]::new() - $allIds = [System.Collections.Generic.List[string]]::new() - $allMemberNames = [System.Collections.Generic.List[string]]::new() - $allMemberIds = [System.Collections.Generic.List[string]]::new() + $allBucketNames = [System.Collections.Generic.List[string]]::new() + $allBucketIds = [System.Collections.Generic.List[string]]::new() } process { + Assert-PfbSelectorNotCoerced -Value $BucketName -OriginalInput $PSItem -ParameterName 'BucketName' -Hint ( + 'Pipe the bucket name instead, e.g. Get-PfbBucket | Select-Object -ExpandProperty name | ' + + 'Get-PfbBucketAccessPolicy, or pass -BucketName explicitly.') if ($Name) { foreach ($n in $Name) { $allNames.Add($n) } } - if ($Id) { foreach ($i in $Id) { $allIds.Add($i) } } - if ($MemberName) { foreach ($n in $MemberName) { $allMemberNames.Add($n) } } - if ($MemberId) { foreach ($i in $MemberId) { $allMemberIds.Add($i) } } + if ($BucketName) { foreach ($b in $BucketName) { $allBucketNames.Add($b) } } + if ($BucketId) { foreach ($i in $BucketId) { $allBucketIds.Add($i) } } } end { $queryParams = @{} - Add-PfbCommonQueryParams -Into $queryParams -BoundParameters $PSBoundParameters -Names $allNames -Ids $allIds - if ($allMemberNames.Count -gt 0) { $queryParams['member_names'] = $allMemberNames -join ',' } - if ($allMemberIds.Count -gt 0) { $queryParams['member_ids'] = $allMemberIds -join ',' } - if ($PolicyName) { $queryParams['policy_names'] = $PolicyName -join ',' } - if ($PolicyId) { $queryParams['policy_ids'] = $PolicyId -join ',' } + Add-PfbCommonQueryParams -Into $queryParams -BoundParameters $PSBoundParameters -Names $allNames + if ($allBucketNames.Count -gt 0) { $queryParams['bucket_names'] = $allBucketNames -join ',' } + if ($allBucketIds.Count -gt 0) { $queryParams['bucket_ids'] = $allBucketIds -join ',' } try { Invoke-PfbApiRequest -Array $Array -Method GET -Endpoint 'buckets/bucket-access-policies' -QueryParams $queryParams -AutoPaginate } catch { if ($_ -match 'Either names or ids' -or $_ -match 'Policy must be specified') { - Write-Warning "Bucket access policies require the -Name parameter with a fully-qualified 'bucket/policy' name, or the -Id parameter. Use Get-PfbObjectStoreAccessPolicy to list available policies." + Write-Warning "Bucket access policies require the -Name parameter with a fully-qualified 'bucket/policy' name, or -BucketName/-BucketId. Use Get-PfbObjectStoreAccessPolicy to list available policies." return } throw diff --git a/Public/Bucket/Get-PfbBucketAccessPolicyRule.ps1 b/Public/Bucket/Get-PfbBucketAccessPolicyRule.ps1 index 00d04d3d..e7031dd2 100644 --- a/Public/Bucket/Get-PfbBucketAccessPolicyRule.ps1 +++ b/Public/Bucket/Get-PfbBucketAccessPolicyRule.ps1 @@ -6,15 +6,14 @@ function Get-PfbBucketAccessPolicyRule { Returns rules for bucket access policies. Rules define the specific permissions within a bucket access policy such as allowed actions, principals, and resources. Filter by fully-qualified name, bucket - member name, or policy name. + name, or policy name. - NOTE: The FlashBlade API requires at least one of -Name, -Id, - -MemberName, or -PolicyName to be specified. + GET /buckets/bucket-access-policies/rules declares no 'ids' selector, + so there is no -Id parameter: the endpoint + silently ignored the key and returned the unfiltered collection. .PARAMETER Name One or more fully-qualified bucket access policy rule names. - .PARAMETER Id - One or more bucket access policy rule IDs. - .PARAMETER MemberName + .PARAMETER BucketName One or more bucket names to retrieve access policy rules for. .PARAMETER PolicyName One or more access policy names to retrieve rules for. @@ -27,7 +26,7 @@ function Get-PfbBucketAccessPolicyRule { .PARAMETER Array The FlashBlade connection object. If not specified, the default connection is used. .EXAMPLE - Get-PfbBucketAccessPolicyRule -MemberName "mybucket" + Get-PfbBucketAccessPolicyRule -BucketName "mybucket" Returns all bucket access policy rules for the specified bucket. .EXAMPLE @@ -35,20 +34,24 @@ function Get-PfbBucketAccessPolicyRule { Returns rules for the policy named 'read-only-policy'. .EXAMPLE - Get-PfbBucketAccessPolicyRule -MemberName "mybucket" -PolicyName "read-only-policy" + Get-PfbBucketAccessPolicyRule -BucketName "mybucket" -PolicyName "read-only-policy" Returns rules for a specific policy on a specific bucket. #> - [CmdletBinding(DefaultParameterSetName = 'ByMemberName')] + [CmdletBinding(DefaultParameterSetName = 'ByBucketName')] param( [Parameter(ParameterSetName = 'ByName')] [string[]]$Name, - [Parameter(ParameterSetName = 'ById')] - [string[]]$Id, - - [Parameter(ParameterSetName = 'ByMemberName', ValueFromPipeline, ValueFromPipelineByPropertyName)] - [string[]]$MemberName, + # Within this family, the cross-endpoint chain from Get-PfbBucket into Get-PfbBucketAccessPolicyRule cannot + # filter correctly: a producer's bare `name` bound to -BucketName / `bucket_names` is the defect + # because `name` means different things by endpoint and metadata cannot identify its producer, + # so no correct generic binding exists. An undeclared or non-matching query key returns HTTP 200 + # with the unfiltered collection; the guard's loud failure is therefore best. Do NOT remove it + # or add an alias: that flips WrongScalar to Bound while sending the wrong name; revisit only if + # the consumer can establish its producer, which parameter metadata alone cannot. Issue #90. + [Parameter(ParameterSetName = 'ByBucketName', ValueFromPipeline, ValueFromPipelineByPropertyName)] + [string[]]$BucketName, [Parameter()] [string[]]$PolicyName, @@ -62,28 +65,29 @@ function Get-PfbBucketAccessPolicyRule { begin { Assert-PfbConnection -Array ([ref]$Array) $allNames = [System.Collections.Generic.List[string]]::new() - $allIds = [System.Collections.Generic.List[string]]::new() - $allMemberNames = [System.Collections.Generic.List[string]]::new() + $allBucketNames = [System.Collections.Generic.List[string]]::new() } process { + Assert-PfbSelectorNotCoerced -Value $BucketName -OriginalInput $PSItem -ParameterName 'BucketName' -Hint ( + 'Pipe the bucket name instead, e.g. Get-PfbBucket | Select-Object -ExpandProperty name | ' + + 'Get-PfbBucketAccessPolicyRule, or pass -BucketName explicitly.') if ($Name) { foreach ($n in $Name) { $allNames.Add($n) } } - if ($Id) { foreach ($i in $Id) { $allIds.Add($i) } } - if ($MemberName) { foreach ($n in $MemberName) { $allMemberNames.Add($n) } } + if ($BucketName) { foreach ($b in $BucketName) { $allBucketNames.Add($b) } } } end { $queryParams = @{} - Add-PfbCommonQueryParams -Into $queryParams -BoundParameters $PSBoundParameters -Names $allNames -Ids $allIds - if ($allMemberNames.Count -gt 0) { $queryParams['member_names'] = $allMemberNames -join ',' } - if ($PolicyName) { $queryParams['policy_names'] = $PolicyName -join ',' } + Add-PfbCommonQueryParams -Into $queryParams -BoundParameters $PSBoundParameters -Names $allNames + if ($allBucketNames.Count -gt 0) { $queryParams['bucket_names'] = $allBucketNames -join ',' } + if ($PolicyName) { $queryParams['policy_names'] = $PolicyName -join ',' } try { Invoke-PfbApiRequest -Array $Array -Method GET -Endpoint 'buckets/bucket-access-policies/rules' -QueryParams $queryParams -AutoPaginate } catch { if ($_ -match 'Either names or ids' -or $_ -match 'Policy must be specified') { - Write-Warning "Bucket access policy rules require the -Name parameter with a fully-qualified name, or the -Id parameter." + Write-Warning "Bucket access policy rules require the -Name parameter with a fully-qualified name, or -BucketName/-PolicyName." return } throw diff --git a/Public/Bucket/Get-PfbBucketAuditFilter.ps1 b/Public/Bucket/Get-PfbBucketAuditFilter.ps1 index e5fc182d..1965c26c 100644 --- a/Public/Bucket/Get-PfbBucketAuditFilter.ps1 +++ b/Public/Bucket/Get-PfbBucketAuditFilter.ps1 @@ -5,11 +5,13 @@ function Get-PfbBucketAuditFilter { .DESCRIPTION Returns one or more bucket audit filters from the FlashBlade array. Audit filters control which S3 operations on a bucket are logged for - auditing purposes. Filter results by bucket member name or ID, or use - a server-side filter expression. - .PARAMETER MemberName + auditing purposes. Filter results by audit filter name, by bucket name + or ID, or use a server-side filter expression. + .PARAMETER Name + One or more audit filter names to retrieve. + .PARAMETER BucketName One or more bucket names to retrieve audit filters for. - .PARAMETER MemberId + .PARAMETER BucketId One or more bucket IDs to retrieve audit filters for. .PARAMETER Filter A server-side filter expression to narrow results. @@ -24,7 +26,7 @@ function Get-PfbBucketAuditFilter { Returns all bucket audit filters. .EXAMPLE - Get-PfbBucketAuditFilter -MemberName "mybucket" + Get-PfbBucketAuditFilter -BucketName "mybucket" Returns audit filters for the bucket named 'mybucket'. .EXAMPLE @@ -34,11 +36,21 @@ function Get-PfbBucketAuditFilter { #> [CmdletBinding(DefaultParameterSetName = 'List')] param( - [Parameter(ParameterSetName = 'ByMemberName', ValueFromPipeline, ValueFromPipelineByPropertyName)] - [string[]]$MemberName, + [Parameter(ParameterSetName = 'ByName')] + [string[]]$Name, - [Parameter(ParameterSetName = 'ByMemberId')] - [string[]]$MemberId, + # Within this family, the cross-endpoint chain from Get-PfbBucket into Get-PfbBucketAuditFilter cannot + # filter correctly: a producer's bare `name` bound to -BucketName / `bucket_names` is the defect + # because `name` means different things by endpoint and metadata cannot identify its producer, + # so no correct generic binding exists. An undeclared or non-matching query key returns HTTP 200 + # with the unfiltered collection; the guard's loud failure is therefore best. Do NOT remove it + # or add an alias: that flips WrongScalar to Bound while sending the wrong name; revisit only if + # the consumer can establish its producer, which parameter metadata alone cannot. Issue #90. + [Parameter(ParameterSetName = 'ByBucketName', ValueFromPipeline, ValueFromPipelineByPropertyName)] + [string[]]$BucketName, + + [Parameter(ParameterSetName = 'ByBucketId')] + [string[]]$BucketId, [Parameter()] [string]$Filter, [Parameter()] [string]$Sort, @@ -48,20 +60,25 @@ function Get-PfbBucketAuditFilter { begin { Assert-PfbConnection -Array ([ref]$Array) - $allMemberNames = [System.Collections.Generic.List[string]]::new() - $allMemberIds = [System.Collections.Generic.List[string]]::new() + $allNames = [System.Collections.Generic.List[string]]::new() + $allBucketNames = [System.Collections.Generic.List[string]]::new() + $allBucketIds = [System.Collections.Generic.List[string]]::new() } process { - if ($MemberName) { foreach ($n in $MemberName) { $allMemberNames.Add($n) } } - if ($MemberId) { foreach ($i in $MemberId) { $allMemberIds.Add($i) } } + Assert-PfbSelectorNotCoerced -Value $BucketName -OriginalInput $PSItem -ParameterName 'BucketName' -Hint ( + 'Pipe the bucket name instead, e.g. Get-PfbBucket | Select-Object -ExpandProperty name | ' + + 'Get-PfbBucketAuditFilter, or pass -BucketName explicitly.') + if ($Name) { foreach ($n in $Name) { $allNames.Add($n) } } + if ($BucketName) { foreach ($b in $BucketName) { $allBucketNames.Add($b) } } + if ($BucketId) { foreach ($i in $BucketId) { $allBucketIds.Add($i) } } } end { $queryParams = @{} - Add-PfbCommonQueryParams -Into $queryParams -BoundParameters $PSBoundParameters - if ($allMemberNames.Count -gt 0) { $queryParams['member_names'] = $allMemberNames -join ',' } - if ($allMemberIds.Count -gt 0) { $queryParams['member_ids'] = $allMemberIds -join ',' } + Add-PfbCommonQueryParams -Into $queryParams -BoundParameters $PSBoundParameters -Names $allNames + if ($allBucketNames.Count -gt 0) { $queryParams['bucket_names'] = $allBucketNames -join ',' } + if ($allBucketIds.Count -gt 0) { $queryParams['bucket_ids'] = $allBucketIds -join ',' } Invoke-PfbApiRequest -Array $Array -Method GET -Endpoint 'buckets/audit-filters' -QueryParams $queryParams -AutoPaginate } diff --git a/Public/Bucket/Get-PfbBucketCorsPolicy.ps1 b/Public/Bucket/Get-PfbBucketCorsPolicy.ps1 index 43ec6bf7..159dd719 100644 --- a/Public/Bucket/Get-PfbBucketCorsPolicy.ps1 +++ b/Public/Bucket/Get-PfbBucketCorsPolicy.ps1 @@ -6,20 +6,20 @@ function Get-PfbBucketCorsPolicy { Returns one or more bucket CORS policy associations from the FlashBlade array. CORS policies control which web origins are permitted to access S3 bucket resources from a browser. Filter results by fully-qualified name, bucket - member name/ID, or policy name. + name, or bucket ID. - NOTE: The FlashBlade API requires at least one of -Name, -Id, - -MemberName, or -PolicyName to be specified. + GET /buckets/cross-origin-resource-sharing-policies declares no + policy-level selector; 'policy_names' exists only on the /rules + variant, so use Get-PfbBucketCorsPolicyRule -PolicyName for that. It + also declares no 'ids' selector, so there is no -Id parameter: the + endpoint silently ignored the key and returned the unfiltered + collection. .PARAMETER Name One or more fully-qualified bucket CORS policy names. - .PARAMETER Id - One or more bucket CORS policy IDs. - .PARAMETER MemberName + .PARAMETER BucketName One or more bucket names to retrieve CORS policies for. - .PARAMETER MemberId + .PARAMETER BucketId One or more bucket IDs to retrieve CORS policies for. - .PARAMETER PolicyName - One or more CORS policy names to retrieve. .PARAMETER Filter A server-side filter expression to narrow results. .PARAMETER Sort @@ -29,7 +29,7 @@ function Get-PfbBucketCorsPolicy { .PARAMETER Array The FlashBlade connection object. If not specified, the default connection is used. .EXAMPLE - Get-PfbBucketCorsPolicy -MemberName "mybucket" + Get-PfbBucketCorsPolicy -BucketName "mybucket" Returns CORS policies associated with the bucket named 'mybucket'. .EXAMPLE @@ -37,26 +37,27 @@ function Get-PfbBucketCorsPolicy { Returns a specific CORS policy by fully-qualified name. .EXAMPLE - Get-PfbBucketCorsPolicy -PolicyName "allow-all-origins" -MemberName "mybucket" + Get-PfbBucketCorsPolicy -BucketId "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" - Returns a specific CORS policy for a specific bucket. + Returns CORS policies for the bucket with the given ID. #> - [CmdletBinding(DefaultParameterSetName = 'ByMemberName')] + [CmdletBinding(DefaultParameterSetName = 'ByBucketName')] param( [Parameter(ParameterSetName = 'ByName')] [string[]]$Name, - [Parameter(ParameterSetName = 'ById')] - [string[]]$Id, + # Within this family, the cross-endpoint chain from Get-PfbBucket into Get-PfbBucketCorsPolicy cannot + # filter correctly: a producer's bare `name` bound to -BucketName / `bucket_names` is the defect + # because `name` means different things by endpoint and metadata cannot identify its producer, + # so no correct generic binding exists. An undeclared or non-matching query key returns HTTP 200 + # with the unfiltered collection; the guard's loud failure is therefore best. Do NOT remove it + # or add an alias: that flips WrongScalar to Bound while sending the wrong name; revisit only if + # the consumer can establish its producer, which parameter metadata alone cannot. Issue #90. + [Parameter(ParameterSetName = 'ByBucketName', ValueFromPipeline, ValueFromPipelineByPropertyName)] + [string[]]$BucketName, - [Parameter(ParameterSetName = 'ByMemberName', ValueFromPipeline, ValueFromPipelineByPropertyName)] - [string[]]$MemberName, - - [Parameter(ParameterSetName = 'ByMemberId')] - [string[]]$MemberId, - - [Parameter()] - [string[]]$PolicyName, + [Parameter(ParameterSetName = 'ByBucketId')] + [string[]]$BucketId, [Parameter()] [string]$Filter, [Parameter()] [string]$Sort, @@ -67,31 +68,31 @@ function Get-PfbBucketCorsPolicy { begin { Assert-PfbConnection -Array ([ref]$Array) $allNames = [System.Collections.Generic.List[string]]::new() - $allIds = [System.Collections.Generic.List[string]]::new() - $allMemberNames = [System.Collections.Generic.List[string]]::new() - $allMemberIds = [System.Collections.Generic.List[string]]::new() + $allBucketNames = [System.Collections.Generic.List[string]]::new() + $allBucketIds = [System.Collections.Generic.List[string]]::new() } process { + Assert-PfbSelectorNotCoerced -Value $BucketName -OriginalInput $PSItem -ParameterName 'BucketName' -Hint ( + 'Pipe the bucket name instead, e.g. Get-PfbBucket | Select-Object -ExpandProperty name | ' + + 'Get-PfbBucketCorsPolicy, or pass -BucketName explicitly.') if ($Name) { foreach ($n in $Name) { $allNames.Add($n) } } - if ($Id) { foreach ($i in $Id) { $allIds.Add($i) } } - if ($MemberName) { foreach ($n in $MemberName) { $allMemberNames.Add($n) } } - if ($MemberId) { foreach ($i in $MemberId) { $allMemberIds.Add($i) } } + if ($BucketName) { foreach ($b in $BucketName) { $allBucketNames.Add($b) } } + if ($BucketId) { foreach ($i in $BucketId) { $allBucketIds.Add($i) } } } end { $queryParams = @{} - Add-PfbCommonQueryParams -Into $queryParams -BoundParameters $PSBoundParameters -Names $allNames -Ids $allIds - if ($allMemberNames.Count -gt 0) { $queryParams['member_names'] = $allMemberNames -join ',' } - if ($allMemberIds.Count -gt 0) { $queryParams['member_ids'] = $allMemberIds -join ',' } - if ($PolicyName) { $queryParams['policy_names'] = $PolicyName -join ',' } + Add-PfbCommonQueryParams -Into $queryParams -BoundParameters $PSBoundParameters -Names $allNames + if ($allBucketNames.Count -gt 0) { $queryParams['bucket_names'] = $allBucketNames -join ',' } + if ($allBucketIds.Count -gt 0) { $queryParams['bucket_ids'] = $allBucketIds -join ',' } try { Invoke-PfbApiRequest -Array $Array -Method GET -Endpoint 'buckets/cross-origin-resource-sharing-policies' -QueryParams $queryParams -AutoPaginate } catch { if ($_ -match 'Either names or ids' -or $_ -match 'Policy must be specified') { - Write-Warning "Bucket CORS policies require the -Name parameter with a fully-qualified 'bucket/policy' name, or the -Id parameter." + Write-Warning "Bucket CORS policies require the -Name parameter with a fully-qualified 'bucket/policy' name, or -BucketName/-BucketId." return } throw diff --git a/Public/Bucket/Get-PfbBucketCorsPolicyRule.ps1 b/Public/Bucket/Get-PfbBucketCorsPolicyRule.ps1 index 9a04b21f..1195145c 100644 --- a/Public/Bucket/Get-PfbBucketCorsPolicyRule.ps1 +++ b/Public/Bucket/Get-PfbBucketCorsPolicyRule.ps1 @@ -6,15 +6,14 @@ function Get-PfbBucketCorsPolicyRule { Returns rules for bucket cross-origin resource sharing (CORS) policies. Rules define allowed origins, HTTP methods, headers, and max age for cross-origin requests to the S3 bucket. Filter by fully-qualified name, - bucket member name, or policy name. + bucket name, or policy name. - NOTE: The FlashBlade API requires at least one of -Name, -Id, - -MemberName, or -PolicyName to be specified. + GET /buckets/cross-origin-resource-sharing-policies/rules declares no 'ids' + selector, so there is no -Id parameter: the endpoint silently ignored the + key and returned the unfiltered collection. .PARAMETER Name One or more fully-qualified bucket CORS policy rule names. - .PARAMETER Id - One or more bucket CORS policy rule IDs. - .PARAMETER MemberName + .PARAMETER BucketName One or more bucket names to retrieve CORS policy rules for. .PARAMETER PolicyName One or more CORS policy names to retrieve rules for. @@ -27,7 +26,7 @@ function Get-PfbBucketCorsPolicyRule { .PARAMETER Array The FlashBlade connection object. If not specified, the default connection is used. .EXAMPLE - Get-PfbBucketCorsPolicyRule -MemberName "mybucket" + Get-PfbBucketCorsPolicyRule -BucketName "mybucket" Returns all bucket CORS policy rules for the specified bucket. .EXAMPLE @@ -35,20 +34,24 @@ function Get-PfbBucketCorsPolicyRule { Returns rules for the CORS policy named 'allow-all-origins'. .EXAMPLE - Get-PfbBucketCorsPolicyRule -MemberName "mybucket" -PolicyName "allow-all-origins" + Get-PfbBucketCorsPolicyRule -BucketName "mybucket" -PolicyName "allow-all-origins" Returns CORS rules for a specific policy on a specific bucket. #> - [CmdletBinding(DefaultParameterSetName = 'ByMemberName')] + [CmdletBinding(DefaultParameterSetName = 'ByBucketName')] param( [Parameter(ParameterSetName = 'ByName')] [string[]]$Name, - [Parameter(ParameterSetName = 'ById')] - [string[]]$Id, - - [Parameter(ParameterSetName = 'ByMemberName', ValueFromPipeline, ValueFromPipelineByPropertyName)] - [string[]]$MemberName, + # Within this family, the cross-endpoint chain from Get-PfbBucket into Get-PfbBucketCorsPolicyRule + # cannot filter correctly: a producer's bare `name` bound to -BucketName / `bucket_names` is + # the defect because `name` means different things by endpoint and metadata cannot identify + # its producer, so no correct generic binding exists. An undeclared or non-matching query key + # returns HTTP 200 with the unfiltered collection; the guard's loud failure is therefore best. + # Do NOT remove it or add an alias: that flips WrongScalar to Bound while sending the wrong + # name; revisit only if the consumer can establish its producer, which metadata alone cannot. Issue #90. + [Parameter(ParameterSetName = 'ByBucketName', ValueFromPipeline, ValueFromPipelineByPropertyName)] + [string[]]$BucketName, [Parameter()] [string[]]$PolicyName, @@ -62,28 +65,29 @@ function Get-PfbBucketCorsPolicyRule { begin { Assert-PfbConnection -Array ([ref]$Array) $allNames = [System.Collections.Generic.List[string]]::new() - $allIds = [System.Collections.Generic.List[string]]::new() - $allMemberNames = [System.Collections.Generic.List[string]]::new() + $allBucketNames = [System.Collections.Generic.List[string]]::new() } process { + Assert-PfbSelectorNotCoerced -Value $BucketName -OriginalInput $PSItem -ParameterName 'BucketName' -Hint ( + 'Pipe the bucket name instead, e.g. Get-PfbBucket | Select-Object -ExpandProperty name | ' + + 'Get-PfbBucketCorsPolicyRule, or pass -BucketName explicitly.') if ($Name) { foreach ($n in $Name) { $allNames.Add($n) } } - if ($Id) { foreach ($i in $Id) { $allIds.Add($i) } } - if ($MemberName) { foreach ($n in $MemberName) { $allMemberNames.Add($n) } } + if ($BucketName) { foreach ($b in $BucketName) { $allBucketNames.Add($b) } } } end { $queryParams = @{} - Add-PfbCommonQueryParams -Into $queryParams -BoundParameters $PSBoundParameters -Names $allNames -Ids $allIds - if ($allMemberNames.Count -gt 0) { $queryParams['member_names'] = $allMemberNames -join ',' } - if ($PolicyName) { $queryParams['policy_names'] = $PolicyName -join ',' } + Add-PfbCommonQueryParams -Into $queryParams -BoundParameters $PSBoundParameters -Names $allNames + if ($allBucketNames.Count -gt 0) { $queryParams['bucket_names'] = $allBucketNames -join ',' } + if ($PolicyName) { $queryParams['policy_names'] = $PolicyName -join ',' } try { Invoke-PfbApiRequest -Array $Array -Method GET -Endpoint 'buckets/cross-origin-resource-sharing-policies/rules' -QueryParams $queryParams -AutoPaginate } catch { if ($_ -match 'Either names or ids' -or $_ -match 'Policy must be specified') { - Write-Warning "Bucket CORS policy rules require the -Name parameter with a fully-qualified name, or the -Id parameter." + Write-Warning "Bucket CORS policy rules require the -Name parameter with a fully-qualified name, or -BucketName/-PolicyName." return } throw diff --git a/Public/Bucket/New-PfbBucketAccessPolicy.ps1 b/Public/Bucket/New-PfbBucketAccessPolicy.ps1 index 2d730f30..4bfc80ed 100644 --- a/Public/Bucket/New-PfbBucketAccessPolicy.ps1 +++ b/Public/Bucket/New-PfbBucketAccessPolicy.ps1 @@ -3,47 +3,67 @@ function New-PfbBucketAccessPolicy { .SYNOPSIS Creates a new bucket access policy on the FlashBlade. .DESCRIPTION - Associates an access policy with a bucket on the FlashBlade array. - Bucket access policies provide S3-compatible bucket-level access - controls. Both the bucket member name and the policy name are required. - .PARAMETER MemberName - The name of the bucket to associate the access policy with. - .PARAMETER PolicyName - The name of the access policy to attach to the bucket. + Creates the bucket access policy for one or more buckets on the + FlashBlade array. Bucket access policies provide S3-compatible + bucket-level access controls. + + NOTE: POST /buckets/bucket-access-policies declares only 'bucket_names', + 'bucket_ids' (and 'context_names' from REST 2.17) as query parameters -- + there is no 'names' and no 'policy_names' on this operation, because a + bucket's access policy is identified by the bucket that owns it. The + previous -MemberName / -PolicyName parameters wrote 'member_names' and + 'policy_names', neither of which this endpoint declares, so the array + silently discarded both. Use Get-PfbBucketAccessPolicy to read the + resulting policy, and New-PfbBucketAccessPolicyRule to add rules to it. + .PARAMETER BucketName + One or more bucket names to create the access policy for. Sent as the + 'bucket_names' query parameter. .PARAMETER Array The FlashBlade connection object. If not specified, the default connection is used. .EXAMPLE - New-PfbBucketAccessPolicy -MemberName "mybucket" -PolicyName "read-only-policy" + New-PfbBucketAccessPolicy -BucketName "mybucket" - Associates the 'read-only-policy' access policy with 'mybucket'. + Creates the bucket access policy for 'mybucket'. .EXAMPLE - New-PfbBucketAccessPolicy -MemberName "data-lake" -PolicyName "full-access" + New-PfbBucketAccessPolicy -BucketName "data-lake","web-assets" - Associates the 'full-access' policy with the 'data-lake' bucket. + Creates the bucket access policy for both buckets in one request. .EXAMPLE - New-PfbBucketAccessPolicy -MemberName "mybucket" -PolicyName "read-only-policy" -Confirm:$false + New-PfbBucketAccessPolicy -BucketName "mybucket" -Confirm:$false - Creates the association without confirmation. + Creates the policy without confirmation. #> [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'Medium')] param( - [Parameter(Mandatory, Position = 0)] - [string]$MemberName, - - [Parameter(Mandatory, Position = 1)] - [string]$PolicyName, + # ValueFromPipelineByPropertyName only, matching New-PfbBucketAccessPolicyRule. + # Bare ValueFromPipeline on a Mandatory selector of a POST cmdlet lets a piped + # bucket object fall through to by-value coercion and go on the wire stringified + # as bucket_names=@{...}, creating a policy against a bucket the caller never + # typed. Pipe an object carrying a `bucketName` property, or pass -BucketName. + # + # Do NOT re-add ValueFromPipeline. This cmdlet accepted no pipeline input at all before + # issue #90, so nothing depends on it, and the selector rail measured the pair go from 0 + # finding rows to 8 Coerced rows the moment bare ValueFromPipeline was present. Attribute + # removal is a COMPLETE fix here only because -BucketName carries no alias that could match + # an object-valued property, so there is no pass-4 (ByPropertyName WITH coercion) exposure + # and the outcome is a loud Unbindable instead of a silent wrong POST. Reasoning: issue #90. + [Parameter(Mandatory, Position = 0, ValueFromPipelineByPropertyName)] + [string[]]$BucketName, [Parameter()] [PSCustomObject]$Array ) - Assert-PfbConnection -Array ([ref]$Array) - - $queryParams = @{ - 'member_names' = $MemberName - 'policy_names' = $PolicyName + begin { + Assert-PfbConnection -Array ([ref]$Array) } - if ($PSCmdlet.ShouldProcess("$MemberName / $PolicyName", 'Create bucket access policy association')) { - Invoke-PfbApiRequest -Array $Array -Method POST -Endpoint 'buckets/bucket-access-policies' -QueryParams $queryParams + process { + $queryParams = @{ + 'bucket_names' = $BucketName -join ',' + } + + if ($PSCmdlet.ShouldProcess(($BucketName -join ','), 'Create bucket access policy')) { + Invoke-PfbApiRequest -Array $Array -Method POST -Endpoint 'buckets/bucket-access-policies' -QueryParams $queryParams + } } } diff --git a/Public/Bucket/New-PfbBucketAccessPolicyRule.ps1 b/Public/Bucket/New-PfbBucketAccessPolicyRule.ps1 index 89ea62e8..80c4945e 100644 --- a/Public/Bucket/New-PfbBucketAccessPolicyRule.ps1 +++ b/Public/Bucket/New-PfbBucketAccessPolicyRule.ps1 @@ -6,35 +6,75 @@ function New-PfbBucketAccessPolicyRule { Adds a new rule to a bucket access policy. Rules define specific permissions such as allowed actions, principals, resources, and conditions within the policy for the specified bucket. - .PARAMETER MemberName - The name of the bucket the access policy belongs to. + + NOTE: POST /buckets/bucket-access-policies/rules declares 'names' as a + REQUIRED query parameter alongside 'bucket_names', 'bucket_ids' and + 'policy_names'. Because 'names' is required on every call, -Name is + Mandatory and this cmdlet deliberately publishes a single parameter set, + so the required key can never be unreachable. The previous -MemberName + parameter wrote 'member_names', which this endpoint does not declare, so + the array silently discarded it -- and the required 'names' key was never + sent at all. + .PARAMETER BucketName + One or more bucket names the access policy belongs to. Sent as + 'bucket_names'. .PARAMETER PolicyName - The name of the access policy to add the rule to. + One or more access policy names to add the rule to. Sent as + 'policy_names'. + .PARAMETER Name + One or more names for the new rule. Sent as 'names'. Required by the + endpoint. .PARAMETER Attributes - A hashtable defining the rule properties (actions, principals, - resources, effect, conditions, etc.). + A hashtable defining the rule properties. Sent as the request body. + + The BucketAccessPolicyRulePost schema declares exactly four properties, and + constrains three of them in their descriptions rather than in an enum: + + actions - array of string; the only supported action is "s3:GetObject". + principals - an OBJECT, not a string array, shaped @{ all = $true }; + only all-principals is supported. + resources - array of string; only all objects in a bucket is supported, + e.g. @("mybucket/*"). + effect - readOnly, so a caller cannot send it. It is always "allow". + + Anything outside that set -- a narrower action, a named principal, a + principals string array, or a caller-supplied effect -- the endpoint does not + accept. Verified against every spec version the endpoint exists in + (REST 2.12 through 2.28); the shape is identical throughout. .PARAMETER Array The FlashBlade connection object. If not specified, the default connection is used. .EXAMPLE - New-PfbBucketAccessPolicyRule -MemberName "mybucket" -PolicyName "read-only-policy" -Attributes @{ effect = "allow"; actions = @("s3:GetObject"); principals = @("*") } + New-PfbBucketAccessPolicyRule -BucketName "mybucket" -PolicyName "mybucket/myaccount:read-only-policy" -Name "allow-get" -Attributes @{ actions = @("s3:GetObject"); principals = @{ all = $true } } - Creates a rule allowing all principals to perform GetObject. + Creates a rule named 'allow-get' allowing all principals to perform GetObject. .EXAMPLE - New-PfbBucketAccessPolicyRule -MemberName "mybucket" -PolicyName "write-policy" -Attributes @{ effect = "allow"; actions = @("s3:PutObject","s3:DeleteObject"); principals = @("user1") } + New-PfbBucketAccessPolicyRule -BucketName "mybucket" -PolicyName "mybucket/myaccount:read-only-policy" -Name "allow-get" -Attributes @{ actions = @("s3:GetObject"); principals = @{ all = $true }; resources = @("mybucket/*") } - Creates a rule allowing user1 to write and delete objects. + Creates the same rule with the resource scope stated explicitly. .EXAMPLE - New-PfbBucketAccessPolicyRule -MemberName "mybucket" -PolicyName "full-access" -Attributes @{ effect = "allow"; actions = @("s3:*"); principals = @("*") } + New-PfbBucketAccessPolicyRule -BucketName "mybucket","archive" -PolicyName "mybucket/myaccount:read-only-policy","archive/myaccount:read-only-policy" -Name "allow-get" -Attributes @{ actions = @("s3:GetObject"); principals = @{ all = $true } } - Creates a rule granting full S3 access to all principals. + Creates the rule across two buckets in one call; each selector is joined into + its comma-separated query key. #> [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'Medium')] param( - [Parameter(Mandatory, Position = 0)] - [string]$MemberName, + # ValidateNotNullOrEmpty on all three selectors: each feeds a query key the + # endpoint requires or matches on, and an empty array or an array of empty + # strings would otherwise join to '' and put a blank selector on the wire. The + # Mandatory binder already rejects @() and @('') on both editions, so this is + # belt-and-braces against a future edit that drops Mandatory. + [Parameter(Mandatory, Position = 0, ValueFromPipelineByPropertyName)] + [ValidateNotNullOrEmpty()] + [string[]]$BucketName, - [Parameter(Mandatory, Position = 1)] - [string]$PolicyName, + [Parameter(Mandatory, Position = 1, ValueFromPipelineByPropertyName)] + [ValidateNotNullOrEmpty()] + [string[]]$PolicyName, + + [Parameter(Mandatory, Position = 2)] + [ValidateNotNullOrEmpty()] + [string[]]$Name, [Parameter(Mandatory)] [hashtable]$Attributes, @@ -42,14 +82,19 @@ function New-PfbBucketAccessPolicyRule { [Parameter()] [PSCustomObject]$Array ) - Assert-PfbConnection -Array ([ref]$Array) - - $queryParams = @{ - 'member_names' = $MemberName - 'policy_names' = $PolicyName + begin { + Assert-PfbConnection -Array ([ref]$Array) } - if ($PSCmdlet.ShouldProcess("$MemberName / $PolicyName", 'Create bucket access policy rule')) { - Invoke-PfbApiRequest -Array $Array -Method POST -Endpoint 'buckets/bucket-access-policies/rules' -Body $Attributes -QueryParams $queryParams + process { + $queryParams = @{ + 'names' = $Name -join ',' + 'bucket_names' = $BucketName -join ',' + 'policy_names' = $PolicyName -join ',' + } + + if ($PSCmdlet.ShouldProcess("$($BucketName -join ',') / $($PolicyName -join ',') / $($Name -join ',')", 'Create bucket access policy rule')) { + Invoke-PfbApiRequest -Array $Array -Method POST -Endpoint 'buckets/bucket-access-policies/rules' -Body $Attributes -QueryParams $queryParams + } } } diff --git a/Public/Bucket/New-PfbBucketAuditFilter.ps1 b/Public/Bucket/New-PfbBucketAuditFilter.ps1 index 9ce669a7..953f0027 100644 --- a/Public/Bucket/New-PfbBucketAuditFilter.ps1 +++ b/Public/Bucket/New-PfbBucketAuditFilter.ps1 @@ -7,30 +7,42 @@ function New-PfbBucketAuditFilter { Audit filters define which S3 operations are captured in audit logs for the specified bucket. Use the Attributes parameter to supply the filter configuration as a hashtable. - .PARAMETER MemberName - The name of the bucket to create the audit filter for. + + NOTE: POST /buckets/audit-filters requires the 'names' query parameter + on every request, and the request body carries no bucket identity, so + the bucket must be supplied separately as 'bucket_names'. -BucketName + is therefore mandatory and -Name is combinable with it; when -Name is + omitted, 'names' defaults to the bucket name (audit filters are named + after their owning bucket). + .PARAMETER BucketName + One or more bucket names to create the audit filter for. Sent as the + 'bucket_names' query parameter. + .PARAMETER Name + One or more audit filter names to create, sent as the required 'names' + query parameter. Defaults to -BucketName when not supplied. .PARAMETER Attributes A hashtable of audit filter properties for the request body. When specified, this is used as the entire request body. .PARAMETER Array The FlashBlade connection object. If not specified, the default connection is used. .EXAMPLE - New-PfbBucketAuditFilter -MemberName "mybucket" -Attributes @{ actions = @("s3.GetObject") } - - Creates an audit filter for 'mybucket' that logs GetObject operations. - .EXAMPLE - New-PfbBucketAuditFilter -MemberName "mybucket" -Attributes @{ actions = @("s3.PutObject","s3.DeleteObject") } + New-PfbBucketAuditFilter -BucketName "mybucket" -Attributes @{ actions = @("s3.GetObject") } - Creates an audit filter that logs PutObject and DeleteObject operations. + Creates an audit filter named 'mybucket' on the bucket 'mybucket' that + logs GetObject operations. .EXAMPLE - New-PfbBucketAuditFilter -MemberName "mybucket" -Attributes @{} + New-PfbBucketAuditFilter -BucketName "mybucket" -Name "myfilter" -Attributes @{ actions = @("s3.PutObject","s3.DeleteObject") } - Creates an audit filter with default settings for the specified bucket. + Creates an audit filter named 'myfilter' on the bucket 'mybucket' that + logs PutObject and DeleteObject operations. #> [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'Medium')] param( [Parameter(Mandatory, Position = 0)] - [string]$MemberName, + [string[]]$BucketName, + + [Parameter(Position = 1)] + [string[]]$Name, [Parameter()] [hashtable]$Attributes, @@ -42,9 +54,17 @@ function New-PfbBucketAuditFilter { $body = if ($Attributes) { $Attributes } else { @{} } - $queryParams = @{ 'member_names' = $MemberName } + # 'names' is required on every POST. Default it from the bucket name when + # the caller did not name the filter explicitly. + $filterNames = if ($Name) { $Name } else { $BucketName } + + $queryParams = @{} + $queryParams['names'] = $filterNames -join ',' + $queryParams['bucket_names'] = $BucketName -join ',' + + $target = "$($filterNames -join ',') on bucket(s) $($BucketName -join ',')" - if ($PSCmdlet.ShouldProcess($MemberName, 'Create bucket audit filter')) { + if ($PSCmdlet.ShouldProcess($target, 'Create bucket audit filter')) { Invoke-PfbApiRequest -Array $Array -Method POST -Endpoint 'buckets/audit-filters' -Body $body -QueryParams $queryParams } } diff --git a/Public/Bucket/New-PfbBucketCorsPolicy.ps1 b/Public/Bucket/New-PfbBucketCorsPolicy.ps1 index 322335ff..efa23657 100644 --- a/Public/Bucket/New-PfbBucketCorsPolicy.ps1 +++ b/Public/Bucket/New-PfbBucketCorsPolicy.ps1 @@ -1,49 +1,69 @@ function New-PfbBucketCorsPolicy { <# .SYNOPSIS - Creates a new bucket CORS policy association on the FlashBlade. + Creates a new bucket CORS policy on the FlashBlade. .DESCRIPTION - Associates a cross-origin resource sharing (CORS) policy with a bucket - on the FlashBlade array. CORS policies control which web origins are - permitted to make cross-origin requests to the S3 bucket. - .PARAMETER MemberName - The name of the bucket to associate the CORS policy with. - .PARAMETER PolicyName - The name of the CORS policy to attach to the bucket. + Creates the cross-origin resource sharing (CORS) policy for one or more + buckets on the FlashBlade array. CORS policies control which web origins + are permitted to make cross-origin requests to the S3 bucket. + + NOTE: POST /buckets/cross-origin-resource-sharing-policies declares only + 'bucket_names', 'bucket_ids' (and 'context_names' from REST 2.17) as + query parameters -- there is no 'names' and no 'policy_names' on this + operation, because a bucket's CORS policy is identified by the bucket + that owns it. The previous -MemberName / -PolicyName parameters wrote + 'member_names' and 'policy_names', neither of which this endpoint + declares, so the array silently discarded both. Use + New-PfbBucketCorsPolicyRule to add rules to the resulting policy. + .PARAMETER BucketName + One or more bucket names to create the CORS policy for. Sent as the + 'bucket_names' query parameter. .PARAMETER Array The FlashBlade connection object. If not specified, the default connection is used. .EXAMPLE - New-PfbBucketCorsPolicy -MemberName "mybucket" -PolicyName "allow-all-origins" + New-PfbBucketCorsPolicy -BucketName "mybucket" - Associates the 'allow-all-origins' CORS policy with 'mybucket'. + Creates the CORS policy for 'mybucket'. .EXAMPLE - New-PfbBucketCorsPolicy -MemberName "web-assets" -PolicyName "restricted-cors" + New-PfbBucketCorsPolicy -BucketName "web-assets","static-content" - Associates the 'restricted-cors' policy with the 'web-assets' bucket. + Creates the CORS policy for both buckets in one request. .EXAMPLE - New-PfbBucketCorsPolicy -MemberName "mybucket" -PolicyName "allow-all-origins" -Confirm:$false + New-PfbBucketCorsPolicy -BucketName "mybucket" -Confirm:$false - Creates the association without confirmation. + Creates the policy without confirmation. #> [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'Medium')] param( - [Parameter(Mandatory, Position = 0)] - [string]$MemberName, - - [Parameter(Mandatory, Position = 1)] - [string]$PolicyName, + # ValueFromPipelineByPropertyName only, matching New-PfbBucketCorsPolicyRule. + # Bare ValueFromPipeline on a Mandatory selector of a POST cmdlet lets a piped + # bucket object fall through to by-value coercion and go on the wire stringified + # as bucket_names=@{...}, creating a policy against a bucket the caller never + # typed. Pipe an object carrying a `bucketName` property, or pass -BucketName. + # + # Do NOT re-add ValueFromPipeline. This cmdlet accepted no pipeline input at all before + # issue #90, so nothing depends on it, and the selector rail measured the pair go from 0 + # finding rows to 8 Coerced rows the moment bare ValueFromPipeline was present. Attribute + # removal is a COMPLETE fix here only because -BucketName carries no alias that could match + # an object-valued property, so there is no pass-4 (ByPropertyName WITH coercion) exposure + # and the outcome is a loud Unbindable instead of a silent wrong POST. Reasoning: issue #90. + [Parameter(Mandatory, Position = 0, ValueFromPipelineByPropertyName)] + [string[]]$BucketName, [Parameter()] [PSCustomObject]$Array ) - Assert-PfbConnection -Array ([ref]$Array) - - $queryParams = @{ - 'member_names' = $MemberName - 'policy_names' = $PolicyName + begin { + Assert-PfbConnection -Array ([ref]$Array) } - if ($PSCmdlet.ShouldProcess("$MemberName / $PolicyName", 'Create bucket CORS policy association')) { - Invoke-PfbApiRequest -Array $Array -Method POST -Endpoint 'buckets/cross-origin-resource-sharing-policies' -QueryParams $queryParams + process { + $queryParams = @{ + 'bucket_names' = $BucketName -join ',' + } + + if ($PSCmdlet.ShouldProcess(($BucketName -join ','), 'Create bucket CORS policy')) { + Invoke-PfbApiRequest -Array $Array -Method POST -Endpoint 'buckets/cross-origin-resource-sharing-policies' -QueryParams $queryParams + } } } diff --git a/Public/Bucket/New-PfbBucketCorsPolicyRule.ps1 b/Public/Bucket/New-PfbBucketCorsPolicyRule.ps1 index 6f118f3c..e6db7276 100644 --- a/Public/Bucket/New-PfbBucketCorsPolicyRule.ps1 +++ b/Public/Bucket/New-PfbBucketCorsPolicyRule.ps1 @@ -3,41 +3,101 @@ function New-PfbBucketCorsPolicyRule { .SYNOPSIS Creates a new bucket CORS policy rule on the FlashBlade. .DESCRIPTION - Adds a new rule to a cross-origin resource sharing (CORS) policy. - Rules define allowed origins, HTTP methods, headers, exposed headers, - and max age for cross-origin requests to S3 buckets. + Adds a new rule to a cross-origin resource sharing (CORS) policy. Rules + define the allowed origins, HTTP methods and headers for cross-origin + requests to an S3 bucket. + + NOTE: POST /buckets/cross-origin-resource-sharing-policies/rules declares + 'names' as a REQUIRED query parameter, alongside 'bucket_names', + 'bucket_ids' and 'policy_names' ('context_names' joins at REST 2.17). + This cmdlet previously sent no query parameters at all, so it could never + satisfy the required 'names' and the call could not succeed. Because + 'names' is required on every call, -Name is Mandatory and this cmdlet + publishes a single parameter set, so the required key is reachable by + construction and can never be made mutually exclusive with a bucket or + policy selector. + + The request body declares only allowed_headers, allowed_methods and + allowed_origins -- it carries no identity of its own, so nothing in the + body overlaps the query keys. In particular there is no 'policy' body + field: the owning policy is identified by 'policy_names' on the query + string. + .PARAMETER BucketName + One or more bucket names the CORS policy belongs to. Sent as + 'bucket_names'. + .PARAMETER PolicyName + One or more CORS policy names to add the rule to. Sent as 'policy_names'. + .PARAMETER Name + One or more names for the new rule. Sent as 'names'. Required by the + endpoint. .PARAMETER Attributes - A hashtable defining the rule properties (allowed_origins, allowed_methods, - allowed_headers, exposed_headers, max_age_in_seconds, policy name references, etc.). + A hashtable defining the rule properties. The endpoint accepts + allowed_origins, allowed_methods and allowed_headers. Sent as the request + body. + + The schema constrains the VALUES as well as the field names, in its + descriptions rather than in an enum: the only supported allowed_origins is + "*", the only supported allowed_headers is "*", and the only supported + allowed_methods is the complete set + @("GET", "PUT", "HEAD", "POST", "DELETE"). Any narrower origin, header or + method subset is rejected by the array, so the examples below deliberately + show only the supported combination. .PARAMETER Array The FlashBlade connection object. If not specified, the default connection is used. .EXAMPLE - New-PfbBucketCorsPolicyRule -Attributes @{ policy = @{ name = "allow-all-origins" }; allowed_origins = @("*"); allowed_methods = @("GET","PUT") } + New-PfbBucketCorsPolicyRule -BucketName "mybucket" -PolicyName "mybucket/cors-policy" -Name "allow-all" -Attributes @{ allowed_origins = @("*"); allowed_methods = @("GET","PUT","HEAD","POST","DELETE") } - Creates a CORS rule allowing all origins with GET and PUT methods. + Creates a CORS rule allowing all origins with the complete supported method set. .EXAMPLE - New-PfbBucketCorsPolicyRule -Attributes @{ policy = @{ name = "restricted-cors" }; allowed_origins = @("https://example.com"); allowed_methods = @("GET"); max_age_in_seconds = 3600 } + New-PfbBucketCorsPolicyRule -BucketName "web-assets" -PolicyName "web-assets/cors-policy" -Name "allow-all" -Attributes @{ allowed_origins = @("*"); allowed_methods = @("GET","PUT","HEAD","POST","DELETE"); allowed_headers = @("*") } - Creates a CORS rule for a specific origin with a max age of one hour. + Creates the same rule with allowed_headers stated explicitly. .EXAMPLE - New-PfbBucketCorsPolicyRule -Attributes @{ policy = @{ name = "allow-all-origins" }; allowed_origins = @("*"); allowed_methods = @("GET","PUT","DELETE"); allowed_headers = @("*"); exposed_headers = @("ETag") } + New-PfbBucketCorsPolicyRule -BucketName "mybucket","web-assets" -PolicyName "mybucket/cors-policy","web-assets/cors-policy" -Name "allow-all" -Attributes @{ allowed_origins = @("*"); allowed_methods = @("GET","PUT","HEAD","POST","DELETE") } - Creates a CORS rule with custom headers and exposed headers. + Creates the rule across two buckets in one call; each selector is joined into + its comma-separated query key. #> [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'Medium')] param( + # ValidateNotNullOrEmpty on all three selectors: each one feeds a query key the + # endpoint requires or matches on, and an empty array or an array of empty + # strings would otherwise join to '' and put a blank selector on the wire. The + # Mandatory binder already rejects @() and @('') on both editions, so this is + # belt-and-braces against a future edit that drops Mandatory -- it is NOT + # belt-and-braces on -Name of Update-PfbBucketAuditFilter, which is not + # Mandatory and where the hole was real. + [Parameter(Mandatory, Position = 0, ValueFromPipelineByPropertyName)] + [ValidateNotNullOrEmpty()] + [string[]]$BucketName, + + [Parameter(Mandatory, Position = 1, ValueFromPipelineByPropertyName)] + [ValidateNotNullOrEmpty()] + [string[]]$PolicyName, + + [Parameter(Mandatory, Position = 2)] + [ValidateNotNullOrEmpty()] + [string[]]$Name, + [Parameter(Mandatory)] [hashtable]$Attributes, [Parameter()] [PSCustomObject]$Array ) - Assert-PfbConnection -Array ([ref]$Array) + begin { + Assert-PfbConnection -Array ([ref]$Array) + } - $target = 'CORS policy rule' - if ($Attributes.policy -and $Attributes.policy.name) { $target = $Attributes.policy.name } + process { + $queryParams = @{ + 'names' = $Name -join ',' + 'bucket_names' = $BucketName -join ',' + 'policy_names' = $PolicyName -join ',' + } - if ($PSCmdlet.ShouldProcess($target, 'Create bucket CORS policy rule')) { - Invoke-PfbApiRequest -Array $Array -Method POST -Endpoint 'buckets/cross-origin-resource-sharing-policies/rules' -Body $Attributes + if ($PSCmdlet.ShouldProcess("$($BucketName -join ',') / $($PolicyName -join ',') / $($Name -join ',')", 'Create bucket CORS policy rule')) { + Invoke-PfbApiRequest -Array $Array -Method POST -Endpoint 'buckets/cross-origin-resource-sharing-policies/rules' -Body $Attributes -QueryParams $queryParams + } } } diff --git a/Public/Bucket/Remove-PfbBucketAccessPolicy.ps1 b/Public/Bucket/Remove-PfbBucketAccessPolicy.ps1 index 601789bc..891c1887 100644 --- a/Public/Bucket/Remove-PfbBucketAccessPolicy.ps1 +++ b/Public/Bucket/Remove-PfbBucketAccessPolicy.ps1 @@ -1,50 +1,77 @@ function Remove-PfbBucketAccessPolicy { <# .SYNOPSIS - Removes a bucket access policy association from the FlashBlade. + Removes a bucket access policy from the FlashBlade. .DESCRIPTION - Deletes the association between a bucket and an access policy on the - FlashBlade. Both the bucket member name and the policy name are required. - This action is irreversible. Use -Confirm:$false to suppress the - confirmation prompt in automation scenarios. - .PARAMETER MemberName - The name of the bucket to remove the access policy from. - .PARAMETER PolicyName - The name of the access policy to detach from the bucket. + Deletes a bucket access policy on the FlashBlade. This action is + irreversible. Use -Confirm:$false to suppress the confirmation prompt in + automation scenarios. + + NOTE: DELETE /buckets/bucket-access-policies declares only 'names', + 'bucket_names' and 'bucket_ids'. There is no policy-level selector, so + -BucketName and -BucketId delete EVERY access policy on the specified + bucket(s). Use the fully-qualified -Name to remove a single policy. The + previous -MemberName / -PolicyName parameters wrote 'member_names' and + 'policy_names', neither of which this endpoint declares; behaviour when + undeclared query keys are sent is undefined by the published API contract. + .PARAMETER Name + One or more fully-qualified bucket access policy names to remove. This is + the only way to target a single policy. + .PARAMETER BucketName + One or more bucket names. Removes all access policies on those buckets. + .PARAMETER BucketId + One or more bucket IDs. Removes all access policies on those buckets. .PARAMETER Array The FlashBlade connection object. If not specified, the default connection is used. .EXAMPLE - Remove-PfbBucketAccessPolicy -MemberName "mybucket" -PolicyName "read-only-policy" + Remove-PfbBucketAccessPolicy -Name "mybucket/myaccount:read-only-policy" - Removes the 'read-only-policy' from 'mybucket'. + Removes the single access policy 'read-only-policy' from 'mybucket'. .EXAMPLE - Remove-PfbBucketAccessPolicy -MemberName "mybucket" -PolicyName "read-only-policy" -Confirm:$false + Remove-PfbBucketAccessPolicy -BucketName "mybucket" - Removes the association without confirmation. + Removes ALL access policies from the bucket named 'mybucket'. .EXAMPLE - Remove-PfbBucketAccessPolicy -MemberName "data-lake" -PolicyName "full-access" + Remove-PfbBucketAccessPolicy -Name "mybucket/myaccount:read-only-policy" -Confirm:$false - Removes the 'full-access' policy association from the 'data-lake' bucket. + Removes the access policy without confirmation. #> [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'High')] param( - [Parameter(Mandatory, Position = 0)] - [string]$MemberName, + [Parameter(ParameterSetName = 'ByName', Mandatory, ValueFromPipelineByPropertyName)] + [string[]]$Name, + + [Parameter(ParameterSetName = 'ByBucketName', Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName)] + [string[]]$BucketName, - [Parameter(Mandatory, Position = 1)] - [string]$PolicyName, + [Parameter(ParameterSetName = 'ByBucketId', Mandatory)] + [string[]]$BucketId, [Parameter()] [PSCustomObject]$Array ) - Assert-PfbConnection -Array ([ref]$Array) - - $queryParams = @{ - 'member_names' = $MemberName - 'policy_names' = $PolicyName + begin { + Assert-PfbConnection -Array ([ref]$Array) } - if ($PSCmdlet.ShouldProcess("$MemberName / $PolicyName", 'Remove bucket access policy association')) { - Invoke-PfbApiRequest -Array $Array -Method DELETE -Endpoint 'buckets/bucket-access-policies' -QueryParams $queryParams + process { + $queryParams = @{} + if ($Name) { $queryParams['names'] = $Name -join ',' } + if ($BucketName) { $queryParams['bucket_names'] = $BucketName -join ',' } + if ($BucketId) { $queryParams['bucket_ids'] = $BucketId -join ',' } + + if ($Name) { + $target = "access policy/policies $($Name -join ',')" + } + elseif ($BucketName) { + $target = "ALL access policies on bucket(s) $($BucketName -join ',')" + } + else { + $target = "ALL access policies on bucket ID(s) $($BucketId -join ',')" + } + + if ($PSCmdlet.ShouldProcess($target, 'Remove bucket access policy')) { + Invoke-PfbApiRequest -Array $Array -Method DELETE -Endpoint 'buckets/bucket-access-policies' -QueryParams $queryParams + } } } diff --git a/Public/Bucket/Remove-PfbBucketAuditFilter.ps1 b/Public/Bucket/Remove-PfbBucketAuditFilter.ps1 index 0058b13e..7ce7d171 100644 --- a/Public/Bucket/Remove-PfbBucketAuditFilter.ps1 +++ b/Public/Bucket/Remove-PfbBucketAuditFilter.ps1 @@ -3,35 +3,40 @@ function Remove-PfbBucketAuditFilter { .SYNOPSIS Removes a bucket audit filter from the FlashBlade. .DESCRIPTION - Deletes an audit filter from a bucket identified by member name or member ID. - This action is irreversible. Use -Confirm:$false to suppress the confirmation - prompt in automation scenarios. - .PARAMETER MemberName - The name of the bucket whose audit filter should be removed. - .PARAMETER MemberId - The ID of the bucket whose audit filter should be removed. + Deletes an audit filter identified by audit filter name, bucket name, or + bucket ID. This action is irreversible. Use -Confirm:$false to suppress + the confirmation prompt in automation scenarios. + .PARAMETER Name + One or more audit filter names to remove. + .PARAMETER BucketName + One or more bucket names whose audit filters should be removed. + .PARAMETER BucketId + One or more bucket IDs whose audit filters should be removed. .PARAMETER Array The FlashBlade connection object. If not specified, the default connection is used. .EXAMPLE - Remove-PfbBucketAuditFilter -MemberName "mybucket" + Remove-PfbBucketAuditFilter -BucketName "mybucket" Removes the audit filter for the bucket named 'mybucket'. .EXAMPLE - Remove-PfbBucketAuditFilter -MemberId "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" + Remove-PfbBucketAuditFilter -BucketId "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" Removes the audit filter by bucket ID. .EXAMPLE - Remove-PfbBucketAuditFilter -MemberName "mybucket" -Confirm:$false + Remove-PfbBucketAuditFilter -Name "myfilter" -Confirm:$false - Removes the audit filter without confirmation. + Removes the audit filter named 'myfilter' without confirmation. #> [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'High')] param( - [Parameter(ParameterSetName = 'ByMemberName', Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName)] - [string]$MemberName, + [Parameter(ParameterSetName = 'ByName', Mandatory, ValueFromPipelineByPropertyName)] + [string[]]$Name, - [Parameter(ParameterSetName = 'ByMemberId', Mandatory)] - [string]$MemberId, + [Parameter(ParameterSetName = 'ByBucketName', Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName)] + [string[]]$BucketName, + + [Parameter(ParameterSetName = 'ByBucketId', Mandatory)] + [string[]]$BucketId, [Parameter()] [PSCustomObject]$Array ) @@ -41,10 +46,12 @@ function Remove-PfbBucketAuditFilter { } process { - $target = if ($MemberName) { $MemberName } else { $MemberId } $queryParams = @{} - if ($MemberName) { $queryParams['member_names'] = $MemberName } - if ($MemberId) { $queryParams['member_ids'] = $MemberId } + if ($Name) { $queryParams['names'] = $Name -join ',' } + if ($BucketName) { $queryParams['bucket_names'] = $BucketName -join ',' } + if ($BucketId) { $queryParams['bucket_ids'] = $BucketId -join ',' } + + $target = if ($Name) { $Name -join ',' } elseif ($BucketName) { $BucketName -join ',' } else { $BucketId -join ',' } if ($PSCmdlet.ShouldProcess($target, 'Remove bucket audit filter')) { Invoke-PfbApiRequest -Array $Array -Method DELETE -Endpoint 'buckets/audit-filters' -QueryParams $queryParams diff --git a/Public/Bucket/Remove-PfbBucketCorsPolicy.ps1 b/Public/Bucket/Remove-PfbBucketCorsPolicy.ps1 index 3ecf01d5..3cc3046e 100644 --- a/Public/Bucket/Remove-PfbBucketCorsPolicy.ps1 +++ b/Public/Bucket/Remove-PfbBucketCorsPolicy.ps1 @@ -7,37 +7,46 @@ function Remove-PfbBucketCorsPolicy { sharing (CORS) policy on the FlashBlade. This action is irreversible. Use -Confirm:$false to suppress the confirmation prompt in automation scenarios. - .PARAMETER MemberName - The name of the bucket to remove the CORS policy from. - .PARAMETER MemberId - The ID of the bucket to remove the CORS policy from. - .PARAMETER PolicyName - The name of the CORS policy to detach from the bucket. + + NOTE: DELETE /buckets/cross-origin-resource-sharing-policies declares + only 'names', 'bucket_names' and 'bucket_ids'. There is no policy-level + selector, so -BucketName and -BucketId delete EVERY CORS policy + association on the specified bucket(s). Use the fully-qualified -Name + to remove a single association. + .PARAMETER Name + One or more fully-qualified bucket CORS policy names to remove. This is + the only way to target a single association. + .PARAMETER BucketName + One or more bucket names. Removes all CORS policy associations on those + buckets. + .PARAMETER BucketId + One or more bucket IDs. Removes all CORS policy associations on those + buckets. .PARAMETER Array The FlashBlade connection object. If not specified, the default connection is used. .EXAMPLE - Remove-PfbBucketCorsPolicy -MemberName "mybucket" -PolicyName "allow-all-origins" + Remove-PfbBucketCorsPolicy -Name "mybucket/allow-all-origins" - Removes the CORS policy association from the specified bucket. + Removes the single CORS policy association 'allow-all-origins' from 'mybucket'. .EXAMPLE - Remove-PfbBucketCorsPolicy -MemberId "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" -PolicyName "restricted-cors" + Remove-PfbBucketCorsPolicy -BucketName "mybucket" - Removes the CORS policy association by bucket ID. + Removes ALL CORS policy associations from the bucket named 'mybucket'. .EXAMPLE - Remove-PfbBucketCorsPolicy -MemberName "mybucket" -PolicyName "allow-all-origins" -Confirm:$false + Remove-PfbBucketCorsPolicy -Name "mybucket/allow-all-origins" -Confirm:$false Removes the CORS policy association without confirmation. #> [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'High')] param( - [Parameter(ParameterSetName = 'ByMemberName', Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName)] - [string]$MemberName, + [Parameter(ParameterSetName = 'ByName', Mandatory, ValueFromPipelineByPropertyName)] + [string[]]$Name, - [Parameter(ParameterSetName = 'ByMemberId', Mandatory)] - [string]$MemberId, + [Parameter(ParameterSetName = 'ByBucketName', Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName)] + [string[]]$BucketName, - [Parameter()] - [string]$PolicyName, + [Parameter(ParameterSetName = 'ByBucketId', Mandatory)] + [string[]]$BucketId, [Parameter()] [PSCustomObject]$Array ) @@ -48,12 +57,19 @@ function Remove-PfbBucketCorsPolicy { process { $queryParams = @{} - if ($MemberName) { $queryParams['member_names'] = $MemberName } - if ($MemberId) { $queryParams['member_ids'] = $MemberId } - if ($PolicyName) { $queryParams['policy_names'] = $PolicyName } + if ($Name) { $queryParams['names'] = $Name -join ',' } + if ($BucketName) { $queryParams['bucket_names'] = $BucketName -join ',' } + if ($BucketId) { $queryParams['bucket_ids'] = $BucketId -join ',' } - $target = if ($MemberName) { $MemberName } else { $MemberId } - if ($PolicyName) { $target = "$target / $PolicyName" } + if ($Name) { + $target = "CORS policy association(s) $($Name -join ',')" + } + elseif ($BucketName) { + $target = "ALL CORS policy associations on bucket(s) $($BucketName -join ',')" + } + else { + $target = "ALL CORS policy associations on bucket ID(s) $($BucketId -join ',')" + } if ($PSCmdlet.ShouldProcess($target, 'Remove bucket CORS policy association')) { Invoke-PfbApiRequest -Array $Array -Method DELETE -Endpoint 'buckets/cross-origin-resource-sharing-policies' -QueryParams $queryParams diff --git a/Public/Bucket/Update-PfbBucketAuditFilter.ps1 b/Public/Bucket/Update-PfbBucketAuditFilter.ps1 index 1d742b10..5003be55 100644 --- a/Public/Bucket/Update-PfbBucketAuditFilter.ps1 +++ b/Public/Bucket/Update-PfbBucketAuditFilter.ps1 @@ -3,28 +3,28 @@ function Update-PfbBucketAuditFilter { .SYNOPSIS Updates an existing bucket audit filter on the FlashBlade. .DESCRIPTION - Modifies an existing audit filter for a bucket identified by member name - or member ID. Use the individual typed parameters for a specific audit + Modifies an existing audit filter for a bucket identified by bucket name + or bucket ID. Use the individual typed parameters for a specific audit filter field, or the Attributes parameter to supply several properties to update at once as a hashtable. The individual typed parameters and the raw -Attributes hashtable are mutually exclusive: they live in separate parameter sets, so PowerShell rejects a mixed invocation at bind time rather than letting -Attributes silently override an - explicitly supplied value. -FilterNames is a query parameter and is orthogonal + explicitly supplied value. -Name is a query parameter and is orthogonal to the body, so it can be combined freely with either. - .PARAMETER MemberName + .PARAMETER BucketName The name of the bucket whose audit filter should be updated. Sent as the 'bucket_names' query parameter. - .PARAMETER MemberId + .PARAMETER BucketId The ID of the bucket whose audit filter should be updated. Sent as the 'bucket_ids' query parameter. - .PARAMETER FilterNames + .PARAMETER Name The audit filter's own name(s), sent as the required 'names' query parameter. - When not explicitly supplied, this defaults to -MemberName (audit filters are - named after their owning bucket), so existing -MemberName-only callers keep - working. If you only have -MemberId and the filter's name differs from the - bucket's name, supply -FilterNames explicitly. + When not explicitly supplied, this defaults to -BucketName (audit filters are + named after their owning bucket), so existing -BucketName-only callers keep + working. If you only have -BucketId and the filter's name differs from the + bucket's name, supply -Name explicitly. .PARAMETER Actions The list of ops to be audited by this filter (e.g. 's3:GetObject'). No fixed value set is documented in the spec, so this is not validated against a closed @@ -38,55 +38,78 @@ function Update-PfbBucketAuditFilter { .PARAMETER Array The FlashBlade connection object. If not specified, the default connection is used. .EXAMPLE - Update-PfbBucketAuditFilter -MemberName "mybucket" -Actions "s3:GetObject","s3:PutObject" + Update-PfbBucketAuditFilter -BucketName "mybucket" -Actions "s3:GetObject","s3:PutObject" Updates the audit filter for 'mybucket' to log GetObject and PutObject operations using typed parameters. .EXAMPLE - Update-PfbBucketAuditFilter -MemberId "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" -FilterNames "mybucket" -Actions "s3:DeleteObject" + Update-PfbBucketAuditFilter -BucketId "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" -Name "mybucket" -Actions "s3:DeleteObject" Updates the audit filter by bucket ID, explicitly supplying the filter's own name. .EXAMPLE - Update-PfbBucketAuditFilter -MemberName "mybucket" -Attributes @{ actions = @("s3:GetObject","s3:PutObject") } + Update-PfbBucketAuditFilter -BucketName "mybucket" -Attributes @{ actions = @("s3:GetObject","s3:PutObject") } Updates the audit filter for 'mybucket' using a raw attribute hashtable. .NOTES Wire-correctness fix: the real `PATCH /buckets/audit-filters` endpoint's query parameters are `bucket_ids`/`bucket_names` (confirmed directly against the real OpenAPI spec) -- not `member_ids`/`member_names`, which this cmdlet previously sent - and which do not exist on this endpoint at all. -MemberName/-MemberId now map to the - correct wire keys. Separately, the endpoint also requires a `names` query parameter - on every PATCH (identifying the audit-filter resource itself) -- new -FilterNames - parameter, defaulted from -MemberName for backward compatibility. `actions` and - `s3_prefixes` are the only two real body properties on `BucketAuditFilterPost`; - `bucket_ids`/`bucket_names`/`names` are query parameters only, never body fields. + and which do not exist on this endpoint at all. -BucketName/-BucketId map to the + correct wire keys, and their names now match the keys they carry as well as the + rest of the Pfb bucket-audit-filter family. Separately, the endpoint also requires + a `names` query parameter on every PATCH (identifying the audit-filter resource + itself) -- the -Name parameter, defaulted from -BucketName for convenience. + `actions` and `s3_prefixes` are the only two real body properties on + `BucketAuditFilterPost`; `bucket_ids`/`bucket_names`/`names` are query parameters + only, never body fields. #> [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'Medium', - DefaultParameterSetName = 'ByMemberNameIndividual')] + DefaultParameterSetName = 'ByBucketNameIndividual')] param( - [Parameter(ParameterSetName = 'ByMemberNameIndividual', Mandatory, ValueFromPipelineByPropertyName)] - [Parameter(ParameterSetName = 'ByMemberNameAttributes', Mandatory, ValueFromPipelineByPropertyName)] - [string]$MemberName, - - [Parameter(ParameterSetName = 'ByMemberIdIndividual', Mandatory)] - [Parameter(ParameterSetName = 'ByMemberIdAttributes', Mandatory)] - [string]$MemberId, + # The three aliases below restore the pre-rename names so existing callers keep + # working. Note the deliberate asymmetry with the Remove-Pfb* cmdlets in this family, + # which underwent the same MemberName/MemberId -> BucketName/BucketId rename on this + # branch and were given NO aliases: their legacy parameters wrote query keys the + # endpoint does not declare, so they over-deleted rather than filtering. Aliasing + # those onto a key that does work would quietly change what a DELETE removes, which + # is worse than the break. Here the old names genuinely worked, so restoring them + # restores working behaviour and nothing else. Do not "fix" the inconsistency by + # adding aliases there. + [Parameter(ParameterSetName = 'ByBucketNameIndividual', Mandatory, ValueFromPipelineByPropertyName)] + [Parameter(ParameterSetName = 'ByBucketNameAttributes', Mandatory, ValueFromPipelineByPropertyName)] + [Alias('MemberName')] + [string]$BucketName, + + [Parameter(ParameterSetName = 'ByBucketIdIndividual', Mandatory)] + [Parameter(ParameterSetName = 'ByBucketIdAttributes', Mandatory)] + [Alias('MemberId')] + [string]$BucketId, # Constraint 17: `names` is a QUERY parameter, orthogonal to the request body, so - # -FilterNames is declared bare rather than scoped to the *Individual sets. + # -Name is declared bare rather than scoped to the *Individual sets. Being bare it + # is also reachable in every parameter set, which the endpoint's `required: true` + # on `names` demands. + # + # ValidateNotNullOrEmpty is load-bearing here, not decoration: -Name is NOT + # Mandatory, so without it `-Name @()` and `-Name @('')` both bind happily, + # $PSBoundParameters.ContainsKey('Name') is true, and `names` goes on the wire + # empty -- a required selector silently dropped. Verified on pwsh 7 and Windows + # PowerShell 5.1 that this attribute rejects both forms. [Parameter()] - [string[]]$FilterNames, + [Alias('FilterNames')] + [ValidateNotNullOrEmpty()] + [string[]]$Name, - [Parameter(ParameterSetName = 'ByMemberNameIndividual')] - [Parameter(ParameterSetName = 'ByMemberIdIndividual')] + [Parameter(ParameterSetName = 'ByBucketNameIndividual')] + [Parameter(ParameterSetName = 'ByBucketIdIndividual')] [string[]]$Actions, - [Parameter(ParameterSetName = 'ByMemberNameIndividual')] - [Parameter(ParameterSetName = 'ByMemberIdIndividual')] + [Parameter(ParameterSetName = 'ByBucketNameIndividual')] + [Parameter(ParameterSetName = 'ByBucketIdIndividual')] [string[]]$S3Prefixes, - [Parameter(ParameterSetName = 'ByMemberNameAttributes', Mandatory)] - [Parameter(ParameterSetName = 'ByMemberIdAttributes', Mandatory)] + [Parameter(ParameterSetName = 'ByBucketNameAttributes', Mandatory)] + [Parameter(ParameterSetName = 'ByBucketIdAttributes', Mandatory)] [hashtable]$Attributes, [Parameter()] [PSCustomObject]$Array @@ -98,24 +121,24 @@ function Update-PfbBucketAuditFilter { process { $queryParams = @{} - if ($MemberName) { $queryParams['bucket_names'] = $MemberName } - if ($MemberId) { $queryParams['bucket_ids'] = $MemberId } + if ($BucketName) { $queryParams['bucket_names'] = $BucketName } + if ($BucketId) { $queryParams['bucket_ids'] = $BucketId } - if ($PSBoundParameters.ContainsKey('FilterNames')) { - $queryParams['names'] = @($FilterNames) + if ($PSBoundParameters.ContainsKey('Name')) { + $queryParams['names'] = $Name -join ',' } - elseif ($MemberName) { - # The real endpoint requires 'names' on every PATCH. Default to -MemberName - # (audit filters are named after their owning bucket) so existing - # -MemberName-only callers keep working without a breaking change. - $queryParams['names'] = $MemberName + elseif ($BucketName) { + # The real endpoint requires 'names' on every PATCH. Default to -BucketName + # (audit filters are named after their owning bucket) so -BucketName-only + # callers do not have to restate the same value twice. + $queryParams['names'] = $BucketName } else { - # -MemberId alone gives no value to infer -FilterNames from (the audit filter's + # -BucketId alone gives no value to infer -Name from (the audit filter's # own name cannot be derived from the bucket's ID). Fail fast client-side rather # than send a request the array will reject anyway for missing the required # 'names' query parameter. - throw "Update-PfbBucketAuditFilter: -FilterNames is required when -MemberId is used without -MemberName -- the audit filter's own name cannot be inferred from an ID alone. Supply -FilterNames explicitly." + throw "Update-PfbBucketAuditFilter: -Name is required when -BucketId is used without -BucketName -- the audit filter's own name cannot be inferred from an ID alone. Supply -Name explicitly." } if ($PSCmdlet.ParameterSetName -like '*Attributes') { @@ -127,7 +150,7 @@ function Update-PfbBucketAuditFilter { if ($PSBoundParameters.ContainsKey('S3Prefixes')) { $body['s3_prefixes'] = @($S3Prefixes) } } - $target = if ($MemberName) { $MemberName } else { $MemberId } + $target = if ($BucketName) { $BucketName } else { $BucketId } if ($PSCmdlet.ShouldProcess($target, 'Update bucket audit filter')) { Invoke-PfbApiRequest -Array $Array -Method PATCH -Endpoint 'buckets/audit-filters' -Body $body -QueryParams $queryParams diff --git a/Public/Certificate/Get-PfbCertificateGroupCertificate.ps1 b/Public/Certificate/Get-PfbCertificateGroupCertificate.ps1 index a775c26a..732d0f2e 100644 --- a/Public/Certificate/Get-PfbCertificateGroupCertificate.ps1 +++ b/Public/Certificate/Get-PfbCertificateGroupCertificate.ps1 @@ -6,9 +6,14 @@ function Get-PfbCertificateGroupCertificate { The Get-PfbCertificateGroupCertificate cmdlet returns the certificate-to-group membership relationships configured on the FlashBlade. This shows which certificates belong to which certificate groups. Results support filtering, sorting, and pagination. - .PARAMETER Name - One or more certificate group names to retrieve certificate memberships for. Accepts pipeline input. - .PARAMETER Id + + Selectors on this endpoint are resource-specific: use -CertificateName to select by + certificate name (wire key 'certificate_names') and -CertificateGroupId to select by + certificate group ID (wire key 'certificate_group_ids'). The endpoint does not accept + the generic 'names' or 'ids' query keys. + .PARAMETER CertificateName + One or more certificate names to retrieve group memberships for. Accepts pipeline input. + .PARAMETER CertificateGroupId One or more certificate group IDs to retrieve certificate memberships for. .PARAMETER Filter A server-side filter expression to narrow results. @@ -23,9 +28,13 @@ function Get-PfbCertificateGroupCertificate { Returns all certificate-to-group memberships on the connected FlashBlade. .EXAMPLE - Get-PfbCertificateGroupCertificate -Name 'ad-cert-group' + Get-PfbCertificateGroupCertificate -CertificateName 'management' + + Retrieves the group memberships of the 'management' certificate. + .EXAMPLE + Get-PfbCertificateGroupCertificate -CertificateGroupId '10314f42-020d-7080-8013-000ddd11003d' - Retrieves certificates that belong to the 'ad-cert-group' certificate group. + Retrieves the certificate memberships of the specified certificate group. .EXAMPLE Get-PfbCertificateGroupCertificate -Filter "group.name='ad-cert-group'" -Limit 10 @@ -33,9 +42,16 @@ function Get-PfbCertificateGroupCertificate { #> [CmdletBinding(DefaultParameterSetName = 'List')] param( - [Parameter(ParameterSetName = 'ByName', ValueFromPipeline, ValueFromPipelineByPropertyName)] - [string[]]$Name, - [Parameter(ParameterSetName = 'ById')] [string[]]$Id, + # Within this family, the cross-endpoint chain from Get-PfbCertificate into Get-PfbCertificateGroupCertificate + # cannot filter correctly: a producer's bare `name` bound to -CertificateName / `certificate_names` + # is the defect because `name` means different things by endpoint and metadata cannot identify + # its producer, so no correct generic binding exists. An undeclared or non-matching query key + # returns HTTP 200 with the unfiltered collection, so the guard's loud failure is best. Do NOT + # remove it or add an alias: that flips WrongScalar to Bound while sending the wrong name; + # revisit only if the consumer can establish its producer, which metadata alone cannot. Issue #90. + [Parameter(ParameterSetName = 'ByCertificateName', ValueFromPipeline, ValueFromPipelineByPropertyName)] + [string[]]$CertificateName, + [Parameter(ParameterSetName = 'ByCertificateGroupId')] [string[]]$CertificateGroupId, [Parameter()] [string]$Filter, [Parameter()] [string]$Sort, [Parameter()] [int]$Limit, @@ -44,18 +60,28 @@ function Get-PfbCertificateGroupCertificate { begin { Assert-PfbConnection -Array ([ref]$Array) - $allNames = [System.Collections.Generic.List[string]]::new() - $allIds = [System.Collections.Generic.List[string]]::new() + $allCertificateNames = [System.Collections.Generic.List[string]]::new() + $allCertificateGroupIds = [System.Collections.Generic.List[string]]::new() } process { - if ($Name) { foreach ($n in $Name) { $allNames.Add($n) } } - if ($Id) { foreach ($i in $Id) { $allIds.Add($i) } } + Assert-PfbSelectorNotCoerced -Value $CertificateName -OriginalInput $PSItem -ParameterName 'CertificateName' -Hint ( + 'Pipe the certificate name instead, e.g. Get-PfbCertificate | ' + + 'Select-Object -ExpandProperty name | Get-PfbCertificateGroupCertificate, ' + + 'or pass -CertificateName explicitly, or -CertificateGroupId if you meant to filter by group.') + if ($CertificateName) { foreach ($n in $CertificateName) { $allCertificateNames.Add($n) } } + if ($CertificateGroupId) { foreach ($i in $CertificateGroupId) { $allCertificateGroupIds.Add($i) } } } end { $queryParams = @{} - Add-PfbCommonQueryParams -Into $queryParams -BoundParameters $PSBoundParameters -Names $allNames -Ids $allIds + Add-PfbCommonQueryParams -Into $queryParams -BoundParameters $PSBoundParameters + if ($allCertificateNames.Count -gt 0) { + $queryParams['certificate_names'] = $allCertificateNames -join ',' + } + if ($allCertificateGroupIds.Count -gt 0) { + $queryParams['certificate_group_ids'] = $allCertificateGroupIds -join ',' + } Invoke-PfbApiRequest -Array $Array -Method GET -Endpoint 'certificate-groups/certificates' -QueryParams $queryParams -AutoPaginate } } diff --git a/Public/DirectoryService/Get-PfbLocalGroupMember.ps1 b/Public/DirectoryService/Get-PfbLocalGroupMember.ps1 index 0f987e0a..86d5f10f 100644 --- a/Public/DirectoryService/Get-PfbLocalGroupMember.ps1 +++ b/Public/DirectoryService/Get-PfbLocalGroupMember.ps1 @@ -5,8 +5,16 @@ function Get-PfbLocalGroupMember { .DESCRIPTION Returns the members of local groups. Endpoint: GET /directory-services/local/groups/members. - .PARAMETER Group + .PARAMETER GroupName One or more local group names whose members to list (sent as 'group_names'). + Aliased as 'Group' and 'group_name'. Named to match the top-level GroupName + property this cmdlet lifts from each item's nested 'group' reference, so a + piped membership binds the group's name rather than the group object. The + rename is what resolved the shadowing: measured on the real module, the + parameter NAME beats the alias in by-property-name binding, so an item + carrying both a lifted string 'GroupName' and the object-valued 'group' + binds 'GroupName'. The 'Group' alias can still match that object on a + producer with no lifted property, which is what the process block guards. .PARAMETER Member One or more member names to filter by (sent as 'member_names'). .PARAMETER Filter @@ -18,13 +26,19 @@ function Get-PfbLocalGroupMember { .PARAMETER Array The FlashBlade connection object. If not specified, uses the default connection. .EXAMPLE - Get-PfbLocalGroupMember -Group "mydomain\share-admins" + Get-PfbLocalGroupMember -GroupName "mydomain\share-admins" Lists the members of the local group. + .EXAMPLE + Get-PfbLocalGroupMember -Group "mydomain\share-admins" + + The same call using the 'Group' alias, which is retained for compatibility. #> [CmdletBinding()] param( - [Parameter(ValueFromPipeline, ValueFromPipelineByPropertyName)] [string[]]$Group, + [Parameter(ValueFromPipeline, ValueFromPipelineByPropertyName)] + [Alias('Group', 'group_name')] + [string[]]$GroupName, [Parameter()] [string[]]$Member, [Parameter()] [string]$Filter, [Parameter()] [string]$Sort, @@ -37,13 +51,39 @@ function Get-PfbLocalGroupMember { $allGroups = [System.Collections.Generic.List[string]]::new() } process { - if ($Group) { foreach ($g in $Group) { $allGroups.Add($g) } } + # -GroupName keeps [Alias('Group', 'group_name')]: the parameter name beats the alias + # in by-property-name lookup, and the alias is load-bearing for + # GET /directory-services/roles, whose `group` is string-valued. This guard covers the + # object-valued `group` on the members item, which coerces whole into the selector. + # + # Do NOT "fix" this pair by dropping ValueFromPipeline. Binding has FOUR passes, not three, + # and pass 4 is ByPropertyName WITH coercion, so a ByPropertyName-only parameter whose ALIAS + # matches the object-valued `group` still binds it stringified: the coercion moves from + # pass 3 to pass 4 and the pair stays red. Dropping the `Group` alias instead is a breaking + # change for -Group callers and costs the /directory-services/roles bind. Reasoning: #90. + Assert-PfbSelectorNotCoerced -Value $GroupName -OriginalInput $PSItem -ParameterName 'GroupName' ` + -BindingPropertyName 'Group', 'group_name' -Hint ( + 'Pipe the group name instead, e.g. Get-PfbLocalGroup | Select-Object -ExpandProperty name | ' + + 'Get-PfbLocalGroupMember, or pass -GroupName explicitly.') + if ($GroupName) { foreach ($g in $GroupName) { $allGroups.Add($g) } } } end { $queryParams = @{} if ($allGroups.Count -gt 0) { $queryParams['group_names'] = $allGroups -join ',' } if ($Member) { $queryParams['member_names'] = $Member -join ',' } Add-PfbCommonQueryParams -Into $queryParams -BoundParameters $PSBoundParameters - Invoke-PfbApiRequest -Array $Array -Method GET -Endpoint 'directory-services/local/groups/members' -QueryParams $queryParams -AutoPaginate + $response = Invoke-PfbApiRequest -Array $Array -Method GET -Endpoint 'directory-services/local/groups/members' -QueryParams $queryParams -AutoPaginate + + # Lift the nested parent group name to a top-level property so that piping a membership into + # a cmdlet that binds -GroupName by property name sends a scalar selector instead of a + # stringified reference. Mutate in place: rebuilding the object would drop 'context' and + # any wire field a future REST version adds. + foreach ($item in @($response)) { + if ($null -ne $item -and $null -ne $item.group -and $null -ne $item.group.name -and + $item.PSObject.Properties.Name -notcontains 'GroupName') { + $item | Add-Member -MemberType NoteProperty -Name 'GroupName' -Value $item.group.name + } + } + $response } } diff --git a/Public/FileSystem/Get-PfbOpenFile.ps1 b/Public/FileSystem/Get-PfbOpenFile.ps1 index 6d7430c9..4dc02f15 100644 --- a/Public/FileSystem/Get-PfbOpenFile.ps1 +++ b/Public/FileSystem/Get-PfbOpenFile.ps1 @@ -4,46 +4,39 @@ function Get-PfbOpenFile { Retrieves open files from the FlashBlade. .DESCRIPTION Returns information about currently open files on file systems. Supports - filtering by file system name, ID, or advanced filter expressions. - Auto-paginates by default. - .PARAMETER Name - One or more file system names to retrieve open files for. Accepts pipeline input. + filtering by open-file ID. Auto-paginates by default. .PARAMETER Id - One or more open file IDs to retrieve. - .PARAMETER Filter - A server-side filter expression to narrow results. - .PARAMETER Sort - Sort field and direction. + One or more open file IDs to retrieve. Binds from the pipeline by property + name, so open-file objects (which carry 'id') can be piped in directly. .PARAMETER Limit Maximum number of items to return. .PARAMETER Array The FlashBlade connection object. If not specified, uses the default connection. .EXAMPLE Get-PfbOpenFile - Returns all open files on the FlashBlade. + + Returns open files on the FlashBlade. Note that this cmdlet does not send the + protocols query parameter the specification marks required; that gap is tracked + in Reports/PfbApiDriftReport.md rather than worked around here. .EXAMPLE - Get-PfbOpenFile -Name "fs01" - Returns all open files on file system 'fs01'. + Get-PfbOpenFile -Id "abc-123" + + Returns the open file with the specified ID. .EXAMPLE - Get-PfbOpenFile -Filter "protocol='SMB'" -Limit 100 - Returns up to 100 open files using the SMB protocol. + Get-PfbOpenFile | Where-Object { $_.lock_count -gt 0 } | Remove-PfbOpenFile + + Closes the locked open files. The -Id that binds from each piped object's 'id' + property is Remove-PfbOpenFile's, not this cmdlet's. Both declare + ValueFromPipelineByPropertyName rather than a bare ValueFromPipeline, so an object + matching no parameter is declined instead of being stringified into the selector. #> + # The spec-required protocols parameter and six optional gaps are tracked in Reports/PfbApiDriftReport.md. [CmdletBinding(DefaultParameterSetName = 'List')] param( - [Parameter(ParameterSetName = 'ByName', ValueFromPipeline, ValueFromPipelineByPropertyName)] - [ValidateNotNullOrEmpty()] - [string[]]$Name, - - [Parameter(ParameterSetName = 'ById')] + [Parameter(ParameterSetName = 'ById', ValueFromPipelineByPropertyName)] [ValidateNotNullOrEmpty()] [string[]]$Id, - [Parameter()] - [string]$Filter, - - [Parameter()] - [string]$Sort, - [Parameter()] [ValidateRange(1, 10000)] [int]$Limit, @@ -54,18 +47,16 @@ function Get-PfbOpenFile { begin { Assert-PfbConnection -Array ([ref]$Array) - $allNames = [System.Collections.Generic.List[string]]::new() $allIds = [System.Collections.Generic.List[string]]::new() } process { - if ($Name) { foreach ($n in $Name) { $allNames.Add($n) } } - if ($Id) { foreach ($i in $Id) { $allIds.Add($i) } } + if ($Id) { foreach ($i in $Id) { $allIds.Add($i) } } } end { $queryParams = @{} - Add-PfbCommonQueryParams -Into $queryParams -BoundParameters $PSBoundParameters -Names $allNames -Ids $allIds + Add-PfbCommonQueryParams -Into $queryParams -BoundParameters $PSBoundParameters -Ids $allIds Invoke-PfbApiRequest -Array $Array -Method GET -Endpoint 'file-systems/open-files' -QueryParams $queryParams -AutoPaginate } diff --git a/Public/FileSystem/Remove-PfbOpenFile.ps1 b/Public/FileSystem/Remove-PfbOpenFile.ps1 index 5dc51fdf..9ef3d95e 100644 --- a/Public/FileSystem/Remove-PfbOpenFile.ps1 +++ b/Public/FileSystem/Remove-PfbOpenFile.ps1 @@ -3,31 +3,28 @@ function Remove-PfbOpenFile { .SYNOPSIS Closes an open file on the FlashBlade. .DESCRIPTION - Forces the closure of an open file by file system name or ID. This is a + Forces the closure of an open file by its open-file ID. This is a disruptive operation that can cause data loss if the file is being actively written to by a client. - .PARAMETER Name - The name of the file system whose open file should be closed. .PARAMETER Id - The ID of the open file to close. + The ID of the open file to close. Binds from the pipeline by property name, + so open-file objects (which carry 'id') can be piped in directly. .PARAMETER Array The FlashBlade connection object. If not specified, uses the default connection. - .EXAMPLE - Remove-PfbOpenFile -Name "fs01" - Closes open files on file system 'fs01'. .EXAMPLE Remove-PfbOpenFile -Id "abc-123" Closes the open file with the specified ID. .EXAMPLE - Remove-PfbOpenFile -Name "fs01" -Confirm:$false + Remove-PfbOpenFile -Id "abc-123" -Confirm:$false Closes the open file without prompting for confirmation. + .EXAMPLE + Get-PfbOpenFile | Where-Object { $_.path -like '*\temp\*' } | Remove-PfbOpenFile -Confirm:$false + Closes the matching open files, one DELETE per piped object; -Id binds from + each object's 'id' property. #> [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'High')] param( - [Parameter(ParameterSetName = 'ByName', Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName)] - [string]$Name, - - [Parameter(ParameterSetName = 'ById', Mandatory)] + [Parameter(Mandatory, ValueFromPipelineByPropertyName)] [string]$Id, [Parameter()] @@ -40,12 +37,9 @@ function Remove-PfbOpenFile { process { $queryParams = @{} - if ($Name) { $queryParams['names'] = $Name } - if ($Id) { $queryParams['ids'] = $Id } - - $target = if ($Name) { $Name } else { $Id } + if ($Id) { $queryParams['ids'] = $Id } - if ($PSCmdlet.ShouldProcess($target, 'Close open file')) { + if ($PSCmdlet.ShouldProcess($Id, 'Close open file')) { Invoke-PfbApiRequest -Array $Array -Method DELETE -Endpoint 'file-systems/open-files' -QueryParams $queryParams } } diff --git a/Public/Misc/Get-PfbResourceAccess.ps1 b/Public/Misc/Get-PfbResourceAccess.ps1 index 3214fe86..62005ef4 100644 --- a/Public/Misc/Get-PfbResourceAccess.ps1 +++ b/Public/Misc/Get-PfbResourceAccess.ps1 @@ -6,10 +6,10 @@ function Get-PfbResourceAccess { The Get-PfbResourceAccess cmdlet returns resource access control entries from the connected Pure Storage FlashBlade. Resource accesses define which users or groups have access to specific resources. - .PARAMETER Name - One or more resource access names to retrieve. Accepts pipeline input. .PARAMETER Id - One or more resource access IDs to retrieve. + One or more resource access IDs to retrieve. Binds from the pipeline by + property name, so resource access objects (which carry 'id') can be piped + in directly. .PARAMETER Filter A server-side filter expression to narrow results. .PARAMETER Sort @@ -23,35 +23,37 @@ function Get-PfbResourceAccess { Retrieves all resource access entries from the connected FlashBlade. .EXAMPLE - Get-PfbResourceAccess -Name "access-prod" + Get-PfbResourceAccess -Id "10314f42-020d-7080-8013-000ddt400012" - Retrieves the resource access entry with the specified name. + Retrieves the resource access entry with the specified ID. .EXAMPLE Get-PfbResourceAccess -Filter "resource_type='file-system'" -Limit 20 Retrieves up to 20 file system resource access entries. + .EXAMPLE + Get-PfbResourceAccess | Where-Object { $_.scope.name -eq 'admin' } | Remove-PfbResourceAccess + + Removes the matching resource access entries; -Id binds from the 'id' + property of each piped object. #> [CmdletBinding(DefaultParameterSetName = 'List')] param( - [Parameter(ParameterSetName = 'ByName', ValueFromPipeline, ValueFromPipelineByPropertyName)] [string[]]$Name, - [Parameter(ParameterSetName = 'ById')] [string[]]$Id, + [Parameter(ParameterSetName = 'ById', ValueFromPipelineByPropertyName)] [string[]]$Id, [Parameter()] [string]$Filter, [Parameter()] [string]$Sort, [Parameter()] [int]$Limit, [Parameter()] [PSCustomObject]$Array ) begin { Assert-PfbConnection -Array ([ref]$Array) - $allNames = [System.Collections.Generic.List[string]]::new() $allIds = [System.Collections.Generic.List[string]]::new() } process { - if ($Name) { foreach ($n in $Name) { $allNames.Add($n) } } if ($Id) { foreach ($i in $Id) { $allIds.Add($i) } } } end { $queryParams = @{} - Add-PfbCommonQueryParams -Into $queryParams -BoundParameters $PSBoundParameters -Names $allNames -Ids $allIds + Add-PfbCommonQueryParams -Into $queryParams -BoundParameters $PSBoundParameters -Ids $allIds Invoke-PfbApiRequest -Array $Array -Method GET -Endpoint 'resource-accesses' -QueryParams $queryParams -AutoPaginate } } diff --git a/Public/Misc/Remove-PfbResourceAccess.ps1 b/Public/Misc/Remove-PfbResourceAccess.ps1 index 524a4f25..f80e0f96 100644 --- a/Public/Misc/Remove-PfbResourceAccess.ps1 +++ b/Public/Misc/Remove-PfbResourceAccess.ps1 @@ -4,30 +4,29 @@ function Remove-PfbResourceAccess { Removes a resource access entry from a FlashBlade array. .DESCRIPTION The Remove-PfbResourceAccess cmdlet deletes a resource access entry from the connected - Pure Storage FlashBlade. The entry can be identified by name or ID. - .PARAMETER Name - The name of the resource access to remove. Accepts pipeline input. + Pure Storage FlashBlade. The entry is identified by its ID. .PARAMETER Id - The ID of the resource access to remove. + The ID of the resource access to remove. Binds from the pipeline by property + name, so resource access objects (which carry 'id') can be piped in directly. .PARAMETER Array The FlashBlade connection object. If not specified, the default connection is used. .EXAMPLE - Remove-PfbResourceAccess -Name "access-old" + Remove-PfbResourceAccess -Id "10314f42-020d-7080-8013-000ddt400012" Removes the resource access entry after prompting for confirmation. .EXAMPLE - Remove-PfbResourceAccess -Name "access-test" -Confirm:$false + Remove-PfbResourceAccess -Id "10314f42-020d-7080-8013-000ddt400012" -Confirm:$false Removes the resource access entry without prompting. .EXAMPLE - Remove-PfbResourceAccess -Id "10314f42-020d-7080-8013-000ddt400012" + Get-PfbResourceAccess | Where-Object { $_.scope.name -eq 'admin' } | Remove-PfbResourceAccess -Confirm:$false - Removes the resource access entry by ID. + Removes every matching resource access entry, one DELETE per piped object; + -Id binds from each object's 'id' property. #> [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'High')] param( - [Parameter(ParameterSetName = 'ByName', Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName)] [string]$Name, - [Parameter(ParameterSetName = 'ById', Mandatory)] [string]$Id, + [Parameter(Mandatory, ValueFromPipelineByPropertyName)] [string]$Id, [Parameter()] [PSCustomObject]$Array ) begin { @@ -35,11 +34,9 @@ function Remove-PfbResourceAccess { } process { - $target = if ($Name) { $Name } else { $Id } $queryParams = @{} - if ($Name) { $queryParams['names'] = $Name } if ($Id) { $queryParams['ids'] = $Id } - if ($PSCmdlet.ShouldProcess($target, 'Remove resource access')) { + if ($PSCmdlet.ShouldProcess($Id, 'Remove resource access')) { Invoke-PfbApiRequest -Array $Array -Method DELETE -Endpoint 'resource-accesses' -QueryParams $queryParams } } diff --git a/Public/Network/Get-PfbNetworkConnectionStatistics.ps1 b/Public/Network/Get-PfbNetworkConnectionStatistics.ps1 index b00cf966..53d16e0f 100644 --- a/Public/Network/Get-PfbNetworkConnectionStatistics.ps1 +++ b/Public/Network/Get-PfbNetworkConnectionStatistics.ps1 @@ -6,8 +6,6 @@ function Get-PfbNetworkConnectionStatistics { The Get-PfbNetworkConnectionStatistics cmdlet returns connection-level statistics for network interfaces on the connected Pure Storage FlashBlade. This includes counters for active connections, connection rates, and protocol-level statistics. - .PARAMETER Name - One or more interface names to retrieve statistics for. .PARAMETER Filter A server-side filter expression. .PARAMETER Sort @@ -20,10 +18,6 @@ function Get-PfbNetworkConnectionStatistics { Get-PfbNetworkConnectionStatistics Retrieves connection statistics for all network interfaces. - .EXAMPLE - Get-PfbNetworkConnectionStatistics -Name "vip1" - - Retrieves connection statistics for the specified interface. .EXAMPLE Get-PfbNetworkConnectionStatistics -Filter "interface_type='vip'" -Sort "name" -Limit 10 @@ -31,7 +25,6 @@ function Get-PfbNetworkConnectionStatistics { #> [CmdletBinding()] param( - [Parameter(ValueFromPipeline, ValueFromPipelineByPropertyName)] [string[]]$Name, [Parameter()] [string]$Filter, [Parameter()] [string]$Sort, [Parameter()] [int]$Limit, @@ -39,14 +32,10 @@ function Get-PfbNetworkConnectionStatistics { ) begin { Assert-PfbConnection -Array ([ref]$Array) - $allNames = [System.Collections.Generic.List[string]]::new() - } - process { - if ($Name) { foreach ($n in $Name) { $allNames.Add($n) } } } end { $queryParams = @{} - Add-PfbCommonQueryParams -Into $queryParams -BoundParameters $PSBoundParameters -Names $allNames + Add-PfbCommonQueryParams -Into $queryParams -BoundParameters $PSBoundParameters Invoke-PfbApiRequest -Array $Array -Method GET -Endpoint 'network-interfaces/network-connection-statistics' -QueryParams $queryParams -AutoPaginate } } diff --git a/Public/Network/Get-PfbNetworkInterfaceNeighbor.ps1 b/Public/Network/Get-PfbNetworkInterfaceNeighbor.ps1 index 6856ee0b..185b8a39 100644 --- a/Public/Network/Get-PfbNetworkInterfaceNeighbor.ps1 +++ b/Public/Network/Get-PfbNetworkInterfaceNeighbor.ps1 @@ -4,11 +4,15 @@ function Get-PfbNetworkInterfaceNeighbor { Retrieves LLDP neighbor data for FlashBlade network interfaces. .DESCRIPTION The Get-PfbNetworkInterfaceNeighbor cmdlet returns Link Layer Discovery Protocol (LLDP) - neighbor information for network interfaces on the connected Pure Storage FlashBlade. + neighbor information for network interfaces on the connected FlashBlade. This data includes the remote switch name, port description, and chassis ID of directly connected network devices. - .PARAMETER Name - One or more interface names to retrieve neighbor data for. + + The selector on this endpoint is resource-specific: use -LocalPortName to select by + local port name (wire key 'local_port_names'). The endpoint does not accept the generic + 'names' query key. + .PARAMETER LocalPortName + One or more local port names to retrieve neighbor data for. Accepts pipeline input. .PARAMETER Filter A server-side filter expression. .PARAMETER Sort @@ -22,9 +26,9 @@ function Get-PfbNetworkInterfaceNeighbor { Retrieves LLDP neighbor data for all network interfaces. .EXAMPLE - Get-PfbNetworkInterfaceNeighbor -Name "CH1.FM1.ETH1" + Get-PfbNetworkInterfaceNeighbor -LocalPortName "CH1.FM1.ETH1" - Retrieves LLDP neighbor data for the specified interface. + Retrieves LLDP neighbor data for the specified local port. .EXAMPLE Get-PfbNetworkInterfaceNeighbor -Filter "port_description='Ethernet1/1'" -Limit 20 @@ -32,7 +36,14 @@ function Get-PfbNetworkInterfaceNeighbor { #> [CmdletBinding()] param( - [Parameter(ValueFromPipeline, ValueFromPipelineByPropertyName)] [string[]]$Name, + # Within this family, the cross-endpoint chain from Get-PfbNetworkInterface into Get-PfbNetworkInterfaceNeighbor + # cannot filter correctly: a producer's bare `name` bound to -LocalPortName / `local_port_names` + # is the defect because `name` means different things by endpoint and metadata cannot identify + # its producer, so no correct generic binding exists. An undeclared or non-matching query key + # returns HTTP 200 with the unfiltered collection, so the guard's loud failure is best. Do NOT + # remove it or add an alias: that flips WrongScalar to Bound while sending the wrong name; + # revisit only if the consumer can establish its producer, which metadata alone cannot. Issue #90. + [Parameter(ValueFromPipeline, ValueFromPipelineByPropertyName)] [string[]]$LocalPortName, [Parameter()] [string]$Filter, [Parameter()] [string]$Sort, [Parameter()] [int]$Limit, @@ -40,14 +51,21 @@ function Get-PfbNetworkInterfaceNeighbor { ) begin { Assert-PfbConnection -Array ([ref]$Array) - $allNames = [System.Collections.Generic.List[string]]::new() + $allLocalPortNames = [System.Collections.Generic.List[string]]::new() } process { - if ($Name) { foreach ($n in $Name) { $allNames.Add($n) } } + Assert-PfbSelectorNotCoerced -Value $LocalPortName -OriginalInput $PSItem -ParameterName 'LocalPortName' -Hint ( + 'Pipe the interface name instead, e.g. Get-PfbNetworkInterface | ' + + 'Select-Object -ExpandProperty name | Get-PfbNetworkInterfaceNeighbor, ' + + 'or pass -LocalPortName explicitly.') + if ($LocalPortName) { foreach ($n in $LocalPortName) { $allLocalPortNames.Add($n) } } } end { $queryParams = @{} - Add-PfbCommonQueryParams -Into $queryParams -BoundParameters $PSBoundParameters -Names $allNames + Add-PfbCommonQueryParams -Into $queryParams -BoundParameters $PSBoundParameters + if ($allLocalPortNames.Count -gt 0) { + $queryParams['local_port_names'] = $allLocalPortNames -join ',' + } Invoke-PfbApiRequest -Array $Array -Method GET -Endpoint 'network-interfaces/neighbors' -QueryParams $queryParams -AutoPaginate } } diff --git a/Public/ObjectStore/Get-PfbObjectStoreAccessPolicyRole.ps1 b/Public/ObjectStore/Get-PfbObjectStoreAccessPolicyRole.ps1 index 9c3432a4..6922fe6f 100644 --- a/Public/ObjectStore/Get-PfbObjectStoreAccessPolicyRole.ps1 +++ b/Public/ObjectStore/Get-PfbObjectStoreAccessPolicyRole.ps1 @@ -76,16 +76,23 @@ function Get-PfbObjectStoreAccessPolicyRole { if ($allMemberIds.Count -gt 0) { $queryParams['member_ids'] = $allMemberIds -join ',' } $response = Invoke-PfbApiRequest -Array $Array -Method GET -Endpoint 'object-store-access-policies/object-store-roles' -QueryParams $queryParams -AutoPaginate - foreach ($item in $response) { - if ($null -ne $item) { - $policyNameValue = $null - if ($null -ne $item.policy) { $policyNameValue = $item.policy.name } - $memberNameValue = $null - if ($null -ne $item.member) { $memberNameValue = $item.member.name } - $item | Add-Member -MemberType NoteProperty -Name 'PolicyName' -Value $policyNameValue -Force - $item | Add-Member -MemberType NoteProperty -Name 'MemberName' -Value $memberNameValue -Force + + # Lift the nested parent names to top-level properties so that piping an association into a + # cmdlet that binds -PolicyName or -MemberName by property name sends a scalar selector + # instead of a stringified reference. Add only when the nested object AND its name are + # non-null: a top-level property holding $null still binds downstream and would send an + # empty selector, which makes the consumer return everything. Mutate in place: rebuilding + # the object would drop 'context' and any wire field a future REST version adds. + foreach ($item in @($response)) { + if ($null -ne $item -and $null -ne $item.policy -and $null -ne $item.policy.name -and + $item.PSObject.Properties.Name -notcontains 'PolicyName') { + $item | Add-Member -MemberType NoteProperty -Name 'PolicyName' -Value $item.policy.name + } + if ($null -ne $item -and $null -ne $item.member -and $null -ne $item.member.name -and + $item.PSObject.Properties.Name -notcontains 'MemberName') { + $item | Add-Member -MemberType NoteProperty -Name 'MemberName' -Value $item.member.name } - $item } + $response } } diff --git a/Public/ObjectStore/Get-PfbObjectStoreAccessPolicyRule.ps1 b/Public/ObjectStore/Get-PfbObjectStoreAccessPolicyRule.ps1 index 4bfece21..94b9f5e3 100644 --- a/Public/ObjectStore/Get-PfbObjectStoreAccessPolicyRule.ps1 +++ b/Public/ObjectStore/Get-PfbObjectStoreAccessPolicyRule.ps1 @@ -55,6 +55,10 @@ function Get-PfbObjectStoreAccessPolicyRule { } process { + Assert-PfbSelectorNotCoerced -Value $PolicyName -OriginalInput $PSItem -ParameterName 'PolicyName' -Hint ( + 'Pipe the policy name instead, e.g. Get-PfbObjectStoreAccessPolicy | ' + + 'Select-Object -ExpandProperty name | Get-PfbObjectStoreAccessPolicyRule, ' + + 'or pass -PolicyName explicitly.') if ($PolicyName) { foreach ($n in $PolicyName) { $allPolicyNames.Add($n) } } if ($PolicyId) { foreach ($i in $PolicyId) { $allPolicyIds.Add($i) } } if ($Name) { foreach ($n in $Name) { $allNames.Add($n) } } @@ -66,6 +70,26 @@ function Get-PfbObjectStoreAccessPolicyRule { if ($allPolicyNames.Count -gt 0) { $queryParams['policy_names'] = $allPolicyNames -join ',' } if ($allPolicyIds.Count -gt 0) { $queryParams['policy_ids'] = $allPolicyIds -join ',' } - Invoke-PfbApiRequest -Array $Array -Method GET -Endpoint 'object-store-access-policies/rules' -QueryParams $queryParams -AutoPaginate + $response = Invoke-PfbApiRequest -Array $Array -Method GET -Endpoint 'object-store-access-policies/rules' -QueryParams $queryParams -AutoPaginate + + # Lift the nested parent policy name to a top-level property so that piping a rule into a + # cmdlet that binds -PolicyName by property name sends a scalar selector instead of a + # stringified reference. Mutate in place: rebuilding the object would drop 'context' and + # any wire field a future REST version adds. + # + # Do NOT delete this lift because the selector rail reports the pair Coerced -- that row is + # an artifact. The rail's probe item is synthesized from the spec's declared response fields + # and never runs a producer cmdlet, so a property added here at runtime cannot appear on it; + # measured Bound against the real module once the lifted PolicyName is present. This makes + # same-family piping work, but an item lifted by a different policy family can bind silently + # when both policies share a name, where the guard used to throw. The rail cannot see that + # cost because its spec-derived probes never carry runtime-added properties. Reasoning: issue #90. + foreach ($item in @($response)) { + if ($null -ne $item -and $null -ne $item.policy -and $null -ne $item.policy.name -and + $item.PSObject.Properties.Name -notcontains 'PolicyName') { + $item | Add-Member -MemberType NoteProperty -Name 'PolicyName' -Value $item.policy.name + } + } + $response } } diff --git a/Public/ObjectStore/Get-PfbObjectStoreTrustPolicy.ps1 b/Public/ObjectStore/Get-PfbObjectStoreTrustPolicy.ps1 index 4c017e64..36800792 100644 --- a/Public/ObjectStore/Get-PfbObjectStoreTrustPolicy.ps1 +++ b/Public/ObjectStore/Get-PfbObjectStoreTrustPolicy.ps1 @@ -49,6 +49,9 @@ function Get-PfbObjectStoreTrustPolicy { } process { + Assert-PfbSelectorNotCoerced -Value $RoleName -OriginalInput $PSItem -ParameterName 'RoleName' -Hint ( + 'Pipe the role name instead, e.g. Get-PfbObjectStoreRole | ' + + 'Select-Object -ExpandProperty name | Get-PfbObjectStoreTrustPolicy, or pass -RoleName explicitly.') if ($RoleName) { foreach ($n in $RoleName) { $allRoleNames.Add($n) } } if ($RoleId) { foreach ($i in $RoleId) { $allRoleIds.Add($i) } } } @@ -59,6 +62,25 @@ function Get-PfbObjectStoreTrustPolicy { if ($allRoleNames.Count -gt 0) { $queryParams['role_names'] = $allRoleNames -join ',' } if ($allRoleIds.Count -gt 0) { $queryParams['role_ids'] = $allRoleIds -join ',' } - Invoke-PfbApiRequest -Array $Array -Method GET -Endpoint 'object-store-roles/object-store-trust-policies' -QueryParams $queryParams -AutoPaginate + $response = Invoke-PfbApiRequest -Array $Array -Method GET -Endpoint 'object-store-roles/object-store-trust-policies' -QueryParams $queryParams -AutoPaginate + + # Lift the nested parent role name to a top-level property so that piping a trust policy + # into a cmdlet that binds -RoleName by property name sends a scalar selector instead of a + # stringified reference. Mutate in place: rebuilding the object would drop 'context' and + # any wire field a future REST version adds. + # + # Do NOT delete this lift because the selector rail reports the pair Coerced -- that row is + # an artifact. The rail's probe item is synthesized from the spec's declared response fields + # and never runs a producer cmdlet, so a property added here at runtime cannot appear on it; + # measured Bound against the real module once the lifted RoleName is present. A Coerced row + # from a DIFFERENT producer endpoint is real, not artifact: the lift only reaches items this + # cmdlet returns, which is what the process-block guard covers. Reasoning: issue #90. + foreach ($item in @($response)) { + if ($null -ne $item -and $null -ne $item.role -and $null -ne $item.role.name -and + $item.PSObject.Properties.Name -notcontains 'RoleName') { + $item | Add-Member -MemberType NoteProperty -Name 'RoleName' -Value $item.role.name + } + } + $response } } diff --git a/Public/ObjectStore/Get-PfbObjectStoreTrustPolicyRule.ps1 b/Public/ObjectStore/Get-PfbObjectStoreTrustPolicyRule.ps1 index a09fec3b..09c5b730 100644 --- a/Public/ObjectStore/Get-PfbObjectStoreTrustPolicyRule.ps1 +++ b/Public/ObjectStore/Get-PfbObjectStoreTrustPolicyRule.ps1 @@ -8,8 +8,6 @@ function Get-PfbObjectStoreTrustPolicyRule { assume the role. .PARAMETER PolicyName One or more trust policy names to filter by. - .PARAMETER PolicyId - One or more trust policy IDs to filter by. .PARAMETER Name One or more fully-qualified rule names to retrieve. .PARAMETER Filter @@ -20,9 +18,6 @@ function Get-PfbObjectStoreTrustPolicyRule { Maximum number of items to return. .PARAMETER Array The FlashBlade connection object. - .EXAMPLE - Get-PfbObjectStoreTrustPolicyRule - Returns all trust policy rules. .EXAMPLE Get-PfbObjectStoreTrustPolicyRule -PolicyName "s3-admin-role/trust-policy" Returns rules for the specified trust policy. @@ -35,9 +30,6 @@ function Get-PfbObjectStoreTrustPolicyRule { [Parameter(Mandatory, ParameterSetName = 'ByPolicyName', Position = 0, ValueFromPipeline, ValueFromPipelineByPropertyName)] [string[]]$PolicyName, - [Parameter(Mandatory, ParameterSetName = 'ByPolicyId')] - [string[]]$PolicyId, - [Parameter(Mandatory, ParameterSetName = 'ByName')] [string[]]$Name, @@ -50,13 +42,15 @@ function Get-PfbObjectStoreTrustPolicyRule { begin { Assert-PfbConnection -Array ([ref]$Array) $allPolicyNames = [System.Collections.Generic.List[string]]::new() - $allPolicyIds = [System.Collections.Generic.List[string]]::new() $allNames = [System.Collections.Generic.List[string]]::new() } process { + Assert-PfbSelectorNotCoerced -Value $PolicyName -OriginalInput $PSItem -ParameterName 'PolicyName' -Hint ( + 'Pipe the trust-policy name instead, e.g. Get-PfbObjectStoreTrustPolicy -RoleName r | ' + + 'Select-Object -ExpandProperty name | Get-PfbObjectStoreTrustPolicyRule, ' + + 'or pass -PolicyName explicitly.') if ($PolicyName) { foreach ($n in $PolicyName) { $allPolicyNames.Add($n) } } - if ($PolicyId) { foreach ($i in $PolicyId) { $allPolicyIds.Add($i) } } if ($Name) { foreach ($n in $Name) { $allNames.Add($n) } } } @@ -64,8 +58,26 @@ function Get-PfbObjectStoreTrustPolicyRule { $queryParams = @{} Add-PfbCommonQueryParams -Into $queryParams -BoundParameters $PSBoundParameters -Names $allNames if ($allPolicyNames.Count -gt 0) { $queryParams['policy_names'] = $allPolicyNames -join ',' } - if ($allPolicyIds.Count -gt 0) { $queryParams['policy_ids'] = $allPolicyIds -join ',' } - Invoke-PfbApiRequest -Array $Array -Method GET -Endpoint 'object-store-roles/object-store-trust-policies/rules' -QueryParams $queryParams -AutoPaginate + $response = Invoke-PfbApiRequest -Array $Array -Method GET -Endpoint 'object-store-roles/object-store-trust-policies/rules' -QueryParams $queryParams -AutoPaginate + + # Lift the nested parent policy name to a top-level property so that piping a rule into a + # cmdlet that binds -PolicyName by property name sends a scalar selector instead of a + # stringified reference. Mutate in place: rebuilding the object would drop 'context' and + # any wire field a future REST version adds. + # + # Do NOT delete this lift because the selector rail reports the pair Coerced -- that row is + # an artifact. The rail's probe item is synthesized from the spec's declared response fields + # and never runs a producer cmdlet, so a property added here at runtime cannot appear on it; + # measured Bound against the real module once the lifted PolicyName is present. A Coerced + # row from a DIFFERENT producer endpoint is real, not artifact: the lift only reaches items + # this cmdlet returns, which is what the process-block guard covers. Reasoning: issue #90. + foreach ($item in @($response)) { + if ($null -ne $item -and $null -ne $item.policy -and $null -ne $item.policy.name -and + $item.PSObject.Properties.Name -notcontains 'PolicyName') { + $item | Add-Member -MemberType NoteProperty -Name 'PolicyName' -Value $item.policy.name + } + } + $response } } diff --git a/Public/Policy/Get-PfbNetworkAccessRule.ps1 b/Public/Policy/Get-PfbNetworkAccessRule.ps1 index e918c282..73d330ab 100644 --- a/Public/Policy/Get-PfbNetworkAccessRule.ps1 +++ b/Public/Policy/Get-PfbNetworkAccessRule.ps1 @@ -57,6 +57,9 @@ function Get-PfbNetworkAccessRule { } process { + Assert-PfbSelectorNotCoerced -Value $PolicyName -OriginalInput $PSItem -ParameterName 'PolicyName' -Hint ( + 'Pipe the policy name instead, e.g. Get-PfbNetworkAccessPolicy | ' + + 'Select-Object -ExpandProperty name | Get-PfbNetworkAccessRule, or pass -PolicyName explicitly.') if ($PolicyName) { foreach ($n in $PolicyName) { $allPolicyNames.Add($n) } } if ($PolicyId) { foreach ($i in $PolicyId) { $allPolicyIds.Add($i) } } } @@ -67,6 +70,26 @@ function Get-PfbNetworkAccessRule { if ($allPolicyNames.Count -gt 0) { $queryParams['policy_names'] = $allPolicyNames -join ',' } if ($allPolicyIds.Count -gt 0) { $queryParams['policy_ids'] = $allPolicyIds -join ',' } - Invoke-PfbApiRequest -Array $Array -Method GET -Endpoint 'network-access-policies/rules' -QueryParams $queryParams -AutoPaginate + $response = Invoke-PfbApiRequest -Array $Array -Method GET -Endpoint 'network-access-policies/rules' -QueryParams $queryParams -AutoPaginate + + # Lift the nested parent policy name to a top-level property so that piping a rule into a + # cmdlet that binds -PolicyName by property name sends a scalar selector instead of a + # stringified reference. Mutate in place: rebuilding the object would drop 'context' and + # any wire field a future REST version adds. + # + # Do NOT delete this lift because the selector rail reports the pair Coerced -- that row is + # an artifact. The rail's probe item is synthesized from the spec's declared response fields + # and never runs a producer cmdlet, so a property added here at runtime cannot appear on it; + # measured Bound against the real module once the lifted PolicyName is present. This makes + # same-family piping work, but an item lifted by a different policy family can bind silently + # when both policies share a name, where the guard used to throw. The rail cannot see that + # cost because its spec-derived probes never carry runtime-added properties. Reasoning: issue #90. + foreach ($item in @($response)) { + if ($null -ne $item -and $null -ne $item.policy -and $null -ne $item.policy.name -and + $item.PSObject.Properties.Name -notcontains 'PolicyName') { + $item | Add-Member -MemberType NoteProperty -Name 'PolicyName' -Value $item.policy.name + } + } + $response } } diff --git a/Public/Policy/Get-PfbNfsExportRule.ps1 b/Public/Policy/Get-PfbNfsExportRule.ps1 index 279f0dc6..5a95c882 100644 --- a/Public/Policy/Get-PfbNfsExportRule.ps1 +++ b/Public/Policy/Get-PfbNfsExportRule.ps1 @@ -57,6 +57,9 @@ function Get-PfbNfsExportRule { } process { + Assert-PfbSelectorNotCoerced -Value $PolicyName -OriginalInput $PSItem -ParameterName 'PolicyName' -Hint ( + 'Pipe the policy name instead, e.g. Get-PfbNfsExportPolicy | ' + + 'Select-Object -ExpandProperty name | Get-PfbNfsExportRule, or pass -PolicyName explicitly.') if ($PolicyName) { foreach ($n in $PolicyName) { $allPolicyNames.Add($n) } } if ($PolicyId) { foreach ($i in $PolicyId) { $allPolicyIds.Add($i) } } } @@ -67,6 +70,26 @@ function Get-PfbNfsExportRule { if ($allPolicyNames.Count -gt 0) { $queryParams['policy_names'] = $allPolicyNames -join ',' } if ($allPolicyIds.Count -gt 0) { $queryParams['policy_ids'] = $allPolicyIds -join ',' } - Invoke-PfbApiRequest -Array $Array -Method GET -Endpoint 'nfs-export-policies/rules' -QueryParams $queryParams -AutoPaginate + $response = Invoke-PfbApiRequest -Array $Array -Method GET -Endpoint 'nfs-export-policies/rules' -QueryParams $queryParams -AutoPaginate + + # Lift the nested parent policy name to a top-level property so that piping a rule into a + # cmdlet that binds -PolicyName by property name sends a scalar selector instead of a + # stringified reference. Mutate in place: rebuilding the object would drop 'context' and + # any wire field a future REST version adds. + # + # Do NOT delete this lift because the selector rail reports the pair Coerced -- that row is + # an artifact. The rail's probe item is synthesized from the spec's declared response fields + # and never runs a producer cmdlet, so a property added here at runtime cannot appear on it; + # measured Bound against the real module once the lifted PolicyName is present. This makes + # same-family piping work, but an item lifted by a different policy family can bind silently + # when both policies share a name, where the guard used to throw. The rail cannot see that + # cost because its spec-derived probes never carry runtime-added properties. Reasoning: issue #90. + foreach ($item in @($response)) { + if ($null -ne $item -and $null -ne $item.policy -and $null -ne $item.policy.name -and + $item.PSObject.Properties.Name -notcontains 'PolicyName') { + $item | Add-Member -MemberType NoteProperty -Name 'PolicyName' -Value $item.policy.name + } + } + $response } } diff --git a/Public/Policy/Get-PfbS3ExportRule.ps1 b/Public/Policy/Get-PfbS3ExportRule.ps1 index 82eb9956..8f40309a 100644 --- a/Public/Policy/Get-PfbS3ExportRule.ps1 +++ b/Public/Policy/Get-PfbS3ExportRule.ps1 @@ -57,6 +57,9 @@ function Get-PfbS3ExportRule { } process { + Assert-PfbSelectorNotCoerced -Value $PolicyName -OriginalInput $PSItem -ParameterName 'PolicyName' -Hint ( + 'Pipe the policy name instead, e.g. Get-PfbS3ExportPolicy | ' + + 'Select-Object -ExpandProperty name | Get-PfbS3ExportRule, or pass -PolicyName explicitly.') if ($PolicyName) { foreach ($n in $PolicyName) { $allPolicyNames.Add($n) } } if ($PolicyId) { foreach ($i in $PolicyId) { $allPolicyIds.Add($i) } } } @@ -67,6 +70,26 @@ function Get-PfbS3ExportRule { if ($allPolicyNames.Count -gt 0) { $queryParams['policy_names'] = $allPolicyNames -join ',' } if ($allPolicyIds.Count -gt 0) { $queryParams['policy_ids'] = $allPolicyIds -join ',' } - Invoke-PfbApiRequest -Array $Array -Method GET -Endpoint 's3-export-policies/rules' -QueryParams $queryParams -AutoPaginate + $response = Invoke-PfbApiRequest -Array $Array -Method GET -Endpoint 's3-export-policies/rules' -QueryParams $queryParams -AutoPaginate + + # Lift the nested parent policy name to a top-level property so that piping a rule into a + # cmdlet that binds -PolicyName by property name sends a scalar selector instead of a + # stringified reference. Mutate in place: rebuilding the object would drop 'context' and + # any wire field a future REST version adds. + # + # Do NOT delete this lift because the selector rail reports the pair Coerced -- that row is + # an artifact. The rail's probe item is synthesized from the spec's declared response fields + # and never runs a producer cmdlet, so a property added here at runtime cannot appear on it; + # measured Bound against the real module once the lifted PolicyName is present. This makes + # same-family piping work, but an item lifted by a different policy family can bind silently + # when both policies share a name, where the guard used to throw. The rail cannot see that + # cost because its spec-derived probes never carry runtime-added properties. Reasoning: issue #90. + foreach ($item in @($response)) { + if ($null -ne $item -and $null -ne $item.policy -and $null -ne $item.policy.name -and + $item.PSObject.Properties.Name -notcontains 'PolicyName') { + $item | Add-Member -MemberType NoteProperty -Name 'PolicyName' -Value $item.policy.name + } + } + $response } } diff --git a/Public/Policy/Get-PfbSmbClientRule.ps1 b/Public/Policy/Get-PfbSmbClientRule.ps1 index 61d70d12..8e0ad917 100644 --- a/Public/Policy/Get-PfbSmbClientRule.ps1 +++ b/Public/Policy/Get-PfbSmbClientRule.ps1 @@ -57,6 +57,9 @@ function Get-PfbSmbClientRule { } process { + Assert-PfbSelectorNotCoerced -Value $PolicyName -OriginalInput $PSItem -ParameterName 'PolicyName' -Hint ( + 'Pipe the policy name instead, e.g. Get-PfbSmbClientPolicy | ' + + 'Select-Object -ExpandProperty name | Get-PfbSmbClientRule, or pass -PolicyName explicitly.') if ($PolicyName) { foreach ($n in $PolicyName) { $allPolicyNames.Add($n) } } if ($PolicyId) { foreach ($i in $PolicyId) { $allPolicyIds.Add($i) } } } @@ -67,6 +70,26 @@ function Get-PfbSmbClientRule { if ($allPolicyNames.Count -gt 0) { $queryParams['policy_names'] = $allPolicyNames -join ',' } if ($allPolicyIds.Count -gt 0) { $queryParams['policy_ids'] = $allPolicyIds -join ',' } - Invoke-PfbApiRequest -Array $Array -Method GET -Endpoint 'smb-client-policies/rules' -QueryParams $queryParams -AutoPaginate + $response = Invoke-PfbApiRequest -Array $Array -Method GET -Endpoint 'smb-client-policies/rules' -QueryParams $queryParams -AutoPaginate + + # Lift the nested parent policy name to a top-level property so that piping a rule into a + # cmdlet that binds -PolicyName by property name sends a scalar selector instead of a + # stringified reference. Mutate in place: rebuilding the object would drop 'context' and + # any wire field a future REST version adds. + # + # Do NOT delete this lift because the selector rail reports the pair Coerced -- that row is + # an artifact. The rail's probe item is synthesized from the spec's declared response fields + # and never runs a producer cmdlet, so a property added here at runtime cannot appear on it; + # measured Bound against the real module once the lifted PolicyName is present. This makes + # same-family piping work, but an item lifted by a different policy family can bind silently + # when both policies share a name, where the guard used to throw. The rail cannot see that + # cost because its spec-derived probes never carry runtime-added properties. Reasoning: issue #90. + foreach ($item in @($response)) { + if ($null -ne $item -and $null -ne $item.policy -and $null -ne $item.policy.name -and + $item.PSObject.Properties.Name -notcontains 'PolicyName') { + $item | Add-Member -MemberType NoteProperty -Name 'PolicyName' -Value $item.policy.name + } + } + $response } } diff --git a/Public/Policy/Get-PfbSmbShareRule.ps1 b/Public/Policy/Get-PfbSmbShareRule.ps1 index 7a508d08..129adf6a 100644 --- a/Public/Policy/Get-PfbSmbShareRule.ps1 +++ b/Public/Policy/Get-PfbSmbShareRule.ps1 @@ -57,6 +57,9 @@ function Get-PfbSmbShareRule { } process { + Assert-PfbSelectorNotCoerced -Value $PolicyName -OriginalInput $PSItem -ParameterName 'PolicyName' -Hint ( + 'Pipe the policy name instead, e.g. Get-PfbSmbSharePolicy | ' + + 'Select-Object -ExpandProperty name | Get-PfbSmbShareRule, or pass -PolicyName explicitly.') if ($PolicyName) { foreach ($n in $PolicyName) { $allPolicyNames.Add($n) } } if ($PolicyId) { foreach ($i in $PolicyId) { $allPolicyIds.Add($i) } } } @@ -67,6 +70,26 @@ function Get-PfbSmbShareRule { if ($allPolicyNames.Count -gt 0) { $queryParams['policy_names'] = $allPolicyNames -join ',' } if ($allPolicyIds.Count -gt 0) { $queryParams['policy_ids'] = $allPolicyIds -join ',' } - Invoke-PfbApiRequest -Array $Array -Method GET -Endpoint 'smb-share-policies/rules' -QueryParams $queryParams -AutoPaginate + $response = Invoke-PfbApiRequest -Array $Array -Method GET -Endpoint 'smb-share-policies/rules' -QueryParams $queryParams -AutoPaginate + + # Lift the nested parent policy name to a top-level property so that piping a rule into a + # cmdlet that binds -PolicyName by property name sends a scalar selector instead of a + # stringified reference. Mutate in place: rebuilding the object would drop 'context' and + # any wire field a future REST version adds. + # + # Do NOT delete this lift because the selector rail reports the pair Coerced -- that row is + # an artifact. The rail's probe item is synthesized from the spec's declared response fields + # and never runs a producer cmdlet, so a property added here at runtime cannot appear on it; + # measured Bound against the real module once the lifted PolicyName is present. This makes + # same-family piping work, but an item lifted by a different policy family can bind silently + # when both policies share a name, where the guard used to throw. The rail cannot see that + # cost because its spec-derived probes never carry runtime-added properties. Reasoning: issue #90. + foreach ($item in @($response)) { + if ($null -ne $item -and $null -ne $item.policy -and $null -ne $item.policy.name -and + $item.PSObject.Properties.Name -notcontains 'PolicyName') { + $item | Add-Member -MemberType NoteProperty -Name 'PolicyName' -Value $item.policy.name + } + } + $response } } diff --git a/Public/Policy/Get-PfbUserGroupQuotaPolicyRule.ps1 b/Public/Policy/Get-PfbUserGroupQuotaPolicyRule.ps1 index b459e756..117428c8 100644 --- a/Public/Policy/Get-PfbUserGroupQuotaPolicyRule.ps1 +++ b/Public/Policy/Get-PfbUserGroupQuotaPolicyRule.ps1 @@ -28,6 +28,15 @@ function Get-PfbUserGroupQuotaPolicyRule { #> [CmdletBinding(DefaultParameterSetName = 'List')] param( + # -PolicyName maps to policy_names, which the published OpenAPI spec does NOT declare on + # GET user-group-quota-policies/rules in any of the four versions carrying the endpoint + # (2.25-2.28), though it IS declared on that path's POST and DELETE and on both sibling + # sub-collections. Measured against an array, the key is parsed and validated server-side, + # while a genuinely unknown key on the same endpoint is silently ignored with HTTP 200. + # That proves the key is acted on; it does NOT demonstrate row filtering, which would need + # two policies each owning a rule. Do NOT treat the parameter as supported or lower the + # module's capability floor on that evidence -- the published spec governs, so this pair + # keeps a selector waiver instead. Reasoning: issue #90. [Parameter(ParameterSetName = 'ByPolicyName', ValueFromPipeline, ValueFromPipelineByPropertyName)] [string[]]$PolicyName, diff --git a/Public/Realm/Get-PfbRealmDefaults.ps1 b/Public/Realm/Get-PfbRealmDefaults.ps1 index 99f2c49c..9b99812b 100644 --- a/Public/Realm/Get-PfbRealmDefaults.ps1 +++ b/Public/Realm/Get-PfbRealmDefaults.ps1 @@ -4,8 +4,11 @@ function Get-PfbRealmDefaults { Retrieves realm default settings from a FlashBlade array. .DESCRIPTION The Get-PfbRealmDefaults cmdlet returns the default settings for realms on the - connected Pure Storage FlashBlade. - .PARAMETER Name + connected FlashBlade. + + The selector on this endpoint is resource-specific: use -RealmName to select by realm + name (wire key 'realm_names'). The endpoint does not accept the generic 'names' query key. + .PARAMETER RealmName One or more realm names to retrieve defaults for. Accepts pipeline input. .PARAMETER Filter A server-side filter expression to narrow results. @@ -20,7 +23,7 @@ function Get-PfbRealmDefaults { Retrieves all realm defaults from the connected FlashBlade. .EXAMPLE - Get-PfbRealmDefaults -Name "realm-prod" + Get-PfbRealmDefaults -RealmName "realm-prod" Retrieves defaults for the specified realm. .EXAMPLE @@ -30,22 +33,35 @@ function Get-PfbRealmDefaults { #> [CmdletBinding()] param( - [Parameter(ValueFromPipeline, ValueFromPipelineByPropertyName)] [string[]]$Name, + # Within this family, the cross-endpoint chain from Get-PfbRealm into Get-PfbRealmDefaults cannot + # filter correctly: a producer's bare `name` bound to -RealmName / `realm_names` is the + # defect because `name` means different things by endpoint and metadata cannot identify its + # producer, so no correct generic binding exists. An undeclared or non-matching query key + # returns HTTP 200 with the unfiltered collection, so the guard's loud failure is best. Do NOT + # remove it or add an alias: that flips WrongScalar to Bound while sending the wrong name; + # revisit only if the consumer can establish its producer, which metadata alone cannot. Issue #90. + [Parameter(ValueFromPipeline, ValueFromPipelineByPropertyName)] [string[]]$RealmName, [Parameter()] [string]$Filter, [Parameter()] [string]$Sort, [Parameter()] [int]$Limit, [Parameter()] [PSCustomObject]$Array ) begin { Assert-PfbConnection -Array ([ref]$Array) - $allNames = [System.Collections.Generic.List[string]]::new() + $allRealmNames = [System.Collections.Generic.List[string]]::new() } process { - if ($Name) { foreach ($n in $Name) { $allNames.Add($n) } } + Assert-PfbSelectorNotCoerced -Value $RealmName -OriginalInput $PSItem -ParameterName 'RealmName' -Hint ( + 'Pipe the realm name instead, e.g. Get-PfbRealm | Select-Object -ExpandProperty name | ' + + 'Get-PfbRealmDefaults, or pass -RealmName explicitly.') + if ($RealmName) { foreach ($n in $RealmName) { $allRealmNames.Add($n) } } } end { $queryParams = @{} - Add-PfbCommonQueryParams -Into $queryParams -BoundParameters $PSBoundParameters -Names $allNames + Add-PfbCommonQueryParams -Into $queryParams -BoundParameters $PSBoundParameters + if ($allRealmNames.Count -gt 0) { + $queryParams['realm_names'] = $allRealmNames -join ',' + } Invoke-PfbApiRequest -Array $Array -Method GET -Endpoint 'realms/defaults' -QueryParams $queryParams -AutoPaginate } } diff --git a/Public/Replication/Get-PfbArrayConnectionKey.ps1 b/Public/Replication/Get-PfbArrayConnectionKey.ps1 index b7df9e15..708ad8bd 100644 --- a/Public/Replication/Get-PfbArrayConnectionKey.ps1 +++ b/Public/Replication/Get-PfbArrayConnectionKey.ps1 @@ -7,7 +7,10 @@ function Get-PfbArrayConnectionKey { the connected Pure Storage FlashBlade. Connection keys are used to authenticate array-to-array replication connections. .PARAMETER Name - One or more connection names to retrieve keys for. Accepts pipeline input. + One or more connection names. Accepts pipeline input. The endpoint declares the + generic names query parameter, so this cmdlet sends that key when the parameter is + supplied, but the items the endpoint returns carry no name of their own, so the key + does not narrow the result. .PARAMETER Filter A server-side filter expression to narrow results. .PARAMETER Sort @@ -23,7 +26,8 @@ function Get-PfbArrayConnectionKey { .EXAMPLE Get-PfbArrayConnectionKey -Name "remote-fb-dc2" - Retrieves the connection key for the specified array connection. + Sends the declared names query key. The endpoint's items carry no name, so this does + not narrow the result -- every array connection key is still returned. .EXAMPLE Get-PfbArrayConnectionKey -Limit 5 @@ -31,7 +35,30 @@ function Get-PfbArrayConnectionKey { #> [CmdletBinding()] param( - [Parameter(ValueFromPipeline, ValueFromPipelineByPropertyName)] [string[]]$Name, + # NAME-based piping stays impossible here, by decision rather than oversight. + # GET /array-connections/connection-key items carry only connection_key, created and + # expires -- no name field and no nested object -- so there is nothing to bind by property + # name and nothing to lift, and an item of that shape reaches by-value coercion. Aliasing + # a differently-meaning field onto -Name was considered and rejected as worse than the gap. + # Do NOT add an alias or a lift here; only an API change adding a name to the endpoint's + # items would move it. + # + # No IDENTITY-based selector can work here either, and that is a property of the endpoint + # rather than of this cmdlet. components.schemas.ArrayConnectionKey -- the item type this + # endpoint returns -- declares exactly connection_key, created and expires at every spec + # version 2.0 through 2.28, and it is a flat object with no allOf, so it does not inherit + # the base schema that supplies id and name to ordinary resources. The generic ids and + # names query keys select resources of the endpoint they are given to, by the identifier + # those resources carry; an item carrying neither has nothing for either key to match. An + # -Id parameter was briefly added here and then removed for exactly that reason: it + # reasoned from the response shape of GET /array-connections, a different endpoint whose + # items do carry id, to this endpoint's query capability. Piping array-connection output + # into this cmdlet therefore cannot filter, and the coercion guard in the process block is + # the entire remedy -- it turns a silently unfiltered result into a loud error. + # Reasoning: issue #90. + [Parameter(ValueFromPipeline, ValueFromPipelineByPropertyName)] + [string[]]$Name, + [Parameter()] [string]$Filter, [Parameter()] [string]$Sort, [Parameter()] [int]$Limit, [Parameter()] [PSCustomObject]$Array ) @@ -41,11 +68,19 @@ function Get-PfbArrayConnectionKey { } process { + Assert-PfbSelectorNotCoerced -Value $Name -OriginalInput $PSItem -ParameterName 'Name' -Hint ( + 'This endpoint cannot be filtered by connection identity at all: its items carry ' + + 'neither an id nor a name, so neither the ids nor the names query key has anything ' + + 'to select on. Call Get-PfbArrayConnectionKey with no selector and match the keys ' + + 'you want from the returned collection.') if ($Name) { foreach ($n in $Name) { $allNames.Add($n) } } } end { $queryParams = @{} + # `names` is a generic key on this endpoint, so the common helper carries it: it emits + # `names` for -Names. The key goes on the wire because the spec declares it, not because + # it narrows anything -- see the note on -Name above. Add-PfbCommonQueryParams -Into $queryParams -BoundParameters $PSBoundParameters -Names $allNames Invoke-PfbApiRequest -Array $Array -Method GET -Endpoint 'array-connections/connection-key' -QueryParams $queryParams -AutoPaginate } diff --git a/Public/Replication/Get-PfbFleetKey.ps1 b/Public/Replication/Get-PfbFleetKey.ps1 index 9b7fa818..c2a7d60e 100644 --- a/Public/Replication/Get-PfbFleetKey.ps1 +++ b/Public/Replication/Get-PfbFleetKey.ps1 @@ -5,13 +5,13 @@ function Get-PfbFleetKey { .DESCRIPTION The Get-PfbFleetKey cmdlet returns fleet key information from the connected Pure Storage FlashBlade. Fleet keys are used to authenticate fleet member enrollment. Results can be - filtered by name or a server-side filter expression. - .PARAMETER Name - One or more fleet names to retrieve keys for. Accepts pipeline input. + narrowed with a server-side filter expression. .PARAMETER Filter A server-side filter expression to narrow results. .PARAMETER Sort - Sort field and direction (e.g., "name" or "name-"). + Sort field and direction (e.g., "expires" or "expires-"). Fleet key items + carry only 'created', 'expires' and 'fleet_key' -- there is no 'name' + field to sort or filter on. .PARAMETER Limit Maximum number of entries to return. .PARAMETER Array @@ -21,32 +21,24 @@ function Get-PfbFleetKey { Retrieves all fleet keys from the connected FlashBlade. .EXAMPLE - Get-PfbFleetKey -Name "fleet-prod" + Get-PfbFleetKey -Filter "expires>0" -Limit 5 - Retrieves the fleet key for the fleet named "fleet-prod". - .EXAMPLE - Get-PfbFleetKey -Filter "name='fleet*'" -Limit 5 - - Retrieves up to 5 fleet keys matching the filter. + Retrieves up to 5 fleet keys that carry an expiry time. Fleet key items + expose only 'created', 'expires' and 'fleet_key', so a filter must + reference one of those fields. #> [CmdletBinding()] param( - [Parameter(ValueFromPipeline, ValueFromPipelineByPropertyName)] [string[]]$Name, [Parameter()] [string]$Filter, [Parameter()] [string]$Sort, [Parameter()] [int]$Limit, [Parameter()] [PSCustomObject]$Array ) begin { Assert-PfbConnection -Array ([ref]$Array) - $allNames = [System.Collections.Generic.List[string]]::new() - } - - process { - if ($Name) { foreach ($n in $Name) { $allNames.Add($n) } } } end { $queryParams = @{} - Add-PfbCommonQueryParams -Into $queryParams -BoundParameters $PSBoundParameters -Names $allNames + Add-PfbCommonQueryParams -Into $queryParams -BoundParameters $PSBoundParameters Invoke-PfbApiRequest -Array $Array -Method GET -Endpoint 'fleets/fleet-key' -QueryParams $queryParams -AutoPaginate } } diff --git a/Reports/PfbApiDriftReport.json b/Reports/PfbApiDriftReport.json index 7cae9cd3..ab1d0040 100644 --- a/Reports/PfbApiDriftReport.json +++ b/Reports/PfbApiDriftReport.json @@ -685,10 +685,7 @@ "Remove-PfbBucketAuditFilter" ], "missingQueryParameters": [ - "bucket_ids", - "bucket_names", - "context_names", - "names" + "context_names" ], "missingBodyProperties": [], "readOnlyFields": [], @@ -706,10 +703,7 @@ "Remove-PfbBucketAccessPolicy" ], "missingQueryParameters": [ - "bucket_ids", - "bucket_names", - "context_names", - "names" + "context_names" ], "missingBodyProperties": [], "readOnlyFields": [], @@ -748,10 +742,7 @@ "Remove-PfbBucketCorsPolicy" ], "missingQueryParameters": [ - "bucket_ids", - "bucket_names", - "context_names", - "names" + "context_names" ], "missingBodyProperties": [], "readOnlyFields": [], @@ -2800,10 +2791,7 @@ ], "missingQueryParameters": [ "allow_errors", - "bucket_ids", - "bucket_names", - "context_names", - "names" + "context_names" ], "missingBodyProperties": [], "readOnlyFields": [], @@ -2822,8 +2810,6 @@ ], "missingQueryParameters": [ "allow_errors", - "bucket_ids", - "bucket_names", "context_names" ], "missingBodyProperties": [], @@ -2844,7 +2830,6 @@ "missingQueryParameters": [ "allow_errors", "bucket_ids", - "bucket_names", "context_names" ], "missingBodyProperties": [], @@ -2864,8 +2849,6 @@ ], "missingQueryParameters": [ "allow_errors", - "bucket_ids", - "bucket_names", "context_names" ], "missingBodyProperties": [], @@ -2886,7 +2869,6 @@ "missingQueryParameters": [ "allow_errors", "bucket_ids", - "bucket_names", "context_names" ], "missingBodyProperties": [], @@ -2905,10 +2887,8 @@ "Get-PfbCertificateGroupCertificate" ], "missingQueryParameters": [ - "certificate_group_ids", "certificate_group_names", - "certificate_ids", - "certificate_names" + "certificate_ids" ], "missingBodyProperties": [], "readOnlyFields": [], @@ -4036,7 +4016,6 @@ "Get-PfbNetworkInterfaceNeighbor" ], "missingQueryParameters": [ - "local_port_names", "total_item_count" ], "missingBodyProperties": [], @@ -4876,8 +4855,7 @@ "missingQueryParameters": [ "allow_errors", "context_names", - "realm_ids", - "realm_names" + "realm_ids" ], "missingBodyProperties": [], "readOnlyFields": [], @@ -9667,52 +9645,28 @@ ], "missingQueryParameters": [ "bucket_ids", - "bucket_names", "context_names", "names" ], "missingBodyProperties": [ - { - "name": "actions", - "type": "array", - "format": null, - "specRequired": false, - "synopsis": "The list of ops to be audited by this filter.", - "suggestedPowerShellType": "[string[]]", - "enumValues": [], - "enumStatus": "not-found-in-resource", - "target": { - "file": "Public/Bucket/New-PfbBucketAuditFilter.ps1", - "paramBlockLine": 38, - "payloadVariable": "body", - "assignmentStyle": "unknown", - "hasAttributes": true - } - }, - { - "name": "s3_prefixes", - "type": "array", - "format": null, - "specRequired": false, - "synopsis": "The list of object name prefixes.", - "suggestedPowerShellType": "[string[]]", - "enumValues": [], - "enumStatus": "no-spec-enum-found", - "target": { - "file": "Public/Bucket/New-PfbBucketAuditFilter.ps1", - "paramBlockLine": 38, - "payloadVariable": "body", - "assignmentStyle": "unknown", - "hasAttributes": true - } - } + "actions", + "s3_prefixes" ], "readOnlyFields": [], "confidence": { - "level": "high", - "unresolvedParameters": [], - "escapeHatchOnly": [], - "caveat": "" + "level": "partial", + "unresolvedParameters": [ + { + "parameter": "Name", + "surface": "AttributesOnly", + "file": "Public/Bucket/New-PfbBucketAuditFilter.ps1", + "line": 44 + } + ], + "escapeHatchOnly": [ + "Name" + ], + "caveat": "body reachable only via -Attributes; lists reflect typed-parameter coverage, not wire reachability" }, "annotations": [] }, @@ -9723,7 +9677,6 @@ ], "missingQueryParameters": [ "bucket_ids", - "bucket_names", "context_names" ], "missingBodyProperties": [ @@ -9738,7 +9691,7 @@ "enumStatus": "no-spec-enum-found", "target": { "file": "Public/Bucket/New-PfbBucketAccessPolicy.ps1", - "paramBlockLine": 36, + "paramBlockLine": 53, "payloadVariable": null, "assignmentStyle": null, "hasAttributes": false @@ -9761,9 +9714,7 @@ ], "missingQueryParameters": [ "bucket_ids", - "bucket_names", - "context_names", - "names" + "context_names" ], "missingBodyProperties": [ { @@ -9777,7 +9728,7 @@ "enumStatus": "not-found-in-resource", "target": { "file": "Public/Bucket/New-PfbBucketAccessPolicyRule.ps1", - "paramBlockLine": 42, + "paramBlockLine": 82, "payloadVariable": "Attributes", "assignmentStyle": "attributesOnly", "hasAttributes": true @@ -9794,7 +9745,7 @@ "enumStatus": "no-spec-enum-found", "target": { "file": "Public/Bucket/New-PfbBucketAccessPolicyRule.ps1", - "paramBlockLine": 42, + "paramBlockLine": 82, "payloadVariable": "Attributes", "assignmentStyle": "attributesOnly", "hasAttributes": true @@ -9811,7 +9762,7 @@ "enumStatus": "no-spec-enum-found", "target": { "file": "Public/Bucket/New-PfbBucketAccessPolicyRule.ps1", - "paramBlockLine": 42, + "paramBlockLine": 82, "payloadVariable": "Attributes", "assignmentStyle": "attributesOnly", "hasAttributes": true @@ -9836,7 +9787,6 @@ ], "missingQueryParameters": [ "bucket_ids", - "bucket_names", "context_names" ], "missingBodyProperties": [ @@ -9851,7 +9801,7 @@ "enumStatus": "no-spec-enum-found", "target": { "file": "Public/Bucket/New-PfbBucketCorsPolicy.ps1", - "paramBlockLine": 36, + "paramBlockLine": 53, "payloadVariable": null, "assignmentStyle": null, "hasAttributes": false @@ -9874,10 +9824,7 @@ ], "missingQueryParameters": [ "bucket_ids", - "bucket_names", - "context_names", - "names", - "policy_names" + "context_names" ], "missingBodyProperties": [ { @@ -9891,7 +9838,7 @@ "enumStatus": "no-spec-enum-found", "target": { "file": "Public/Bucket/New-PfbBucketCorsPolicyRule.ps1", - "paramBlockLine": 32, + "paramBlockLine": 85, "payloadVariable": "Attributes", "assignmentStyle": "attributesOnly", "hasAttributes": true @@ -9908,7 +9855,7 @@ "enumStatus": "no-spec-enum-found", "target": { "file": "Public/Bucket/New-PfbBucketCorsPolicyRule.ps1", - "paramBlockLine": 32, + "paramBlockLine": 85, "payloadVariable": "Attributes", "assignmentStyle": "attributesOnly", "hasAttributes": true @@ -9925,7 +9872,7 @@ "enumStatus": "no-spec-enum-found", "target": { "file": "Public/Bucket/New-PfbBucketCorsPolicyRule.ps1", - "paramBlockLine": 32, + "paramBlockLine": 85, "payloadVariable": "Attributes", "assignmentStyle": "attributesOnly", "hasAttributes": true @@ -14169,8 +14116,8 @@ "systemicGaps": [ { "name": "context_names", - "endpointCount": 269, - "queryEndpointCount": 269, + "endpointCount": 268, + "queryEndpointCount": 268, "bodyEndpointCount": 0, "endpoints": [ "DELETE /admins/api-tokens", @@ -14394,7 +14341,6 @@ "POST /audit-file-systems-policies/members", "POST /audit-object-store-policies/members", "POST /buckets", - "POST /buckets/audit-filters", "POST /buckets/bucket-access-policies", "POST /buckets/bucket-access-policies/rules", "POST /buckets/cross-origin-resource-sharing-policies", @@ -14635,46 +14581,6 @@ ], "annotations": [] }, - { - "name": "names", - "endpointCount": 31, - "queryEndpointCount": 31, - "bodyEndpointCount": 0, - "endpoints": [ - "DELETE /buckets/audit-filters", - "DELETE /buckets/bucket-access-policies", - "DELETE /buckets/cross-origin-resource-sharing-policies", - "GET /arrays/clients/performance", - "GET /arrays/clients/s3-specific-performance", - "GET /arrays/supported-time-zones", - "GET /audit-file-systems-policy-operations", - "GET /bucket-audit-filter-actions", - "GET /buckets/audit-filters", - "GET /directory-services/test", - "GET /dns", - "GET /file-systems/groups/performance", - "GET /file-systems/users/performance", - "GET /legal-holds/held-entities", - "GET /object-store-access-policy-actions", - "GET /object-store-roles/object-store-trust-policies", - "GET /password-policies", - "GET /quotas/settings", - "GET /smtp-servers", - "GET /snmp-agents", - "GET /software-check", - "GET /syslog-servers/settings", - "PATCH /password-policies", - "PATCH /syslog-servers/settings", - "POST /buckets/audit-filters", - "POST /buckets/bucket-access-policies/rules", - "POST /buckets/cross-origin-resource-sharing-policies/rules", - "POST /maintenance-windows", - "POST /object-store-access-keys", - "POST /object-store-access-policies/rules", - "POST /object-store-roles/object-store-trust-policies/rules" - ], - "annotations": [] - }, { "name": "sort", "endpointCount": 28, @@ -14713,28 +14619,35 @@ "annotations": [] }, { - "name": "bucket_ids", - "endpointCount": 17, - "queryEndpointCount": 17, + "name": "names", + "endpointCount": 24, + "queryEndpointCount": 24, "bodyEndpointCount": 0, "endpoints": [ - "DELETE /buckets/audit-filters", - "DELETE /buckets/bucket-access-policies", - "DELETE /buckets/bucket-access-policies/rules", - "DELETE /buckets/cross-origin-resource-sharing-policies", - "DELETE /buckets/cross-origin-resource-sharing-policies/rules", - "DELETE /lifecycle-rules", - "GET /buckets/audit-filters", - "GET /buckets/bucket-access-policies", - "GET /buckets/bucket-access-policies/rules", - "GET /buckets/cross-origin-resource-sharing-policies", - "GET /buckets/cross-origin-resource-sharing-policies/rules", - "GET /lifecycle-rules", - "POST /buckets/audit-filters", - "POST /buckets/bucket-access-policies", - "POST /buckets/bucket-access-policies/rules", - "POST /buckets/cross-origin-resource-sharing-policies", - "POST /buckets/cross-origin-resource-sharing-policies/rules" + "GET /arrays/clients/performance", + "GET /arrays/clients/s3-specific-performance", + "GET /arrays/supported-time-zones", + "GET /audit-file-systems-policy-operations", + "GET /bucket-audit-filter-actions", + "GET /directory-services/test", + "GET /dns", + "GET /file-systems/groups/performance", + "GET /file-systems/users/performance", + "GET /legal-holds/held-entities", + "GET /object-store-access-policy-actions", + "GET /object-store-roles/object-store-trust-policies", + "GET /password-policies", + "GET /quotas/settings", + "GET /smtp-servers", + "GET /snmp-agents", + "GET /software-check", + "GET /syslog-servers/settings", + "PATCH /password-policies", + "PATCH /syslog-servers/settings", + "POST /maintenance-windows", + "POST /object-store-access-keys", + "POST /object-store-access-policies/rules", + "POST /object-store-roles/object-store-trust-policies/rules" ], "annotations": [] }, @@ -14764,31 +14677,6 @@ ], "annotations": [] }, - { - "name": "bucket_names", - "endpointCount": 16, - "queryEndpointCount": 16, - "bodyEndpointCount": 0, - "endpoints": [ - "DELETE /buckets/audit-filters", - "DELETE /buckets/bucket-access-policies", - "DELETE /buckets/bucket-access-policies/rules", - "DELETE /buckets/cross-origin-resource-sharing-policies", - "DELETE /buckets/cross-origin-resource-sharing-policies/rules", - "DELETE /lifecycle-rules", - "GET /buckets/audit-filters", - "GET /buckets/bucket-access-policies", - "GET /buckets/bucket-access-policies/rules", - "GET /buckets/cross-origin-resource-sharing-policies", - "GET /buckets/cross-origin-resource-sharing-policies/rules", - "POST /buckets/audit-filters", - "POST /buckets/bucket-access-policies", - "POST /buckets/bucket-access-policies/rules", - "POST /buckets/cross-origin-resource-sharing-policies", - "POST /buckets/cross-origin-resource-sharing-policies/rules" - ], - "annotations": [] - }, { "name": "policy_ids", "endpointCount": 16, @@ -14838,10 +14726,29 @@ "annotations": [] }, { - "name": "policy_names", + "name": "bucket_ids", "endpointCount": 10, "queryEndpointCount": 10, "bodyEndpointCount": 0, + "endpoints": [ + "DELETE /buckets/bucket-access-policies/rules", + "DELETE /buckets/cross-origin-resource-sharing-policies/rules", + "DELETE /lifecycle-rules", + "GET /buckets/bucket-access-policies/rules", + "GET /buckets/cross-origin-resource-sharing-policies/rules", + "GET /lifecycle-rules", + "POST /buckets/bucket-access-policies", + "POST /buckets/bucket-access-policies/rules", + "POST /buckets/cross-origin-resource-sharing-policies", + "POST /buckets/cross-origin-resource-sharing-policies/rules" + ], + "annotations": [] + }, + { + "name": "policy_names", + "endpointCount": 9, + "queryEndpointCount": 9, + "bodyEndpointCount": 0, "endpoints": [ "DELETE /buckets/bucket-access-policies/rules", "DELETE /buckets/cross-origin-resource-sharing-policies/rules", @@ -14851,7 +14758,6 @@ "PATCH /object-store-roles/object-store-trust-policies/rules", "PATCH /s3-export-policies/rules", "PATCH /smb-share-policies/rules", - "POST /buckets/cross-origin-resource-sharing-policies/rules", "POST /object-store-roles/object-store-access-policies" ], "annotations": [] @@ -14890,22 +14796,6 @@ ], "annotations": [] }, - { - "name": "actions", - "endpointCount": 7, - "queryEndpointCount": 0, - "bodyEndpointCount": 7, - "endpoints": [ - "PATCH /object-store-access-policies/rules", - "PATCH /object-store-roles/object-store-trust-policies/rules", - "PATCH /s3-export-policies/rules", - "POST /buckets/audit-filters", - "POST /buckets/bucket-access-policies/rules", - "POST /object-store-access-policies/rules", - "POST /object-store-roles/object-store-trust-policies/rules" - ], - "annotations": [] - }, { "name": "limit", "endpointCount": 7, @@ -14954,6 +14844,21 @@ ], "annotations": [] }, + { + "name": "actions", + "endpointCount": 6, + "queryEndpointCount": 0, + "bodyEndpointCount": 6, + "endpoints": [ + "PATCH /object-store-access-policies/rules", + "PATCH /object-store-roles/object-store-trust-policies/rules", + "PATCH /s3-export-policies/rules", + "POST /buckets/bucket-access-policies/rules", + "POST /object-store-access-policies/rules", + "POST /object-store-roles/object-store-trust-policies/rules" + ], + "annotations": [] + }, { "name": "enabled", "endpointCount": 6, @@ -15309,14 +15214,14 @@ "annotations": [] }, { - "name": "certificate_group_ids", + "name": "bucket_names", "endpointCount": 3, "queryEndpointCount": 3, "bodyEndpointCount": 0, "endpoints": [ - "DELETE /certificates/certificate-groups", - "GET /certificate-groups/certificates", - "GET /certificates/certificate-groups" + "DELETE /buckets/bucket-access-policies/rules", + "DELETE /buckets/cross-origin-resource-sharing-policies/rules", + "DELETE /lifecycle-rules" ], "annotations": [] }, @@ -15500,6 +15405,17 @@ ], "annotations": [] }, + { + "name": "certificate_group_ids", + "endpointCount": 2, + "queryEndpointCount": 2, + "bodyEndpointCount": 0, + "endpoints": [ + "DELETE /certificates/certificate-groups", + "GET /certificates/certificate-groups" + ], + "annotations": [] + }, { "name": "component_name", "endpointCount": 2, @@ -16189,16 +16105,6 @@ ], "annotations": [] }, - { - "name": "certificate_names", - "endpointCount": 1, - "queryEndpointCount": 1, - "bodyEndpointCount": 0, - "endpoints": [ - "GET /certificate-groups/certificates" - ], - "annotations": [] - }, { "name": "certificate_type", "endpointCount": 1, @@ -16729,16 +16635,6 @@ ], "annotations": [] }, - { - "name": "local_port_names", - "endpointCount": 1, - "queryEndpointCount": 1, - "bodyEndpointCount": 0, - "endpoints": [ - "GET /network-interfaces/neighbors" - ], - "annotations": [] - }, { "name": "locality", "endpointCount": 1, @@ -17099,16 +16995,6 @@ ], "annotations": [] }, - { - "name": "realm_names", - "endpointCount": 1, - "queryEndpointCount": 1, - "bodyEndpointCount": 0, - "endpoints": [ - "GET /realms/defaults" - ], - "annotations": [] - }, { "name": "recursive", "endpointCount": 1, @@ -17219,16 +17105,6 @@ ], "annotations": [] }, - { - "name": "s3_prefixes", - "endpointCount": 1, - "queryEndpointCount": 0, - "bodyEndpointCount": 1, - "endpoints": [ - "POST /buckets/audit-filters" - ], - "annotations": [] - }, { "name": "secure", "endpointCount": 1, @@ -17403,7 +17279,7 @@ "conventionStrength": [ { "name": "names", - "cmdletCount": 303, + "cmdletCount": 300, "cmdlets": [ "Get-PfbActiveDirectory", "Get-PfbAdmin", @@ -17421,13 +17297,13 @@ "Get-PfbBucket", "Get-PfbBucketAccessPolicy", "Get-PfbBucketAccessPolicyRule", + "Get-PfbBucketAuditFilter", "Get-PfbBucketCorsPolicy", "Get-PfbBucketCorsPolicyRule", "Get-PfbBucketPerformance", "Get-PfbBucketS3Performance", "Get-PfbCertificate", "Get-PfbCertificateGroup", - "Get-PfbCertificateGroupCertificate", "Get-PfbCertificateGroupUse", "Get-PfbCertificateUse", "Get-PfbDataEvictionPolicy", @@ -17443,7 +17319,6 @@ "Get-PfbFileSystemSnapshotTransfer", "Get-PfbFileSystemStorageClass", "Get-PfbFleet", - "Get-PfbFleetKey", "Get-PfbHardware", "Get-PfbHardwareConnector", "Get-PfbHardwareConnectorPerformance", @@ -17462,12 +17337,10 @@ "Get-PfbManagementAccessPolicy", "Get-PfbNetworkAccessPolicy", "Get-PfbNetworkAccessRule", - "Get-PfbNetworkConnectionStatistics", "Get-PfbNetworkInterface", "Get-PfbNetworkInterfaceConnector", "Get-PfbNetworkInterfaceConnectorPerformance", "Get-PfbNetworkInterfaceConnectorSettings", - "Get-PfbNetworkInterfaceNeighbor", "Get-PfbNfsExportPolicy", "Get-PfbNfsExportRule", "Get-PfbNode", @@ -17484,7 +17357,6 @@ "Get-PfbObjectStoreUser", "Get-PfbObjectStoreVirtualHost", "Get-PfbOidcIdp", - "Get-PfbOpenFile", "Get-PfbPolicy", "Get-PfbPolicyAll", "Get-PfbPresetWorkload", @@ -17494,12 +17366,10 @@ "Get-PfbQuotaGroup", "Get-PfbQuotaUser", "Get-PfbRealm", - "Get-PfbRealmDefaults", "Get-PfbRealmSpace", "Get-PfbRealmStorageClass", "Get-PfbRemoteArray", "Get-PfbResiliencyGroup", - "Get-PfbResourceAccess", "Get-PfbRole", "Get-PfbS3ExportPolicy", "Get-PfbS3ExportRule", @@ -17530,6 +17400,8 @@ "New-PfbAuditFileSystemPolicy", "New-PfbAuditObjectStorePolicy", "New-PfbBucket", + "New-PfbBucketAccessPolicyRule", + "New-PfbBucketCorsPolicyRule", "New-PfbCertificate", "New-PfbCertificateGroup", "New-PfbDataEvictionPolicy", @@ -17573,7 +17445,10 @@ "Remove-PfbAuditFileSystemPolicy", "Remove-PfbAuditObjectStorePolicy", "Remove-PfbBucket", + "Remove-PfbBucketAccessPolicy", "Remove-PfbBucketAccessPolicyRule", + "Remove-PfbBucketAuditFilter", + "Remove-PfbBucketCorsPolicy", "Remove-PfbBucketCorsPolicyRule", "Remove-PfbCertificate", "Remove-PfbCertificateGroup", @@ -17612,13 +17487,11 @@ "Remove-PfbObjectStoreUser", "Remove-PfbObjectStoreVirtualHost", "Remove-PfbOidcIdp", - "Remove-PfbOpenFile", "Remove-PfbPolicy", "Remove-PfbPresetWorkload", "Remove-PfbPublicKey", "Remove-PfbQosPolicy", "Remove-PfbRealm", - "Remove-PfbResourceAccess", "Remove-PfbS3ExportPolicy", "Remove-PfbS3ExportRule", "Remove-PfbSaml2Idp", @@ -17712,7 +17585,7 @@ }, { "name": "ids", - "cmdletCount": 225, + "cmdletCount": 220, "cmdlets": [ "Get-PfbAdmin", "Get-PfbAdminCache", @@ -17729,16 +17602,11 @@ "Get-PfbAuditObjectStorePolicy", "Get-PfbBlade", "Get-PfbBucket", - "Get-PfbBucketAccessPolicy", - "Get-PfbBucketAccessPolicyRule", - "Get-PfbBucketCorsPolicy", - "Get-PfbBucketCorsPolicyRule", "Get-PfbBucketPerformance", "Get-PfbBucketReplicaLink", "Get-PfbBucketS3Performance", "Get-PfbCertificate", "Get-PfbCertificateGroup", - "Get-PfbCertificateGroupCertificate", "Get-PfbDataEvictionPolicy", "Get-PfbDirectoryServiceRole", "Get-PfbDrive", @@ -17943,7 +17811,7 @@ }, { "name": "filter", - "cmdletCount": 202, + "cmdletCount": 201, "cmdlets": [ "Get-PfbActiveDirectory", "Get-PfbAdmin", @@ -18083,7 +17951,6 @@ "Get-PfbObjectStoreUserAccessPolicy", "Get-PfbObjectStoreVirtualHost", "Get-PfbOidcIdp", - "Get-PfbOpenFile", "Get-PfbPasswordPolicy", "Get-PfbPolicy", "Get-PfbPolicyAll", @@ -18356,7 +18223,7 @@ }, { "name": "sort", - "cmdletCount": 180, + "cmdletCount": 179, "cmdlets": [ "Get-PfbAdmin", "Get-PfbAdminCache", @@ -18486,7 +18353,6 @@ "Get-PfbObjectStoreUserAccessPolicy", "Get-PfbObjectStoreVirtualHost", "Get-PfbOidcIdp", - "Get-PfbOpenFile", "Get-PfbPasswordPolicy", "Get-PfbPolicy", "Get-PfbPolicyAll", @@ -18542,7 +18408,7 @@ }, { "name": "policy_names", - "cmdletCount": 119, + "cmdletCount": 114, "cmdlets": [ "Add-PfbDataEvictionPolicyFileSystem", "Get-PfbAdminManagementAccessPolicy", @@ -18550,9 +18416,7 @@ "Get-PfbArraySshCaPolicy", "Get-PfbAuditFileSystemPolicyMember", "Get-PfbAuditObjectStorePolicyMember", - "Get-PfbBucketAccessPolicy", "Get-PfbBucketAccessPolicyRule", - "Get-PfbBucketCorsPolicy", "Get-PfbBucketCorsPolicyRule", "Get-PfbDataEvictionPolicyFileSystem", "Get-PfbDataEvictionPolicyMember", @@ -18599,9 +18463,8 @@ "New-PfbArraySshCaPolicy", "New-PfbAuditFileSystemPolicyMember", "New-PfbAuditObjectStorePolicyMember", - "New-PfbBucketAccessPolicy", "New-PfbBucketAccessPolicyRule", - "New-PfbBucketCorsPolicy", + "New-PfbBucketCorsPolicyRule", "New-PfbDirectoryServiceRoleManagementPolicy", "New-PfbFileSystemAuditPolicy", "New-PfbFileSystemExport", @@ -18634,8 +18497,6 @@ "Remove-PfbArraySshCaPolicy", "Remove-PfbAuditFileSystemPolicyMember", "Remove-PfbAuditObjectStorePolicyMember", - "Remove-PfbBucketAccessPolicy", - "Remove-PfbBucketCorsPolicy", "Remove-PfbDataEvictionPolicyFileSystem", "Remove-PfbDirectoryServiceRoleManagementPolicy", "Remove-PfbFileSystemAuditPolicy", @@ -18667,7 +18528,7 @@ }, { "name": "policy_ids", - "cmdletCount": 99, + "cmdletCount": 97, "cmdlets": [ "Add-PfbDataEvictionPolicyFileSystem", "Get-PfbAdminManagementAccessPolicy", @@ -18675,7 +18536,6 @@ "Get-PfbArraySshCaPolicy", "Get-PfbAuditFileSystemPolicyMember", "Get-PfbAuditObjectStorePolicyMember", - "Get-PfbBucketAccessPolicy", "Get-PfbDataEvictionPolicyFileSystem", "Get-PfbDataEvictionPolicyMember", "Get-PfbDirectoryServiceRoleManagementPolicy", @@ -18695,7 +18555,6 @@ "Get-PfbObjectStoreAccessPolicyRole", "Get-PfbObjectStoreAccessPolicyRule", "Get-PfbObjectStoreAccessPolicyUser", - "Get-PfbObjectStoreTrustPolicyRule", "Get-PfbObjectStoreUserAccessPolicy", "Get-PfbPolicyAllMember", "Get-PfbPolicyFileSystem", @@ -18772,7 +18631,7 @@ }, { "name": "member_ids", - "cmdletCount": 86, + "cmdletCount": 81, "cmdlets": [ "Add-PfbDataEvictionPolicyFileSystem", "Get-PfbAdminManagementAccessPolicy", @@ -18780,9 +18639,6 @@ "Get-PfbArraySshCaPolicy", "Get-PfbAuditFileSystemPolicyMember", "Get-PfbAuditObjectStorePolicyMember", - "Get-PfbBucketAccessPolicy", - "Get-PfbBucketAuditFilter", - "Get-PfbBucketCorsPolicy", "Get-PfbDataEvictionPolicyFileSystem", "Get-PfbDataEvictionPolicyMember", "Get-PfbDirectoryServiceRoleManagementPolicy", @@ -18843,8 +18699,6 @@ "Remove-PfbArraySshCaPolicy", "Remove-PfbAuditFileSystemPolicyMember", "Remove-PfbAuditObjectStorePolicyMember", - "Remove-PfbBucketAuditFilter", - "Remove-PfbBucketCorsPolicy", "Remove-PfbDataEvictionPolicyFileSystem", "Remove-PfbDirectoryServiceRoleManagementPolicy", "Remove-PfbFileSystemAuditPolicy", @@ -18934,6 +18788,28 @@ "Update-PfbAsyncLog" ] }, + { + "name": "bucket_names", + "cmdletCount": 16, + "cmdlets": [ + "Get-PfbBucketAccessPolicy", + "Get-PfbBucketAccessPolicyRule", + "Get-PfbBucketAuditFilter", + "Get-PfbBucketCorsPolicy", + "Get-PfbBucketCorsPolicyRule", + "Get-PfbLifecycleRule", + "New-PfbBucketAccessPolicy", + "New-PfbBucketAccessPolicyRule", + "New-PfbBucketAuditFilter", + "New-PfbBucketCorsPolicy", + "New-PfbBucketCorsPolicyRule", + "Remove-PfbBucketAccessPolicy", + "Remove-PfbBucketAuditFilter", + "Remove-PfbBucketCorsPolicy", + "Update-PfbBucketAuditFilter", + "Update-PfbLifecycleRule" + ] + }, { "name": "resolution", "cmdletCount": 15, @@ -19023,6 +18899,20 @@ "Update-PfbLegalHoldEntity" ] }, + { + "name": "bucket_ids", + "cmdletCount": 8, + "cmdlets": [ + "Get-PfbBucketAccessPolicy", + "Get-PfbBucketAuditFilter", + "Get-PfbBucketCorsPolicy", + "Remove-PfbBucketAccessPolicy", + "Remove-PfbBucketAuditFilter", + "Remove-PfbBucketCorsPolicy", + "Update-PfbBucketAuditFilter", + "Update-PfbLifecycleRule" + ] + }, { "name": "location", "cmdletCount": 8, @@ -19175,15 +19065,6 @@ "New-PfbSmbClientRule" ] }, - { - "name": "bucket_names", - "cmdletCount": 3, - "cmdlets": [ - "Get-PfbLifecycleRule", - "Update-PfbBucketAuditFilter", - "Update-PfbLifecycleRule" - ] - }, { "name": "ca_certificate", "cmdletCount": 3, @@ -19202,15 +19083,6 @@ "Remove-PfbCertificateCertificateGroup" ] }, - { - "name": "certificate_names", - "cmdletCount": 3, - "cmdlets": [ - "Get-PfbCertificateCertificateGroup", - "New-PfbCertificateCertificateGroup", - "Remove-PfbCertificateCertificateGroup" - ] - }, { "name": "client", "cmdletCount": 3, @@ -19291,11 +19163,11 @@ ] }, { - "name": "bucket_ids", + "name": "certificate_group_ids", "cmdletCount": 2, "cmdlets": [ - "Update-PfbBucketAuditFilter", - "Update-PfbLifecycleRule" + "Get-PfbCertificateGroupCertificate", + "New-PfbCertificateCertificateGroup" ] }, { @@ -19472,13 +19344,6 @@ "Update-PfbCertificate" ] }, - { - "name": "certificate_group_ids", - "cmdletCount": 1, - "cmdlets": [ - "New-PfbCertificateCertificateGroup" - ] - }, { "name": "certificate_ids", "cmdletCount": 1, @@ -19822,13 +19687,6 @@ "Update-PfbRealmDefaults" ] }, - { - "name": "realm_names", - "cmdletCount": 1, - "cmdlets": [ - "Update-PfbRealmDefaults" - ] - }, { "name": "required_transport_security", "cmdletCount": 1, @@ -19850,13 +19708,6 @@ "Update-PfbWormPolicy" ] }, - { - "name": "s3_prefixes", - "cmdletCount": 1, - "cmdlets": [ - "Update-PfbBucketAuditFilter" - ] - }, { "name": "secret_access_key", "cmdletCount": 1, @@ -20209,11 +20060,6 @@ "cmdletCount": 0, "cmdlets": [] }, - { - "name": "local_port_names", - "cmdletCount": 0, - "cmdlets": [] - }, { "name": "lockout_duration", "cmdletCount": 0, diff --git a/Reports/PfbApiDriftReport.md b/Reports/PfbApiDriftReport.md index 2685402e..81f29791 100644 --- a/Reports/PfbApiDriftReport.md +++ b/Reports/PfbApiDriftReport.md @@ -23,11 +23,11 @@ This report accepts **false positives in order to eliminate false negatives**. A - Uncovered endpoints: 95 - Endpoints with parameter gaps: 439 - Missing body properties (addable): 426 -- Missing query parameters (addable): 913 +- Missing query parameters (addable): 883 - Read-only body fields (not addable -- see the Read-only fields section below): 384 - Phantom fields silently excluded (accumulated in the capability map, absent from the newest analysed spec): 40 -- Partial-confidence endpoints (see `How to read this report` above, and each row's marker in the Parameter gaps table): 60 -- Systemic gaps (distinct field names collapsed across high-confidence endpoints, detailed below): 245 +- Partial-confidence endpoints (see `How to read this report` above, and each row's marker in the Parameter gaps table): 61 +- Systemic gaps (distinct field names collapsed across high-confidence endpoints, detailed below): 241 - ValidateSet drift: 0 - New ValidateSet candidates: 2 - Context cardinality signal disagreements (fb2.28): 9 @@ -39,35 +39,35 @@ This report accepts **false positives in order to eliminate false negatives**. A One finding per distinct wire field name, collapsed across every endpoint where a high-confidence gap exists (decision 7) -- turns hundreds of per-endpoint rows into a handful of real, actionable decisions. "Cmdlets already using this name" is decision 8's convention-strength ranking: a high count means closing the remaining gaps for this name is a mechanical batch fix; zero means no established convention exists to extend at all -- closing it is an architectural decision, not a mechanical one. -Showing the top 25 of 245 findings by endpoint count -- the full list is in the JSON manifest's `systemicGaps`, nothing is dropped there. +Showing the top 25 of 241 findings by endpoint count -- the full list is in the JSON manifest's `systemicGaps`, nothing is dropped there. | Field name | Endpoints | Query | Body | Cmdlets already using this name | Annotation | |---|---|---|---|---|---| -| `context_names` | 269 | 269 | 0 | 0 | implemented in Phase 1 via central injection; still listed as a gap because the drift detector does not resolve the variable-keyed injection site (issue #113) | +| `context_names` | 268 | 268 | 0 | 0 | implemented in Phase 1 via central injection; still listed as a gap because the drift detector does not resolve the variable-keyed injection site (issue #113) | | `allow_errors` | 118 | 118 | 0 | 0 | not yet implemented; deferred to Phase 2 | -| `ids` | 38 | 38 | 0 | 225 | | -| `names` | 31 | 31 | 0 | 303 | | -| `sort` | 28 | 28 | 0 | 180 | | -| `bucket_ids` | 17 | 17 | 0 | 2 | | +| `ids` | 38 | 38 | 0 | 220 | | +| `sort` | 28 | 28 | 0 | 179 | | +| `names` | 24 | 24 | 0 | 300 | | | `total_only` | 17 | 17 | 0 | 12 | | -| `bucket_names` | 16 | 16 | 0 | 3 | | -| `policy_ids` | 16 | 16 | 0 | 99 | | -| `member_ids` | 14 | 14 | 0 | 86 | | -| `policy_names` | 10 | 10 | 0 | 119 | | +| `policy_ids` | 16 | 16 | 0 | 97 | | +| `member_ids` | 14 | 14 | 0 | 81 | | +| `bucket_ids` | 10 | 10 | 0 | 8 | | +| `policy_names` | 9 | 9 | 0 | 114 | | | `file_system_ids` | 8 | 8 | 0 | 9 | | | `local_file_system_ids` | 8 | 8 | 0 | 2 | | -| `actions` | 7 | 0 | 7 | 2 | | | `limit` | 7 | 7 | 0 | 199 | | | `name` | 7 | 0 | 7 | 20 | | | `versions` | 7 | 7 | 0 | 5 | | +| `actions` | 6 | 0 | 6 | 2 | | | `enabled` | 6 | 0 | 6 | 10 | | -| `filter` | 6 | 6 | 0 | 202 | | +| `filter` | 6 | 6 | 0 | 201 | | | `role_ids` | 6 | 6 | 0 | 2 | | | `role_names` | 6 | 6 | 0 | 4 | | | `workload_ids` | 6 | 6 | 0 | 0 | | | `workload_names` | 6 | 6 | 0 | 0 | | | `gids` | 5 | 5 | 0 | 2 | | | `local_file_system_names` | 5 | 5 | 0 | 5 | | +| `policy` | 5 | 0 | 5 | 3 | | ## Parameter gaps @@ -87,10 +87,10 @@ Endpoints an existing cmdlet already calls, where the capability map knows of a | `DELETE /audit-object-store-policies` | Remove-PfbAuditObjectStorePolicy | context_names | | `high` | | | `DELETE /audit-object-store-policies/members` | Remove-PfbAuditObjectStorePolicyMember | context_names | | `high` | | | `DELETE /buckets` | Remove-PfbBucket | context_names | | `partial` -- /!\ 1 unresolved param (see Partial-confidence detail below) | | -| `DELETE /buckets/audit-filters` | Remove-PfbBucketAuditFilter | bucket_ids, bucket_names, context_names, names | | `high` | | -| `DELETE /buckets/bucket-access-policies` | Remove-PfbBucketAccessPolicy | bucket_ids, bucket_names, context_names, names | | `high` | | +| `DELETE /buckets/audit-filters` | Remove-PfbBucketAuditFilter | context_names | | `high` | | +| `DELETE /buckets/bucket-access-policies` | Remove-PfbBucketAccessPolicy | context_names | | `high` | | | `DELETE /buckets/bucket-access-policies/rules` | Remove-PfbBucketAccessPolicyRule | bucket_ids, bucket_names, context_names, policy_names | | `high` | | -| `DELETE /buckets/cross-origin-resource-sharing-policies` | Remove-PfbBucketCorsPolicy | bucket_ids, bucket_names, context_names, names | | `high` | | +| `DELETE /buckets/cross-origin-resource-sharing-policies` | Remove-PfbBucketCorsPolicy | context_names | | `high` | | | `DELETE /buckets/cross-origin-resource-sharing-policies/rules` | Remove-PfbBucketCorsPolicyRule | bucket_ids, bucket_names, context_names, policy_names | | `high` | | | `DELETE /certificates/certificate-groups` | Remove-PfbCertificateCertificateGroup | certificate_group_ids, certificate_ids | | `high` | | | `DELETE /data-eviction-policies` | Remove-PfbDataEvictionPolicy | context_names | | `high` | | @@ -192,12 +192,12 @@ Endpoints an existing cmdlet already calls, where the capability map knows of a | `GET /bucket-audit-filter-actions` | Get-PfbBucketAuditFilterAction | allow_errors, context_names, names | | `high` | | | `GET /bucket-replica-links` | Get-PfbBucketReplicaLink | allow_errors, context_names, local_bucket_ids, total_only | | `high` | | | `GET /buckets` | Get-PfbBucket | allow_errors, context_names | | `high` | | -| `GET /buckets/audit-filters` | Get-PfbBucketAuditFilter | allow_errors, bucket_ids, bucket_names, context_names, names | | `high` | | -| `GET /buckets/bucket-access-policies` | Get-PfbBucketAccessPolicy | allow_errors, bucket_ids, bucket_names, context_names | | `high` | | -| `GET /buckets/bucket-access-policies/rules` | Get-PfbBucketAccessPolicyRule | allow_errors, bucket_ids, bucket_names, context_names | | `high` | | -| `GET /buckets/cross-origin-resource-sharing-policies` | Get-PfbBucketCorsPolicy | allow_errors, bucket_ids, bucket_names, context_names | | `high` | | -| `GET /buckets/cross-origin-resource-sharing-policies/rules` | Get-PfbBucketCorsPolicyRule | allow_errors, bucket_ids, bucket_names, context_names | | `high` | | -| `GET /certificate-groups/certificates` | Get-PfbCertificateGroupCertificate | certificate_group_ids, certificate_group_names, certificate_ids, certificate_names | | `high` | | +| `GET /buckets/audit-filters` | Get-PfbBucketAuditFilter | allow_errors, context_names | | `high` | | +| `GET /buckets/bucket-access-policies` | Get-PfbBucketAccessPolicy | allow_errors, context_names | | `high` | | +| `GET /buckets/bucket-access-policies/rules` | Get-PfbBucketAccessPolicyRule | allow_errors, bucket_ids, context_names | | `high` | | +| `GET /buckets/cross-origin-resource-sharing-policies` | Get-PfbBucketCorsPolicy | allow_errors, context_names | | `high` | | +| `GET /buckets/cross-origin-resource-sharing-policies/rules` | Get-PfbBucketCorsPolicyRule | allow_errors, bucket_ids, context_names | | `high` | | +| `GET /certificate-groups/certificates` | Get-PfbCertificateGroupCertificate | certificate_group_names, certificate_ids | | `high` | | | `GET /certificate-groups/uses` | Get-PfbCertificateGroupUse | ids | | `high` | | | `GET /certificates/certificate-groups` | Get-PfbCertificateCertificateGroup | certificate_group_ids, certificate_ids, sort | | `high` | | | `GET /certificates/uses` | Get-PfbCertificateUse | ids | | `high` | | @@ -252,7 +252,7 @@ Endpoints an existing cmdlet already calls, where the capability map knows of a | `GET /network-access-policies/rules` | Get-PfbNetworkAccessRule | ids | | `high` | | | `GET /network-interfaces/connectors/performance` | Get-PfbNetworkInterfaceConnectorPerformance | ids, total_only | | `high` | | | `GET /network-interfaces/connectors/settings` | Get-PfbNetworkInterfaceConnectorSettings | ids | | `high` | | -| `GET /network-interfaces/neighbors` | Get-PfbNetworkInterfaceNeighbor | local_port_names, total_item_count | | `high` | | +| `GET /network-interfaces/neighbors` | Get-PfbNetworkInterfaceNeighbor | total_item_count | | `high` | | | `GET /network-interfaces/network-connection-statistics` | Get-PfbNetworkConnectionStatistics | current_state, local_host, local_port, remote_host, remote_port | | `high` | | | `GET /network-interfaces/ping` | Invoke-PfbNetworkPing | component_name, print_latency, resolve_hostname, source | | `high` | | | `GET /network-interfaces/trace` | Invoke-PfbNetworkTrace | component_name, discover_mtu, fragment_packet, port, resolve_hostname, source | | `high` | | @@ -294,7 +294,7 @@ Endpoints an existing cmdlet already calls, where the capability map knows of a | `GET /quotas/settings` | Get-PfbQuotaSettings | ids, names | | `high` | | | `GET /quotas/users` | Get-PfbQuotaUser | allow_errors, context_names, file_system_ids, uids, user_names | | `high` | | | `GET /realms` | Get-PfbRealm | allow_errors, context_names | | `high` | | -| `GET /realms/defaults` | Get-PfbRealmDefaults | allow_errors, context_names, realm_ids, realm_names | | `high` | | +| `GET /realms/defaults` | Get-PfbRealmDefaults | allow_errors, context_names, realm_ids | | `high` | | | `GET /realms/space` | Get-PfbRealmSpace | end_time, ids, resolution, start_time, total_only, type | | `high` | | | `GET /realms/space/storage-classes` | Get-PfbRealmStorageClass | end_time, ids, resolution, start_time, storage_class_names, total_only | | `high` | | | `GET /remote-arrays` | Get-PfbRemoteArray | total_only | | `high` | | @@ -423,11 +423,11 @@ Endpoints an existing cmdlet already calls, where the capability map knows of a | `POST /audit-object-store-policies` | New-PfbAuditObjectStorePolicy | context_names | enabled, location, log_targets, name | `partial` -- /!\ 1 unresolved param (see Partial-confidence detail below) | | | `POST /audit-object-store-policies/members` | New-PfbAuditObjectStorePolicyMember | context_names | | `high` | | | `POST /buckets` | New-PfbBucket | context_names | bucket_type, eradication_config, hard_limit_enabled, object_lock_config, retention_lock | `high` | | -| `POST /buckets/audit-filters` | New-PfbBucketAuditFilter | bucket_ids, bucket_names, context_names, names | actions, s3_prefixes | `high` | | -| `POST /buckets/bucket-access-policies` | New-PfbBucketAccessPolicy | bucket_ids, bucket_names, context_names | rules | `high` | | -| `POST /buckets/bucket-access-policies/rules` | New-PfbBucketAccessPolicyRule | bucket_ids, bucket_names, context_names, names | actions, principals, resources | `high` | | -| `POST /buckets/cross-origin-resource-sharing-policies` | New-PfbBucketCorsPolicy | bucket_ids, bucket_names, context_names | rules | `high` | | -| `POST /buckets/cross-origin-resource-sharing-policies/rules` | New-PfbBucketCorsPolicyRule | bucket_ids, bucket_names, context_names, names, policy_names | allowed_headers, allowed_methods, allowed_origins | `high` | | +| `POST /buckets/audit-filters` | New-PfbBucketAuditFilter | bucket_ids, context_names, names | actions, s3_prefixes | `partial` -- /!\ 1 unresolved param (see Partial-confidence detail below) | | +| `POST /buckets/bucket-access-policies` | New-PfbBucketAccessPolicy | bucket_ids, context_names | rules | `high` | | +| `POST /buckets/bucket-access-policies/rules` | New-PfbBucketAccessPolicyRule | bucket_ids, context_names | actions, principals, resources | `high` | | +| `POST /buckets/cross-origin-resource-sharing-policies` | New-PfbBucketCorsPolicy | bucket_ids, context_names | rules | `high` | | +| `POST /buckets/cross-origin-resource-sharing-policies/rules` | New-PfbBucketCorsPolicyRule | bucket_ids, context_names | allowed_headers, allowed_methods, allowed_origins | `high` | | | `POST /certificates` | New-PfbCertificate | | certificate, certificate_type, common_name, country, days, email, intermediate_certificate, key_algorithm, key_size, locality, organization, organizational_unit, passphrase, private_key, state, subject_alternative_names | `high` | | | `POST /certificates/certificate-signing-requests` | New-PfbCertificateSigningRequest | | certificate, common_name, country, email, locality, organization, organizational_unit, state, subject_alternative_names | `partial` -- /!\ 1 unresolved param (see Partial-confidence detail below) | | | `POST /data-eviction-policies` | New-PfbDataEvictionPolicy | context_names | enabled, location, name | `partial` -- /!\ 1 unresolved param (see Partial-confidence detail below) | | @@ -571,6 +571,7 @@ Per the decision-6 procedure above: open each parameter at its `file:line` and f | `POST /active-directory` | `-Name` | AttributesOnly | `Public/DirectoryService/New-PfbActiveDirectory.ps1:40` | body reachable only via -Attributes; lists reflect typed-parameter coverage, not wire reachability | | `POST /audit-file-systems-policies` | `-Enabled` | AttributesOnly | `Public/Policy/New-PfbAuditFileSystemPolicy.ps1:35` | body reachable only via -Attributes; lists reflect typed-parameter coverage, not wire reachability | | `POST /audit-object-store-policies` | `-Enabled` | AttributesOnly | `Public/Policy/New-PfbAuditObjectStorePolicy.ps1:35` | body reachable only via -Attributes; lists reflect typed-parameter coverage, not wire reachability | +| `POST /buckets/audit-filters` | `-Name` | AttributesOnly | `Public/Bucket/New-PfbBucketAuditFilter.ps1:44` | body reachable only via -Attributes; lists reflect typed-parameter coverage, not wire reachability | | `POST /certificates/certificate-signing-requests` | `-Name` | AttributesOnly | `Public/Certificate/New-PfbCertificateSigningRequest.ps1:29` | body reachable only via -Attributes; lists reflect typed-parameter coverage, not wire reachability | | `POST /data-eviction-policies` | `-Disabled` | TypedUnresolved | `Public/DataEviction/New-PfbDataEvictionPolicy.ps1:31` | one or more parameters could not be traced to a wire name and have no -Attributes escape hatch; lists reflect typed-parameter coverage only, not full wire reachability | | `POST /directory-services/local/groups/members` | `-Member` | TypedUnresolved | `Public/DirectoryService/New-PfbLocalGroupMember.ps1:35` | one or more parameters could not be traced to a wire name and have no -Attributes escape hatch; lists reflect typed-parameter coverage only, not full wire reachability | diff --git a/Reports/PfbDeadKeyReport.json b/Reports/PfbDeadKeyReport.json index faf4710b..b3c8137d 100644 --- a/Reports/PfbDeadKeyReport.json +++ b/Reports/PfbDeadKeyReport.json @@ -1,12 +1,12 @@ { "specVersion": "2.28", "counts": { - "parametersInventoried": 2174, - "keysEvaluated": 1757, - "ok": 1631, - "deadKey": 126, + "parametersInventoried": 2164, + "keysEvaluated": 1746, + "ok": 1661, + "deadKey": 85, "skipReasons": { - "wire name unresolved": 125, + "wire name unresolved": 126, "body property": 278, "endpoint/method ambiguous": 14, "endpoint/verb absent from spec": 0 @@ -327,348 +327,6 @@ "names" ] }, - { - "severity": "WRONG-RESULTS", - "cmdlet": "Get-PfbBucketAccessPolicy", - "parameter": "Id", - "wireKey": "ids", - "method": "GET", - "endpoint": "buckets/bucket-access-policies", - "declared": [ - "allow_errors", - "bucket_ids", - "bucket_names", - "context_names", - "continuation_token", - "filter", - "limit", - "names", - "offset", - "sort" - ] - }, - { - "severity": "WRONG-RESULTS", - "cmdlet": "Get-PfbBucketAccessPolicy", - "parameter": "MemberId", - "wireKey": "member_ids", - "method": "GET", - "endpoint": "buckets/bucket-access-policies", - "declared": [ - "allow_errors", - "bucket_ids", - "bucket_names", - "context_names", - "continuation_token", - "filter", - "limit", - "names", - "offset", - "sort" - ] - }, - { - "severity": "WRONG-RESULTS", - "cmdlet": "Get-PfbBucketAccessPolicy", - "parameter": "MemberName", - "wireKey": "member_names", - "method": "GET", - "endpoint": "buckets/bucket-access-policies", - "declared": [ - "allow_errors", - "bucket_ids", - "bucket_names", - "context_names", - "continuation_token", - "filter", - "limit", - "names", - "offset", - "sort" - ] - }, - { - "severity": "WRONG-RESULTS", - "cmdlet": "Get-PfbBucketAccessPolicy", - "parameter": "PolicyId", - "wireKey": "policy_ids", - "method": "GET", - "endpoint": "buckets/bucket-access-policies", - "declared": [ - "allow_errors", - "bucket_ids", - "bucket_names", - "context_names", - "continuation_token", - "filter", - "limit", - "names", - "offset", - "sort" - ] - }, - { - "severity": "WRONG-RESULTS", - "cmdlet": "Get-PfbBucketAccessPolicy", - "parameter": "PolicyName", - "wireKey": "policy_names", - "method": "GET", - "endpoint": "buckets/bucket-access-policies", - "declared": [ - "allow_errors", - "bucket_ids", - "bucket_names", - "context_names", - "continuation_token", - "filter", - "limit", - "names", - "offset", - "sort" - ] - }, - { - "severity": "WRONG-RESULTS", - "cmdlet": "Get-PfbBucketAccessPolicyRule", - "parameter": "Id", - "wireKey": "ids", - "method": "GET", - "endpoint": "buckets/bucket-access-policies/rules", - "declared": [ - "allow_errors", - "bucket_ids", - "bucket_names", - "context_names", - "continuation_token", - "filter", - "limit", - "names", - "offset", - "policy_names", - "sort" - ] - }, - { - "severity": "WRONG-RESULTS", - "cmdlet": "Get-PfbBucketAccessPolicyRule", - "parameter": "MemberName", - "wireKey": "member_names", - "method": "GET", - "endpoint": "buckets/bucket-access-policies/rules", - "declared": [ - "allow_errors", - "bucket_ids", - "bucket_names", - "context_names", - "continuation_token", - "filter", - "limit", - "names", - "offset", - "policy_names", - "sort" - ] - }, - { - "severity": "WRONG-RESULTS", - "cmdlet": "Get-PfbBucketAuditFilter", - "parameter": "MemberId", - "wireKey": "member_ids", - "method": "GET", - "endpoint": "buckets/audit-filters", - "declared": [ - "allow_errors", - "bucket_ids", - "bucket_names", - "context_names", - "continuation_token", - "filter", - "limit", - "names", - "offset", - "sort" - ] - }, - { - "severity": "WRONG-RESULTS", - "cmdlet": "Get-PfbBucketAuditFilter", - "parameter": "MemberName", - "wireKey": "member_names", - "method": "GET", - "endpoint": "buckets/audit-filters", - "declared": [ - "allow_errors", - "bucket_ids", - "bucket_names", - "context_names", - "continuation_token", - "filter", - "limit", - "names", - "offset", - "sort" - ] - }, - { - "severity": "WRONG-RESULTS", - "cmdlet": "Get-PfbBucketCorsPolicy", - "parameter": "Id", - "wireKey": "ids", - "method": "GET", - "endpoint": "buckets/cross-origin-resource-sharing-policies", - "declared": [ - "allow_errors", - "bucket_ids", - "bucket_names", - "context_names", - "continuation_token", - "filter", - "limit", - "names", - "offset", - "sort" - ] - }, - { - "severity": "WRONG-RESULTS", - "cmdlet": "Get-PfbBucketCorsPolicy", - "parameter": "MemberId", - "wireKey": "member_ids", - "method": "GET", - "endpoint": "buckets/cross-origin-resource-sharing-policies", - "declared": [ - "allow_errors", - "bucket_ids", - "bucket_names", - "context_names", - "continuation_token", - "filter", - "limit", - "names", - "offset", - "sort" - ] - }, - { - "severity": "WRONG-RESULTS", - "cmdlet": "Get-PfbBucketCorsPolicy", - "parameter": "MemberName", - "wireKey": "member_names", - "method": "GET", - "endpoint": "buckets/cross-origin-resource-sharing-policies", - "declared": [ - "allow_errors", - "bucket_ids", - "bucket_names", - "context_names", - "continuation_token", - "filter", - "limit", - "names", - "offset", - "sort" - ] - }, - { - "severity": "WRONG-RESULTS", - "cmdlet": "Get-PfbBucketCorsPolicy", - "parameter": "PolicyName", - "wireKey": "policy_names", - "method": "GET", - "endpoint": "buckets/cross-origin-resource-sharing-policies", - "declared": [ - "allow_errors", - "bucket_ids", - "bucket_names", - "context_names", - "continuation_token", - "filter", - "limit", - "names", - "offset", - "sort" - ] - }, - { - "severity": "WRONG-RESULTS", - "cmdlet": "Get-PfbBucketCorsPolicyRule", - "parameter": "Id", - "wireKey": "ids", - "method": "GET", - "endpoint": "buckets/cross-origin-resource-sharing-policies/rules", - "declared": [ - "allow_errors", - "bucket_ids", - "bucket_names", - "context_names", - "continuation_token", - "filter", - "limit", - "names", - "offset", - "policy_names", - "sort" - ] - }, - { - "severity": "WRONG-RESULTS", - "cmdlet": "Get-PfbBucketCorsPolicyRule", - "parameter": "MemberName", - "wireKey": "member_names", - "method": "GET", - "endpoint": "buckets/cross-origin-resource-sharing-policies/rules", - "declared": [ - "allow_errors", - "bucket_ids", - "bucket_names", - "context_names", - "continuation_token", - "filter", - "limit", - "names", - "offset", - "policy_names", - "sort" - ] - }, - { - "severity": "WRONG-RESULTS", - "cmdlet": "Get-PfbCertificateGroupCertificate", - "parameter": "Id", - "wireKey": "ids", - "method": "GET", - "endpoint": "certificate-groups/certificates", - "declared": [ - "certificate_group_ids", - "certificate_group_names", - "certificate_ids", - "certificate_names", - "continuation_token", - "filter", - "limit", - "offset", - "sort" - ] - }, - { - "severity": "WRONG-RESULTS", - "cmdlet": "Get-PfbCertificateGroupCertificate", - "parameter": "Name", - "wireKey": "names", - "method": "GET", - "endpoint": "certificate-groups/certificates", - "declared": [ - "certificate_group_ids", - "certificate_group_names", - "certificate_ids", - "certificate_names", - "continuation_token", - "filter", - "limit", - "offset", - "sort" - ] - }, { "severity": "WRONG-RESULTS", "cmdlet": "Get-PfbFileLock", @@ -970,22 +628,6 @@ "user_names" ] }, - { - "severity": "WRONG-RESULTS", - "cmdlet": "Get-PfbFleetKey", - "parameter": "Name", - "wireKey": "names", - "method": "GET", - "endpoint": "fleets/fleet-key", - "declared": [ - "continuation_token", - "filter", - "limit", - "offset", - "sort", - "total_only" - ] - }, { "severity": "WRONG-RESULTS", "cmdlet": "Get-PfbKeytabDownload", @@ -1184,42 +826,6 @@ "start_time" ] }, - { - "severity": "WRONG-RESULTS", - "cmdlet": "Get-PfbNetworkConnectionStatistics", - "parameter": "Name", - "wireKey": "names", - "method": "GET", - "endpoint": "network-interfaces/network-connection-statistics", - "declared": [ - "current_state", - "filter", - "limit", - "local_host", - "local_port", - "offset", - "remote_host", - "remote_port", - "sort" - ] - }, - { - "severity": "WRONG-RESULTS", - "cmdlet": "Get-PfbNetworkInterfaceNeighbor", - "parameter": "Name", - "wireKey": "names", - "method": "GET", - "endpoint": "network-interfaces/neighbors", - "declared": [ - "continuation_token", - "filter", - "limit", - "local_port_names", - "offset", - "sort", - "total_item_count" - ] - }, { "severity": "WRONG-RESULTS", "cmdlet": "Get-PfbNodeGroupNode", @@ -1264,212 +870,95 @@ "parameter": "MemberId", "wireKey": "member_ids", "method": "GET", - "endpoint": "node-groups/nodes", - "declared": [ - "continuation_token", - "filter", - "limit", - "node_group_ids", - "node_group_names", - "node_ids", - "node_names", - "offset", - "sort" - ] - }, - { - "severity": "WRONG-RESULTS", - "cmdlet": "Get-PfbNodeGroupNode", - "parameter": "MemberName", - "wireKey": "member_names", - "method": "GET", - "endpoint": "node-groups/nodes", - "declared": [ - "continuation_token", - "filter", - "limit", - "node_group_ids", - "node_group_names", - "node_ids", - "node_names", - "offset", - "sort" - ] - }, - { - "severity": "WRONG-RESULTS", - "cmdlet": "Get-PfbObjectStoreAccessKey", - "parameter": "Id", - "wireKey": "ids", - "method": "GET", - "endpoint": "object-store-access-keys", - "declared": [ - "allow_errors", - "context_names", - "continuation_token", - "filter", - "limit", - "names", - "offset", - "sort" - ] - }, - { - "severity": "WRONG-RESULTS", - "cmdlet": "Get-PfbObjectStoreRoleAccessPolicy", - "parameter": "RoleId", - "wireKey": "role_ids", - "method": "GET", - "endpoint": "object-store-roles/object-store-access-policies", - "declared": [ - "allow_errors", - "context_names", - "continuation_token", - "filter", - "limit", - "member_ids", - "member_names", - "offset", - "policy_ids", - "policy_names", - "sort" - ] - }, - { - "severity": "WRONG-RESULTS", - "cmdlet": "Get-PfbObjectStoreRoleAccessPolicy", - "parameter": "RoleName", - "wireKey": "role_names", - "method": "GET", - "endpoint": "object-store-roles/object-store-access-policies", - "declared": [ - "allow_errors", - "context_names", - "continuation_token", - "filter", - "limit", - "member_ids", - "member_names", - "offset", - "policy_ids", - "policy_names", - "sort" - ] - }, - { - "severity": "WRONG-RESULTS", - "cmdlet": "Get-PfbObjectStoreTrustPolicyRule", - "parameter": "PolicyId", - "wireKey": "policy_ids", - "method": "GET", - "endpoint": "object-store-roles/object-store-trust-policies/rules", - "declared": [ - "allow_errors", - "context_names", - "continuation_token", - "filter", - "indices", - "limit", - "names", - "offset", - "policy_names", - "role_ids", - "role_names", - "sort" - ] - }, - { - "severity": "WRONG-RESULTS", - "cmdlet": "Get-PfbOpenFile", - "parameter": "Filter", - "wireKey": "filter", - "method": "GET", - "endpoint": "file-systems/open-files", + "endpoint": "node-groups/nodes", "declared": [ - "client_names", "continuation_token", - "file_system_ids", - "file_system_names", - "ids", + "filter", "limit", - "paths", - "protocols", - "session_names", - "user_names" + "node_group_ids", + "node_group_names", + "node_ids", + "node_names", + "offset", + "sort" ] }, { "severity": "WRONG-RESULTS", - "cmdlet": "Get-PfbOpenFile", - "parameter": "Name", - "wireKey": "names", + "cmdlet": "Get-PfbNodeGroupNode", + "parameter": "MemberName", + "wireKey": "member_names", "method": "GET", - "endpoint": "file-systems/open-files", + "endpoint": "node-groups/nodes", "declared": [ - "client_names", "continuation_token", - "file_system_ids", - "file_system_names", - "ids", + "filter", "limit", - "paths", - "protocols", - "session_names", - "user_names" + "node_group_ids", + "node_group_names", + "node_ids", + "node_names", + "offset", + "sort" ] }, { "severity": "WRONG-RESULTS", - "cmdlet": "Get-PfbOpenFile", - "parameter": "Sort", - "wireKey": "sort", + "cmdlet": "Get-PfbObjectStoreAccessKey", + "parameter": "Id", + "wireKey": "ids", "method": "GET", - "endpoint": "file-systems/open-files", + "endpoint": "object-store-access-keys", "declared": [ - "client_names", + "allow_errors", + "context_names", "continuation_token", - "file_system_ids", - "file_system_names", - "ids", + "filter", "limit", - "paths", - "protocols", - "session_names", - "user_names" + "names", + "offset", + "sort" ] }, { "severity": "WRONG-RESULTS", - "cmdlet": "Get-PfbRealmDefaults", - "parameter": "Name", - "wireKey": "names", + "cmdlet": "Get-PfbObjectStoreRoleAccessPolicy", + "parameter": "RoleId", + "wireKey": "role_ids", "method": "GET", - "endpoint": "realms/defaults", + "endpoint": "object-store-roles/object-store-access-policies", "declared": [ "allow_errors", "context_names", "continuation_token", "filter", "limit", + "member_ids", + "member_names", "offset", - "realm_ids", - "realm_names", + "policy_ids", + "policy_names", "sort" ] }, { "severity": "WRONG-RESULTS", - "cmdlet": "Get-PfbResourceAccess", - "parameter": "Name", - "wireKey": "names", + "cmdlet": "Get-PfbObjectStoreRoleAccessPolicy", + "parameter": "RoleName", + "wireKey": "role_names", "method": "GET", - "endpoint": "resource-accesses", + "endpoint": "object-store-roles/object-store-access-policies", "declared": [ + "allow_errors", + "context_names", "continuation_token", "filter", - "ids", "limit", + "member_ids", + "member_names", "offset", + "policy_ids", + "policy_names", "sort" ] }, @@ -1648,87 +1137,6 @@ "source" ] }, - { - "severity": "CREATE", - "cmdlet": "New-PfbBucketAccessPolicy", - "parameter": "MemberName", - "wireKey": "member_names", - "method": "POST", - "endpoint": "buckets/bucket-access-policies", - "declared": [ - "bucket_ids", - "bucket_names", - "context_names" - ] - }, - { - "severity": "CREATE", - "cmdlet": "New-PfbBucketAccessPolicy", - "parameter": "PolicyName", - "wireKey": "policy_names", - "method": "POST", - "endpoint": "buckets/bucket-access-policies", - "declared": [ - "bucket_ids", - "bucket_names", - "context_names" - ] - }, - { - "severity": "CREATE", - "cmdlet": "New-PfbBucketAccessPolicyRule", - "parameter": "MemberName", - "wireKey": "member_names", - "method": "POST", - "endpoint": "buckets/bucket-access-policies/rules", - "declared": [ - "bucket_ids", - "bucket_names", - "context_names", - "names", - "policy_names" - ] - }, - { - "severity": "CREATE", - "cmdlet": "New-PfbBucketAuditFilter", - "parameter": "MemberName", - "wireKey": "member_names", - "method": "POST", - "endpoint": "buckets/audit-filters", - "declared": [ - "bucket_ids", - "bucket_names", - "context_names", - "names" - ] - }, - { - "severity": "CREATE", - "cmdlet": "New-PfbBucketCorsPolicy", - "parameter": "MemberName", - "wireKey": "member_names", - "method": "POST", - "endpoint": "buckets/cross-origin-resource-sharing-policies", - "declared": [ - "bucket_ids", - "bucket_names", - "context_names" - ] - }, - { - "severity": "CREATE", - "cmdlet": "New-PfbBucketCorsPolicy", - "parameter": "PolicyName", - "wireKey": "policy_names", - "method": "POST", - "endpoint": "buckets/cross-origin-resource-sharing-policies", - "declared": [ - "bucket_ids", - "bucket_names", - "context_names" - ] - }, { "severity": "CREATE", "cmdlet": "New-PfbNlmReclamation", @@ -1755,104 +1163,6 @@ "policy_names" ] }, - { - "severity": "DESTRUCTIVE", - "cmdlet": "Remove-PfbBucketAccessPolicy", - "parameter": "MemberName", - "wireKey": "member_names", - "method": "DELETE", - "endpoint": "buckets/bucket-access-policies", - "declared": [ - "bucket_ids", - "bucket_names", - "context_names", - "names" - ] - }, - { - "severity": "DESTRUCTIVE", - "cmdlet": "Remove-PfbBucketAccessPolicy", - "parameter": "PolicyName", - "wireKey": "policy_names", - "method": "DELETE", - "endpoint": "buckets/bucket-access-policies", - "declared": [ - "bucket_ids", - "bucket_names", - "context_names", - "names" - ] - }, - { - "severity": "DESTRUCTIVE", - "cmdlet": "Remove-PfbBucketAuditFilter", - "parameter": "MemberId", - "wireKey": "member_ids", - "method": "DELETE", - "endpoint": "buckets/audit-filters", - "declared": [ - "bucket_ids", - "bucket_names", - "context_names", - "names" - ] - }, - { - "severity": "DESTRUCTIVE", - "cmdlet": "Remove-PfbBucketAuditFilter", - "parameter": "MemberName", - "wireKey": "member_names", - "method": "DELETE", - "endpoint": "buckets/audit-filters", - "declared": [ - "bucket_ids", - "bucket_names", - "context_names", - "names" - ] - }, - { - "severity": "DESTRUCTIVE", - "cmdlet": "Remove-PfbBucketCorsPolicy", - "parameter": "MemberId", - "wireKey": "member_ids", - "method": "DELETE", - "endpoint": "buckets/cross-origin-resource-sharing-policies", - "declared": [ - "bucket_ids", - "bucket_names", - "context_names", - "names" - ] - }, - { - "severity": "DESTRUCTIVE", - "cmdlet": "Remove-PfbBucketCorsPolicy", - "parameter": "MemberName", - "wireKey": "member_names", - "method": "DELETE", - "endpoint": "buckets/cross-origin-resource-sharing-policies", - "declared": [ - "bucket_ids", - "bucket_names", - "context_names", - "names" - ] - }, - { - "severity": "DESTRUCTIVE", - "cmdlet": "Remove-PfbBucketCorsPolicy", - "parameter": "PolicyName", - "wireKey": "policy_names", - "method": "DELETE", - "endpoint": "buckets/cross-origin-resource-sharing-policies", - "declared": [ - "bucket_ids", - "bucket_names", - "context_names", - "names" - ] - }, { "severity": "DESTRUCTIVE", "cmdlet": "Remove-PfbFileLock", @@ -2009,28 +1319,6 @@ "policy_names" ] }, - { - "severity": "DESTRUCTIVE", - "cmdlet": "Remove-PfbOpenFile", - "parameter": "Name", - "wireKey": "names", - "method": "DELETE", - "endpoint": "file-systems/open-files", - "declared": [ - "ids" - ] - }, - { - "severity": "DESTRUCTIVE", - "cmdlet": "Remove-PfbResourceAccess", - "parameter": "Name", - "wireKey": "names", - "method": "DELETE", - "endpoint": "resource-accesses", - "declared": [ - "ids" - ] - }, { "severity": "DESTRUCTIVE", "cmdlet": "Remove-PfbSmbClientRule", @@ -2061,26 +1349,11 @@ } ], "noSurvivingSelector": [ - { - "cmdlet": "Get-PfbBucketAuditFilter", - "method": "GET", - "endpoint": "buckets/audit-filters" - }, - { - "cmdlet": "Get-PfbCertificateGroupCertificate", - "method": "GET", - "endpoint": "certificate-groups/certificates" - }, { "cmdlet": "Get-PfbFileLockClient", "method": "GET", "endpoint": "file-systems/locks/clients" }, - { - "cmdlet": "Get-PfbFleetKey", - "method": "GET", - "endpoint": "fleets/fleet-key" - }, { "cmdlet": "Get-PfbKeytabDownload", "method": "GET", @@ -2091,61 +1364,16 @@ "method": "GET", "endpoint": "legal-holds/held-entities" }, - { - "cmdlet": "Get-PfbNetworkConnectionStatistics", - "method": "GET", - "endpoint": "network-interfaces/network-connection-statistics" - }, - { - "cmdlet": "Get-PfbNetworkInterfaceNeighbor", - "method": "GET", - "endpoint": "network-interfaces/neighbors" - }, { "cmdlet": "Get-PfbNodeGroupNode", "method": "GET", "endpoint": "node-groups/nodes" }, - { - "cmdlet": "Get-PfbRealmDefaults", - "method": "GET", - "endpoint": "realms/defaults" - }, - { - "cmdlet": "New-PfbBucketAccessPolicy", - "method": "POST", - "endpoint": "buckets/bucket-access-policies" - }, - { - "cmdlet": "New-PfbBucketAuditFilter", - "method": "POST", - "endpoint": "buckets/audit-filters" - }, - { - "cmdlet": "New-PfbBucketCorsPolicy", - "method": "POST", - "endpoint": "buckets/cross-origin-resource-sharing-policies" - }, { "cmdlet": "New-PfbNlmReclamation", "method": "POST", "endpoint": "file-systems/locks/nlm-reclamations" }, - { - "cmdlet": "Remove-PfbBucketAccessPolicy", - "method": "DELETE", - "endpoint": "buckets/bucket-access-policies" - }, - { - "cmdlet": "Remove-PfbBucketAuditFilter", - "method": "DELETE", - "endpoint": "buckets/audit-filters" - }, - { - "cmdlet": "Remove-PfbBucketCorsPolicy", - "method": "DELETE", - "endpoint": "buckets/cross-origin-resource-sharing-policies" - }, { "cmdlet": "Remove-PfbNodeGroupNode", "method": "DELETE", diff --git a/Reports/PfbFieldCmdletMap.json b/Reports/PfbFieldCmdletMap.json index fb39404b..bb618f5e 100644 --- a/Reports/PfbFieldCmdletMap.json +++ b/Reports/PfbFieldCmdletMap.json @@ -1944,18 +1944,8 @@ }, { "cmdlet": "Get-PfbBucketAccessPolicy", - "parameter": "Filter", - "wireName": "filter", - "status": "no-spec-enum-found", - "matchedKey": null, - "specValues": null, - "stableSinceOldestVersion": null, - "recommendation": null - }, - { - "cmdlet": "Get-PfbBucketAccessPolicy", - "parameter": "Id", - "wireName": "ids", + "parameter": "BucketId", + "wireName": "bucket_ids", "status": "no-spec-enum-found", "matchedKey": null, "specValues": null, @@ -1964,8 +1954,8 @@ }, { "cmdlet": "Get-PfbBucketAccessPolicy", - "parameter": "Limit", - "wireName": "limit", + "parameter": "BucketName", + "wireName": "bucket_names", "status": "no-spec-enum-found", "matchedKey": null, "specValues": null, @@ -1974,8 +1964,8 @@ }, { "cmdlet": "Get-PfbBucketAccessPolicy", - "parameter": "MemberId", - "wireName": "member_ids", + "parameter": "Filter", + "wireName": "filter", "status": "no-spec-enum-found", "matchedKey": null, "specValues": null, @@ -1984,8 +1974,8 @@ }, { "cmdlet": "Get-PfbBucketAccessPolicy", - "parameter": "MemberName", - "wireName": "member_names", + "parameter": "Limit", + "wireName": "limit", "status": "no-spec-enum-found", "matchedKey": null, "specValues": null, @@ -2002,26 +1992,6 @@ "stableSinceOldestVersion": null, "recommendation": null }, - { - "cmdlet": "Get-PfbBucketAccessPolicy", - "parameter": "PolicyId", - "wireName": "policy_ids", - "status": "no-spec-enum-found", - "matchedKey": null, - "specValues": null, - "stableSinceOldestVersion": null, - "recommendation": null - }, - { - "cmdlet": "Get-PfbBucketAccessPolicy", - "parameter": "PolicyName", - "wireName": "policy_names", - "status": "no-spec-enum-found", - "matchedKey": null, - "specValues": null, - "stableSinceOldestVersion": null, - "recommendation": null - }, { "cmdlet": "Get-PfbBucketAccessPolicy", "parameter": "Sort", @@ -2034,8 +2004,8 @@ }, { "cmdlet": "Get-PfbBucketAccessPolicyRule", - "parameter": "Filter", - "wireName": "filter", + "parameter": "BucketName", + "wireName": "bucket_names", "status": "no-spec-enum-found", "matchedKey": null, "specValues": null, @@ -2044,8 +2014,8 @@ }, { "cmdlet": "Get-PfbBucketAccessPolicyRule", - "parameter": "Id", - "wireName": "ids", + "parameter": "Filter", + "wireName": "filter", "status": "no-spec-enum-found", "matchedKey": null, "specValues": null, @@ -2064,8 +2034,8 @@ }, { "cmdlet": "Get-PfbBucketAccessPolicyRule", - "parameter": "MemberName", - "wireName": "member_names", + "parameter": "Name", + "wireName": "names", "status": "no-spec-enum-found", "matchedKey": null, "specValues": null, @@ -2074,8 +2044,8 @@ }, { "cmdlet": "Get-PfbBucketAccessPolicyRule", - "parameter": "Name", - "wireName": "names", + "parameter": "PolicyName", + "wireName": "policy_names", "status": "no-spec-enum-found", "matchedKey": null, "specValues": null, @@ -2084,8 +2054,8 @@ }, { "cmdlet": "Get-PfbBucketAccessPolicyRule", - "parameter": "PolicyName", - "wireName": "policy_names", + "parameter": "Sort", + "wireName": "sort", "status": "no-spec-enum-found", "matchedKey": null, "specValues": null, @@ -2093,9 +2063,9 @@ "recommendation": null }, { - "cmdlet": "Get-PfbBucketAccessPolicyRule", - "parameter": "Sort", - "wireName": "sort", + "cmdlet": "Get-PfbBucketAuditFilter", + "parameter": "BucketId", + "wireName": "bucket_ids", "status": "no-spec-enum-found", "matchedKey": null, "specValues": null, @@ -2104,8 +2074,8 @@ }, { "cmdlet": "Get-PfbBucketAuditFilter", - "parameter": "Filter", - "wireName": "filter", + "parameter": "BucketName", + "wireName": "bucket_names", "status": "no-spec-enum-found", "matchedKey": null, "specValues": null, @@ -2114,8 +2084,8 @@ }, { "cmdlet": "Get-PfbBucketAuditFilter", - "parameter": "Limit", - "wireName": "limit", + "parameter": "Filter", + "wireName": "filter", "status": "no-spec-enum-found", "matchedKey": null, "specValues": null, @@ -2124,8 +2094,8 @@ }, { "cmdlet": "Get-PfbBucketAuditFilter", - "parameter": "MemberId", - "wireName": "member_ids", + "parameter": "Limit", + "wireName": "limit", "status": "no-spec-enum-found", "matchedKey": null, "specValues": null, @@ -2134,8 +2104,8 @@ }, { "cmdlet": "Get-PfbBucketAuditFilter", - "parameter": "MemberName", - "wireName": "member_names", + "parameter": "Name", + "wireName": "names", "status": "no-spec-enum-found", "matchedKey": null, "specValues": null, @@ -2184,18 +2154,8 @@ }, { "cmdlet": "Get-PfbBucketCorsPolicy", - "parameter": "Filter", - "wireName": "filter", - "status": "no-spec-enum-found", - "matchedKey": null, - "specValues": null, - "stableSinceOldestVersion": null, - "recommendation": null - }, - { - "cmdlet": "Get-PfbBucketCorsPolicy", - "parameter": "Id", - "wireName": "ids", + "parameter": "BucketId", + "wireName": "bucket_ids", "status": "no-spec-enum-found", "matchedKey": null, "specValues": null, @@ -2204,8 +2164,8 @@ }, { "cmdlet": "Get-PfbBucketCorsPolicy", - "parameter": "Limit", - "wireName": "limit", + "parameter": "BucketName", + "wireName": "bucket_names", "status": "no-spec-enum-found", "matchedKey": null, "specValues": null, @@ -2214,8 +2174,8 @@ }, { "cmdlet": "Get-PfbBucketCorsPolicy", - "parameter": "MemberId", - "wireName": "member_ids", + "parameter": "Filter", + "wireName": "filter", "status": "no-spec-enum-found", "matchedKey": null, "specValues": null, @@ -2224,8 +2184,8 @@ }, { "cmdlet": "Get-PfbBucketCorsPolicy", - "parameter": "MemberName", - "wireName": "member_names", + "parameter": "Limit", + "wireName": "limit", "status": "no-spec-enum-found", "matchedKey": null, "specValues": null, @@ -2242,16 +2202,6 @@ "stableSinceOldestVersion": null, "recommendation": null }, - { - "cmdlet": "Get-PfbBucketCorsPolicy", - "parameter": "PolicyName", - "wireName": "policy_names", - "status": "no-spec-enum-found", - "matchedKey": null, - "specValues": null, - "stableSinceOldestVersion": null, - "recommendation": null - }, { "cmdlet": "Get-PfbBucketCorsPolicy", "parameter": "Sort", @@ -2264,8 +2214,8 @@ }, { "cmdlet": "Get-PfbBucketCorsPolicyRule", - "parameter": "Filter", - "wireName": "filter", + "parameter": "BucketName", + "wireName": "bucket_names", "status": "no-spec-enum-found", "matchedKey": null, "specValues": null, @@ -2274,8 +2224,8 @@ }, { "cmdlet": "Get-PfbBucketCorsPolicyRule", - "parameter": "Id", - "wireName": "ids", + "parameter": "Filter", + "wireName": "filter", "status": "no-spec-enum-found", "matchedKey": null, "specValues": null, @@ -2292,16 +2242,6 @@ "stableSinceOldestVersion": null, "recommendation": null }, - { - "cmdlet": "Get-PfbBucketCorsPolicyRule", - "parameter": "MemberName", - "wireName": "member_names", - "status": "no-spec-enum-found", - "matchedKey": null, - "specValues": null, - "stableSinceOldestVersion": null, - "recommendation": null - }, { "cmdlet": "Get-PfbBucketCorsPolicyRule", "parameter": "Name", @@ -2734,8 +2674,8 @@ }, { "cmdlet": "Get-PfbCertificateGroupCertificate", - "parameter": "Filter", - "wireName": "filter", + "parameter": "CertificateGroupId", + "wireName": "certificate_group_ids", "status": "no-spec-enum-found", "matchedKey": null, "specValues": null, @@ -2744,8 +2684,8 @@ }, { "cmdlet": "Get-PfbCertificateGroupCertificate", - "parameter": "Id", - "wireName": "ids", + "parameter": "CertificateName", + "wireName": "certificate_names", "status": "no-spec-enum-found", "matchedKey": null, "specValues": null, @@ -2754,8 +2694,8 @@ }, { "cmdlet": "Get-PfbCertificateGroupCertificate", - "parameter": "Limit", - "wireName": "limit", + "parameter": "Filter", + "wireName": "filter", "status": "no-spec-enum-found", "matchedKey": null, "specValues": null, @@ -2764,8 +2704,8 @@ }, { "cmdlet": "Get-PfbCertificateGroupCertificate", - "parameter": "Name", - "wireName": "names", + "parameter": "Limit", + "wireName": "limit", "status": "no-spec-enum-found", "matchedKey": null, "specValues": null, @@ -4862,16 +4802,6 @@ "stableSinceOldestVersion": null, "recommendation": null }, - { - "cmdlet": "Get-PfbFleetKey", - "parameter": "Name", - "wireName": "names", - "status": "no-spec-enum-found", - "matchedKey": null, - "specValues": null, - "stableSinceOldestVersion": null, - "recommendation": null - }, { "cmdlet": "Get-PfbFleetKey", "parameter": "Sort", @@ -5604,7 +5534,7 @@ }, { "cmdlet": "Get-PfbLocalGroupMember", - "parameter": "Group", + "parameter": "GroupName", "wireName": "group_names", "status": "no-spec-enum-found", "matchedKey": null, @@ -6272,16 +6202,6 @@ "stableSinceOldestVersion": null, "recommendation": null }, - { - "cmdlet": "Get-PfbNetworkConnectionStatistics", - "parameter": "Name", - "wireName": "names", - "status": "no-spec-enum-found", - "matchedKey": null, - "specValues": null, - "stableSinceOldestVersion": null, - "recommendation": null - }, { "cmdlet": "Get-PfbNetworkConnectionStatistics", "parameter": "Sort", @@ -6524,8 +6444,8 @@ }, { "cmdlet": "Get-PfbNetworkInterfaceNeighbor", - "parameter": "Name", - "wireName": "names", + "parameter": "LocalPortName", + "wireName": "local_port_names", "status": "no-spec-enum-found", "matchedKey": null, "specValues": null, @@ -7622,16 +7542,6 @@ "stableSinceOldestVersion": null, "recommendation": null }, - { - "cmdlet": "Get-PfbObjectStoreTrustPolicyRule", - "parameter": "PolicyId", - "wireName": "policy_ids", - "status": "no-spec-enum-found", - "matchedKey": null, - "specValues": null, - "stableSinceOldestVersion": null, - "recommendation": null - }, { "cmdlet": "Get-PfbObjectStoreTrustPolicyRule", "parameter": "PolicyName", @@ -7872,16 +7782,6 @@ "stableSinceOldestVersion": null, "recommendation": null }, - { - "cmdlet": "Get-PfbOpenFile", - "parameter": "Filter", - "wireName": "filter", - "status": "no-spec-enum-found", - "matchedKey": null, - "specValues": null, - "stableSinceOldestVersion": null, - "recommendation": null - }, { "cmdlet": "Get-PfbOpenFile", "parameter": "Id", @@ -7902,26 +7802,6 @@ "stableSinceOldestVersion": null, "recommendation": null }, - { - "cmdlet": "Get-PfbOpenFile", - "parameter": "Name", - "wireName": "names", - "status": "no-spec-enum-found", - "matchedKey": null, - "specValues": null, - "stableSinceOldestVersion": null, - "recommendation": null - }, - { - "cmdlet": "Get-PfbOpenFile", - "parameter": "Sort", - "wireName": "sort", - "status": "no-spec-enum-found", - "matchedKey": null, - "specValues": null, - "stableSinceOldestVersion": null, - "recommendation": null - }, { "cmdlet": "Get-PfbPasswordPolicy", "parameter": "Filter", @@ -8889,8 +8769,8 @@ }, { "cmdlet": "Get-PfbRealmDefaults", - "parameter": "Name", - "wireName": "names", + "parameter": "RealmName", + "wireName": "realm_names", "status": "no-spec-enum-found", "matchedKey": null, "specValues": null, @@ -9127,16 +9007,6 @@ "stableSinceOldestVersion": null, "recommendation": null }, - { - "cmdlet": "Get-PfbResourceAccess", - "parameter": "Name", - "wireName": "names", - "status": "no-spec-enum-found", - "matchedKey": null, - "specValues": null, - "stableSinceOldestVersion": null, - "recommendation": null - }, { "cmdlet": "Get-PfbResourceAccess", "parameter": "Sort", @@ -11659,8 +11529,8 @@ }, { "cmdlet": "New-PfbBucketAccessPolicy", - "parameter": "MemberName", - "wireName": "member_names", + "parameter": "BucketName", + "wireName": "bucket_names", "status": "no-spec-enum-found", "matchedKey": null, "specValues": null, @@ -11668,9 +11538,9 @@ "recommendation": null }, { - "cmdlet": "New-PfbBucketAccessPolicy", - "parameter": "PolicyName", - "wireName": "policy_names", + "cmdlet": "New-PfbBucketAccessPolicyRule", + "parameter": "BucketName", + "wireName": "bucket_names", "status": "no-spec-enum-found", "matchedKey": null, "specValues": null, @@ -11679,8 +11549,8 @@ }, { "cmdlet": "New-PfbBucketAccessPolicyRule", - "parameter": "MemberName", - "wireName": "member_names", + "parameter": "Name", + "wireName": "names", "status": "no-spec-enum-found", "matchedKey": null, "specValues": null, @@ -11699,8 +11569,8 @@ }, { "cmdlet": "New-PfbBucketAuditFilter", - "parameter": "MemberName", - "wireName": "member_names", + "parameter": "BucketName", + "wireName": "bucket_names", "status": "no-spec-enum-found", "matchedKey": null, "specValues": null, @@ -11709,8 +11579,8 @@ }, { "cmdlet": "New-PfbBucketCorsPolicy", - "parameter": "MemberName", - "wireName": "member_names", + "parameter": "BucketName", + "wireName": "bucket_names", "status": "no-spec-enum-found", "matchedKey": null, "specValues": null, @@ -11718,7 +11588,27 @@ "recommendation": null }, { - "cmdlet": "New-PfbBucketCorsPolicy", + "cmdlet": "New-PfbBucketCorsPolicyRule", + "parameter": "BucketName", + "wireName": "bucket_names", + "status": "no-spec-enum-found", + "matchedKey": null, + "specValues": null, + "stableSinceOldestVersion": null, + "recommendation": null + }, + { + "cmdlet": "New-PfbBucketCorsPolicyRule", + "parameter": "Name", + "wireName": "names", + "status": "no-spec-enum-found", + "matchedKey": null, + "specValues": null, + "stableSinceOldestVersion": null, + "recommendation": null + }, + { + "cmdlet": "New-PfbBucketCorsPolicyRule", "parameter": "PolicyName", "wireName": "policy_names", "status": "no-spec-enum-found", @@ -14399,8 +14289,8 @@ }, { "cmdlet": "Remove-PfbBucketAccessPolicy", - "parameter": "MemberName", - "wireName": "member_names", + "parameter": "BucketId", + "wireName": "bucket_ids", "status": "no-spec-enum-found", "matchedKey": null, "specValues": null, @@ -14409,8 +14299,18 @@ }, { "cmdlet": "Remove-PfbBucketAccessPolicy", - "parameter": "PolicyName", - "wireName": "policy_names", + "parameter": "BucketName", + "wireName": "bucket_names", + "status": "no-spec-enum-found", + "matchedKey": null, + "specValues": null, + "stableSinceOldestVersion": null, + "recommendation": null + }, + { + "cmdlet": "Remove-PfbBucketAccessPolicy", + "parameter": "Name", + "wireName": "names", "status": "no-spec-enum-found", "matchedKey": null, "specValues": null, @@ -14429,8 +14329,8 @@ }, { "cmdlet": "Remove-PfbBucketAuditFilter", - "parameter": "MemberId", - "wireName": "member_ids", + "parameter": "BucketId", + "wireName": "bucket_ids", "status": "no-spec-enum-found", "matchedKey": null, "specValues": null, @@ -14439,8 +14339,18 @@ }, { "cmdlet": "Remove-PfbBucketAuditFilter", - "parameter": "MemberName", - "wireName": "member_names", + "parameter": "BucketName", + "wireName": "bucket_names", + "status": "no-spec-enum-found", + "matchedKey": null, + "specValues": null, + "stableSinceOldestVersion": null, + "recommendation": null + }, + { + "cmdlet": "Remove-PfbBucketAuditFilter", + "parameter": "Name", + "wireName": "names", "status": "no-spec-enum-found", "matchedKey": null, "specValues": null, @@ -14449,8 +14359,8 @@ }, { "cmdlet": "Remove-PfbBucketCorsPolicy", - "parameter": "MemberId", - "wireName": "member_ids", + "parameter": "BucketId", + "wireName": "bucket_ids", "status": "no-spec-enum-found", "matchedKey": null, "specValues": null, @@ -14459,8 +14369,8 @@ }, { "cmdlet": "Remove-PfbBucketCorsPolicy", - "parameter": "MemberName", - "wireName": "member_names", + "parameter": "BucketName", + "wireName": "bucket_names", "status": "no-spec-enum-found", "matchedKey": null, "specValues": null, @@ -14469,8 +14379,8 @@ }, { "cmdlet": "Remove-PfbBucketCorsPolicy", - "parameter": "PolicyName", - "wireName": "policy_names", + "parameter": "Name", + "wireName": "names", "status": "no-spec-enum-found", "matchedKey": null, "specValues": null, @@ -15887,16 +15797,6 @@ "stableSinceOldestVersion": null, "recommendation": null }, - { - "cmdlet": "Remove-PfbOpenFile", - "parameter": "Name", - "wireName": "names", - "status": "no-spec-enum-found", - "matchedKey": null, - "specValues": null, - "stableSinceOldestVersion": null, - "recommendation": null - }, { "cmdlet": "Remove-PfbPolicy", "parameter": "Id", @@ -16137,16 +16037,6 @@ "stableSinceOldestVersion": null, "recommendation": null }, - { - "cmdlet": "Remove-PfbResourceAccess", - "parameter": "Name", - "wireName": "names", - "status": "no-spec-enum-found", - "matchedKey": null, - "specValues": null, - "stableSinceOldestVersion": null, - "recommendation": null - }, { "cmdlet": "Remove-PfbS3ExportPolicy", "parameter": "Id", @@ -17349,8 +17239,8 @@ }, { "cmdlet": "Update-PfbBucketAuditFilter", - "parameter": "FilterNames", - "wireName": "names", + "parameter": "BucketId", + "wireName": "bucket_ids", "status": "no-spec-enum-found", "matchedKey": null, "specValues": null, @@ -17359,8 +17249,8 @@ }, { "cmdlet": "Update-PfbBucketAuditFilter", - "parameter": "MemberId", - "wireName": "bucket_ids", + "parameter": "BucketName", + "wireName": "bucket_names", "status": "no-spec-enum-found", "matchedKey": null, "specValues": null, @@ -17369,8 +17259,8 @@ }, { "cmdlet": "Update-PfbBucketAuditFilter", - "parameter": "MemberName", - "wireName": "bucket_names", + "parameter": "Name", + "wireName": "names", "status": "no-spec-enum-found", "matchedKey": null, "specValues": null, @@ -20193,6 +20083,10 @@ "cmdlet": "New-PfbAuditObjectStorePolicy", "parameter": "Enabled" }, + { + "cmdlet": "New-PfbBucketAuditFilter", + "parameter": "Name" + }, { "cmdlet": "New-PfbCertificateSigningRequest", "parameter": "Name" diff --git a/Reports/PfbFieldCmdletMapping.md b/Reports/PfbFieldCmdletMapping.md index aab3c599..068ded87 100644 --- a/Reports/PfbFieldCmdletMapping.md +++ b/Reports/PfbFieldCmdletMapping.md @@ -9,7 +9,7 @@ Reporting only -- no `Public/` cmdlet is edited by this script. Every `matched` - matched: 2 - collision: 1 - not-found-in-resource: 29 -- no-spec-enum-found: 1982 +- no-spec-enum-found: 1971 | Cmdlet | Parameter | Wire name | Status | Spec values | Recommendation | |---|---|---|---|---|---| @@ -46,11 +46,12 @@ Reporting only -- no `Public/` cmdlet is edited by this script. Every `matched` | `Update-PfbWorkload` | `-NewName` | name | not-found-in-resource | | | | `Update-PfbWormPolicy` | `-DefaultRetention` | default_retention | not-found-in-resource | | | -## Attributes-only parameters (no typed field to attach either mechanism to): 74 +## Attributes-only parameters (no typed field to attach either mechanism to): 75 - `New-PfbActiveDirectory -Name` - `New-PfbAuditFileSystemPolicy -Enabled` - `New-PfbAuditObjectStorePolicy -Enabled` +- `New-PfbBucketAuditFilter -Name` - `New-PfbCertificateSigningRequest -Name` - `New-PfbDns -Name` - `New-PfbFileSystem -DefaultExports` diff --git a/Reports/PfbPipelineSelectorMap.json b/Reports/PfbPipelineSelectorMap.json index 301f8086..f3261157 100644 --- a/Reports/PfbPipelineSelectorMap.json +++ b/Reports/PfbPipelineSelectorMap.json @@ -7,15 +7,15 @@ "GET /object-store-roles/object-store-trust-policies/download" ], "totals": { - "probePairs": 1179, - "evaluatedPairs": 1145, - "candidatePairs": 565, - "candidateRate": 0.4934, - "findings": 389, - "findingPairs": 127, - "confirmationRate": 0.6885, - "controlLeakage": 2, - "assistedRows": 152 + "probePairs": 1247, + "evaluatedPairs": 1213, + "candidatePairs": 629, + "candidateRate": 0.5185, + "findings": 264, + "findingPairs": 101, + "confirmationRate": 0.4197, + "controlLeakage": 0, + "assistedRows": 213 }, "outcomeBreakdown": [ { @@ -24,7 +24,7 @@ }, { "Outcome": "Bound", - "Count": 574 + "Count": 578 }, { "Outcome": "CmdletError", @@ -32,29 +32,29 @@ }, { "Outcome": "Coerced", - "Count": 389 + "Count": 264 }, { "Outcome": "Guarded", - "Count": 25 + "Count": 116 }, { "Outcome": "NoSelector", - "Count": 23 + "Count": 47 }, { "Outcome": "Unbindable", - "Count": 160 + "Count": 234 } ], "gateBreakdown": [ { "Gate": "Candidate", - "Count": 565 + "Count": 629 }, { "Gate": "Matched", - "Count": 580 + "Count": 584 }, { "Gate": "SelectorUnresolved", @@ -1291,11 +1291,11 @@ "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "names=@{ca_certificate_group=; context=; encrypted=PROBE-encrypted; id=PROBE-id; management_address=PROBE-management_address; os=PROBE-os; remote=; replication_addresses=System.Object[]; status=PROBE-status; throttle=; type=PROBE-type; version=PROBE-version}", - "BoundWireKey": "names", - "BoundValue": "@{ca_certificate_group=; context=; encrypted=PROBE-encrypted; id=PROBE-id; management_address=PROBE-management_address; os=PROBE-os; remote=; replication_addresses=System.Object[]; status=PROBE-status; throttle=; type=PROBE-type; version=PROBE-version}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-Name received a stringified object ('@{ca_certificate_group=; context=; encrypted=PROBE-encrypted; id=PROBE-id; management_address=PROBE-management_address; os=PROBE-os; remote=; replication_addresses=System.Object[]; status=PROBE-status; throttle=; type=PROBE-type; version=PROBE-version}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -Name, which sends a garbage filter and returns the UNFILTERED collection. This endpoint cannot be filtered by connection identity at all: its items carry neither an id nor a name, so neither the ids nor the names query key has anything to select on. Call Get-PfbArrayConnectionKey with no selector and match the keys you want from the returned collection.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "ca_certificate_group", @@ -1337,11 +1337,11 @@ "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "names=@{connection_key=PROBE-connection_key; created=PROBE-created; expires=PROBE-expires}", - "BoundWireKey": "names", - "BoundValue": "@{connection_key=PROBE-connection_key; created=PROBE-created; expires=PROBE-expires}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-Name received a stringified object ('@{connection_key=PROBE-connection_key; created=PROBE-created; expires=PROBE-expires}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -Name, which sends a garbage filter and returns the UNFILTERED collection. This endpoint cannot be filtered by connection identity at all: its items carry neither an id nor a name, so neither the ids nor the names query key has anything to select on. Call Get-PfbArrayConnectionKey with no selector and match the keys you want from the returned collection.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "connection_key", @@ -1365,11 +1365,11 @@ "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "names=@{context=; destination=PROBE-destination; id=PROBE-id; remote=; source=PROBE-source; status=PROBE-status; status_details=PROBE-status_details; type=PROBE-type}", - "BoundWireKey": "names", - "BoundValue": "@{context=; destination=PROBE-destination; id=PROBE-id; remote=; source=PROBE-source; status=PROBE-status; status_details=PROBE-status_details; type=PROBE-type}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-Name received a stringified object ('@{context=; destination=PROBE-destination; id=PROBE-id; remote=; source=PROBE-source; status=PROBE-status; status_details=PROBE-status_details; type=PROBE-type}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -Name, which sends a garbage filter and returns the UNFILTERED collection. This endpoint cannot be filtered by connection identity at all: its items carry neither an id nor a name, so neither the ids nor the names query key has anything to select on. Call Get-PfbArrayConnectionKey with no selector and match the keys you want from the returned collection.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "context", @@ -1403,11 +1403,11 @@ "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "names=@{aggregate=; continuous=; id=PROBE-id; periodic=; remote=; time=PROBE-time}", - "BoundWireKey": "names", - "BoundValue": "@{aggregate=; continuous=; id=PROBE-id; periodic=; remote=; time=PROBE-time}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-Name received a stringified object ('@{aggregate=; continuous=; id=PROBE-id; periodic=; remote=; time=PROBE-time}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -Name, which sends a garbage filter and returns the UNFILTERED collection. This endpoint cannot be filtered by connection identity at all: its items carry neither an id nor a name, so neither the ids nor the names query key has anything to select on. Call Get-PfbArrayConnectionKey with no selector and match the keys you want from the returned collection.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "aggregate", @@ -2673,19 +2673,19 @@ { "Cmdlet": "Get-PfbBucketAccessPolicy", "Verb": "Get", - "Parameter": "MemberName", + "Parameter": "BucketName", "Producer": "GET /buckets", "IsPrimary": false, "FromExample": false, - "WireName": "member_names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "member_names=@{account=; bucket_type=PROBE-bucket_type; context=; created=PROBE-created; destroyed=PROBE-destroyed; eradication_config=; hard_limit_enabled=PROBE-hard_limit_enabled; id=PROBE-id; name=PROBE-name; object_count=PROBE-object_count; object_lock_config=; public_access_config=; public_status=PROBE-public_status; qos_policy=; quota_limit=PROBE-quota_limit; retention_lock=PROBE-retention_lock; space=; storage_class=; time_remaining=PROBE-time_remaining; time_remaining_status=PROBE-time_remaining_status; versioning=PROBE-versioning}", - "BoundWireKey": "member_names", - "BoundValue": "@{account=; bucket_type=PROBE-bucket_type; context=; created=PROBE-created; destroyed=PROBE-destroyed; eradication_config=; hard_limit_enabled=PROBE-hard_limit_enabled; id=PROBE-id; name=PROBE-name; object_count=PROBE-object_count; object_lock_config=; public_access_config=; public_status=PROBE-public_status; qos_policy=; quota_limit=PROBE-quota_limit; retention_lock=PROBE-retention_lock; space=; storage_class=; time_remaining=PROBE-time_remaining; time_remaining_status=PROBE-time_remaining_status; versioning=PROBE-versioning}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-BucketName received a stringified object ('@{account=; bucket_type=PROBE-bucket_type; context=; created=PROBE-created; destroyed=PROBE-destroyed; eradication_config=; hard_limit_enabled=PROBE-hard_limit_enabled; id=PROBE-id; name=PROBE-name; object_count=PROBE-object_count; object_lock_config=; public_access_config=; public_status=PROBE-public_status; qos_policy=; quota_limit=PROBE-quota_limit; retention_lock=PROBE-retention_lock; space=; storage_class=; time_remaining=PROBE-time_remaining; time_remaining_status=PROBE-time_remaining_status; versioning=PROBE-versioning}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -BucketName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the bucket name instead, e.g. Get-PfbBucket | Select-Object -ExpandProperty name | Get-PfbBucketAccessPolicy, or pass -BucketName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "account", @@ -2737,19 +2737,19 @@ { "Cmdlet": "Get-PfbBucketAccessPolicy", "Verb": "Get", - "Parameter": "MemberName", + "Parameter": "BucketName", "Producer": "GET /buckets/audit-filters", "IsPrimary": false, "FromExample": false, - "WireName": "member_names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "member_names=@{actions=System.Object[]; bucket=; context=; name=PROBE-name; s3_prefixes=System.Object[]}", - "BoundWireKey": "member_names", - "BoundValue": "@{actions=System.Object[]; bucket=; context=; name=PROBE-name; s3_prefixes=System.Object[]}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-BucketName received a stringified object ('@{actions=System.Object[]; bucket=; context=; name=PROBE-name; s3_prefixes=System.Object[]}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -BucketName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the bucket name instead, e.g. Get-PfbBucket | Select-Object -ExpandProperty name | Get-PfbBucketAccessPolicy, or pass -BucketName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "actions", @@ -2769,19 +2769,19 @@ { "Cmdlet": "Get-PfbBucketAccessPolicy", "Verb": "Get", - "Parameter": "MemberName", + "Parameter": "BucketName", "Producer": "GET /buckets/bucket-access-policies", "IsPrimary": true, "FromExample": false, - "WireName": "member_names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "member_names=@{bucket=; context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]}", - "BoundWireKey": "member_names", - "BoundValue": "@{bucket=; context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-BucketName received a stringified object ('@{bucket=; context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -BucketName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the bucket name instead, e.g. Get-PfbBucket | Select-Object -ExpandProperty name | Get-PfbBucketAccessPolicy, or pass -BucketName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "bucket", @@ -2811,19 +2811,19 @@ { "Cmdlet": "Get-PfbBucketAccessPolicy", "Verb": "Get", - "Parameter": "MemberName", + "Parameter": "BucketName", "Producer": "GET /buckets/bucket-access-policies/rules", "IsPrimary": false, "FromExample": false, - "WireName": "member_names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "member_names=@{actions=System.Object[]; context=; effect=PROBE-effect; name=PROBE-name; policy=; principals=; resources=System.Object[]}", - "BoundWireKey": "member_names", - "BoundValue": "@{actions=System.Object[]; context=; effect=PROBE-effect; name=PROBE-name; policy=; principals=; resources=System.Object[]}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-BucketName received a stringified object ('@{actions=System.Object[]; context=; effect=PROBE-effect; name=PROBE-name; policy=; principals=; resources=System.Object[]}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -BucketName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the bucket name instead, e.g. Get-PfbBucket | Select-Object -ExpandProperty name | Get-PfbBucketAccessPolicy, or pass -BucketName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "actions", @@ -2847,19 +2847,19 @@ { "Cmdlet": "Get-PfbBucketAccessPolicy", "Verb": "Get", - "Parameter": "MemberName", + "Parameter": "BucketName", "Producer": "GET /buckets/cross-origin-resource-sharing-policies", "IsPrimary": false, "FromExample": false, - "WireName": "member_names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "member_names=@{bucket=; context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]}", - "BoundWireKey": "member_names", - "BoundValue": "@{bucket=; context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-BucketName received a stringified object ('@{bucket=; context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -BucketName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the bucket name instead, e.g. Get-PfbBucket | Select-Object -ExpandProperty name | Get-PfbBucketAccessPolicy, or pass -BucketName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "bucket", @@ -2889,19 +2889,19 @@ { "Cmdlet": "Get-PfbBucketAccessPolicy", "Verb": "Get", - "Parameter": "MemberName", + "Parameter": "BucketName", "Producer": "GET /buckets/cross-origin-resource-sharing-policies/rules", "IsPrimary": false, "FromExample": false, - "WireName": "member_names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "member_names=@{allowed_headers=System.Object[]; allowed_methods=System.Object[]; allowed_origins=System.Object[]; context=; name=PROBE-name; policy=}", - "BoundWireKey": "member_names", - "BoundValue": "@{allowed_headers=System.Object[]; allowed_methods=System.Object[]; allowed_origins=System.Object[]; context=; name=PROBE-name; policy=}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-BucketName received a stringified object ('@{allowed_headers=System.Object[]; allowed_methods=System.Object[]; allowed_origins=System.Object[]; context=; name=PROBE-name; policy=}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -BucketName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the bucket name instead, e.g. Get-PfbBucket | Select-Object -ExpandProperty name | Get-PfbBucketAccessPolicy, or pass -BucketName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "allowed_headers", @@ -2923,19 +2923,19 @@ { "Cmdlet": "Get-PfbBucketAccessPolicy", "Verb": "Get", - "Parameter": "MemberName", + "Parameter": "BucketName", "Producer": "GET /buckets/performance", "IsPrimary": false, "FromExample": false, - "WireName": "member_names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "member_names=@{bytes_per_op=PROBE-bytes_per_op; bytes_per_read=PROBE-bytes_per_read; bytes_per_write=PROBE-bytes_per_write; id=PROBE-id; max_total_bytes_per_sec=PROBE-max_total_bytes_per_sec; max_total_ops_per_sec=PROBE-max_total_ops_per_sec; name=PROBE-name; others_per_sec=PROBE-others_per_sec; read_bytes_per_sec=PROBE-read_bytes_per_sec; reads_per_sec=PROBE-reads_per_sec; time=PROBE-time; usec_per_other_op=PROBE-usec_per_other_op; usec_per_read_op=PROBE-usec_per_read_op; usec_per_write_op=PROBE-usec_per_write_op; write_bytes_per_sec=PROBE-write_bytes_per_sec; writes_per_sec=PROBE-writes_per_sec}", - "BoundWireKey": "member_names", - "BoundValue": "@{bytes_per_op=PROBE-bytes_per_op; bytes_per_read=PROBE-bytes_per_read; bytes_per_write=PROBE-bytes_per_write; id=PROBE-id; max_total_bytes_per_sec=PROBE-max_total_bytes_per_sec; max_total_ops_per_sec=PROBE-max_total_ops_per_sec; name=PROBE-name; others_per_sec=PROBE-others_per_sec; read_bytes_per_sec=PROBE-read_bytes_per_sec; reads_per_sec=PROBE-reads_per_sec; time=PROBE-time; usec_per_other_op=PROBE-usec_per_other_op; usec_per_read_op=PROBE-usec_per_read_op; usec_per_write_op=PROBE-usec_per_write_op; write_bytes_per_sec=PROBE-write_bytes_per_sec; writes_per_sec=PROBE-writes_per_sec}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-BucketName received a stringified object ('@{bytes_per_op=PROBE-bytes_per_op; bytes_per_read=PROBE-bytes_per_read; bytes_per_write=PROBE-bytes_per_write; id=PROBE-id; max_total_bytes_per_sec=PROBE-max_total_bytes_per_sec; max_total_ops_per_sec=PROBE-max_total_ops_per_sec; name=PROBE-name; others_per_sec=PROBE-others_per_sec; read_bytes_per_sec=PROBE-read_bytes_per_sec; reads_per_sec=PROBE-reads_per_sec; time=PROBE-time; usec_per_other_op=PROBE-usec_per_other_op; usec_per_read_op=PROBE-usec_per_read_op; usec_per_write_op=PROBE-usec_per_write_op; write_bytes_per_sec=PROBE-write_bytes_per_sec; writes_per_sec=PROBE-writes_per_sec}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -BucketName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the bucket name instead, e.g. Get-PfbBucket | Select-Object -ExpandProperty name | Get-PfbBucketAccessPolicy, or pass -BucketName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "bytes_per_op", @@ -2977,19 +2977,19 @@ { "Cmdlet": "Get-PfbBucketAccessPolicy", "Verb": "Get", - "Parameter": "MemberName", + "Parameter": "BucketName", "Producer": "GET /buckets/s3-specific-performance", "IsPrimary": false, "FromExample": false, - "WireName": "member_names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "member_names=@{id=PROBE-id; name=PROBE-name; others_per_sec=PROBE-others_per_sec; read_buckets_per_sec=PROBE-read_buckets_per_sec; read_objects_per_sec=PROBE-read_objects_per_sec; time=PROBE-time; usec_per_other_op=PROBE-usec_per_other_op; usec_per_read_bucket_op=PROBE-usec_per_read_bucket_op; usec_per_read_object_op=PROBE-usec_per_read_object_op; usec_per_write_bucket_op=PROBE-usec_per_write_bucket_op; usec_per_write_object_op=PROBE-usec_per_write_object_op; write_buckets_per_sec=PROBE-write_buckets_per_sec; write_objects_per_sec=PROBE-write_objects_per_sec}", - "BoundWireKey": "member_names", - "BoundValue": "@{id=PROBE-id; name=PROBE-name; others_per_sec=PROBE-others_per_sec; read_buckets_per_sec=PROBE-read_buckets_per_sec; read_objects_per_sec=PROBE-read_objects_per_sec; time=PROBE-time; usec_per_other_op=PROBE-usec_per_other_op; usec_per_read_bucket_op=PROBE-usec_per_read_bucket_op; usec_per_read_object_op=PROBE-usec_per_read_object_op; usec_per_write_bucket_op=PROBE-usec_per_write_bucket_op; usec_per_write_object_op=PROBE-usec_per_write_object_op; write_buckets_per_sec=PROBE-write_buckets_per_sec; write_objects_per_sec=PROBE-write_objects_per_sec}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-BucketName received a stringified object ('@{id=PROBE-id; name=PROBE-name; others_per_sec=PROBE-others_per_sec; read_buckets_per_sec=PROBE-read_buckets_per_sec; read_objects_per_sec=PROBE-read_objects_per_sec; time=PROBE-time; usec_per_other_op=PROBE-usec_per_other_op; usec_per_read_bucket_op=PROBE-usec_per_read_bucket_op; usec_per_read_object_op=PROBE-usec_per_read_object_op; usec_per_write_bucket_op=PROBE-usec_per_write_bucket_op; usec_per_write_object_op=PROBE-usec_per_write_object_op; write_buckets_per_sec=PROBE-write_buckets_per_sec; write_objects_per_sec=PROBE-write_objects_per_sec}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -BucketName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the bucket name instead, e.g. Get-PfbBucket | Select-Object -ExpandProperty name | Get-PfbBucketAccessPolicy, or pass -BucketName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "id", @@ -3025,19 +3025,19 @@ { "Cmdlet": "Get-PfbBucketAccessPolicyRule", "Verb": "Get", - "Parameter": "MemberName", + "Parameter": "BucketName", "Producer": "GET /buckets", "IsPrimary": false, "FromExample": false, - "WireName": "member_names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "member_names=@{account=; bucket_type=PROBE-bucket_type; context=; created=PROBE-created; destroyed=PROBE-destroyed; eradication_config=; hard_limit_enabled=PROBE-hard_limit_enabled; id=PROBE-id; name=PROBE-name; object_count=PROBE-object_count; object_lock_config=; public_access_config=; public_status=PROBE-public_status; qos_policy=; quota_limit=PROBE-quota_limit; retention_lock=PROBE-retention_lock; space=; storage_class=; time_remaining=PROBE-time_remaining; time_remaining_status=PROBE-time_remaining_status; versioning=PROBE-versioning}", - "BoundWireKey": "member_names", - "BoundValue": "@{account=; bucket_type=PROBE-bucket_type; context=; created=PROBE-created; destroyed=PROBE-destroyed; eradication_config=; hard_limit_enabled=PROBE-hard_limit_enabled; id=PROBE-id; name=PROBE-name; object_count=PROBE-object_count; object_lock_config=; public_access_config=; public_status=PROBE-public_status; qos_policy=; quota_limit=PROBE-quota_limit; retention_lock=PROBE-retention_lock; space=; storage_class=; time_remaining=PROBE-time_remaining; time_remaining_status=PROBE-time_remaining_status; versioning=PROBE-versioning}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-BucketName received a stringified object ('@{account=; bucket_type=PROBE-bucket_type; context=; created=PROBE-created; destroyed=PROBE-destroyed; eradication_config=; hard_limit_enabled=PROBE-hard_limit_enabled; id=PROBE-id; name=PROBE-name; object_count=PROBE-object_count; object_lock_config=; public_access_config=; public_status=PROBE-public_status; qos_policy=; quota_limit=PROBE-quota_limit; retention_lock=PROBE-retention_lock; space=; storage_class=; time_remaining=PROBE-time_remaining; time_remaining_status=PROBE-time_remaining_status; versioning=PROBE-versioning}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -BucketName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the bucket name instead, e.g. Get-PfbBucket | Select-Object -ExpandProperty name | Get-PfbBucketAccessPolicyRule, or pass -BucketName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "account", @@ -3089,19 +3089,19 @@ { "Cmdlet": "Get-PfbBucketAccessPolicyRule", "Verb": "Get", - "Parameter": "MemberName", + "Parameter": "BucketName", "Producer": "GET /buckets/audit-filters", "IsPrimary": false, "FromExample": false, - "WireName": "member_names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "member_names=@{actions=System.Object[]; bucket=; context=; name=PROBE-name; s3_prefixes=System.Object[]}", - "BoundWireKey": "member_names", - "BoundValue": "@{actions=System.Object[]; bucket=; context=; name=PROBE-name; s3_prefixes=System.Object[]}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-BucketName received a stringified object ('@{actions=System.Object[]; bucket=; context=; name=PROBE-name; s3_prefixes=System.Object[]}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -BucketName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the bucket name instead, e.g. Get-PfbBucket | Select-Object -ExpandProperty name | Get-PfbBucketAccessPolicyRule, or pass -BucketName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "actions", @@ -3121,19 +3121,19 @@ { "Cmdlet": "Get-PfbBucketAccessPolicyRule", "Verb": "Get", - "Parameter": "MemberName", + "Parameter": "BucketName", "Producer": "GET /buckets/bucket-access-policies", "IsPrimary": false, "FromExample": false, - "WireName": "member_names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "member_names=@{bucket=; context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]}", - "BoundWireKey": "member_names", - "BoundValue": "@{bucket=; context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-BucketName received a stringified object ('@{bucket=; context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -BucketName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the bucket name instead, e.g. Get-PfbBucket | Select-Object -ExpandProperty name | Get-PfbBucketAccessPolicyRule, or pass -BucketName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "bucket", @@ -3163,19 +3163,19 @@ { "Cmdlet": "Get-PfbBucketAccessPolicyRule", "Verb": "Get", - "Parameter": "MemberName", + "Parameter": "BucketName", "Producer": "GET /buckets/bucket-access-policies/rules", "IsPrimary": true, "FromExample": false, - "WireName": "member_names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "member_names=@{actions=System.Object[]; context=; effect=PROBE-effect; name=PROBE-name; policy=; principals=; resources=System.Object[]}", - "BoundWireKey": "member_names", - "BoundValue": "@{actions=System.Object[]; context=; effect=PROBE-effect; name=PROBE-name; policy=; principals=; resources=System.Object[]}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-BucketName received a stringified object ('@{actions=System.Object[]; context=; effect=PROBE-effect; name=PROBE-name; policy=; principals=; resources=System.Object[]}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -BucketName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the bucket name instead, e.g. Get-PfbBucket | Select-Object -ExpandProperty name | Get-PfbBucketAccessPolicyRule, or pass -BucketName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "actions", @@ -3199,19 +3199,19 @@ { "Cmdlet": "Get-PfbBucketAccessPolicyRule", "Verb": "Get", - "Parameter": "MemberName", + "Parameter": "BucketName", "Producer": "GET /buckets/cross-origin-resource-sharing-policies", "IsPrimary": false, "FromExample": false, - "WireName": "member_names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "member_names=@{bucket=; context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]}", - "BoundWireKey": "member_names", - "BoundValue": "@{bucket=; context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-BucketName received a stringified object ('@{bucket=; context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -BucketName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the bucket name instead, e.g. Get-PfbBucket | Select-Object -ExpandProperty name | Get-PfbBucketAccessPolicyRule, or pass -BucketName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "bucket", @@ -3241,19 +3241,19 @@ { "Cmdlet": "Get-PfbBucketAccessPolicyRule", "Verb": "Get", - "Parameter": "MemberName", + "Parameter": "BucketName", "Producer": "GET /buckets/cross-origin-resource-sharing-policies/rules", "IsPrimary": false, "FromExample": false, - "WireName": "member_names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "member_names=@{allowed_headers=System.Object[]; allowed_methods=System.Object[]; allowed_origins=System.Object[]; context=; name=PROBE-name; policy=}", - "BoundWireKey": "member_names", - "BoundValue": "@{allowed_headers=System.Object[]; allowed_methods=System.Object[]; allowed_origins=System.Object[]; context=; name=PROBE-name; policy=}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-BucketName received a stringified object ('@{allowed_headers=System.Object[]; allowed_methods=System.Object[]; allowed_origins=System.Object[]; context=; name=PROBE-name; policy=}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -BucketName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the bucket name instead, e.g. Get-PfbBucket | Select-Object -ExpandProperty name | Get-PfbBucketAccessPolicyRule, or pass -BucketName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "allowed_headers", @@ -3275,19 +3275,19 @@ { "Cmdlet": "Get-PfbBucketAccessPolicyRule", "Verb": "Get", - "Parameter": "MemberName", + "Parameter": "BucketName", "Producer": "GET /buckets/performance", "IsPrimary": false, "FromExample": false, - "WireName": "member_names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "member_names=@{bytes_per_op=PROBE-bytes_per_op; bytes_per_read=PROBE-bytes_per_read; bytes_per_write=PROBE-bytes_per_write; id=PROBE-id; max_total_bytes_per_sec=PROBE-max_total_bytes_per_sec; max_total_ops_per_sec=PROBE-max_total_ops_per_sec; name=PROBE-name; others_per_sec=PROBE-others_per_sec; read_bytes_per_sec=PROBE-read_bytes_per_sec; reads_per_sec=PROBE-reads_per_sec; time=PROBE-time; usec_per_other_op=PROBE-usec_per_other_op; usec_per_read_op=PROBE-usec_per_read_op; usec_per_write_op=PROBE-usec_per_write_op; write_bytes_per_sec=PROBE-write_bytes_per_sec; writes_per_sec=PROBE-writes_per_sec}", - "BoundWireKey": "member_names", - "BoundValue": "@{bytes_per_op=PROBE-bytes_per_op; bytes_per_read=PROBE-bytes_per_read; bytes_per_write=PROBE-bytes_per_write; id=PROBE-id; max_total_bytes_per_sec=PROBE-max_total_bytes_per_sec; max_total_ops_per_sec=PROBE-max_total_ops_per_sec; name=PROBE-name; others_per_sec=PROBE-others_per_sec; read_bytes_per_sec=PROBE-read_bytes_per_sec; reads_per_sec=PROBE-reads_per_sec; time=PROBE-time; usec_per_other_op=PROBE-usec_per_other_op; usec_per_read_op=PROBE-usec_per_read_op; usec_per_write_op=PROBE-usec_per_write_op; write_bytes_per_sec=PROBE-write_bytes_per_sec; writes_per_sec=PROBE-writes_per_sec}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-BucketName received a stringified object ('@{bytes_per_op=PROBE-bytes_per_op; bytes_per_read=PROBE-bytes_per_read; bytes_per_write=PROBE-bytes_per_write; id=PROBE-id; max_total_bytes_per_sec=PROBE-max_total_bytes_per_sec; max_total_ops_per_sec=PROBE-max_total_ops_per_sec; name=PROBE-name; others_per_sec=PROBE-others_per_sec; read_bytes_per_sec=PROBE-read_bytes_per_sec; reads_per_sec=PROBE-reads_per_sec; time=PROBE-time; usec_per_other_op=PROBE-usec_per_other_op; usec_per_read_op=PROBE-usec_per_read_op; usec_per_write_op=PROBE-usec_per_write_op; write_bytes_per_sec=PROBE-write_bytes_per_sec; writes_per_sec=PROBE-writes_per_sec}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -BucketName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the bucket name instead, e.g. Get-PfbBucket | Select-Object -ExpandProperty name | Get-PfbBucketAccessPolicyRule, or pass -BucketName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "bytes_per_op", @@ -3329,19 +3329,19 @@ { "Cmdlet": "Get-PfbBucketAccessPolicyRule", "Verb": "Get", - "Parameter": "MemberName", + "Parameter": "BucketName", "Producer": "GET /buckets/s3-specific-performance", "IsPrimary": false, "FromExample": false, - "WireName": "member_names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "member_names=@{id=PROBE-id; name=PROBE-name; others_per_sec=PROBE-others_per_sec; read_buckets_per_sec=PROBE-read_buckets_per_sec; read_objects_per_sec=PROBE-read_objects_per_sec; time=PROBE-time; usec_per_other_op=PROBE-usec_per_other_op; usec_per_read_bucket_op=PROBE-usec_per_read_bucket_op; usec_per_read_object_op=PROBE-usec_per_read_object_op; usec_per_write_bucket_op=PROBE-usec_per_write_bucket_op; usec_per_write_object_op=PROBE-usec_per_write_object_op; write_buckets_per_sec=PROBE-write_buckets_per_sec; write_objects_per_sec=PROBE-write_objects_per_sec}", - "BoundWireKey": "member_names", - "BoundValue": "@{id=PROBE-id; name=PROBE-name; others_per_sec=PROBE-others_per_sec; read_buckets_per_sec=PROBE-read_buckets_per_sec; read_objects_per_sec=PROBE-read_objects_per_sec; time=PROBE-time; usec_per_other_op=PROBE-usec_per_other_op; usec_per_read_bucket_op=PROBE-usec_per_read_bucket_op; usec_per_read_object_op=PROBE-usec_per_read_object_op; usec_per_write_bucket_op=PROBE-usec_per_write_bucket_op; usec_per_write_object_op=PROBE-usec_per_write_object_op; write_buckets_per_sec=PROBE-write_buckets_per_sec; write_objects_per_sec=PROBE-write_objects_per_sec}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-BucketName received a stringified object ('@{id=PROBE-id; name=PROBE-name; others_per_sec=PROBE-others_per_sec; read_buckets_per_sec=PROBE-read_buckets_per_sec; read_objects_per_sec=PROBE-read_objects_per_sec; time=PROBE-time; usec_per_other_op=PROBE-usec_per_other_op; usec_per_read_bucket_op=PROBE-usec_per_read_bucket_op; usec_per_read_object_op=PROBE-usec_per_read_object_op; usec_per_write_bucket_op=PROBE-usec_per_write_bucket_op; usec_per_write_object_op=PROBE-usec_per_write_object_op; write_buckets_per_sec=PROBE-write_buckets_per_sec; write_objects_per_sec=PROBE-write_objects_per_sec}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -BucketName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the bucket name instead, e.g. Get-PfbBucket | Select-Object -ExpandProperty name | Get-PfbBucketAccessPolicyRule, or pass -BucketName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "id", @@ -3377,19 +3377,19 @@ { "Cmdlet": "Get-PfbBucketAuditFilter", "Verb": "Get", - "Parameter": "MemberName", + "Parameter": "BucketName", "Producer": "GET /buckets", "IsPrimary": false, "FromExample": false, - "WireName": "member_names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "member_names=@{account=; bucket_type=PROBE-bucket_type; context=; created=PROBE-created; destroyed=PROBE-destroyed; eradication_config=; hard_limit_enabled=PROBE-hard_limit_enabled; id=PROBE-id; name=PROBE-name; object_count=PROBE-object_count; object_lock_config=; public_access_config=; public_status=PROBE-public_status; qos_policy=; quota_limit=PROBE-quota_limit; retention_lock=PROBE-retention_lock; space=; storage_class=; time_remaining=PROBE-time_remaining; time_remaining_status=PROBE-time_remaining_status; versioning=PROBE-versioning}", - "BoundWireKey": "member_names", - "BoundValue": "@{account=; bucket_type=PROBE-bucket_type; context=; created=PROBE-created; destroyed=PROBE-destroyed; eradication_config=; hard_limit_enabled=PROBE-hard_limit_enabled; id=PROBE-id; name=PROBE-name; object_count=PROBE-object_count; object_lock_config=; public_access_config=; public_status=PROBE-public_status; qos_policy=; quota_limit=PROBE-quota_limit; retention_lock=PROBE-retention_lock; space=; storage_class=; time_remaining=PROBE-time_remaining; time_remaining_status=PROBE-time_remaining_status; versioning=PROBE-versioning}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-BucketName received a stringified object ('@{account=; bucket_type=PROBE-bucket_type; context=; created=PROBE-created; destroyed=PROBE-destroyed; eradication_config=; hard_limit_enabled=PROBE-hard_limit_enabled; id=PROBE-id; name=PROBE-name; object_count=PROBE-object_count; object_lock_config=; public_access_config=; public_status=PROBE-public_status; qos_policy=; quota_limit=PROBE-quota_limit; retention_lock=PROBE-retention_lock; space=; storage_class=; time_remaining=PROBE-time_remaining; time_remaining_status=PROBE-time_remaining_status; versioning=PROBE-versioning}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -BucketName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the bucket name instead, e.g. Get-PfbBucket | Select-Object -ExpandProperty name | Get-PfbBucketAuditFilter, or pass -BucketName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "account", @@ -3441,19 +3441,19 @@ { "Cmdlet": "Get-PfbBucketAuditFilter", "Verb": "Get", - "Parameter": "MemberName", + "Parameter": "BucketName", "Producer": "GET /buckets/audit-filters", "IsPrimary": true, "FromExample": false, - "WireName": "member_names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "member_names=@{actions=System.Object[]; bucket=; context=; name=PROBE-name; s3_prefixes=System.Object[]}", - "BoundWireKey": "member_names", - "BoundValue": "@{actions=System.Object[]; bucket=; context=; name=PROBE-name; s3_prefixes=System.Object[]}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-BucketName received a stringified object ('@{actions=System.Object[]; bucket=; context=; name=PROBE-name; s3_prefixes=System.Object[]}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -BucketName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the bucket name instead, e.g. Get-PfbBucket | Select-Object -ExpandProperty name | Get-PfbBucketAuditFilter, or pass -BucketName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "actions", @@ -3473,19 +3473,19 @@ { "Cmdlet": "Get-PfbBucketAuditFilter", "Verb": "Get", - "Parameter": "MemberName", + "Parameter": "BucketName", "Producer": "GET /buckets/bucket-access-policies", "IsPrimary": false, "FromExample": false, - "WireName": "member_names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "member_names=@{bucket=; context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]}", - "BoundWireKey": "member_names", - "BoundValue": "@{bucket=; context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-BucketName received a stringified object ('@{bucket=; context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -BucketName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the bucket name instead, e.g. Get-PfbBucket | Select-Object -ExpandProperty name | Get-PfbBucketAuditFilter, or pass -BucketName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "bucket", @@ -3515,19 +3515,19 @@ { "Cmdlet": "Get-PfbBucketAuditFilter", "Verb": "Get", - "Parameter": "MemberName", + "Parameter": "BucketName", "Producer": "GET /buckets/bucket-access-policies/rules", "IsPrimary": false, "FromExample": false, - "WireName": "member_names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "member_names=@{actions=System.Object[]; context=; effect=PROBE-effect; name=PROBE-name; policy=; principals=; resources=System.Object[]}", - "BoundWireKey": "member_names", - "BoundValue": "@{actions=System.Object[]; context=; effect=PROBE-effect; name=PROBE-name; policy=; principals=; resources=System.Object[]}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-BucketName received a stringified object ('@{actions=System.Object[]; context=; effect=PROBE-effect; name=PROBE-name; policy=; principals=; resources=System.Object[]}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -BucketName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the bucket name instead, e.g. Get-PfbBucket | Select-Object -ExpandProperty name | Get-PfbBucketAuditFilter, or pass -BucketName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "actions", @@ -3551,19 +3551,19 @@ { "Cmdlet": "Get-PfbBucketAuditFilter", "Verb": "Get", - "Parameter": "MemberName", + "Parameter": "BucketName", "Producer": "GET /buckets/cross-origin-resource-sharing-policies", "IsPrimary": false, "FromExample": false, - "WireName": "member_names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "member_names=@{bucket=; context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]}", - "BoundWireKey": "member_names", - "BoundValue": "@{bucket=; context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-BucketName received a stringified object ('@{bucket=; context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -BucketName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the bucket name instead, e.g. Get-PfbBucket | Select-Object -ExpandProperty name | Get-PfbBucketAuditFilter, or pass -BucketName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "bucket", @@ -3593,19 +3593,19 @@ { "Cmdlet": "Get-PfbBucketAuditFilter", "Verb": "Get", - "Parameter": "MemberName", + "Parameter": "BucketName", "Producer": "GET /buckets/cross-origin-resource-sharing-policies/rules", "IsPrimary": false, "FromExample": false, - "WireName": "member_names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "member_names=@{allowed_headers=System.Object[]; allowed_methods=System.Object[]; allowed_origins=System.Object[]; context=; name=PROBE-name; policy=}", - "BoundWireKey": "member_names", - "BoundValue": "@{allowed_headers=System.Object[]; allowed_methods=System.Object[]; allowed_origins=System.Object[]; context=; name=PROBE-name; policy=}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-BucketName received a stringified object ('@{allowed_headers=System.Object[]; allowed_methods=System.Object[]; allowed_origins=System.Object[]; context=; name=PROBE-name; policy=}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -BucketName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the bucket name instead, e.g. Get-PfbBucket | Select-Object -ExpandProperty name | Get-PfbBucketAuditFilter, or pass -BucketName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "allowed_headers", @@ -3627,19 +3627,19 @@ { "Cmdlet": "Get-PfbBucketAuditFilter", "Verb": "Get", - "Parameter": "MemberName", + "Parameter": "BucketName", "Producer": "GET /buckets/performance", "IsPrimary": false, "FromExample": false, - "WireName": "member_names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "member_names=@{bytes_per_op=PROBE-bytes_per_op; bytes_per_read=PROBE-bytes_per_read; bytes_per_write=PROBE-bytes_per_write; id=PROBE-id; max_total_bytes_per_sec=PROBE-max_total_bytes_per_sec; max_total_ops_per_sec=PROBE-max_total_ops_per_sec; name=PROBE-name; others_per_sec=PROBE-others_per_sec; read_bytes_per_sec=PROBE-read_bytes_per_sec; reads_per_sec=PROBE-reads_per_sec; time=PROBE-time; usec_per_other_op=PROBE-usec_per_other_op; usec_per_read_op=PROBE-usec_per_read_op; usec_per_write_op=PROBE-usec_per_write_op; write_bytes_per_sec=PROBE-write_bytes_per_sec; writes_per_sec=PROBE-writes_per_sec}", - "BoundWireKey": "member_names", - "BoundValue": "@{bytes_per_op=PROBE-bytes_per_op; bytes_per_read=PROBE-bytes_per_read; bytes_per_write=PROBE-bytes_per_write; id=PROBE-id; max_total_bytes_per_sec=PROBE-max_total_bytes_per_sec; max_total_ops_per_sec=PROBE-max_total_ops_per_sec; name=PROBE-name; others_per_sec=PROBE-others_per_sec; read_bytes_per_sec=PROBE-read_bytes_per_sec; reads_per_sec=PROBE-reads_per_sec; time=PROBE-time; usec_per_other_op=PROBE-usec_per_other_op; usec_per_read_op=PROBE-usec_per_read_op; usec_per_write_op=PROBE-usec_per_write_op; write_bytes_per_sec=PROBE-write_bytes_per_sec; writes_per_sec=PROBE-writes_per_sec}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-BucketName received a stringified object ('@{bytes_per_op=PROBE-bytes_per_op; bytes_per_read=PROBE-bytes_per_read; bytes_per_write=PROBE-bytes_per_write; id=PROBE-id; max_total_bytes_per_sec=PROBE-max_total_bytes_per_sec; max_total_ops_per_sec=PROBE-max_total_ops_per_sec; name=PROBE-name; others_per_sec=PROBE-others_per_sec; read_bytes_per_sec=PROBE-read_bytes_per_sec; reads_per_sec=PROBE-reads_per_sec; time=PROBE-time; usec_per_other_op=PROBE-usec_per_other_op; usec_per_read_op=PROBE-usec_per_read_op; usec_per_write_op=PROBE-usec_per_write_op; write_bytes_per_sec=PROBE-write_bytes_per_sec; writes_per_sec=PROBE-writes_per_sec}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -BucketName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the bucket name instead, e.g. Get-PfbBucket | Select-Object -ExpandProperty name | Get-PfbBucketAuditFilter, or pass -BucketName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "bytes_per_op", @@ -3681,19 +3681,19 @@ { "Cmdlet": "Get-PfbBucketAuditFilter", "Verb": "Get", - "Parameter": "MemberName", + "Parameter": "BucketName", "Producer": "GET /buckets/s3-specific-performance", "IsPrimary": false, "FromExample": false, - "WireName": "member_names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "member_names=@{id=PROBE-id; name=PROBE-name; others_per_sec=PROBE-others_per_sec; read_buckets_per_sec=PROBE-read_buckets_per_sec; read_objects_per_sec=PROBE-read_objects_per_sec; time=PROBE-time; usec_per_other_op=PROBE-usec_per_other_op; usec_per_read_bucket_op=PROBE-usec_per_read_bucket_op; usec_per_read_object_op=PROBE-usec_per_read_object_op; usec_per_write_bucket_op=PROBE-usec_per_write_bucket_op; usec_per_write_object_op=PROBE-usec_per_write_object_op; write_buckets_per_sec=PROBE-write_buckets_per_sec; write_objects_per_sec=PROBE-write_objects_per_sec}", - "BoundWireKey": "member_names", - "BoundValue": "@{id=PROBE-id; name=PROBE-name; others_per_sec=PROBE-others_per_sec; read_buckets_per_sec=PROBE-read_buckets_per_sec; read_objects_per_sec=PROBE-read_objects_per_sec; time=PROBE-time; usec_per_other_op=PROBE-usec_per_other_op; usec_per_read_bucket_op=PROBE-usec_per_read_bucket_op; usec_per_read_object_op=PROBE-usec_per_read_object_op; usec_per_write_bucket_op=PROBE-usec_per_write_bucket_op; usec_per_write_object_op=PROBE-usec_per_write_object_op; write_buckets_per_sec=PROBE-write_buckets_per_sec; write_objects_per_sec=PROBE-write_objects_per_sec}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-BucketName received a stringified object ('@{id=PROBE-id; name=PROBE-name; others_per_sec=PROBE-others_per_sec; read_buckets_per_sec=PROBE-read_buckets_per_sec; read_objects_per_sec=PROBE-read_objects_per_sec; time=PROBE-time; usec_per_other_op=PROBE-usec_per_other_op; usec_per_read_bucket_op=PROBE-usec_per_read_bucket_op; usec_per_read_object_op=PROBE-usec_per_read_object_op; usec_per_write_bucket_op=PROBE-usec_per_write_bucket_op; usec_per_write_object_op=PROBE-usec_per_write_object_op; write_buckets_per_sec=PROBE-write_buckets_per_sec; write_objects_per_sec=PROBE-write_objects_per_sec}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -BucketName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the bucket name instead, e.g. Get-PfbBucket | Select-Object -ExpandProperty name | Get-PfbBucketAuditFilter, or pass -BucketName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "id", @@ -3729,19 +3729,19 @@ { "Cmdlet": "Get-PfbBucketCorsPolicy", "Verb": "Get", - "Parameter": "MemberName", + "Parameter": "BucketName", "Producer": "GET /buckets", "IsPrimary": false, "FromExample": false, - "WireName": "member_names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "member_names=@{account=; bucket_type=PROBE-bucket_type; context=; created=PROBE-created; destroyed=PROBE-destroyed; eradication_config=; hard_limit_enabled=PROBE-hard_limit_enabled; id=PROBE-id; name=PROBE-name; object_count=PROBE-object_count; object_lock_config=; public_access_config=; public_status=PROBE-public_status; qos_policy=; quota_limit=PROBE-quota_limit; retention_lock=PROBE-retention_lock; space=; storage_class=; time_remaining=PROBE-time_remaining; time_remaining_status=PROBE-time_remaining_status; versioning=PROBE-versioning}", - "BoundWireKey": "member_names", - "BoundValue": "@{account=; bucket_type=PROBE-bucket_type; context=; created=PROBE-created; destroyed=PROBE-destroyed; eradication_config=; hard_limit_enabled=PROBE-hard_limit_enabled; id=PROBE-id; name=PROBE-name; object_count=PROBE-object_count; object_lock_config=; public_access_config=; public_status=PROBE-public_status; qos_policy=; quota_limit=PROBE-quota_limit; retention_lock=PROBE-retention_lock; space=; storage_class=; time_remaining=PROBE-time_remaining; time_remaining_status=PROBE-time_remaining_status; versioning=PROBE-versioning}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-BucketName received a stringified object ('@{account=; bucket_type=PROBE-bucket_type; context=; created=PROBE-created; destroyed=PROBE-destroyed; eradication_config=; hard_limit_enabled=PROBE-hard_limit_enabled; id=PROBE-id; name=PROBE-name; object_count=PROBE-object_count; object_lock_config=; public_access_config=; public_status=PROBE-public_status; qos_policy=; quota_limit=PROBE-quota_limit; retention_lock=PROBE-retention_lock; space=; storage_class=; time_remaining=PROBE-time_remaining; time_remaining_status=PROBE-time_remaining_status; versioning=PROBE-versioning}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -BucketName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the bucket name instead, e.g. Get-PfbBucket | Select-Object -ExpandProperty name | Get-PfbBucketCorsPolicy, or pass -BucketName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "account", @@ -3793,19 +3793,19 @@ { "Cmdlet": "Get-PfbBucketCorsPolicy", "Verb": "Get", - "Parameter": "MemberName", + "Parameter": "BucketName", "Producer": "GET /buckets/audit-filters", "IsPrimary": false, "FromExample": false, - "WireName": "member_names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "member_names=@{actions=System.Object[]; bucket=; context=; name=PROBE-name; s3_prefixes=System.Object[]}", - "BoundWireKey": "member_names", - "BoundValue": "@{actions=System.Object[]; bucket=; context=; name=PROBE-name; s3_prefixes=System.Object[]}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-BucketName received a stringified object ('@{actions=System.Object[]; bucket=; context=; name=PROBE-name; s3_prefixes=System.Object[]}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -BucketName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the bucket name instead, e.g. Get-PfbBucket | Select-Object -ExpandProperty name | Get-PfbBucketCorsPolicy, or pass -BucketName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "actions", @@ -3825,19 +3825,19 @@ { "Cmdlet": "Get-PfbBucketCorsPolicy", "Verb": "Get", - "Parameter": "MemberName", + "Parameter": "BucketName", "Producer": "GET /buckets/bucket-access-policies", "IsPrimary": false, "FromExample": false, - "WireName": "member_names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "member_names=@{bucket=; context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]}", - "BoundWireKey": "member_names", - "BoundValue": "@{bucket=; context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-BucketName received a stringified object ('@{bucket=; context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -BucketName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the bucket name instead, e.g. Get-PfbBucket | Select-Object -ExpandProperty name | Get-PfbBucketCorsPolicy, or pass -BucketName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "bucket", @@ -3867,19 +3867,19 @@ { "Cmdlet": "Get-PfbBucketCorsPolicy", "Verb": "Get", - "Parameter": "MemberName", + "Parameter": "BucketName", "Producer": "GET /buckets/bucket-access-policies/rules", "IsPrimary": false, "FromExample": false, - "WireName": "member_names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "member_names=@{actions=System.Object[]; context=; effect=PROBE-effect; name=PROBE-name; policy=; principals=; resources=System.Object[]}", - "BoundWireKey": "member_names", - "BoundValue": "@{actions=System.Object[]; context=; effect=PROBE-effect; name=PROBE-name; policy=; principals=; resources=System.Object[]}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-BucketName received a stringified object ('@{actions=System.Object[]; context=; effect=PROBE-effect; name=PROBE-name; policy=; principals=; resources=System.Object[]}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -BucketName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the bucket name instead, e.g. Get-PfbBucket | Select-Object -ExpandProperty name | Get-PfbBucketCorsPolicy, or pass -BucketName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "actions", @@ -3903,19 +3903,19 @@ { "Cmdlet": "Get-PfbBucketCorsPolicy", "Verb": "Get", - "Parameter": "MemberName", + "Parameter": "BucketName", "Producer": "GET /buckets/cross-origin-resource-sharing-policies", "IsPrimary": true, "FromExample": false, - "WireName": "member_names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "member_names=@{bucket=; context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]}", - "BoundWireKey": "member_names", - "BoundValue": "@{bucket=; context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-BucketName received a stringified object ('@{bucket=; context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -BucketName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the bucket name instead, e.g. Get-PfbBucket | Select-Object -ExpandProperty name | Get-PfbBucketCorsPolicy, or pass -BucketName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "bucket", @@ -3945,19 +3945,19 @@ { "Cmdlet": "Get-PfbBucketCorsPolicy", "Verb": "Get", - "Parameter": "MemberName", + "Parameter": "BucketName", "Producer": "GET /buckets/cross-origin-resource-sharing-policies/rules", "IsPrimary": false, "FromExample": false, - "WireName": "member_names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "member_names=@{allowed_headers=System.Object[]; allowed_methods=System.Object[]; allowed_origins=System.Object[]; context=; name=PROBE-name; policy=}", - "BoundWireKey": "member_names", - "BoundValue": "@{allowed_headers=System.Object[]; allowed_methods=System.Object[]; allowed_origins=System.Object[]; context=; name=PROBE-name; policy=}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-BucketName received a stringified object ('@{allowed_headers=System.Object[]; allowed_methods=System.Object[]; allowed_origins=System.Object[]; context=; name=PROBE-name; policy=}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -BucketName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the bucket name instead, e.g. Get-PfbBucket | Select-Object -ExpandProperty name | Get-PfbBucketCorsPolicy, or pass -BucketName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "allowed_headers", @@ -3979,19 +3979,19 @@ { "Cmdlet": "Get-PfbBucketCorsPolicy", "Verb": "Get", - "Parameter": "MemberName", + "Parameter": "BucketName", "Producer": "GET /buckets/performance", "IsPrimary": false, "FromExample": false, - "WireName": "member_names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "member_names=@{bytes_per_op=PROBE-bytes_per_op; bytes_per_read=PROBE-bytes_per_read; bytes_per_write=PROBE-bytes_per_write; id=PROBE-id; max_total_bytes_per_sec=PROBE-max_total_bytes_per_sec; max_total_ops_per_sec=PROBE-max_total_ops_per_sec; name=PROBE-name; others_per_sec=PROBE-others_per_sec; read_bytes_per_sec=PROBE-read_bytes_per_sec; reads_per_sec=PROBE-reads_per_sec; time=PROBE-time; usec_per_other_op=PROBE-usec_per_other_op; usec_per_read_op=PROBE-usec_per_read_op; usec_per_write_op=PROBE-usec_per_write_op; write_bytes_per_sec=PROBE-write_bytes_per_sec; writes_per_sec=PROBE-writes_per_sec}", - "BoundWireKey": "member_names", - "BoundValue": "@{bytes_per_op=PROBE-bytes_per_op; bytes_per_read=PROBE-bytes_per_read; bytes_per_write=PROBE-bytes_per_write; id=PROBE-id; max_total_bytes_per_sec=PROBE-max_total_bytes_per_sec; max_total_ops_per_sec=PROBE-max_total_ops_per_sec; name=PROBE-name; others_per_sec=PROBE-others_per_sec; read_bytes_per_sec=PROBE-read_bytes_per_sec; reads_per_sec=PROBE-reads_per_sec; time=PROBE-time; usec_per_other_op=PROBE-usec_per_other_op; usec_per_read_op=PROBE-usec_per_read_op; usec_per_write_op=PROBE-usec_per_write_op; write_bytes_per_sec=PROBE-write_bytes_per_sec; writes_per_sec=PROBE-writes_per_sec}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-BucketName received a stringified object ('@{bytes_per_op=PROBE-bytes_per_op; bytes_per_read=PROBE-bytes_per_read; bytes_per_write=PROBE-bytes_per_write; id=PROBE-id; max_total_bytes_per_sec=PROBE-max_total_bytes_per_sec; max_total_ops_per_sec=PROBE-max_total_ops_per_sec; name=PROBE-name; others_per_sec=PROBE-others_per_sec; read_bytes_per_sec=PROBE-read_bytes_per_sec; reads_per_sec=PROBE-reads_per_sec; time=PROBE-time; usec_per_other_op=PROBE-usec_per_other_op; usec_per_read_op=PROBE-usec_per_read_op; usec_per_write_op=PROBE-usec_per_write_op; write_bytes_per_sec=PROBE-write_bytes_per_sec; writes_per_sec=PROBE-writes_per_sec}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -BucketName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the bucket name instead, e.g. Get-PfbBucket | Select-Object -ExpandProperty name | Get-PfbBucketCorsPolicy, or pass -BucketName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "bytes_per_op", @@ -4033,19 +4033,19 @@ { "Cmdlet": "Get-PfbBucketCorsPolicy", "Verb": "Get", - "Parameter": "MemberName", + "Parameter": "BucketName", "Producer": "GET /buckets/s3-specific-performance", "IsPrimary": false, "FromExample": false, - "WireName": "member_names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "member_names=@{id=PROBE-id; name=PROBE-name; others_per_sec=PROBE-others_per_sec; read_buckets_per_sec=PROBE-read_buckets_per_sec; read_objects_per_sec=PROBE-read_objects_per_sec; time=PROBE-time; usec_per_other_op=PROBE-usec_per_other_op; usec_per_read_bucket_op=PROBE-usec_per_read_bucket_op; usec_per_read_object_op=PROBE-usec_per_read_object_op; usec_per_write_bucket_op=PROBE-usec_per_write_bucket_op; usec_per_write_object_op=PROBE-usec_per_write_object_op; write_buckets_per_sec=PROBE-write_buckets_per_sec; write_objects_per_sec=PROBE-write_objects_per_sec}", - "BoundWireKey": "member_names", - "BoundValue": "@{id=PROBE-id; name=PROBE-name; others_per_sec=PROBE-others_per_sec; read_buckets_per_sec=PROBE-read_buckets_per_sec; read_objects_per_sec=PROBE-read_objects_per_sec; time=PROBE-time; usec_per_other_op=PROBE-usec_per_other_op; usec_per_read_bucket_op=PROBE-usec_per_read_bucket_op; usec_per_read_object_op=PROBE-usec_per_read_object_op; usec_per_write_bucket_op=PROBE-usec_per_write_bucket_op; usec_per_write_object_op=PROBE-usec_per_write_object_op; write_buckets_per_sec=PROBE-write_buckets_per_sec; write_objects_per_sec=PROBE-write_objects_per_sec}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-BucketName received a stringified object ('@{id=PROBE-id; name=PROBE-name; others_per_sec=PROBE-others_per_sec; read_buckets_per_sec=PROBE-read_buckets_per_sec; read_objects_per_sec=PROBE-read_objects_per_sec; time=PROBE-time; usec_per_other_op=PROBE-usec_per_other_op; usec_per_read_bucket_op=PROBE-usec_per_read_bucket_op; usec_per_read_object_op=PROBE-usec_per_read_object_op; usec_per_write_bucket_op=PROBE-usec_per_write_bucket_op; usec_per_write_object_op=PROBE-usec_per_write_object_op; write_buckets_per_sec=PROBE-write_buckets_per_sec; write_objects_per_sec=PROBE-write_objects_per_sec}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -BucketName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the bucket name instead, e.g. Get-PfbBucket | Select-Object -ExpandProperty name | Get-PfbBucketCorsPolicy, or pass -BucketName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "id", @@ -4081,19 +4081,19 @@ { "Cmdlet": "Get-PfbBucketCorsPolicyRule", "Verb": "Get", - "Parameter": "MemberName", + "Parameter": "BucketName", "Producer": "GET /buckets", "IsPrimary": false, "FromExample": false, - "WireName": "member_names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "member_names=@{account=; bucket_type=PROBE-bucket_type; context=; created=PROBE-created; destroyed=PROBE-destroyed; eradication_config=; hard_limit_enabled=PROBE-hard_limit_enabled; id=PROBE-id; name=PROBE-name; object_count=PROBE-object_count; object_lock_config=; public_access_config=; public_status=PROBE-public_status; qos_policy=; quota_limit=PROBE-quota_limit; retention_lock=PROBE-retention_lock; space=; storage_class=; time_remaining=PROBE-time_remaining; time_remaining_status=PROBE-time_remaining_status; versioning=PROBE-versioning}", - "BoundWireKey": "member_names", - "BoundValue": "@{account=; bucket_type=PROBE-bucket_type; context=; created=PROBE-created; destroyed=PROBE-destroyed; eradication_config=; hard_limit_enabled=PROBE-hard_limit_enabled; id=PROBE-id; name=PROBE-name; object_count=PROBE-object_count; object_lock_config=; public_access_config=; public_status=PROBE-public_status; qos_policy=; quota_limit=PROBE-quota_limit; retention_lock=PROBE-retention_lock; space=; storage_class=; time_remaining=PROBE-time_remaining; time_remaining_status=PROBE-time_remaining_status; versioning=PROBE-versioning}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-BucketName received a stringified object ('@{account=; bucket_type=PROBE-bucket_type; context=; created=PROBE-created; destroyed=PROBE-destroyed; eradication_config=; hard_limit_enabled=PROBE-hard_limit_enabled; id=PROBE-id; name=PROBE-name; object_count=PROBE-object_count; object_lock_config=; public_access_config=; public_status=PROBE-public_status; qos_policy=; quota_limit=PROBE-quota_limit; retention_lock=PROBE-retention_lock; space=; storage_class=; time_remaining=PROBE-time_remaining; time_remaining_status=PROBE-time_remaining_status; versioning=PROBE-versioning}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -BucketName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the bucket name instead, e.g. Get-PfbBucket | Select-Object -ExpandProperty name | Get-PfbBucketCorsPolicyRule, or pass -BucketName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "account", @@ -4145,19 +4145,19 @@ { "Cmdlet": "Get-PfbBucketCorsPolicyRule", "Verb": "Get", - "Parameter": "MemberName", + "Parameter": "BucketName", "Producer": "GET /buckets/audit-filters", "IsPrimary": false, "FromExample": false, - "WireName": "member_names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "member_names=@{actions=System.Object[]; bucket=; context=; name=PROBE-name; s3_prefixes=System.Object[]}", - "BoundWireKey": "member_names", - "BoundValue": "@{actions=System.Object[]; bucket=; context=; name=PROBE-name; s3_prefixes=System.Object[]}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-BucketName received a stringified object ('@{actions=System.Object[]; bucket=; context=; name=PROBE-name; s3_prefixes=System.Object[]}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -BucketName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the bucket name instead, e.g. Get-PfbBucket | Select-Object -ExpandProperty name | Get-PfbBucketCorsPolicyRule, or pass -BucketName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "actions", @@ -4177,19 +4177,19 @@ { "Cmdlet": "Get-PfbBucketCorsPolicyRule", "Verb": "Get", - "Parameter": "MemberName", + "Parameter": "BucketName", "Producer": "GET /buckets/bucket-access-policies", "IsPrimary": false, "FromExample": false, - "WireName": "member_names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "member_names=@{bucket=; context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]}", - "BoundWireKey": "member_names", - "BoundValue": "@{bucket=; context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-BucketName received a stringified object ('@{bucket=; context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -BucketName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the bucket name instead, e.g. Get-PfbBucket | Select-Object -ExpandProperty name | Get-PfbBucketCorsPolicyRule, or pass -BucketName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "bucket", @@ -4219,19 +4219,19 @@ { "Cmdlet": "Get-PfbBucketCorsPolicyRule", "Verb": "Get", - "Parameter": "MemberName", + "Parameter": "BucketName", "Producer": "GET /buckets/bucket-access-policies/rules", "IsPrimary": false, "FromExample": false, - "WireName": "member_names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "member_names=@{actions=System.Object[]; context=; effect=PROBE-effect; name=PROBE-name; policy=; principals=; resources=System.Object[]}", - "BoundWireKey": "member_names", - "BoundValue": "@{actions=System.Object[]; context=; effect=PROBE-effect; name=PROBE-name; policy=; principals=; resources=System.Object[]}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-BucketName received a stringified object ('@{actions=System.Object[]; context=; effect=PROBE-effect; name=PROBE-name; policy=; principals=; resources=System.Object[]}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -BucketName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the bucket name instead, e.g. Get-PfbBucket | Select-Object -ExpandProperty name | Get-PfbBucketCorsPolicyRule, or pass -BucketName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "actions", @@ -4255,19 +4255,19 @@ { "Cmdlet": "Get-PfbBucketCorsPolicyRule", "Verb": "Get", - "Parameter": "MemberName", + "Parameter": "BucketName", "Producer": "GET /buckets/cross-origin-resource-sharing-policies", "IsPrimary": false, "FromExample": false, - "WireName": "member_names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "member_names=@{bucket=; context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]}", - "BoundWireKey": "member_names", - "BoundValue": "@{bucket=; context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-BucketName received a stringified object ('@{bucket=; context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -BucketName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the bucket name instead, e.g. Get-PfbBucket | Select-Object -ExpandProperty name | Get-PfbBucketCorsPolicyRule, or pass -BucketName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "bucket", @@ -4297,19 +4297,19 @@ { "Cmdlet": "Get-PfbBucketCorsPolicyRule", "Verb": "Get", - "Parameter": "MemberName", + "Parameter": "BucketName", "Producer": "GET /buckets/cross-origin-resource-sharing-policies/rules", "IsPrimary": true, "FromExample": false, - "WireName": "member_names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "member_names=@{allowed_headers=System.Object[]; allowed_methods=System.Object[]; allowed_origins=System.Object[]; context=; name=PROBE-name; policy=}", - "BoundWireKey": "member_names", - "BoundValue": "@{allowed_headers=System.Object[]; allowed_methods=System.Object[]; allowed_origins=System.Object[]; context=; name=PROBE-name; policy=}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-BucketName received a stringified object ('@{allowed_headers=System.Object[]; allowed_methods=System.Object[]; allowed_origins=System.Object[]; context=; name=PROBE-name; policy=}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -BucketName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the bucket name instead, e.g. Get-PfbBucket | Select-Object -ExpandProperty name | Get-PfbBucketCorsPolicyRule, or pass -BucketName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "allowed_headers", @@ -4331,19 +4331,19 @@ { "Cmdlet": "Get-PfbBucketCorsPolicyRule", "Verb": "Get", - "Parameter": "MemberName", + "Parameter": "BucketName", "Producer": "GET /buckets/performance", "IsPrimary": false, "FromExample": false, - "WireName": "member_names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "member_names=@{bytes_per_op=PROBE-bytes_per_op; bytes_per_read=PROBE-bytes_per_read; bytes_per_write=PROBE-bytes_per_write; id=PROBE-id; max_total_bytes_per_sec=PROBE-max_total_bytes_per_sec; max_total_ops_per_sec=PROBE-max_total_ops_per_sec; name=PROBE-name; others_per_sec=PROBE-others_per_sec; read_bytes_per_sec=PROBE-read_bytes_per_sec; reads_per_sec=PROBE-reads_per_sec; time=PROBE-time; usec_per_other_op=PROBE-usec_per_other_op; usec_per_read_op=PROBE-usec_per_read_op; usec_per_write_op=PROBE-usec_per_write_op; write_bytes_per_sec=PROBE-write_bytes_per_sec; writes_per_sec=PROBE-writes_per_sec}", - "BoundWireKey": "member_names", - "BoundValue": "@{bytes_per_op=PROBE-bytes_per_op; bytes_per_read=PROBE-bytes_per_read; bytes_per_write=PROBE-bytes_per_write; id=PROBE-id; max_total_bytes_per_sec=PROBE-max_total_bytes_per_sec; max_total_ops_per_sec=PROBE-max_total_ops_per_sec; name=PROBE-name; others_per_sec=PROBE-others_per_sec; read_bytes_per_sec=PROBE-read_bytes_per_sec; reads_per_sec=PROBE-reads_per_sec; time=PROBE-time; usec_per_other_op=PROBE-usec_per_other_op; usec_per_read_op=PROBE-usec_per_read_op; usec_per_write_op=PROBE-usec_per_write_op; write_bytes_per_sec=PROBE-write_bytes_per_sec; writes_per_sec=PROBE-writes_per_sec}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-BucketName received a stringified object ('@{bytes_per_op=PROBE-bytes_per_op; bytes_per_read=PROBE-bytes_per_read; bytes_per_write=PROBE-bytes_per_write; id=PROBE-id; max_total_bytes_per_sec=PROBE-max_total_bytes_per_sec; max_total_ops_per_sec=PROBE-max_total_ops_per_sec; name=PROBE-name; others_per_sec=PROBE-others_per_sec; read_bytes_per_sec=PROBE-read_bytes_per_sec; reads_per_sec=PROBE-reads_per_sec; time=PROBE-time; usec_per_other_op=PROBE-usec_per_other_op; usec_per_read_op=PROBE-usec_per_read_op; usec_per_write_op=PROBE-usec_per_write_op; write_bytes_per_sec=PROBE-write_bytes_per_sec; writes_per_sec=PROBE-writes_per_sec}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -BucketName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the bucket name instead, e.g. Get-PfbBucket | Select-Object -ExpandProperty name | Get-PfbBucketCorsPolicyRule, or pass -BucketName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "bytes_per_op", @@ -4385,19 +4385,19 @@ { "Cmdlet": "Get-PfbBucketCorsPolicyRule", "Verb": "Get", - "Parameter": "MemberName", + "Parameter": "BucketName", "Producer": "GET /buckets/s3-specific-performance", "IsPrimary": false, "FromExample": false, - "WireName": "member_names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "member_names=@{id=PROBE-id; name=PROBE-name; others_per_sec=PROBE-others_per_sec; read_buckets_per_sec=PROBE-read_buckets_per_sec; read_objects_per_sec=PROBE-read_objects_per_sec; time=PROBE-time; usec_per_other_op=PROBE-usec_per_other_op; usec_per_read_bucket_op=PROBE-usec_per_read_bucket_op; usec_per_read_object_op=PROBE-usec_per_read_object_op; usec_per_write_bucket_op=PROBE-usec_per_write_bucket_op; usec_per_write_object_op=PROBE-usec_per_write_object_op; write_buckets_per_sec=PROBE-write_buckets_per_sec; write_objects_per_sec=PROBE-write_objects_per_sec}", - "BoundWireKey": "member_names", - "BoundValue": "@{id=PROBE-id; name=PROBE-name; others_per_sec=PROBE-others_per_sec; read_buckets_per_sec=PROBE-read_buckets_per_sec; read_objects_per_sec=PROBE-read_objects_per_sec; time=PROBE-time; usec_per_other_op=PROBE-usec_per_other_op; usec_per_read_bucket_op=PROBE-usec_per_read_bucket_op; usec_per_read_object_op=PROBE-usec_per_read_object_op; usec_per_write_bucket_op=PROBE-usec_per_write_bucket_op; usec_per_write_object_op=PROBE-usec_per_write_object_op; write_buckets_per_sec=PROBE-write_buckets_per_sec; write_objects_per_sec=PROBE-write_objects_per_sec}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-BucketName received a stringified object ('@{id=PROBE-id; name=PROBE-name; others_per_sec=PROBE-others_per_sec; read_buckets_per_sec=PROBE-read_buckets_per_sec; read_objects_per_sec=PROBE-read_objects_per_sec; time=PROBE-time; usec_per_other_op=PROBE-usec_per_other_op; usec_per_read_bucket_op=PROBE-usec_per_read_bucket_op; usec_per_read_object_op=PROBE-usec_per_read_object_op; usec_per_write_bucket_op=PROBE-usec_per_write_bucket_op; usec_per_write_object_op=PROBE-usec_per_write_object_op; write_buckets_per_sec=PROBE-write_buckets_per_sec; write_objects_per_sec=PROBE-write_objects_per_sec}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -BucketName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the bucket name instead, e.g. Get-PfbBucket | Select-Object -ExpandProperty name | Get-PfbBucketCorsPolicyRule, or pass -BucketName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "id", @@ -5339,19 +5339,19 @@ { "Cmdlet": "Get-PfbCertificateGroupCertificate", "Verb": "Get", - "Parameter": "Name", + "Parameter": "CertificateName", "Producer": "GET /certificate-groups", "IsPrimary": false, "FromExample": false, - "WireName": "names", - "IsCandidate": false, - "Gate": "Matched", + "WireName": "certificate_names", + "IsCandidate": true, + "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Bound", - "Evidence": "names=PROBE-name (from property 'name')", - "BoundWireKey": "names", - "BoundValue": "PROBE-name", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-CertificateName received a stringified object ('@{id=PROBE-id; name=PROBE-name; realms=System.Object[]}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -CertificateName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the certificate name instead, e.g. Get-PfbCertificate | Select-Object -ExpandProperty name | Get-PfbCertificateGroupCertificate, or pass -CertificateName explicitly, or -CertificateGroupId if you meant to filter by group.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "id", @@ -5367,19 +5367,19 @@ { "Cmdlet": "Get-PfbCertificateGroupCertificate", "Verb": "Get", - "Parameter": "Name", + "Parameter": "CertificateName", "Producer": "GET /certificate-groups/certificates", "IsPrimary": true, "FromExample": false, - "WireName": "names", + "WireName": "certificate_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "names=@{group=; member=}", - "BoundWireKey": "names", - "BoundValue": "@{group=; member=}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-CertificateName received a stringified object ('@{group=; member=}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -CertificateName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the certificate name instead, e.g. Get-PfbCertificate | Select-Object -ExpandProperty name | Get-PfbCertificateGroupCertificate, or pass -CertificateName explicitly, or -CertificateGroupId if you meant to filter by group.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "group", @@ -5393,19 +5393,19 @@ { "Cmdlet": "Get-PfbCertificateGroupCertificate", "Verb": "Get", - "Parameter": "Name", + "Parameter": "CertificateName", "Producer": "GET /certificate-groups/uses", "IsPrimary": false, "FromExample": false, - "WireName": "names", - "IsCandidate": false, - "Gate": "Matched", + "WireName": "certificate_names", + "IsCandidate": true, + "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Bound", - "Evidence": "names=PROBE-name (from property 'name')", - "BoundWireKey": "names", - "BoundValue": "PROBE-name", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-CertificateName received a stringified object ('@{id=PROBE-id; name=PROBE-name; use=}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -CertificateName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the certificate name instead, e.g. Get-PfbCertificate | Select-Object -ExpandProperty name | Get-PfbCertificateGroupCertificate, or pass -CertificateName explicitly, or -CertificateGroupId if you meant to filter by group.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "id", @@ -11652,94 +11652,6 @@ "status_details": "string" } }, - { - "Cmdlet": "Get-PfbFleetKey", - "Verb": "Get", - "Parameter": "Name", - "Producer": "GET /fleets", - "IsPrimary": false, - "FromExample": false, - "WireName": "names", - "IsCandidate": false, - "Gate": "Matched", - "ValueFromPipeline": true, - "Outcome": "Bound", - "Evidence": "names=PROBE-name (from property 'name')", - "BoundWireKey": "names", - "BoundValue": "PROBE-name", - "ErrorKind": null, - "FilledParameter": [], - "ProbeProperties": [ - "id", - "is_local", - "name" - ], - "ProbeTypes": { - "id": "string", - "is_local": "boolean", - "name": "string" - } - }, - { - "Cmdlet": "Get-PfbFleetKey", - "Verb": "Get", - "Parameter": "Name", - "Producer": "GET /fleets/fleet-key", - "IsPrimary": true, - "FromExample": false, - "WireName": "names", - "IsCandidate": true, - "Gate": "Candidate", - "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "names=@{created=PROBE-created; expires=PROBE-expires; fleet_key=PROBE-fleet_key}", - "BoundWireKey": "names", - "BoundValue": "@{created=PROBE-created; expires=PROBE-expires; fleet_key=PROBE-fleet_key}", - "ErrorKind": null, - "FilledParameter": [], - "ProbeProperties": [ - "created", - "expires", - "fleet_key" - ], - "ProbeTypes": { - "created": "integer", - "expires": "integer", - "fleet_key": "string" - } - }, - { - "Cmdlet": "Get-PfbFleetKey", - "Verb": "Get", - "Parameter": "Name", - "Producer": "GET /fleets/members", - "IsPrimary": false, - "FromExample": false, - "WireName": "names", - "IsCandidate": true, - "Gate": "Candidate", - "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "names=@{coordinator_of=System.Object[]; fleet=; member=; status=PROBE-status; status_details=PROBE-status_details}", - "BoundWireKey": "names", - "BoundValue": "@{coordinator_of=System.Object[]; fleet=; member=; status=PROBE-status; status_details=PROBE-status_details}", - "ErrorKind": null, - "FilledParameter": [], - "ProbeProperties": [ - "coordinator_of", - "fleet", - "member", - "status", - "status_details" - ], - "ProbeTypes": { - "coordinator_of": "array", - "fleet": "object", - "member": "object", - "status": "string", - "status_details": "string" - } - }, { "Cmdlet": "Get-PfbHardware", "Verb": "Get", @@ -13033,7 +12945,7 @@ { "Cmdlet": "Get-PfbLocalGroupMember", "Verb": "Get", - "Parameter": "Group", + "Parameter": "GroupName", "Producer": "GET /directory-services", "IsPrimary": false, "FromExample": false, @@ -13041,11 +12953,11 @@ "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "group_names=@{base_dn=PROBE-base_dn; bind_password=PROBE-bind_password; bind_user=PROBE-bind_user; ca_certificate=; ca_certificate_group=; enabled=PROBE-enabled; id=PROBE-id; management=; name=PROBE-name; nfs=; services=System.Object[]; smb=; uris=System.Object[]}", - "BoundWireKey": "group_names", - "BoundValue": "@{base_dn=PROBE-base_dn; bind_password=PROBE-bind_password; bind_user=PROBE-bind_user; ca_certificate=; ca_certificate_group=; enabled=PROBE-enabled; id=PROBE-id; management=; name=PROBE-name; nfs=; services=System.Object[]; smb=; uris=System.Object[]}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-GroupName received a stringified object ('@{base_dn=PROBE-base_dn; bind_password=PROBE-bind_password; bind_user=PROBE-bind_user; ca_certificate=; ca_certificate_group=; enabled=PROBE-enabled; id=PROBE-id; management=; name=PROBE-name; nfs=; services=System.Object[]; smb=; uris=System.Object[]}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -GroupName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the group name instead, e.g. Get-PfbLocalGroup | Select-Object -ExpandProperty name | Get-PfbLocalGroupMember, or pass -GroupName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "base_dn", @@ -13081,7 +12993,7 @@ { "Cmdlet": "Get-PfbLocalGroupMember", "Verb": "Get", - "Parameter": "Group", + "Parameter": "GroupName", "Producer": "GET /directory-services/local/directory-services", "IsPrimary": false, "FromExample": false, @@ -13089,11 +13001,11 @@ "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "group_names=@{context=; destroyed=PROBE-destroyed; domain=PROBE-domain; id=PROBE-id; name=PROBE-name; realms=System.Object[]; server=; time_remaining=PROBE-time_remaining}", - "BoundWireKey": "group_names", - "BoundValue": "@{context=; destroyed=PROBE-destroyed; domain=PROBE-domain; id=PROBE-id; name=PROBE-name; realms=System.Object[]; server=; time_remaining=PROBE-time_remaining}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-GroupName received a stringified object ('@{context=; destroyed=PROBE-destroyed; domain=PROBE-domain; id=PROBE-id; name=PROBE-name; realms=System.Object[]; server=; time_remaining=PROBE-time_remaining}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -GroupName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the group name instead, e.g. Get-PfbLocalGroup | Select-Object -ExpandProperty name | Get-PfbLocalGroupMember, or pass -GroupName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "context", @@ -13119,7 +13031,7 @@ { "Cmdlet": "Get-PfbLocalGroupMember", "Verb": "Get", - "Parameter": "Group", + "Parameter": "GroupName", "Producer": "GET /directory-services/local/groups", "IsPrimary": false, "FromExample": false, @@ -13127,11 +13039,11 @@ "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "group_names=@{built_in=PROBE-built_in; context=; email=PROBE-email; gid=PROBE-gid; local_directory_service=; name=PROBE-name; realms=System.Object[]; server=; sid=PROBE-sid}", - "BoundWireKey": "group_names", - "BoundValue": "@{built_in=PROBE-built_in; context=; email=PROBE-email; gid=PROBE-gid; local_directory_service=; name=PROBE-name; realms=System.Object[]; server=; sid=PROBE-sid}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-GroupName received a stringified object ('@{built_in=PROBE-built_in; context=; email=PROBE-email; gid=PROBE-gid; local_directory_service=; name=PROBE-name; realms=System.Object[]; server=; sid=PROBE-sid}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -GroupName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the group name instead, e.g. Get-PfbLocalGroup | Select-Object -ExpandProperty name | Get-PfbLocalGroupMember, or pass -GroupName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "built_in", @@ -13159,7 +13071,7 @@ { "Cmdlet": "Get-PfbLocalGroupMember", "Verb": "Get", - "Parameter": "Group", + "Parameter": "GroupName", "Producer": "GET /directory-services/local/groups/members", "IsPrimary": true, "FromExample": false, @@ -13167,11 +13079,11 @@ "IsCandidate": false, "Gate": "Matched", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "group_names=@{context=; group=; group_gid=PROBE-group_gid; is_primary_group=PROBE-is_primary_group; local_directory_service=; member=; member_id=PROBE-member_id; realms=System.Object[]; server=}", - "BoundWireKey": "group_names", - "BoundValue": "@{context=; group=; group_gid=PROBE-group_gid; is_primary_group=PROBE-is_primary_group; local_directory_service=; member=; member_id=PROBE-member_id; realms=System.Object[]; server=}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-GroupName received a stringified object ('@{context=; group=; group_gid=PROBE-group_gid; is_primary_group=PROBE-is_primary_group; local_directory_service=; member=; member_id=PROBE-member_id; realms=System.Object[]; server=}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -GroupName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the group name instead, e.g. Get-PfbLocalGroup | Select-Object -ExpandProperty name | Get-PfbLocalGroupMember, or pass -GroupName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "context", @@ -13199,7 +13111,7 @@ { "Cmdlet": "Get-PfbLocalGroupMember", "Verb": "Get", - "Parameter": "Group", + "Parameter": "GroupName", "Producer": "GET /directory-services/local/users", "IsPrimary": false, "FromExample": false, @@ -13207,11 +13119,11 @@ "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "group_names=@{built_in=PROBE-built_in; context=; email=PROBE-email; enabled=PROBE-enabled; local_directory_service=; name=PROBE-name; primary_group=; realms=System.Object[]; server=; sid=PROBE-sid; uid=PROBE-uid}", - "BoundWireKey": "group_names", - "BoundValue": "@{built_in=PROBE-built_in; context=; email=PROBE-email; enabled=PROBE-enabled; local_directory_service=; name=PROBE-name; primary_group=; realms=System.Object[]; server=; sid=PROBE-sid; uid=PROBE-uid}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-GroupName received a stringified object ('@{built_in=PROBE-built_in; context=; email=PROBE-email; enabled=PROBE-enabled; local_directory_service=; name=PROBE-name; primary_group=; realms=System.Object[]; server=; sid=PROBE-sid; uid=PROBE-uid}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -GroupName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the group name instead, e.g. Get-PfbLocalGroup | Select-Object -ExpandProperty name | Get-PfbLocalGroupMember, or pass -GroupName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "built_in", @@ -13243,7 +13155,7 @@ { "Cmdlet": "Get-PfbLocalGroupMember", "Verb": "Get", - "Parameter": "Group", + "Parameter": "GroupName", "Producer": "GET /directory-services/local/users/members", "IsPrimary": false, "FromExample": false, @@ -13251,11 +13163,11 @@ "IsCandidate": false, "Gate": "Matched", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "group_names=@{context=; group=; group_gid=PROBE-group_gid; is_primary_group=PROBE-is_primary_group; local_directory_service=; member=; member_id=PROBE-member_id; realms=System.Object[]; server=}", - "BoundWireKey": "group_names", - "BoundValue": "@{context=; group=; group_gid=PROBE-group_gid; is_primary_group=PROBE-is_primary_group; local_directory_service=; member=; member_id=PROBE-member_id; realms=System.Object[]; server=}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-GroupName received a stringified object ('@{context=; group=; group_gid=PROBE-group_gid; is_primary_group=PROBE-is_primary_group; local_directory_service=; member=; member_id=PROBE-member_id; realms=System.Object[]; server=}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -GroupName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the group name instead, e.g. Get-PfbLocalGroup | Select-Object -ExpandProperty name | Get-PfbLocalGroupMember, or pass -GroupName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "context", @@ -13283,7 +13195,7 @@ { "Cmdlet": "Get-PfbLocalGroupMember", "Verb": "Get", - "Parameter": "Group", + "Parameter": "GroupName", "Producer": "GET /directory-services/roles", "IsPrimary": false, "FromExample": false, @@ -13317,7 +13229,7 @@ { "Cmdlet": "Get-PfbLocalGroupMember", "Verb": "Get", - "Parameter": "Group", + "Parameter": "GroupName", "Producer": "GET /directory-services/roles/management-access-policies", "IsPrimary": false, "FromExample": false, @@ -13325,11 +13237,11 @@ "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "group_names=@{member=; policy=}", - "BoundWireKey": "group_names", - "BoundValue": "@{member=; policy=}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-GroupName received a stringified object ('@{member=; policy=}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -GroupName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the group name instead, e.g. Get-PfbLocalGroup | Select-Object -ExpandProperty name | Get-PfbLocalGroupMember, or pass -GroupName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "member", @@ -13343,7 +13255,7 @@ { "Cmdlet": "Get-PfbLocalGroupMember", "Verb": "Get", - "Parameter": "Group", + "Parameter": "GroupName", "Producer": "GET /directory-services/test", "IsPrimary": false, "FromExample": false, @@ -13351,11 +13263,11 @@ "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "group_names=@{component_address=PROBE-component_address; component_name=PROBE-component_name; context=; description=PROBE-description; destination=PROBE-destination; enabled=PROBE-enabled; resource=; result_details=PROBE-result_details; success=PROBE-success; test_type=PROBE-test_type}", - "BoundWireKey": "group_names", - "BoundValue": "@{component_address=PROBE-component_address; component_name=PROBE-component_name; context=; description=PROBE-description; destination=PROBE-destination; enabled=PROBE-enabled; resource=; result_details=PROBE-result_details; success=PROBE-success; test_type=PROBE-test_type}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-GroupName received a stringified object ('@{component_address=PROBE-component_address; component_name=PROBE-component_name; context=; description=PROBE-description; destination=PROBE-destination; enabled=PROBE-enabled; resource=; result_details=PROBE-result_details; success=PROBE-success; test_type=PROBE-test_type}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -GroupName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the group name instead, e.g. Get-PfbLocalGroup | Select-Object -ExpandProperty name | Get-PfbLocalGroupMember, or pass -GroupName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "component_address", @@ -13919,11 +13831,11 @@ "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "policy_names=@{enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]; version=PROBE-version}", - "BoundWireKey": "policy_names", - "BoundValue": "@{enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]; version=PROBE-version}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-PolicyName received a stringified object ('@{enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]; version=PROBE-version}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -PolicyName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the policy name instead, e.g. Get-PfbNetworkAccessPolicy | Select-Object -ExpandProperty name | Get-PfbNetworkAccessRule, or pass -PolicyName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "enabled", @@ -13959,11 +13871,11 @@ "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "policy_names=@{member=; policy=}", - "BoundWireKey": "policy_names", - "BoundValue": "@{member=; policy=}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-PolicyName received a stringified object ('@{member=; policy=}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -PolicyName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the policy name instead, e.g. Get-PfbNetworkAccessPolicy | Select-Object -ExpandProperty name | Get-PfbNetworkAccessRule, or pass -PolicyName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "member", @@ -13985,11 +13897,11 @@ "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "policy_names=@{client=PROBE-client; effect=PROBE-effect; id=PROBE-id; index=PROBE-index; interfaces=System.Object[]; name=PROBE-name; policy=; policy_version=PROBE-policy_version}", - "BoundWireKey": "policy_names", - "BoundValue": "@{client=PROBE-client; effect=PROBE-effect; id=PROBE-id; index=PROBE-index; interfaces=System.Object[]; name=PROBE-name; policy=; policy_version=PROBE-policy_version}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-PolicyName received a stringified object ('@{client=PROBE-client; effect=PROBE-effect; id=PROBE-id; index=PROBE-index; interfaces=System.Object[]; name=PROBE-name; policy=; policy_version=PROBE-policy_version}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -PolicyName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the policy name instead, e.g. Get-PfbNetworkAccessPolicy | Select-Object -ExpandProperty name | Get-PfbNetworkAccessRule, or pass -PolicyName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "client", @@ -14013,11 +13925,11 @@ } }, { - "Cmdlet": "Get-PfbNetworkConnectionStatistics", + "Cmdlet": "Get-PfbNetworkInterface", "Verb": "Get", "Parameter": "Name", "Producer": "GET /network-interfaces", - "IsPrimary": false, + "IsPrimary": true, "FromExample": false, "WireName": "names", "IsCandidate": false, @@ -14063,7 +13975,7 @@ } }, { - "Cmdlet": "Get-PfbNetworkConnectionStatistics", + "Cmdlet": "Get-PfbNetworkInterface", "Verb": "Get", "Parameter": "Name", "Producer": "GET /network-interfaces/connectors", @@ -14101,7 +14013,7 @@ } }, { - "Cmdlet": "Get-PfbNetworkConnectionStatistics", + "Cmdlet": "Get-PfbNetworkInterface", "Verb": "Get", "Parameter": "Name", "Producer": "GET /network-interfaces/connectors/performance", @@ -14173,7 +14085,7 @@ } }, { - "Cmdlet": "Get-PfbNetworkConnectionStatistics", + "Cmdlet": "Get-PfbNetworkInterface", "Verb": "Get", "Parameter": "Name", "Producer": "GET /network-interfaces/connectors/settings", @@ -14201,7 +14113,7 @@ } }, { - "Cmdlet": "Get-PfbNetworkConnectionStatistics", + "Cmdlet": "Get-PfbNetworkInterface", "Verb": "Get", "Parameter": "Name", "Producer": "GET /network-interfaces/neighbors", @@ -14231,11 +14143,11 @@ } }, { - "Cmdlet": "Get-PfbNetworkConnectionStatistics", + "Cmdlet": "Get-PfbNetworkInterface", "Verb": "Get", "Parameter": "Name", "Producer": "GET /network-interfaces/network-connection-statistics", - "IsPrimary": true, + "IsPrimary": false, "FromExample": false, "WireName": "names", "IsCandidate": true, @@ -14261,7 +14173,7 @@ } }, { - "Cmdlet": "Get-PfbNetworkConnectionStatistics", + "Cmdlet": "Get-PfbNetworkInterface", "Verb": "Get", "Parameter": "Name", "Producer": "GET /network-interfaces/ping", @@ -14291,7 +14203,7 @@ } }, { - "Cmdlet": "Get-PfbNetworkConnectionStatistics", + "Cmdlet": "Get-PfbNetworkInterface", "Verb": "Get", "Parameter": "Name", "Producer": "GET /network-interfaces/tls-policies", @@ -14317,7 +14229,7 @@ } }, { - "Cmdlet": "Get-PfbNetworkConnectionStatistics", + "Cmdlet": "Get-PfbNetworkInterface", "Verb": "Get", "Parameter": "Name", "Producer": "GET /network-interfaces/trace", @@ -14347,11 +14259,11 @@ } }, { - "Cmdlet": "Get-PfbNetworkInterface", + "Cmdlet": "Get-PfbNetworkInterfaceConnector", "Verb": "Get", "Parameter": "Name", "Producer": "GET /network-interfaces", - "IsPrimary": true, + "IsPrimary": false, "FromExample": false, "WireName": "names", "IsCandidate": false, @@ -14397,11 +14309,11 @@ } }, { - "Cmdlet": "Get-PfbNetworkInterface", + "Cmdlet": "Get-PfbNetworkInterfaceConnector", "Verb": "Get", "Parameter": "Name", "Producer": "GET /network-interfaces/connectors", - "IsPrimary": false, + "IsPrimary": true, "FromExample": false, "WireName": "names", "IsCandidate": false, @@ -14435,7 +14347,7 @@ } }, { - "Cmdlet": "Get-PfbNetworkInterface", + "Cmdlet": "Get-PfbNetworkInterfaceConnector", "Verb": "Get", "Parameter": "Name", "Producer": "GET /network-interfaces/connectors/performance", @@ -14507,7 +14419,7 @@ } }, { - "Cmdlet": "Get-PfbNetworkInterface", + "Cmdlet": "Get-PfbNetworkInterfaceConnector", "Verb": "Get", "Parameter": "Name", "Producer": "GET /network-interfaces/connectors/settings", @@ -14535,7 +14447,7 @@ } }, { - "Cmdlet": "Get-PfbNetworkInterface", + "Cmdlet": "Get-PfbNetworkInterfaceConnector", "Verb": "Get", "Parameter": "Name", "Producer": "GET /network-interfaces/neighbors", @@ -14565,7 +14477,7 @@ } }, { - "Cmdlet": "Get-PfbNetworkInterface", + "Cmdlet": "Get-PfbNetworkInterfaceConnector", "Verb": "Get", "Parameter": "Name", "Producer": "GET /network-interfaces/network-connection-statistics", @@ -14595,7 +14507,7 @@ } }, { - "Cmdlet": "Get-PfbNetworkInterface", + "Cmdlet": "Get-PfbNetworkInterfaceConnector", "Verb": "Get", "Parameter": "Name", "Producer": "GET /network-interfaces/ping", @@ -14625,7 +14537,7 @@ } }, { - "Cmdlet": "Get-PfbNetworkInterface", + "Cmdlet": "Get-PfbNetworkInterfaceConnector", "Verb": "Get", "Parameter": "Name", "Producer": "GET /network-interfaces/tls-policies", @@ -14650,345 +14562,11 @@ "policy": "object" } }, - { - "Cmdlet": "Get-PfbNetworkInterface", - "Verb": "Get", - "Parameter": "Name", - "Producer": "GET /network-interfaces/trace", - "IsPrimary": false, - "FromExample": false, - "WireName": "names", - "IsCandidate": true, - "Gate": "Candidate", - "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "names=@{component_name=PROBE-component_name; destination=PROBE-destination; details=PROBE-details; source=PROBE-source}", - "BoundWireKey": "names", - "BoundValue": "@{component_name=PROBE-component_name; destination=PROBE-destination; details=PROBE-details; source=PROBE-source}", - "ErrorKind": null, - "FilledParameter": [], - "ProbeProperties": [ - "component_name", - "destination", - "details", - "source" - ], - "ProbeTypes": { - "component_name": "string", - "destination": "string", - "details": "string", - "source": "string" - } - }, - { - "Cmdlet": "Get-PfbNetworkInterfaceConnector", - "Verb": "Get", - "Parameter": "Name", - "Producer": "GET /network-interfaces", - "IsPrimary": false, - "FromExample": false, - "WireName": "names", - "IsCandidate": false, - "Gate": "Matched", - "ValueFromPipeline": true, - "Outcome": "Bound", - "Evidence": "names=PROBE-name (from property 'name')", - "BoundWireKey": "names", - "BoundValue": "PROBE-name", - "ErrorKind": null, - "FilledParameter": [], - "ProbeProperties": [ - "address", - "attached_servers", - "enabled", - "gateway", - "id", - "mtu", - "name", - "netmask", - "rdma_enabled", - "realms", - "services", - "subnet", - "type", - "vlan" - ], - "ProbeTypes": { - "address": "string", - "attached_servers": "array", - "enabled": "boolean", - "gateway": "string", - "id": "string", - "mtu": "integer", - "name": "string", - "netmask": "string", - "rdma_enabled": "boolean", - "realms": "array", - "services": "array", - "subnet": "object", - "type": "string", - "vlan": "integer" - } - }, - { - "Cmdlet": "Get-PfbNetworkInterfaceConnector", - "Verb": "Get", - "Parameter": "Name", - "Producer": "GET /network-interfaces/connectors", - "IsPrimary": true, - "FromExample": false, - "WireName": "names", - "IsCandidate": false, - "Gate": "Matched", - "ValueFromPipeline": true, - "Outcome": "Bound", - "Evidence": "names=PROBE-name (from property 'name')", - "BoundWireKey": "names", - "BoundValue": "PROBE-name", - "ErrorKind": null, - "FilledParameter": [], - "ProbeProperties": [ - "connector_type", - "id", - "lane_speed", - "lanes_per_port", - "name", - "port_count", - "port_speed", - "transceiver_type" - ], - "ProbeTypes": { - "connector_type": "string", - "id": "string", - "lane_speed": "integer", - "lanes_per_port": "integer", - "name": "string", - "port_count": "integer", - "port_speed": "integer", - "transceiver_type": "string" - } - }, - { - "Cmdlet": "Get-PfbNetworkInterfaceConnector", - "Verb": "Get", - "Parameter": "Name", - "Producer": "GET /network-interfaces/connectors/performance", - "IsPrimary": false, - "FromExample": false, - "WireName": "names", - "IsCandidate": false, - "Gate": "Matched", - "ValueFromPipeline": true, - "Outcome": "Bound", - "Evidence": "names=PROBE-name (from property 'name')", - "BoundWireKey": "names", - "BoundValue": "PROBE-name", - "ErrorKind": null, - "FilledParameter": [], - "ProbeProperties": [ - "flow_control_received_congestion_packets_per_sec", - "flow_control_received_discarded_packets_per_sec", - "flow_control_received_lossless_bytes_per_sec", - "flow_control_received_pause_frames_per_sec", - "flow_control_transmitted_congestion_packets_per_sec", - "flow_control_transmitted_discarded_packets_per_sec", - "flow_control_transmitted_lossless_bytes_per_sec", - "flow_control_transmitted_pause_frames_per_sec", - "id", - "link_aggregation_group", - "name", - "other_errors_per_sec", - "rdma_received_req_cqe_errors_per_sec", - "rdma_received_sequence_errors_per_sec", - "rdma_transmitted_local_ack_timeout_errors_per_sec", - "received_bytes_per_sec", - "received_crc_errors_per_sec", - "received_frame_errors_per_sec", - "received_packets_per_sec", - "time", - "total_errors_per_sec", - "transmitted_bytes_per_sec", - "transmitted_carrier_errors_per_sec", - "transmitted_dropped_errors_per_sec", - "transmitted_packets_per_sec" - ], - "ProbeTypes": { - "flow_control_received_congestion_packets_per_sec": "integer", - "flow_control_received_discarded_packets_per_sec": "integer", - "flow_control_received_lossless_bytes_per_sec": "integer", - "flow_control_received_pause_frames_per_sec": "integer", - "flow_control_transmitted_congestion_packets_per_sec": "integer", - "flow_control_transmitted_discarded_packets_per_sec": "integer", - "flow_control_transmitted_lossless_bytes_per_sec": "integer", - "flow_control_transmitted_pause_frames_per_sec": "integer", - "id": "string", - "link_aggregation_group": "object", - "name": "string", - "other_errors_per_sec": "integer", - "rdma_received_req_cqe_errors_per_sec": "integer", - "rdma_received_sequence_errors_per_sec": "integer", - "rdma_transmitted_local_ack_timeout_errors_per_sec": "integer", - "received_bytes_per_sec": "integer", - "received_crc_errors_per_sec": "integer", - "received_frame_errors_per_sec": "integer", - "received_packets_per_sec": "integer", - "time": "integer", - "total_errors_per_sec": "integer", - "transmitted_bytes_per_sec": "integer", - "transmitted_carrier_errors_per_sec": "integer", - "transmitted_dropped_errors_per_sec": "integer", - "transmitted_packets_per_sec": "integer" - } - }, { "Cmdlet": "Get-PfbNetworkInterfaceConnector", "Verb": "Get", "Parameter": "Name", - "Producer": "GET /network-interfaces/connectors/settings", - "IsPrimary": false, - "FromExample": false, - "WireName": "names", - "IsCandidate": false, - "Gate": "Matched", - "ValueFromPipeline": true, - "Outcome": "Bound", - "Evidence": "names=PROBE-name (from property 'name')", - "BoundWireKey": "names", - "BoundValue": "PROBE-name", - "ErrorKind": null, - "FilledParameter": [], - "ProbeProperties": [ - "id", - "name", - "roce" - ], - "ProbeTypes": { - "id": "string", - "name": "string", - "roce": "object" - } - }, - { - "Cmdlet": "Get-PfbNetworkInterfaceConnector", - "Verb": "Get", - "Parameter": "Name", - "Producer": "GET /network-interfaces/neighbors", - "IsPrimary": false, - "FromExample": false, - "WireName": "names", - "IsCandidate": true, - "Gate": "Candidate", - "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "names=@{initial_ttl_in_sec=PROBE-initial_ttl_in_sec; local_port=; neighbor_chassis=; neighbor_port=}", - "BoundWireKey": "names", - "BoundValue": "@{initial_ttl_in_sec=PROBE-initial_ttl_in_sec; local_port=; neighbor_chassis=; neighbor_port=}", - "ErrorKind": null, - "FilledParameter": [], - "ProbeProperties": [ - "initial_ttl_in_sec", - "local_port", - "neighbor_chassis", - "neighbor_port" - ], - "ProbeTypes": { - "initial_ttl_in_sec": "integer", - "local_port": "object", - "neighbor_chassis": "object", - "neighbor_port": "object" - } - }, - { - "Cmdlet": "Get-PfbNetworkInterfaceConnector", - "Verb": "Get", - "Parameter": "Name", - "Producer": "GET /network-interfaces/network-connection-statistics", - "IsPrimary": false, - "FromExample": false, - "WireName": "names", - "IsCandidate": true, - "Gate": "Candidate", - "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "names=@{current_state=PROBE-current_state; local=; remote=; time=PROBE-time}", - "BoundWireKey": "names", - "BoundValue": "@{current_state=PROBE-current_state; local=; remote=; time=PROBE-time}", - "ErrorKind": null, - "FilledParameter": [], - "ProbeProperties": [ - "current_state", - "local", - "remote", - "time" - ], - "ProbeTypes": { - "current_state": "string", - "local": "object", - "remote": "object", - "time": "integer" - } - }, - { - "Cmdlet": "Get-PfbNetworkInterfaceConnector", - "Verb": "Get", - "Parameter": "Name", - "Producer": "GET /network-interfaces/ping", - "IsPrimary": false, - "FromExample": false, - "WireName": "names", - "IsCandidate": true, - "Gate": "Candidate", - "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "names=@{component_name=PROBE-component_name; destination=PROBE-destination; details=PROBE-details; source=PROBE-source}", - "BoundWireKey": "names", - "BoundValue": "@{component_name=PROBE-component_name; destination=PROBE-destination; details=PROBE-details; source=PROBE-source}", - "ErrorKind": null, - "FilledParameter": [], - "ProbeProperties": [ - "component_name", - "destination", - "details", - "source" - ], - "ProbeTypes": { - "component_name": "string", - "destination": "string", - "details": "string", - "source": "string" - } - }, - { - "Cmdlet": "Get-PfbNetworkInterfaceConnector", - "Verb": "Get", - "Parameter": "Name", - "Producer": "GET /network-interfaces/tls-policies", - "IsPrimary": false, - "FromExample": false, - "WireName": "names", - "IsCandidate": true, - "Gate": "Candidate", - "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "names=@{member=; policy=}", - "BoundWireKey": "names", - "BoundValue": "@{member=; policy=}", - "ErrorKind": null, - "FilledParameter": [], - "ProbeProperties": [ - "member", - "policy" - ], - "ProbeTypes": { - "member": "object", - "policy": "object" - } - }, - { - "Cmdlet": "Get-PfbNetworkInterfaceConnector", - "Verb": "Get", - "Parameter": "Name", - "Producer": "GET /network-interfaces/trace", + "Producer": "GET /network-interfaces/trace", "IsPrimary": false, "FromExample": false, "WireName": "names", @@ -15685,19 +15263,19 @@ { "Cmdlet": "Get-PfbNetworkInterfaceNeighbor", "Verb": "Get", - "Parameter": "Name", + "Parameter": "LocalPortName", "Producer": "GET /network-interfaces", "IsPrimary": false, "FromExample": false, - "WireName": "names", - "IsCandidate": false, - "Gate": "Matched", + "WireName": "local_port_names", + "IsCandidate": true, + "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Bound", - "Evidence": "names=PROBE-name (from property 'name')", - "BoundWireKey": "names", - "BoundValue": "PROBE-name", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-LocalPortName received a stringified object ('@{address=PROBE-address; attached_servers=System.Object[]; enabled=PROBE-enabled; gateway=PROBE-gateway; id=PROBE-id; mtu=PROBE-mtu; name=PROBE-name; netmask=PROBE-netmask; rdma_enabled=PROBE-rdma_enabled; realms=System.Object[]; services=System.Object[]; subnet=; type=PROBE-type; vlan=PROBE-vlan}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -LocalPortName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the interface name instead, e.g. Get-PfbNetworkInterface | Select-Object -ExpandProperty name | Get-PfbNetworkInterfaceNeighbor, or pass -LocalPortName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "address", @@ -15735,19 +15313,19 @@ { "Cmdlet": "Get-PfbNetworkInterfaceNeighbor", "Verb": "Get", - "Parameter": "Name", + "Parameter": "LocalPortName", "Producer": "GET /network-interfaces/connectors", "IsPrimary": false, "FromExample": false, - "WireName": "names", - "IsCandidate": false, - "Gate": "Matched", + "WireName": "local_port_names", + "IsCandidate": true, + "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Bound", - "Evidence": "names=PROBE-name (from property 'name')", - "BoundWireKey": "names", - "BoundValue": "PROBE-name", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-LocalPortName received a stringified object ('@{connector_type=PROBE-connector_type; id=PROBE-id; lane_speed=PROBE-lane_speed; lanes_per_port=PROBE-lanes_per_port; name=PROBE-name; port_count=PROBE-port_count; port_speed=PROBE-port_speed; transceiver_type=PROBE-transceiver_type}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -LocalPortName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the interface name instead, e.g. Get-PfbNetworkInterface | Select-Object -ExpandProperty name | Get-PfbNetworkInterfaceNeighbor, or pass -LocalPortName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "connector_type", @@ -15773,19 +15351,19 @@ { "Cmdlet": "Get-PfbNetworkInterfaceNeighbor", "Verb": "Get", - "Parameter": "Name", + "Parameter": "LocalPortName", "Producer": "GET /network-interfaces/connectors/performance", "IsPrimary": false, "FromExample": false, - "WireName": "names", - "IsCandidate": false, - "Gate": "Matched", + "WireName": "local_port_names", + "IsCandidate": true, + "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Bound", - "Evidence": "names=PROBE-name (from property 'name')", - "BoundWireKey": "names", - "BoundValue": "PROBE-name", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-LocalPortName received a stringified object ('@{flow_control_received_congestion_packets_per_sec=PROBE-flow_control_received_congestion_packets_per_sec; flow_control_received_discarded_packets_per_sec=PROBE-flow_control_received_discarded_packets_per_sec; flow_control_received_lossless_bytes_per_sec=PROBE-flow_control_received_lossless_bytes_per_sec; flow_control_received_pause_frames_per_sec=PROBE-flow_control_received_pause_frames_per_sec; flow_control_transmitted_congestion_packets_per_sec=PROBE-flow_control_transmitted_congestion_packets_per_sec; flow_control_transmitted_discarded_packets_per_sec=PROBE-flow_control_transmitted_discarded_packets_per_sec; flow_control_transmitted_lossless_bytes_per_sec=PROBE-flow_control_transmitted_lossless_bytes_per_sec; flow_control_transmitted_pause_frames_per_sec=PROBE-flow_control_transmitted_pause_frames_per_sec; id=PROBE-id; link_aggregation_group=; name=PROBE-name; other_errors_per_sec=PROBE-other_errors_per_sec; rdma_received_req_cqe_errors_per_sec=PROBE-rdma_received_req_cqe_errors_per_sec; rdma_received_sequence_errors_per_sec=PROBE-rdma_received_sequence_errors_per_sec; rdma_transmitted_local_ack_timeout_errors_per_sec=PROBE-rdma_transmitted_local_ack_timeout_errors_per_sec; received_bytes_per_sec=PROBE-received_bytes_per_sec; received_crc_errors_per_sec=PROBE-received_crc_errors_per_sec; received_frame_errors_per_sec=PROBE-received_frame_errors_per_sec; received_packets_per_sec=PROBE-received_packets_per_sec; time=PROBE-time; total_errors_per_sec=PROBE-total_errors_per_sec; transmitted_bytes_per_sec=PROBE-transmitted_bytes_per_sec; transmitted_carrier_errors_per_sec=PROBE-transmitted_carrier_errors_per_sec; transmitted_dropped_errors_per_sec=PROBE-transmitted_dropped_errors_per_sec; transmitted_packets_per_sec=PROBE-transmitted_packets_per_sec}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -LocalPortName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the interface name instead, e.g. Get-PfbNetworkInterface | Select-Object -ExpandProperty name | Get-PfbNetworkInterfaceNeighbor, or pass -LocalPortName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "flow_control_received_congestion_packets_per_sec", @@ -15845,19 +15423,19 @@ { "Cmdlet": "Get-PfbNetworkInterfaceNeighbor", "Verb": "Get", - "Parameter": "Name", + "Parameter": "LocalPortName", "Producer": "GET /network-interfaces/connectors/settings", "IsPrimary": false, "FromExample": false, - "WireName": "names", - "IsCandidate": false, - "Gate": "Matched", + "WireName": "local_port_names", + "IsCandidate": true, + "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Bound", - "Evidence": "names=PROBE-name (from property 'name')", - "BoundWireKey": "names", - "BoundValue": "PROBE-name", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-LocalPortName received a stringified object ('@{id=PROBE-id; name=PROBE-name; roce=}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -LocalPortName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the interface name instead, e.g. Get-PfbNetworkInterface | Select-Object -ExpandProperty name | Get-PfbNetworkInterfaceNeighbor, or pass -LocalPortName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "id", @@ -15873,19 +15451,19 @@ { "Cmdlet": "Get-PfbNetworkInterfaceNeighbor", "Verb": "Get", - "Parameter": "Name", + "Parameter": "LocalPortName", "Producer": "GET /network-interfaces/neighbors", "IsPrimary": true, "FromExample": false, - "WireName": "names", + "WireName": "local_port_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "names=@{initial_ttl_in_sec=PROBE-initial_ttl_in_sec; local_port=; neighbor_chassis=; neighbor_port=}", - "BoundWireKey": "names", - "BoundValue": "@{initial_ttl_in_sec=PROBE-initial_ttl_in_sec; local_port=; neighbor_chassis=; neighbor_port=}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-LocalPortName received a stringified object ('@{initial_ttl_in_sec=PROBE-initial_ttl_in_sec; local_port=; neighbor_chassis=; neighbor_port=}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -LocalPortName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the interface name instead, e.g. Get-PfbNetworkInterface | Select-Object -ExpandProperty name | Get-PfbNetworkInterfaceNeighbor, or pass -LocalPortName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "initial_ttl_in_sec", @@ -15903,19 +15481,19 @@ { "Cmdlet": "Get-PfbNetworkInterfaceNeighbor", "Verb": "Get", - "Parameter": "Name", + "Parameter": "LocalPortName", "Producer": "GET /network-interfaces/network-connection-statistics", "IsPrimary": false, "FromExample": false, - "WireName": "names", + "WireName": "local_port_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "names=@{current_state=PROBE-current_state; local=; remote=; time=PROBE-time}", - "BoundWireKey": "names", - "BoundValue": "@{current_state=PROBE-current_state; local=; remote=; time=PROBE-time}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-LocalPortName received a stringified object ('@{current_state=PROBE-current_state; local=; remote=; time=PROBE-time}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -LocalPortName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the interface name instead, e.g. Get-PfbNetworkInterface | Select-Object -ExpandProperty name | Get-PfbNetworkInterfaceNeighbor, or pass -LocalPortName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "current_state", @@ -15933,19 +15511,19 @@ { "Cmdlet": "Get-PfbNetworkInterfaceNeighbor", "Verb": "Get", - "Parameter": "Name", + "Parameter": "LocalPortName", "Producer": "GET /network-interfaces/ping", "IsPrimary": false, "FromExample": false, - "WireName": "names", + "WireName": "local_port_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "names=@{component_name=PROBE-component_name; destination=PROBE-destination; details=PROBE-details; source=PROBE-source}", - "BoundWireKey": "names", - "BoundValue": "@{component_name=PROBE-component_name; destination=PROBE-destination; details=PROBE-details; source=PROBE-source}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-LocalPortName received a stringified object ('@{component_name=PROBE-component_name; destination=PROBE-destination; details=PROBE-details; source=PROBE-source}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -LocalPortName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the interface name instead, e.g. Get-PfbNetworkInterface | Select-Object -ExpandProperty name | Get-PfbNetworkInterfaceNeighbor, or pass -LocalPortName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "component_name", @@ -15963,19 +15541,19 @@ { "Cmdlet": "Get-PfbNetworkInterfaceNeighbor", "Verb": "Get", - "Parameter": "Name", + "Parameter": "LocalPortName", "Producer": "GET /network-interfaces/tls-policies", "IsPrimary": false, "FromExample": false, - "WireName": "names", + "WireName": "local_port_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "names=@{member=; policy=}", - "BoundWireKey": "names", - "BoundValue": "@{member=; policy=}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-LocalPortName received a stringified object ('@{member=; policy=}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -LocalPortName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the interface name instead, e.g. Get-PfbNetworkInterface | Select-Object -ExpandProperty name | Get-PfbNetworkInterfaceNeighbor, or pass -LocalPortName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "member", @@ -15989,19 +15567,19 @@ { "Cmdlet": "Get-PfbNetworkInterfaceNeighbor", "Verb": "Get", - "Parameter": "Name", + "Parameter": "LocalPortName", "Producer": "GET /network-interfaces/trace", "IsPrimary": false, "FromExample": false, - "WireName": "names", + "WireName": "local_port_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "names=@{component_name=PROBE-component_name; destination=PROBE-destination; details=PROBE-details; source=PROBE-source}", - "BoundWireKey": "names", - "BoundValue": "@{component_name=PROBE-component_name; destination=PROBE-destination; details=PROBE-details; source=PROBE-source}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-LocalPortName received a stringified object ('@{component_name=PROBE-component_name; destination=PROBE-destination; details=PROBE-details; source=PROBE-source}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -LocalPortName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the interface name instead, e.g. Get-PfbNetworkInterface | Select-Object -ExpandProperty name | Get-PfbNetworkInterfaceNeighbor, or pass -LocalPortName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "component_name", @@ -16125,11 +15703,11 @@ "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "policy_names=@{context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]; version=PROBE-version; workload=}", - "BoundWireKey": "policy_names", - "BoundValue": "@{context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]; version=PROBE-version; workload=}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-PolicyName received a stringified object ('@{context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]; version=PROBE-version; workload=}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -PolicyName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the policy name instead, e.g. Get-PfbNfsExportPolicy | Select-Object -ExpandProperty name | Get-PfbNfsExportRule, or pass -PolicyName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "context", @@ -16169,11 +15747,11 @@ "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "policy_names=@{access=PROBE-access; anongid=PROBE-anongid; anonuid=PROBE-anonuid; atime=PROBE-atime; client=PROBE-client; context=; fileid_32bit=PROBE-fileid_32bit; id=PROBE-id; index=PROBE-index; name=PROBE-name; permission=PROBE-permission; policy=; policy_version=PROBE-policy_version; required_transport_security=PROBE-required_transport_security; secure=PROBE-secure; security=System.Object[]}", - "BoundWireKey": "policy_names", - "BoundValue": "@{access=PROBE-access; anongid=PROBE-anongid; anonuid=PROBE-anonuid; atime=PROBE-atime; client=PROBE-client; context=; fileid_32bit=PROBE-fileid_32bit; id=PROBE-id; index=PROBE-index; name=PROBE-name; permission=PROBE-permission; policy=; policy_version=PROBE-policy_version; required_transport_security=PROBE-required_transport_security; secure=PROBE-secure; security=System.Object[]}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-PolicyName received a stringified object ('@{access=PROBE-access; anongid=PROBE-anongid; anonuid=PROBE-anonuid; atime=PROBE-atime; client=PROBE-client; context=; fileid_32bit=PROBE-fileid_32bit; id=PROBE-id; index=PROBE-index; name=PROBE-name; permission=PROBE-permission; policy=; policy_version=PROBE-policy_version; required_transport_security=PROBE-required_transport_security; secure=PROBE-secure; security=System.Object[]}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -PolicyName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the policy name instead, e.g. Get-PfbNfsExportPolicy | Select-Object -ExpandProperty name | Get-PfbNfsExportRule, or pass -PolicyName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "access", @@ -16783,11 +16361,11 @@ "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "policy_names=@{account=; arn=PROBE-arn; context=; created=PROBE-created; description=PROBE-description; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]; updated=PROBE-updated}", - "BoundWireKey": "policy_names", - "BoundValue": "@{account=; arn=PROBE-arn; context=; created=PROBE-created; description=PROBE-description; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]; updated=PROBE-updated}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-PolicyName received a stringified object ('@{account=; arn=PROBE-arn; context=; created=PROBE-created; description=PROBE-description; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]; updated=PROBE-updated}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -PolicyName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the policy name instead, e.g. Get-PfbObjectStoreAccessPolicy | Select-Object -ExpandProperty name | Get-PfbObjectStoreAccessPolicyRule, or pass -PolicyName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "account", @@ -16833,11 +16411,11 @@ "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "policy_names=@{context=; member=; policy=}", - "BoundWireKey": "policy_names", - "BoundValue": "@{context=; member=; policy=}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-PolicyName received a stringified object ('@{context=; member=; policy=}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -PolicyName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the policy name instead, e.g. Get-PfbObjectStoreAccessPolicy | Select-Object -ExpandProperty name | Get-PfbObjectStoreAccessPolicyRule, or pass -PolicyName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "context", @@ -16861,11 +16439,11 @@ "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "policy_names=@{context=; member=; policy=}", - "BoundWireKey": "policy_names", - "BoundValue": "@{context=; member=; policy=}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-PolicyName received a stringified object ('@{context=; member=; policy=}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -PolicyName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the policy name instead, e.g. Get-PfbObjectStoreAccessPolicy | Select-Object -ExpandProperty name | Get-PfbObjectStoreAccessPolicyRule, or pass -PolicyName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "context", @@ -16889,11 +16467,11 @@ "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "policy_names=@{actions=System.Object[]; conditions=; context=; effect=PROBE-effect; name=PROBE-name; policy=; resources=System.Object[]}", - "BoundWireKey": "policy_names", - "BoundValue": "@{actions=System.Object[]; conditions=; context=; effect=PROBE-effect; name=PROBE-name; policy=; resources=System.Object[]}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-PolicyName received a stringified object ('@{actions=System.Object[]; conditions=; context=; effect=PROBE-effect; name=PROBE-name; policy=; resources=System.Object[]}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -PolicyName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the policy name instead, e.g. Get-PfbObjectStoreAccessPolicy | Select-Object -ExpandProperty name | Get-PfbObjectStoreAccessPolicyRule, or pass -PolicyName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "actions", @@ -17477,11 +17055,11 @@ "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "role_names=@{account=; context=; created=PROBE-created; id=PROBE-id; max_session_duration=PROBE-max_session_duration; name=PROBE-name; prn=PROBE-prn; trusted_entities=System.Object[]}", - "BoundWireKey": "role_names", - "BoundValue": "@{account=; context=; created=PROBE-created; id=PROBE-id; max_session_duration=PROBE-max_session_duration; name=PROBE-name; prn=PROBE-prn; trusted_entities=System.Object[]}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-RoleName received a stringified object ('@{account=; context=; created=PROBE-created; id=PROBE-id; max_session_duration=PROBE-max_session_duration; name=PROBE-name; prn=PROBE-prn; trusted_entities=System.Object[]}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -RoleName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the role name instead, e.g. Get-PfbObjectStoreRole | Select-Object -ExpandProperty name | Get-PfbObjectStoreTrustPolicy, or pass -RoleName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "account", @@ -17515,11 +17093,11 @@ "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "role_names=@{context=; member=; policy=}", - "BoundWireKey": "role_names", - "BoundValue": "@{context=; member=; policy=}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-RoleName received a stringified object ('@{context=; member=; policy=}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -RoleName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the role name instead, e.g. Get-PfbObjectStoreRole | Select-Object -ExpandProperty name | Get-PfbObjectStoreTrustPolicy, or pass -RoleName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "context", @@ -17543,11 +17121,11 @@ "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "role_names=@{context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; role=; rules=System.Object[]}", - "BoundWireKey": "role_names", - "BoundValue": "@{context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; role=; rules=System.Object[]}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-RoleName received a stringified object ('@{context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; role=; rules=System.Object[]}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -RoleName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the role name instead, e.g. Get-PfbObjectStoreRole | Select-Object -ExpandProperty name | Get-PfbObjectStoreTrustPolicy, or pass -RoleName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "context", @@ -17585,11 +17163,11 @@ "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "role_names=@{actions=System.Object[]; conditions=System.Object[]; context=; effect=PROBE-effect; index=PROBE-index; name=PROBE-name; policy=; principals=System.Object[]}", - "BoundWireKey": "role_names", - "BoundValue": "@{actions=System.Object[]; conditions=System.Object[]; context=; effect=PROBE-effect; index=PROBE-index; name=PROBE-name; policy=; principals=System.Object[]}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-RoleName received a stringified object ('@{actions=System.Object[]; conditions=System.Object[]; context=; effect=PROBE-effect; index=PROBE-index; name=PROBE-name; policy=; principals=System.Object[]}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -RoleName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the role name instead, e.g. Get-PfbObjectStoreRole | Select-Object -ExpandProperty name | Get-PfbObjectStoreTrustPolicy, or pass -RoleName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "actions", @@ -17623,11 +17201,11 @@ "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "policy_names=@{account=; context=; created=PROBE-created; id=PROBE-id; max_session_duration=PROBE-max_session_duration; name=PROBE-name; prn=PROBE-prn; trusted_entities=System.Object[]}", - "BoundWireKey": "policy_names", - "BoundValue": "@{account=; context=; created=PROBE-created; id=PROBE-id; max_session_duration=PROBE-max_session_duration; name=PROBE-name; prn=PROBE-prn; trusted_entities=System.Object[]}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-PolicyName received a stringified object ('@{account=; context=; created=PROBE-created; id=PROBE-id; max_session_duration=PROBE-max_session_duration; name=PROBE-name; prn=PROBE-prn; trusted_entities=System.Object[]}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -PolicyName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the trust-policy name instead, e.g. Get-PfbObjectStoreTrustPolicy -RoleName r | Select-Object -ExpandProperty name | Get-PfbObjectStoreTrustPolicyRule, or pass -PolicyName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "account", @@ -17661,11 +17239,11 @@ "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "policy_names=@{context=; member=; policy=}", - "BoundWireKey": "policy_names", - "BoundValue": "@{context=; member=; policy=}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-PolicyName received a stringified object ('@{context=; member=; policy=}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -PolicyName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the trust-policy name instead, e.g. Get-PfbObjectStoreTrustPolicy -RoleName r | Select-Object -ExpandProperty name | Get-PfbObjectStoreTrustPolicyRule, or pass -PolicyName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "context", @@ -17689,11 +17267,11 @@ "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "policy_names=@{context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; role=; rules=System.Object[]}", - "BoundWireKey": "policy_names", - "BoundValue": "@{context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; role=; rules=System.Object[]}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-PolicyName received a stringified object ('@{context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; role=; rules=System.Object[]}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -PolicyName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the trust-policy name instead, e.g. Get-PfbObjectStoreTrustPolicy -RoleName r | Select-Object -ExpandProperty name | Get-PfbObjectStoreTrustPolicyRule, or pass -PolicyName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "context", @@ -17731,11 +17309,11 @@ "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "policy_names=@{actions=System.Object[]; conditions=System.Object[]; context=; effect=PROBE-effect; index=PROBE-index; name=PROBE-name; policy=; principals=System.Object[]}", - "BoundWireKey": "policy_names", - "BoundValue": "@{actions=System.Object[]; conditions=System.Object[]; context=; effect=PROBE-effect; index=PROBE-index; name=PROBE-name; policy=; principals=System.Object[]}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-PolicyName received a stringified object ('@{actions=System.Object[]; conditions=System.Object[]; context=; effect=PROBE-effect; index=PROBE-index; name=PROBE-name; policy=; principals=System.Object[]}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -PolicyName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the trust-policy name instead, e.g. Get-PfbObjectStoreTrustPolicy -RoleName r | Select-Object -ExpandProperty name | Get-PfbObjectStoreTrustPolicyRule, or pass -PolicyName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "actions", @@ -18035,18 +17613,18 @@ { "Cmdlet": "Get-PfbOpenFile", "Verb": "Get", - "Parameter": "Name", + "Parameter": "Id", "Producer": "GET /file-systems", "IsPrimary": false, "FromExample": false, - "WireName": "names", + "WireName": "ids", "IsCandidate": false, "Gate": "Matched", - "ValueFromPipeline": true, + "ValueFromPipeline": false, "Outcome": "Bound", - "Evidence": "names=PROBE-name (from property 'name')", - "BoundWireKey": "names", - "BoundValue": "PROBE-name", + "Evidence": "ids=PROBE-id (from property 'id')", + "BoundWireKey": "ids", + "BoundValue": "PROBE-id", "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ @@ -18113,19 +17691,19 @@ { "Cmdlet": "Get-PfbOpenFile", "Verb": "Get", - "Parameter": "Name", + "Parameter": "Id", "Producer": "GET /file-systems/audit-policies", "IsPrimary": false, "FromExample": false, - "WireName": "names", + "WireName": "ids", "IsCandidate": true, "Gate": "Candidate", - "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "names=@{context=; member=; policy=}", - "BoundWireKey": "names", - "BoundValue": "@{context=; member=; policy=}", - "ErrorKind": null, + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", "FilledParameter": [], "ProbeProperties": [ "context", @@ -18141,19 +17719,19 @@ { "Cmdlet": "Get-PfbOpenFile", "Verb": "Get", - "Parameter": "Name", + "Parameter": "Id", "Producer": "GET /file-systems/data-eviction-policies", "IsPrimary": false, "FromExample": false, - "WireName": "names", + "WireName": "ids", "IsCandidate": true, "Gate": "Candidate", - "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "names=@{context=; member=; policy=}", - "BoundWireKey": "names", - "BoundValue": "@{context=; member=; policy=}", - "ErrorKind": null, + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", "FilledParameter": [], "ProbeProperties": [ "context", @@ -18169,19 +17747,19 @@ { "Cmdlet": "Get-PfbOpenFile", "Verb": "Get", - "Parameter": "Name", + "Parameter": "Id", "Producer": "GET /file-systems/groups", "IsPrimary": false, "FromExample": false, - "WireName": "names", + "WireName": "ids", "IsCandidate": true, "Gate": "Candidate", - "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "names=@{context=; file_system=; group=; limited_by=; percentage_used=PROBE-percentage_used; quota_limit=PROBE-quota_limit; usage=PROBE-usage}", - "BoundWireKey": "names", - "BoundValue": "@{context=; file_system=; group=; limited_by=; percentage_used=PROBE-percentage_used; quota_limit=PROBE-quota_limit; usage=PROBE-usage}", - "ErrorKind": null, + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", "FilledParameter": [], "ProbeProperties": [ "context", @@ -18205,19 +17783,19 @@ { "Cmdlet": "Get-PfbOpenFile", "Verb": "Get", - "Parameter": "Name", + "Parameter": "Id", "Producer": "GET /file-systems/groups/performance", "IsPrimary": false, "FromExample": false, - "WireName": "names", - "IsCandidate": false, - "Gate": "Matched", - "ValueFromPipeline": true, - "Outcome": "Bound", - "Evidence": "names=PROBE-name (from property 'name')", - "BoundWireKey": "names", - "BoundValue": "PROBE-name", - "ErrorKind": null, + "WireName": "ids", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", "FilledParameter": [], "ProbeProperties": [ "bytes_per_op", @@ -18257,19 +17835,19 @@ { "Cmdlet": "Get-PfbOpenFile", "Verb": "Get", - "Parameter": "Name", + "Parameter": "Id", "Producer": "GET /file-systems/locks", "IsPrimary": false, "FromExample": false, - "WireName": "names", - "IsCandidate": false, - "Gate": "Matched", - "ValueFromPipeline": true, - "Outcome": "Bound", - "Evidence": "names=PROBE-name (from property 'name')", - "BoundWireKey": "names", - "BoundValue": "PROBE-name", - "ErrorKind": null, + "WireName": "ids", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", "FilledParameter": [], "ProbeProperties": [ "access_type", @@ -18299,19 +17877,19 @@ { "Cmdlet": "Get-PfbOpenFile", "Verb": "Get", - "Parameter": "Name", + "Parameter": "Id", "Producer": "GET /file-systems/locks/clients", "IsPrimary": false, "FromExample": false, - "WireName": "names", - "IsCandidate": false, - "Gate": "Matched", - "ValueFromPipeline": true, - "Outcome": "Bound", - "Evidence": "names=PROBE-name (from property 'name')", - "BoundWireKey": "names", - "BoundValue": "PROBE-name", - "ErrorKind": null, + "WireName": "ids", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", "FilledParameter": [], "ProbeProperties": [ "context", @@ -18325,18 +17903,18 @@ { "Cmdlet": "Get-PfbOpenFile", "Verb": "Get", - "Parameter": "Name", + "Parameter": "Id", "Producer": "GET /file-systems/open-files", "IsPrimary": true, "FromExample": false, - "WireName": "names", - "IsCandidate": true, - "Gate": "Candidate", - "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "names=@{client=; id=PROBE-id; lock_count=PROBE-lock_count; mode=PROBE-mode; path=PROBE-path; session=; source=; user=}", - "BoundWireKey": "names", - "BoundValue": "@{client=; id=PROBE-id; lock_count=PROBE-lock_count; mode=PROBE-mode; path=PROBE-path; session=; source=; user=}", + "WireName": "ids", + "IsCandidate": false, + "Gate": "Matched", + "ValueFromPipeline": false, + "Outcome": "Bound", + "Evidence": "ids=PROBE-id (from property 'id')", + "BoundWireKey": "ids", + "BoundValue": "PROBE-id", "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ @@ -18363,18 +17941,18 @@ { "Cmdlet": "Get-PfbOpenFile", "Verb": "Get", - "Parameter": "Name", + "Parameter": "Id", "Producer": "GET /file-systems/performance", "IsPrimary": false, "FromExample": false, - "WireName": "names", + "WireName": "ids", "IsCandidate": false, "Gate": "Matched", - "ValueFromPipeline": true, + "ValueFromPipeline": false, "Outcome": "Bound", - "Evidence": "names=PROBE-name (from property 'name')", - "BoundWireKey": "names", - "BoundValue": "PROBE-name", + "Evidence": "ids=PROBE-id (from property 'id')", + "BoundWireKey": "ids", + "BoundValue": "PROBE-id", "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ @@ -18413,19 +17991,19 @@ { "Cmdlet": "Get-PfbOpenFile", "Verb": "Get", - "Parameter": "Name", + "Parameter": "Id", "Producer": "GET /file-systems/policies", "IsPrimary": false, "FromExample": false, - "WireName": "names", + "WireName": "ids", "IsCandidate": true, "Gate": "Candidate", - "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "names=@{context=; member=; policy=}", - "BoundWireKey": "names", - "BoundValue": "@{context=; member=; policy=}", - "ErrorKind": null, + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", "FilledParameter": [], "ProbeProperties": [ "context", @@ -18441,19 +18019,19 @@ { "Cmdlet": "Get-PfbOpenFile", "Verb": "Get", - "Parameter": "Name", + "Parameter": "Id", "Producer": "GET /file-systems/policies-all", "IsPrimary": false, "FromExample": false, - "WireName": "names", + "WireName": "ids", "IsCandidate": true, "Gate": "Candidate", - "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "names=@{context=; member=; policy=}", - "BoundWireKey": "names", - "BoundValue": "@{context=; member=; policy=}", - "ErrorKind": null, + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", "FilledParameter": [], "ProbeProperties": [ "context", @@ -18469,19 +18047,19 @@ { "Cmdlet": "Get-PfbOpenFile", "Verb": "Get", - "Parameter": "Name", + "Parameter": "Id", "Producer": "GET /file-systems/sessions", "IsPrimary": false, "FromExample": false, - "WireName": "names", - "IsCandidate": false, - "Gate": "Matched", - "ValueFromPipeline": true, - "Outcome": "Bound", - "Evidence": "names=PROBE-name (from property 'name')", - "BoundWireKey": "names", - "BoundValue": "PROBE-name", - "ErrorKind": null, + "WireName": "ids", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", "FilledParameter": [], "ProbeProperties": [ "authentication", @@ -18513,18 +18091,18 @@ { "Cmdlet": "Get-PfbOpenFile", "Verb": "Get", - "Parameter": "Name", + "Parameter": "Id", "Producer": "GET /file-systems/space/storage-classes", "IsPrimary": false, "FromExample": false, - "WireName": "names", + "WireName": "ids", "IsCandidate": false, "Gate": "Matched", - "ValueFromPipeline": true, + "ValueFromPipeline": false, "Outcome": "Bound", - "Evidence": "names=PROBE-name (from property 'name')", - "BoundWireKey": "names", - "BoundValue": "PROBE-name", + "Evidence": "ids=PROBE-id (from property 'id')", + "BoundWireKey": "ids", + "BoundValue": "PROBE-id", "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ @@ -18545,19 +18123,19 @@ { "Cmdlet": "Get-PfbOpenFile", "Verb": "Get", - "Parameter": "Name", + "Parameter": "Id", "Producer": "GET /file-systems/user-group-quota-policies", "IsPrimary": false, "FromExample": false, - "WireName": "names", + "WireName": "ids", "IsCandidate": true, "Gate": "Candidate", - "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "names=@{context=; member=; policy=}", - "BoundWireKey": "names", - "BoundValue": "@{context=; member=; policy=}", - "ErrorKind": null, + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", "FilledParameter": [], "ProbeProperties": [ "context", @@ -18573,19 +18151,19 @@ { "Cmdlet": "Get-PfbOpenFile", "Verb": "Get", - "Parameter": "Name", + "Parameter": "Id", "Producer": "GET /file-systems/users", "IsPrimary": false, "FromExample": false, - "WireName": "names", + "WireName": "ids", "IsCandidate": true, "Gate": "Candidate", - "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "names=@{context=; file_system=; limited_by=; percentage_used=PROBE-percentage_used; quota_limit=PROBE-quota_limit; usage=PROBE-usage; user=}", - "BoundWireKey": "names", - "BoundValue": "@{context=; file_system=; limited_by=; percentage_used=PROBE-percentage_used; quota_limit=PROBE-quota_limit; usage=PROBE-usage; user=}", - "ErrorKind": null, + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", "FilledParameter": [], "ProbeProperties": [ "context", @@ -18609,19 +18187,19 @@ { "Cmdlet": "Get-PfbOpenFile", "Verb": "Get", - "Parameter": "Name", + "Parameter": "Id", "Producer": "GET /file-systems/users/performance", "IsPrimary": false, "FromExample": false, - "WireName": "names", - "IsCandidate": false, - "Gate": "Matched", - "ValueFromPipeline": true, - "Outcome": "Bound", - "Evidence": "names=PROBE-name (from property 'name')", - "BoundWireKey": "names", - "BoundValue": "PROBE-name", - "ErrorKind": null, + "WireName": "ids", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", "FilledParameter": [], "ProbeProperties": [ "bytes_per_op", @@ -18661,19 +18239,19 @@ { "Cmdlet": "Get-PfbOpenFile", "Verb": "Get", - "Parameter": "Name", + "Parameter": "Id", "Producer": "GET /file-systems/worm-data-policies", "IsPrimary": false, "FromExample": false, - "WireName": "names", + "WireName": "ids", "IsCandidate": true, "Gate": "Candidate", - "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "names=@{context=; member=; policy=}", - "BoundWireKey": "names", - "BoundValue": "@{context=; member=; policy=}", - "ErrorKind": null, + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", "FilledParameter": [], "ProbeProperties": [ "context", @@ -19345,6 +18923,132 @@ { "Cmdlet": "Get-PfbRealmDefaults", "Verb": "Get", + "Parameter": "RealmName", + "Producer": "GET /realms", + "IsPrimary": false, + "FromExample": false, + "WireName": "realm_names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": true, + "Outcome": "Guarded", + "Evidence": "-RealmName received a stringified object ('@{created=PROBE-created; default_inbound_tls_policy=; destroyed=PROBE-destroyed; id=PROBE-id; name=PROBE-name; space=; time_remaining=PROBE-time_remaining}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -RealmName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the realm name instead, e.g. Get-PfbRealm | Select-Object -ExpandProperty name | Get-PfbRealmDefaults, or pass -RealmName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", + "FilledParameter": [], + "ProbeProperties": [ + "created", + "default_inbound_tls_policy", + "destroyed", + "id", + "name", + "space", + "time_remaining" + ], + "ProbeTypes": { + "created": "integer", + "default_inbound_tls_policy": "object", + "destroyed": "boolean", + "id": "string", + "name": "string", + "space": "object", + "time_remaining": "integer" + } + }, + { + "Cmdlet": "Get-PfbRealmDefaults", + "Verb": "Get", + "Parameter": "RealmName", + "Producer": "GET /realms/defaults", + "IsPrimary": true, + "FromExample": false, + "WireName": "realm_names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": true, + "Outcome": "Guarded", + "Evidence": "-RealmName received a stringified object ('@{context=; object_store=System.Object[]; realm=}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -RealmName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the realm name instead, e.g. Get-PfbRealm | Select-Object -ExpandProperty name | Get-PfbRealmDefaults, or pass -RealmName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", + "FilledParameter": [], + "ProbeProperties": [ + "context", + "object_store", + "realm" + ], + "ProbeTypes": { + "context": "object", + "object_store": "array", + "realm": "object" + } + }, + { + "Cmdlet": "Get-PfbRealmDefaults", + "Verb": "Get", + "Parameter": "RealmName", + "Producer": "GET /realms/space", + "IsPrimary": false, + "FromExample": false, + "WireName": "realm_names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": true, + "Outcome": "Guarded", + "Evidence": "-RealmName received a stringified object ('@{id=PROBE-id; name=PROBE-name; space=; time=PROBE-time}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -RealmName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the realm name instead, e.g. Get-PfbRealm | Select-Object -ExpandProperty name | Get-PfbRealmDefaults, or pass -RealmName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", + "FilledParameter": [], + "ProbeProperties": [ + "id", + "name", + "space", + "time" + ], + "ProbeTypes": { + "id": "string", + "name": "string", + "space": "object", + "time": "integer" + } + }, + { + "Cmdlet": "Get-PfbRealmDefaults", + "Verb": "Get", + "Parameter": "RealmName", + "Producer": "GET /realms/space/storage-classes", + "IsPrimary": false, + "FromExample": false, + "WireName": "realm_names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": true, + "Outcome": "Guarded", + "Evidence": "-RealmName received a stringified object ('@{id=PROBE-id; name=PROBE-name; space=; storage_class=PROBE-storage_class; time=PROBE-time}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -RealmName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the realm name instead, e.g. Get-PfbRealm | Select-Object -ExpandProperty name | Get-PfbRealmDefaults, or pass -RealmName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", + "FilledParameter": [], + "ProbeProperties": [ + "id", + "name", + "space", + "storage_class", + "time" + ], + "ProbeTypes": { + "id": "string", + "name": "string", + "space": "object", + "storage_class": "string", + "time": "integer" + } + }, + { + "Cmdlet": "Get-PfbRealmSpace", + "Verb": "Get", "Parameter": "Name", "Producer": "GET /realms", "IsPrimary": false, @@ -19379,263 +19083,137 @@ } }, { - "Cmdlet": "Get-PfbRealmDefaults", + "Cmdlet": "Get-PfbRealmSpace", "Verb": "Get", "Parameter": "Name", "Producer": "GET /realms/defaults", + "IsPrimary": false, + "FromExample": false, + "WireName": "names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": true, + "Outcome": "Coerced", + "Evidence": "names=@{context=; object_store=System.Object[]; realm=}", + "BoundWireKey": "names", + "BoundValue": "@{context=; object_store=System.Object[]; realm=}", + "ErrorKind": null, + "FilledParameter": [], + "ProbeProperties": [ + "context", + "object_store", + "realm" + ], + "ProbeTypes": { + "context": "object", + "object_store": "array", + "realm": "object" + } + }, + { + "Cmdlet": "Get-PfbRealmSpace", + "Verb": "Get", + "Parameter": "Name", + "Producer": "GET /realms/space", "IsPrimary": true, - "FromExample": false, - "WireName": "names", - "IsCandidate": true, - "Gate": "Candidate", - "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "names=@{context=; object_store=System.Object[]; realm=}", - "BoundWireKey": "names", - "BoundValue": "@{context=; object_store=System.Object[]; realm=}", - "ErrorKind": null, - "FilledParameter": [], - "ProbeProperties": [ - "context", - "object_store", - "realm" - ], - "ProbeTypes": { - "context": "object", - "object_store": "array", - "realm": "object" - } - }, - { - "Cmdlet": "Get-PfbRealmDefaults", - "Verb": "Get", - "Parameter": "Name", - "Producer": "GET /realms/space", - "IsPrimary": false, - "FromExample": false, - "WireName": "names", - "IsCandidate": false, - "Gate": "Matched", - "ValueFromPipeline": true, - "Outcome": "Bound", - "Evidence": "names=PROBE-name (from property 'name')", - "BoundWireKey": "names", - "BoundValue": "PROBE-name", - "ErrorKind": null, - "FilledParameter": [], - "ProbeProperties": [ - "id", - "name", - "space", - "time" - ], - "ProbeTypes": { - "id": "string", - "name": "string", - "space": "object", - "time": "integer" - } - }, - { - "Cmdlet": "Get-PfbRealmDefaults", - "Verb": "Get", - "Parameter": "Name", - "Producer": "GET /realms/space/storage-classes", - "IsPrimary": false, - "FromExample": false, - "WireName": "names", - "IsCandidate": false, - "Gate": "Matched", - "ValueFromPipeline": true, - "Outcome": "Bound", - "Evidence": "names=PROBE-name (from property 'name')", - "BoundWireKey": "names", - "BoundValue": "PROBE-name", - "ErrorKind": null, - "FilledParameter": [], - "ProbeProperties": [ - "id", - "name", - "space", - "storage_class", - "time" - ], - "ProbeTypes": { - "id": "string", - "name": "string", - "space": "object", - "storage_class": "string", - "time": "integer" - } - }, - { - "Cmdlet": "Get-PfbRealmSpace", - "Verb": "Get", - "Parameter": "Name", - "Producer": "GET /realms", - "IsPrimary": false, - "FromExample": false, - "WireName": "names", - "IsCandidate": false, - "Gate": "Matched", - "ValueFromPipeline": true, - "Outcome": "Bound", - "Evidence": "names=PROBE-name (from property 'name')", - "BoundWireKey": "names", - "BoundValue": "PROBE-name", - "ErrorKind": null, - "FilledParameter": [], - "ProbeProperties": [ - "created", - "default_inbound_tls_policy", - "destroyed", - "id", - "name", - "space", - "time_remaining" - ], - "ProbeTypes": { - "created": "integer", - "default_inbound_tls_policy": "object", - "destroyed": "boolean", - "id": "string", - "name": "string", - "space": "object", - "time_remaining": "integer" - } - }, - { - "Cmdlet": "Get-PfbRealmSpace", - "Verb": "Get", - "Parameter": "Name", - "Producer": "GET /realms/defaults", - "IsPrimary": false, - "FromExample": false, - "WireName": "names", - "IsCandidate": true, - "Gate": "Candidate", - "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "names=@{context=; object_store=System.Object[]; realm=}", - "BoundWireKey": "names", - "BoundValue": "@{context=; object_store=System.Object[]; realm=}", - "ErrorKind": null, - "FilledParameter": [], - "ProbeProperties": [ - "context", - "object_store", - "realm" - ], - "ProbeTypes": { - "context": "object", - "object_store": "array", - "realm": "object" - } - }, - { - "Cmdlet": "Get-PfbRealmSpace", - "Verb": "Get", - "Parameter": "Name", - "Producer": "GET /realms/space", - "IsPrimary": true, - "FromExample": false, - "WireName": "names", - "IsCandidate": false, - "Gate": "Matched", - "ValueFromPipeline": true, - "Outcome": "Bound", - "Evidence": "names=PROBE-name (from property 'name')", - "BoundWireKey": "names", - "BoundValue": "PROBE-name", - "ErrorKind": null, - "FilledParameter": [], - "ProbeProperties": [ - "id", - "name", - "space", - "time" - ], - "ProbeTypes": { - "id": "string", - "name": "string", - "space": "object", - "time": "integer" - } - }, - { - "Cmdlet": "Get-PfbRealmSpace", - "Verb": "Get", - "Parameter": "Name", - "Producer": "GET /realms/space/storage-classes", - "IsPrimary": false, - "FromExample": false, - "WireName": "names", - "IsCandidate": false, - "Gate": "Matched", - "ValueFromPipeline": true, - "Outcome": "Bound", - "Evidence": "names=PROBE-name (from property 'name')", - "BoundWireKey": "names", - "BoundValue": "PROBE-name", - "ErrorKind": null, - "FilledParameter": [], - "ProbeProperties": [ - "id", - "name", - "space", - "storage_class", - "time" - ], - "ProbeTypes": { - "id": "string", - "name": "string", - "space": "object", - "storage_class": "string", - "time": "integer" - } - }, - { - "Cmdlet": "Get-PfbRealmStorageClass", - "Verb": "Get", - "Parameter": "Name", - "Producer": "GET /realms", - "IsPrimary": false, - "FromExample": false, - "WireName": "names", - "IsCandidate": false, - "Gate": "Matched", - "ValueFromPipeline": true, - "Outcome": "Bound", - "Evidence": "names=PROBE-name (from property 'name')", - "BoundWireKey": "names", - "BoundValue": "PROBE-name", - "ErrorKind": null, - "FilledParameter": [], - "ProbeProperties": [ - "created", - "default_inbound_tls_policy", - "destroyed", - "id", - "name", - "space", - "time_remaining" - ], - "ProbeTypes": { - "created": "integer", - "default_inbound_tls_policy": "object", - "destroyed": "boolean", - "id": "string", - "name": "string", - "space": "object", - "time_remaining": "integer" - } - }, - { - "Cmdlet": "Get-PfbRealmStorageClass", - "Verb": "Get", - "Parameter": "Name", - "Producer": "GET /realms/defaults", - "IsPrimary": false, + "FromExample": false, + "WireName": "names", + "IsCandidate": false, + "Gate": "Matched", + "ValueFromPipeline": true, + "Outcome": "Bound", + "Evidence": "names=PROBE-name (from property 'name')", + "BoundWireKey": "names", + "BoundValue": "PROBE-name", + "ErrorKind": null, + "FilledParameter": [], + "ProbeProperties": [ + "id", + "name", + "space", + "time" + ], + "ProbeTypes": { + "id": "string", + "name": "string", + "space": "object", + "time": "integer" + } + }, + { + "Cmdlet": "Get-PfbRealmSpace", + "Verb": "Get", + "Parameter": "Name", + "Producer": "GET /realms/space/storage-classes", + "IsPrimary": false, + "FromExample": false, + "WireName": "names", + "IsCandidate": false, + "Gate": "Matched", + "ValueFromPipeline": true, + "Outcome": "Bound", + "Evidence": "names=PROBE-name (from property 'name')", + "BoundWireKey": "names", + "BoundValue": "PROBE-name", + "ErrorKind": null, + "FilledParameter": [], + "ProbeProperties": [ + "id", + "name", + "space", + "storage_class", + "time" + ], + "ProbeTypes": { + "id": "string", + "name": "string", + "space": "object", + "storage_class": "string", + "time": "integer" + } + }, + { + "Cmdlet": "Get-PfbRealmStorageClass", + "Verb": "Get", + "Parameter": "Name", + "Producer": "GET /realms", + "IsPrimary": false, + "FromExample": false, + "WireName": "names", + "IsCandidate": false, + "Gate": "Matched", + "ValueFromPipeline": true, + "Outcome": "Bound", + "Evidence": "names=PROBE-name (from property 'name')", + "BoundWireKey": "names", + "BoundValue": "PROBE-name", + "ErrorKind": null, + "FilledParameter": [], + "ProbeProperties": [ + "created", + "default_inbound_tls_policy", + "destroyed", + "id", + "name", + "space", + "time_remaining" + ], + "ProbeTypes": { + "created": "integer", + "default_inbound_tls_policy": "object", + "destroyed": "boolean", + "id": "string", + "name": "string", + "space": "object", + "time_remaining": "integer" + } + }, + { + "Cmdlet": "Get-PfbRealmStorageClass", + "Verb": "Get", + "Parameter": "Name", + "Producer": "GET /realms/defaults", + "IsPrimary": false, "FromExample": false, "WireName": "names", "IsCandidate": true, @@ -19819,18 +19397,18 @@ { "Cmdlet": "Get-PfbResourceAccess", "Verb": "Get", - "Parameter": "Name", + "Parameter": "Id", "Producer": "GET /resource-accesses", "IsPrimary": true, "FromExample": false, - "WireName": "names", - "IsCandidate": true, - "Gate": "Candidate", - "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "names=@{id=PROBE-id; resource=; scope=}", - "BoundWireKey": "names", - "BoundValue": "@{id=PROBE-id; resource=; scope=}", + "WireName": "ids", + "IsCandidate": false, + "Gate": "Matched", + "ValueFromPipeline": false, + "Outcome": "Bound", + "Evidence": "ids=PROBE-id (from property 'id')", + "BoundWireKey": "ids", + "BoundValue": "PROBE-id", "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ @@ -19957,11 +19535,11 @@ "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "policy_names=@{context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]}", - "BoundWireKey": "policy_names", - "BoundValue": "@{context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-PolicyName received a stringified object ('@{context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -PolicyName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the policy name instead, e.g. Get-PfbS3ExportPolicy | Select-Object -ExpandProperty name | Get-PfbS3ExportRule, or pass -PolicyName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "context", @@ -19997,11 +19575,11 @@ "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "policy_names=@{actions=System.Object[]; context=; effect=PROBE-effect; name=PROBE-name; policy=; resources=System.Object[]}", - "BoundWireKey": "policy_names", - "BoundValue": "@{actions=System.Object[]; context=; effect=PROBE-effect; name=PROBE-name; policy=; resources=System.Object[]}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-PolicyName received a stringified object ('@{actions=System.Object[]; context=; effect=PROBE-effect; name=PROBE-name; policy=; resources=System.Object[]}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -PolicyName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the policy name instead, e.g. Get-PfbS3ExportPolicy | Select-Object -ExpandProperty name | Get-PfbS3ExportRule, or pass -PolicyName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "actions", @@ -20315,11 +19893,11 @@ "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "policy_names=@{access_based_enumeration_enabled=PROBE-access_based_enumeration_enabled; context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]; version=PROBE-version; workload=}", - "BoundWireKey": "policy_names", - "BoundValue": "@{access_based_enumeration_enabled=PROBE-access_based_enumeration_enabled; context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]; version=PROBE-version; workload=}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-PolicyName received a stringified object ('@{access_based_enumeration_enabled=PROBE-access_based_enumeration_enabled; context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]; version=PROBE-version; workload=}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -PolicyName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the policy name instead, e.g. Get-PfbSmbClientPolicy | Select-Object -ExpandProperty name | Get-PfbSmbClientRule, or pass -PolicyName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "access_based_enumeration_enabled", @@ -20361,11 +19939,11 @@ "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "policy_names=@{client=PROBE-client; context=; encryption=PROBE-encryption; id=PROBE-id; index=PROBE-index; name=PROBE-name; permission=PROBE-permission; policy=; policy_version=PROBE-policy_version}", - "BoundWireKey": "policy_names", - "BoundValue": "@{client=PROBE-client; context=; encryption=PROBE-encryption; id=PROBE-id; index=PROBE-index; name=PROBE-name; permission=PROBE-permission; policy=; policy_version=PROBE-policy_version}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-PolicyName received a stringified object ('@{client=PROBE-client; context=; encryption=PROBE-encryption; id=PROBE-id; index=PROBE-index; name=PROBE-name; permission=PROBE-permission; policy=; policy_version=PROBE-policy_version}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -PolicyName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the policy name instead, e.g. Get-PfbSmbClientPolicy | Select-Object -ExpandProperty name | Get-PfbSmbClientRule, or pass -PolicyName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "client", @@ -20481,11 +20059,11 @@ "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "policy_names=@{context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]; workload=}", - "BoundWireKey": "policy_names", - "BoundValue": "@{context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]; workload=}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-PolicyName received a stringified object ('@{context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]; workload=}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -PolicyName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the policy name instead, e.g. Get-PfbSmbSharePolicy | Select-Object -ExpandProperty name | Get-PfbSmbShareRule, or pass -PolicyName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "context", @@ -20523,11 +20101,11 @@ "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "policy_names=@{change=PROBE-change; context=; full_control=PROBE-full_control; id=PROBE-id; name=PROBE-name; policy=; principal=PROBE-principal; read=PROBE-read}", - "BoundWireKey": "policy_names", - "BoundValue": "@{change=PROBE-change; context=; full_control=PROBE-full_control; id=PROBE-id; name=PROBE-name; policy=; principal=PROBE-principal; read=PROBE-read}", - "ErrorKind": null, + "Outcome": "Guarded", + "Evidence": "-PolicyName received a stringified object ('@{change=PROBE-change; context=; full_control=PROBE-full_control; id=PROBE-id; name=PROBE-name; policy=; principal=PROBE-principal; read=PROBE-read}') instead of a name. A piped object that matches none of this cmdlet's parameters by property name is coerced whole into -PolicyName, which sends a garbage filter and returns the UNFILTERED collection. Pipe the policy name instead, e.g. Get-PfbSmbSharePolicy | Select-Object -ExpandProperty name | Get-PfbSmbShareRule, or pass -PolicyName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", "FilledParameter": [], "ProbeProperties": [ "change", @@ -22265,61 +21843,81 @@ } }, { - "Cmdlet": "New-PfbFileSystemSnapshot", + "Cmdlet": "New-PfbBucketAccessPolicy", "Verb": "New", - "Parameter": "SourceName", - "Producer": "GET /file-system-snapshots", - "IsPrimary": true, + "Parameter": "BucketName", + "Producer": "GET /buckets", + "IsPrimary": false, "FromExample": false, - "WireName": null, - "IsCandidate": false, - "Gate": "SelectorUnresolved", + "WireName": "bucket_names", + "IsCandidate": true, + "Gate": "Candidate", "ValueFromPipeline": false, - "Outcome": "NoSelector", - "Evidence": "the parameter resolves to no wire key, so nothing can be attributed to it", + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", "BoundWireKey": null, "BoundValue": null, - "ErrorKind": null, - "FilledParameter": [], + "ErrorKind": "InputObjectNotBound", + "FilledParameter": [ + "BucketName" + ], "ProbeProperties": [ + "account", + "bucket_type", "context", "created", "destroyed", + "eradication_config", + "hard_limit_enabled", "id", "name", - "owner", - "owner_destroyed", - "policies", - "policy", - "source", - "suffix", - "time_remaining" + "object_count", + "object_lock_config", + "public_access_config", + "public_status", + "qos_policy", + "quota_limit", + "retention_lock", + "space", + "storage_class", + "time_remaining", + "time_remaining_status", + "versioning" ], "ProbeTypes": { + "account": "object", + "bucket_type": "string", "context": "object", "created": "integer", "destroyed": "boolean", + "eradication_config": "object", + "hard_limit_enabled": "boolean", "id": "string", "name": "string", - "owner": "object", - "owner_destroyed": "boolean", - "policies": "array", - "policy": "object", - "source": "object", - "suffix": "string", - "time_remaining": "integer" + "object_count": "integer", + "object_lock_config": "object", + "public_access_config": "object", + "public_status": "string", + "qos_policy": "object", + "quota_limit": "integer", + "retention_lock": "string", + "space": "object", + "storage_class": "object", + "time_remaining": "integer", + "time_remaining_status": "string", + "versioning": "string" } }, { - "Cmdlet": "New-PfbFileSystemSnapshot", + "Cmdlet": "New-PfbBucketAccessPolicy", "Verb": "New", - "Parameter": "SourceName", - "Producer": "GET /file-system-snapshots/policies", + "Parameter": "BucketName", + "Producer": "GET /buckets/audit-filters", "IsPrimary": false, "FromExample": false, - "WireName": null, - "IsCandidate": false, - "Gate": "SelectorUnresolved", + "WireName": "bucket_names", + "IsCandidate": true, + "Gate": "Candidate", "ValueFromPipeline": false, "Outcome": "Unbindable", "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", @@ -22327,151 +21925,113 @@ "BoundValue": null, "ErrorKind": "InputObjectNotBound", "FilledParameter": [ - "SourceName" + "BucketName" ], "ProbeProperties": [ + "actions", + "bucket", "context", - "member", - "policy" + "name", + "s3_prefixes" ], "ProbeTypes": { + "actions": "array", + "bucket": "object", "context": "object", - "member": "object", - "policy": "object" + "name": "string", + "s3_prefixes": "array" } }, { - "Cmdlet": "New-PfbFileSystemSnapshot", + "Cmdlet": "New-PfbBucketAccessPolicy", "Verb": "New", - "Parameter": "SourceName", - "Producer": "GET /file-system-snapshots/transfer", - "IsPrimary": false, + "Parameter": "BucketName", + "Producer": "GET /buckets/bucket-access-policies", + "IsPrimary": true, "FromExample": false, - "WireName": null, - "IsCandidate": false, - "Gate": "SelectorUnresolved", + "WireName": "bucket_names", + "IsCandidate": true, + "Gate": "Candidate", "ValueFromPipeline": false, - "Outcome": "NoSelector", - "Evidence": "the parameter resolves to no wire key, so nothing can be attributed to it", + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", "BoundWireKey": null, "BoundValue": null, - "ErrorKind": null, - "FilledParameter": [], + "ErrorKind": "InputObjectNotBound", + "FilledParameter": [ + "BucketName" + ], "ProbeProperties": [ - "completed", + "bucket", "context", - "data_transferred", - "direction", + "enabled", "id", - "local_snapshot", + "is_local", + "location", "name", - "progress", - "remote", - "remote_snapshot", - "started", - "status" + "policy_type", + "realms", + "rules" ], "ProbeTypes": { - "completed": "integer", + "bucket": "object", "context": "object", - "data_transferred": "integer", - "direction": "string", + "enabled": "boolean", "id": "string", - "local_snapshot": "object", + "is_local": "boolean", + "location": "object", "name": "string", - "progress": "number", - "remote": "object", - "remote_snapshot": "object", - "started": "integer", - "status": "string" + "policy_type": "string", + "realms": "array", + "rules": "array" } }, { - "Cmdlet": "New-PfbFileSystemSnapshot", + "Cmdlet": "New-PfbBucketAccessPolicy", "Verb": "New", - "Parameter": "SourceName", - "Producer": "GET /file-systems", + "Parameter": "BucketName", + "Producer": "GET /buckets/bucket-access-policies/rules", "IsPrimary": false, - "FromExample": true, - "WireName": null, - "IsCandidate": false, - "Gate": "SelectorUnresolved", + "FromExample": false, + "WireName": "bucket_names", + "IsCandidate": true, + "Gate": "Candidate", "ValueFromPipeline": false, - "Outcome": "NoSelector", - "Evidence": "the parameter resolves to no wire key, so nothing can be attributed to it", + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", "BoundWireKey": null, "BoundValue": null, - "ErrorKind": null, - "FilledParameter": [], + "ErrorKind": "InputObjectNotBound", + "FilledParameter": [ + "BucketName" + ], "ProbeProperties": [ + "actions", "context", - "created", - "default_group_quota", - "default_user_quota", - "destroyed", - "eradication_config", - "fast_remove_directory_enabled", - "group_ownership", - "hard_limit_enabled", - "http", - "id", - "multi_protocol", + "effect", "name", - "nfs", - "node_group", - "promotion_status", - "provisioned", - "qos_policy", - "realms", - "requested_promotion_state", - "smb", - "snapshot_directory_enabled", - "source", - "space", - "storage_class", - "time_remaining", - "workload", - "writable" + "policy", + "principals", + "resources" ], "ProbeTypes": { + "actions": "array", "context": "object", - "created": "integer", - "default_group_quota": "integer", - "default_user_quota": "integer", - "destroyed": "boolean", - "eradication_config": "object", - "fast_remove_directory_enabled": "boolean", - "group_ownership": "string", - "hard_limit_enabled": "boolean", - "http": "object", - "id": "string", - "multi_protocol": "object", + "effect": "string", "name": "string", - "nfs": "object", - "node_group": "object", - "promotion_status": "string", - "provisioned": "integer", - "qos_policy": "object", - "realms": "array", - "requested_promotion_state": "string", - "smb": "object", - "snapshot_directory_enabled": "boolean", - "source": "object", - "space": "object", - "storage_class": "object", - "time_remaining": "integer", - "workload": "object", - "writable": "boolean" + "policy": "object", + "principals": "object", + "resources": "array" } }, { - "Cmdlet": "New-PfbObjectStoreAccessPolicyRole", + "Cmdlet": "New-PfbBucketAccessPolicy", "Verb": "New", - "Parameter": "MemberName", - "Producer": "GET /object-store-access-policies", + "Parameter": "BucketName", + "Producer": "GET /buckets/cross-origin-resource-sharing-policies", "IsPrimary": false, "FromExample": false, - "WireName": "member_names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": false, @@ -22481,15 +22041,11 @@ "BoundValue": null, "ErrorKind": "InputObjectNotBound", "FilledParameter": [ - "MemberName", - "PolicyName" + "BucketName" ], "ProbeProperties": [ - "account", - "arn", + "bucket", "context", - "created", - "description", "enabled", "id", "is_local", @@ -22497,15 +22053,11 @@ "name", "policy_type", "realms", - "rules", - "updated" + "rules" ], "ProbeTypes": { - "account": "object", - "arn": "string", + "bucket": "object", "context": "object", - "created": "integer", - "description": "string", "enabled": "boolean", "id": "string", "is_local": "boolean", @@ -22513,18 +22065,17 @@ "name": "string", "policy_type": "string", "realms": "array", - "rules": "array", - "updated": "integer" + "rules": "array" } }, { - "Cmdlet": "New-PfbObjectStoreAccessPolicyRole", + "Cmdlet": "New-PfbBucketAccessPolicy", "Verb": "New", - "Parameter": "MemberName", - "Producer": "GET /object-store-access-policies/object-store-roles", - "IsPrimary": true, - "FromExample": true, - "WireName": "member_names", + "Parameter": "BucketName", + "Producer": "GET /buckets/cross-origin-resource-sharing-policies/rules", + "IsPrimary": false, + "FromExample": false, + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": false, @@ -22534,28 +22085,33 @@ "BoundValue": null, "ErrorKind": "InputObjectNotBound", "FilledParameter": [ - "MemberName", - "PolicyName" + "BucketName" ], "ProbeProperties": [ + "allowed_headers", + "allowed_methods", + "allowed_origins", "context", - "member", + "name", "policy" ], "ProbeTypes": { + "allowed_headers": "array", + "allowed_methods": "array", + "allowed_origins": "array", "context": "object", - "member": "object", + "name": "string", "policy": "object" } }, { - "Cmdlet": "New-PfbObjectStoreAccessPolicyRole", + "Cmdlet": "New-PfbBucketAccessPolicy", "Verb": "New", - "Parameter": "MemberName", - "Producer": "GET /object-store-access-policies/object-store-users", + "Parameter": "BucketName", + "Producer": "GET /buckets/performance", "IsPrimary": false, "FromExample": false, - "WireName": "member_names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": false, @@ -22565,28 +22121,53 @@ "BoundValue": null, "ErrorKind": "InputObjectNotBound", "FilledParameter": [ - "MemberName", - "PolicyName" + "BucketName" ], "ProbeProperties": [ - "context", - "member", - "policy" + "bytes_per_op", + "bytes_per_read", + "bytes_per_write", + "id", + "max_total_bytes_per_sec", + "max_total_ops_per_sec", + "name", + "others_per_sec", + "read_bytes_per_sec", + "reads_per_sec", + "time", + "usec_per_other_op", + "usec_per_read_op", + "usec_per_write_op", + "write_bytes_per_sec", + "writes_per_sec" ], "ProbeTypes": { - "context": "object", - "member": "object", - "policy": "object" + "bytes_per_op": "number", + "bytes_per_read": "number", + "bytes_per_write": "number", + "id": "string", + "max_total_bytes_per_sec": "number", + "max_total_ops_per_sec": "number", + "name": "string", + "others_per_sec": "number", + "read_bytes_per_sec": "number", + "reads_per_sec": "number", + "time": "integer", + "usec_per_other_op": "number", + "usec_per_read_op": "number", + "usec_per_write_op": "number", + "write_bytes_per_sec": "number", + "writes_per_sec": "number" } }, { - "Cmdlet": "New-PfbObjectStoreAccessPolicyRole", + "Cmdlet": "New-PfbBucketAccessPolicy", "Verb": "New", - "Parameter": "MemberName", - "Producer": "GET /object-store-access-policies/rules", + "Parameter": "BucketName", + "Producer": "GET /buckets/s3-specific-performance", "IsPrimary": false, "FromExample": false, - "WireName": "member_names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": false, @@ -22596,36 +22177,47 @@ "BoundValue": null, "ErrorKind": "InputObjectNotBound", "FilledParameter": [ - "MemberName", - "PolicyName" + "BucketName" ], "ProbeProperties": [ - "actions", - "conditions", - "context", - "effect", + "id", "name", - "policy", - "resources" + "others_per_sec", + "read_buckets_per_sec", + "read_objects_per_sec", + "time", + "usec_per_other_op", + "usec_per_read_bucket_op", + "usec_per_read_object_op", + "usec_per_write_bucket_op", + "usec_per_write_object_op", + "write_buckets_per_sec", + "write_objects_per_sec" ], "ProbeTypes": { - "actions": "array", - "conditions": "object", - "context": "object", - "effect": "string", + "id": "string", "name": "string", - "policy": "object", - "resources": "array" + "others_per_sec": "number", + "read_buckets_per_sec": "number", + "read_objects_per_sec": "number", + "time": "integer", + "usec_per_other_op": "number", + "usec_per_read_bucket_op": "number", + "usec_per_read_object_op": "number", + "usec_per_write_bucket_op": "number", + "usec_per_write_object_op": "number", + "write_buckets_per_sec": "number", + "write_objects_per_sec": "number" } }, { - "Cmdlet": "New-PfbObjectStoreAccessPolicyRole", + "Cmdlet": "New-PfbBucketAccessPolicyRule", "Verb": "New", - "Parameter": "PolicyName", - "Producer": "GET /object-store-access-policies", + "Parameter": "BucketName", + "Producer": "GET /buckets", "IsPrimary": false, "FromExample": false, - "WireName": "policy_names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": false, @@ -22635,50 +22227,66 @@ "BoundValue": null, "ErrorKind": "InputObjectNotBound", "FilledParameter": [ - "MemberName", + "Attributes", + "BucketName", + "Name", "PolicyName" ], "ProbeProperties": [ "account", - "arn", + "bucket_type", "context", "created", - "description", - "enabled", + "destroyed", + "eradication_config", + "hard_limit_enabled", "id", - "is_local", - "location", "name", - "policy_type", - "realms", - "rules", - "updated" + "object_count", + "object_lock_config", + "public_access_config", + "public_status", + "qos_policy", + "quota_limit", + "retention_lock", + "space", + "storage_class", + "time_remaining", + "time_remaining_status", + "versioning" ], "ProbeTypes": { "account": "object", - "arn": "string", + "bucket_type": "string", "context": "object", "created": "integer", - "description": "string", - "enabled": "boolean", + "destroyed": "boolean", + "eradication_config": "object", + "hard_limit_enabled": "boolean", "id": "string", - "is_local": "boolean", - "location": "object", "name": "string", - "policy_type": "string", - "realms": "array", - "rules": "array", - "updated": "integer" + "object_count": "integer", + "object_lock_config": "object", + "public_access_config": "object", + "public_status": "string", + "qos_policy": "object", + "quota_limit": "integer", + "retention_lock": "string", + "space": "object", + "storage_class": "object", + "time_remaining": "integer", + "time_remaining_status": "string", + "versioning": "string" } }, { - "Cmdlet": "New-PfbObjectStoreAccessPolicyRole", + "Cmdlet": "New-PfbBucketAccessPolicyRule", "Verb": "New", - "Parameter": "PolicyName", - "Producer": "GET /object-store-access-policies/object-store-roles", - "IsPrimary": true, - "FromExample": true, - "WireName": "policy_names", + "Parameter": "BucketName", + "Producer": "GET /buckets/audit-filters", + "IsPrimary": false, + "FromExample": false, + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": false, @@ -22688,28 +22296,34 @@ "BoundValue": null, "ErrorKind": "InputObjectNotBound", "FilledParameter": [ - "MemberName", + "Attributes", + "BucketName", + "Name", "PolicyName" ], "ProbeProperties": [ + "actions", + "bucket", "context", - "member", - "policy" + "name", + "s3_prefixes" ], "ProbeTypes": { + "actions": "array", + "bucket": "object", "context": "object", - "member": "object", - "policy": "object" + "name": "string", + "s3_prefixes": "array" } }, { - "Cmdlet": "New-PfbObjectStoreAccessPolicyRole", + "Cmdlet": "New-PfbBucketAccessPolicyRule", "Verb": "New", - "Parameter": "PolicyName", - "Producer": "GET /object-store-access-policies/object-store-users", + "Parameter": "BucketName", + "Producer": "GET /buckets/bucket-access-policies", "IsPrimary": false, "FromExample": false, - "WireName": "policy_names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": false, @@ -22719,28 +22333,44 @@ "BoundValue": null, "ErrorKind": "InputObjectNotBound", "FilledParameter": [ - "MemberName", + "Attributes", + "BucketName", + "Name", "PolicyName" ], "ProbeProperties": [ + "bucket", "context", - "member", - "policy" + "enabled", + "id", + "is_local", + "location", + "name", + "policy_type", + "realms", + "rules" ], "ProbeTypes": { + "bucket": "object", "context": "object", - "member": "object", - "policy": "object" + "enabled": "boolean", + "id": "string", + "is_local": "boolean", + "location": "object", + "name": "string", + "policy_type": "string", + "realms": "array", + "rules": "array" } }, { - "Cmdlet": "New-PfbObjectStoreAccessPolicyRole", + "Cmdlet": "New-PfbBucketAccessPolicyRule", "Verb": "New", - "Parameter": "PolicyName", - "Producer": "GET /object-store-access-policies/rules", - "IsPrimary": false, + "Parameter": "BucketName", + "Producer": "GET /buckets/bucket-access-policies/rules", + "IsPrimary": true, "FromExample": false, - "WireName": "policy_names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": false, @@ -22750,36 +22380,38 @@ "BoundValue": null, "ErrorKind": "InputObjectNotBound", "FilledParameter": [ - "MemberName", + "Attributes", + "BucketName", + "Name", "PolicyName" ], "ProbeProperties": [ "actions", - "conditions", "context", "effect", "name", "policy", + "principals", "resources" ], "ProbeTypes": { "actions": "array", - "conditions": "object", "context": "object", "effect": "string", "name": "string", "policy": "object", + "principals": "object", "resources": "array" } }, { - "Cmdlet": "New-PfbObjectStoreAccessPolicyUser", + "Cmdlet": "New-PfbBucketAccessPolicyRule", "Verb": "New", - "Parameter": "MemberName", - "Producer": "GET /object-store-access-policies", + "Parameter": "BucketName", + "Producer": "GET /buckets/cross-origin-resource-sharing-policies", "IsPrimary": false, "FromExample": false, - "WireName": "member_names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": false, @@ -22789,15 +22421,14 @@ "BoundValue": null, "ErrorKind": "InputObjectNotBound", "FilledParameter": [ - "MemberName", + "Attributes", + "BucketName", + "Name", "PolicyName" ], "ProbeProperties": [ - "account", - "arn", + "bucket", "context", - "created", - "description", "enabled", "id", "is_local", @@ -22805,15 +22436,11 @@ "name", "policy_type", "realms", - "rules", - "updated" + "rules" ], "ProbeTypes": { - "account": "object", - "arn": "string", + "bucket": "object", "context": "object", - "created": "integer", - "description": "string", "enabled": "boolean", "id": "string", "is_local": "boolean", @@ -22821,18 +22448,17 @@ "name": "string", "policy_type": "string", "realms": "array", - "rules": "array", - "updated": "integer" + "rules": "array" } }, { - "Cmdlet": "New-PfbObjectStoreAccessPolicyUser", + "Cmdlet": "New-PfbBucketAccessPolicyRule", "Verb": "New", - "Parameter": "MemberName", - "Producer": "GET /object-store-access-policies/object-store-roles", + "Parameter": "BucketName", + "Producer": "GET /buckets/cross-origin-resource-sharing-policies/rules", "IsPrimary": false, "FromExample": false, - "WireName": "member_names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": false, @@ -22842,28 +22468,36 @@ "BoundValue": null, "ErrorKind": "InputObjectNotBound", "FilledParameter": [ - "MemberName", + "Attributes", + "BucketName", + "Name", "PolicyName" ], "ProbeProperties": [ + "allowed_headers", + "allowed_methods", + "allowed_origins", "context", - "member", + "name", "policy" ], "ProbeTypes": { + "allowed_headers": "array", + "allowed_methods": "array", + "allowed_origins": "array", "context": "object", - "member": "object", + "name": "string", "policy": "object" } }, { - "Cmdlet": "New-PfbObjectStoreAccessPolicyUser", + "Cmdlet": "New-PfbBucketAccessPolicyRule", "Verb": "New", - "Parameter": "MemberName", - "Producer": "GET /object-store-access-policies/object-store-users", - "IsPrimary": true, - "FromExample": true, - "WireName": "member_names", + "Parameter": "BucketName", + "Producer": "GET /buckets/performance", + "IsPrimary": false, + "FromExample": false, + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": false, @@ -22873,28 +22507,56 @@ "BoundValue": null, "ErrorKind": "InputObjectNotBound", "FilledParameter": [ - "MemberName", + "Attributes", + "BucketName", + "Name", "PolicyName" ], "ProbeProperties": [ - "context", - "member", - "policy" + "bytes_per_op", + "bytes_per_read", + "bytes_per_write", + "id", + "max_total_bytes_per_sec", + "max_total_ops_per_sec", + "name", + "others_per_sec", + "read_bytes_per_sec", + "reads_per_sec", + "time", + "usec_per_other_op", + "usec_per_read_op", + "usec_per_write_op", + "write_bytes_per_sec", + "writes_per_sec" ], "ProbeTypes": { - "context": "object", - "member": "object", - "policy": "object" + "bytes_per_op": "number", + "bytes_per_read": "number", + "bytes_per_write": "number", + "id": "string", + "max_total_bytes_per_sec": "number", + "max_total_ops_per_sec": "number", + "name": "string", + "others_per_sec": "number", + "read_bytes_per_sec": "number", + "reads_per_sec": "number", + "time": "integer", + "usec_per_other_op": "number", + "usec_per_read_op": "number", + "usec_per_write_op": "number", + "write_bytes_per_sec": "number", + "writes_per_sec": "number" } }, { - "Cmdlet": "New-PfbObjectStoreAccessPolicyUser", + "Cmdlet": "New-PfbBucketAccessPolicyRule", "Verb": "New", - "Parameter": "MemberName", - "Producer": "GET /object-store-access-policies/rules", + "Parameter": "BucketName", + "Producer": "GET /buckets/s3-specific-performance", "IsPrimary": false, "FromExample": false, - "WireName": "member_names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": false, @@ -22904,33 +22566,47 @@ "BoundValue": null, "ErrorKind": "InputObjectNotBound", "FilledParameter": [ - "MemberName", + "Attributes", + "BucketName", + "Name", "PolicyName" ], "ProbeProperties": [ - "actions", - "conditions", - "context", - "effect", + "id", "name", - "policy", - "resources" + "others_per_sec", + "read_buckets_per_sec", + "read_objects_per_sec", + "time", + "usec_per_other_op", + "usec_per_read_bucket_op", + "usec_per_read_object_op", + "usec_per_write_bucket_op", + "usec_per_write_object_op", + "write_buckets_per_sec", + "write_objects_per_sec" ], "ProbeTypes": { - "actions": "array", - "conditions": "object", - "context": "object", - "effect": "string", + "id": "string", "name": "string", - "policy": "object", - "resources": "array" + "others_per_sec": "number", + "read_buckets_per_sec": "number", + "read_objects_per_sec": "number", + "time": "integer", + "usec_per_other_op": "number", + "usec_per_read_bucket_op": "number", + "usec_per_read_object_op": "number", + "usec_per_write_bucket_op": "number", + "usec_per_write_object_op": "number", + "write_buckets_per_sec": "number", + "write_objects_per_sec": "number" } }, { - "Cmdlet": "New-PfbObjectStoreAccessPolicyUser", + "Cmdlet": "New-PfbBucketAccessPolicyRule", "Verb": "New", "Parameter": "PolicyName", - "Producer": "GET /object-store-access-policies", + "Producer": "GET /buckets", "IsPrimary": false, "FromExample": false, "WireName": "policy_names", @@ -22943,47 +22619,63 @@ "BoundValue": null, "ErrorKind": "InputObjectNotBound", "FilledParameter": [ - "MemberName", + "Attributes", + "BucketName", + "Name", "PolicyName" ], "ProbeProperties": [ "account", - "arn", + "bucket_type", "context", "created", - "description", - "enabled", + "destroyed", + "eradication_config", + "hard_limit_enabled", "id", - "is_local", - "location", "name", - "policy_type", - "realms", - "rules", - "updated" + "object_count", + "object_lock_config", + "public_access_config", + "public_status", + "qos_policy", + "quota_limit", + "retention_lock", + "space", + "storage_class", + "time_remaining", + "time_remaining_status", + "versioning" ], "ProbeTypes": { "account": "object", - "arn": "string", + "bucket_type": "string", "context": "object", "created": "integer", - "description": "string", - "enabled": "boolean", + "destroyed": "boolean", + "eradication_config": "object", + "hard_limit_enabled": "boolean", "id": "string", - "is_local": "boolean", - "location": "object", "name": "string", - "policy_type": "string", - "realms": "array", - "rules": "array", - "updated": "integer" + "object_count": "integer", + "object_lock_config": "object", + "public_access_config": "object", + "public_status": "string", + "qos_policy": "object", + "quota_limit": "integer", + "retention_lock": "string", + "space": "object", + "storage_class": "object", + "time_remaining": "integer", + "time_remaining_status": "string", + "versioning": "string" } }, { - "Cmdlet": "New-PfbObjectStoreAccessPolicyUser", + "Cmdlet": "New-PfbBucketAccessPolicyRule", "Verb": "New", "Parameter": "PolicyName", - "Producer": "GET /object-store-access-policies/object-store-roles", + "Producer": "GET /buckets/audit-filters", "IsPrimary": false, "FromExample": false, "WireName": "policy_names", @@ -22996,27 +22688,33 @@ "BoundValue": null, "ErrorKind": "InputObjectNotBound", "FilledParameter": [ - "MemberName", + "Attributes", + "BucketName", + "Name", "PolicyName" ], "ProbeProperties": [ + "actions", + "bucket", "context", - "member", - "policy" + "name", + "s3_prefixes" ], "ProbeTypes": { + "actions": "array", + "bucket": "object", "context": "object", - "member": "object", - "policy": "object" + "name": "string", + "s3_prefixes": "array" } }, { - "Cmdlet": "New-PfbObjectStoreAccessPolicyUser", + "Cmdlet": "New-PfbBucketAccessPolicyRule", "Verb": "New", "Parameter": "PolicyName", - "Producer": "GET /object-store-access-policies/object-store-users", - "IsPrimary": true, - "FromExample": true, + "Producer": "GET /buckets/bucket-access-policies", + "IsPrimary": false, + "FromExample": false, "WireName": "policy_names", "IsCandidate": true, "Gate": "Candidate", @@ -23027,26 +22725,42 @@ "BoundValue": null, "ErrorKind": "InputObjectNotBound", "FilledParameter": [ - "MemberName", + "Attributes", + "BucketName", + "Name", "PolicyName" ], "ProbeProperties": [ + "bucket", "context", - "member", - "policy" + "enabled", + "id", + "is_local", + "location", + "name", + "policy_type", + "realms", + "rules" ], "ProbeTypes": { + "bucket": "object", "context": "object", - "member": "object", - "policy": "object" + "enabled": "boolean", + "id": "string", + "is_local": "boolean", + "location": "object", + "name": "string", + "policy_type": "string", + "realms": "array", + "rules": "array" } }, { - "Cmdlet": "New-PfbObjectStoreAccessPolicyUser", + "Cmdlet": "New-PfbBucketAccessPolicyRule", "Verb": "New", "Parameter": "PolicyName", - "Producer": "GET /object-store-access-policies/rules", - "IsPrimary": false, + "Producer": "GET /buckets/bucket-access-policies/rules", + "IsPrimary": true, "FromExample": false, "WireName": "policy_names", "IsCandidate": true, @@ -23058,36 +22772,38 @@ "BoundValue": null, "ErrorKind": "InputObjectNotBound", "FilledParameter": [ - "MemberName", + "Attributes", + "BucketName", + "Name", "PolicyName" ], "ProbeProperties": [ "actions", - "conditions", "context", "effect", "name", "policy", + "principals", "resources" ], "ProbeTypes": { "actions": "array", - "conditions": "object", "context": "object", "effect": "string", "name": "string", "policy": "object", + "principals": "object", "resources": "array" } }, { - "Cmdlet": "New-PfbObjectStoreUserAccessPolicy", + "Cmdlet": "New-PfbBucketAccessPolicyRule", "Verb": "New", - "Parameter": "MemberName", - "Producer": "GET /object-store-users", + "Parameter": "PolicyName", + "Producer": "GET /buckets/cross-origin-resource-sharing-policies", "IsPrimary": false, "FromExample": false, - "WireName": "member_names", + "WireName": "policy_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": false, @@ -23097,34 +22813,44 @@ "BoundValue": null, "ErrorKind": "InputObjectNotBound", "FilledParameter": [ - "MemberName", + "Attributes", + "BucketName", + "Name", "PolicyName" ], "ProbeProperties": [ - "access_keys", - "account", + "bucket", "context", - "created", + "enabled", "id", - "name" + "is_local", + "location", + "name", + "policy_type", + "realms", + "rules" ], "ProbeTypes": { - "access_keys": "array", - "account": "object", + "bucket": "object", "context": "object", - "created": "integer", + "enabled": "boolean", "id": "string", - "name": "string" + "is_local": "boolean", + "location": "object", + "name": "string", + "policy_type": "string", + "realms": "array", + "rules": "array" } }, { - "Cmdlet": "New-PfbObjectStoreUserAccessPolicy", + "Cmdlet": "New-PfbBucketAccessPolicyRule", "Verb": "New", - "Parameter": "MemberName", - "Producer": "GET /object-store-users/object-store-access-policies", - "IsPrimary": true, - "FromExample": true, - "WireName": "member_names", + "Parameter": "PolicyName", + "Producer": "GET /buckets/cross-origin-resource-sharing-policies/rules", + "IsPrimary": false, + "FromExample": false, + "WireName": "policy_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": false, @@ -23134,25 +22860,33 @@ "BoundValue": null, "ErrorKind": "InputObjectNotBound", "FilledParameter": [ - "MemberName", + "Attributes", + "BucketName", + "Name", "PolicyName" ], "ProbeProperties": [ + "allowed_headers", + "allowed_methods", + "allowed_origins", "context", - "member", + "name", "policy" ], "ProbeTypes": { + "allowed_headers": "array", + "allowed_methods": "array", + "allowed_origins": "array", "context": "object", - "member": "object", + "name": "string", "policy": "object" } }, { - "Cmdlet": "New-PfbObjectStoreUserAccessPolicy", + "Cmdlet": "New-PfbBucketAccessPolicyRule", "Verb": "New", "Parameter": "PolicyName", - "Producer": "GET /object-store-users", + "Producer": "GET /buckets/performance", "IsPrimary": false, "FromExample": false, "WireName": "policy_names", @@ -23165,33 +22899,55 @@ "BoundValue": null, "ErrorKind": "InputObjectNotBound", "FilledParameter": [ - "MemberName", + "Attributes", + "BucketName", + "Name", "PolicyName" ], "ProbeProperties": [ - "access_keys", - "account", - "context", - "created", + "bytes_per_op", + "bytes_per_read", + "bytes_per_write", "id", - "name" + "max_total_bytes_per_sec", + "max_total_ops_per_sec", + "name", + "others_per_sec", + "read_bytes_per_sec", + "reads_per_sec", + "time", + "usec_per_other_op", + "usec_per_read_op", + "usec_per_write_op", + "write_bytes_per_sec", + "writes_per_sec" ], "ProbeTypes": { - "access_keys": "array", - "account": "object", - "context": "object", - "created": "integer", + "bytes_per_op": "number", + "bytes_per_read": "number", + "bytes_per_write": "number", "id": "string", - "name": "string" + "max_total_bytes_per_sec": "number", + "max_total_ops_per_sec": "number", + "name": "string", + "others_per_sec": "number", + "read_bytes_per_sec": "number", + "reads_per_sec": "number", + "time": "integer", + "usec_per_other_op": "number", + "usec_per_read_op": "number", + "usec_per_write_op": "number", + "write_bytes_per_sec": "number", + "writes_per_sec": "number" } }, { - "Cmdlet": "New-PfbObjectStoreUserAccessPolicy", + "Cmdlet": "New-PfbBucketAccessPolicyRule", "Verb": "New", "Parameter": "PolicyName", - "Producer": "GET /object-store-users/object-store-access-policies", - "IsPrimary": true, - "FromExample": true, + "Producer": "GET /buckets/s3-specific-performance", + "IsPrimary": false, + "FromExample": false, "WireName": "policy_names", "IsCandidate": true, "Gate": "Candidate", @@ -23202,120 +22958,3164 @@ "BoundValue": null, "ErrorKind": "InputObjectNotBound", "FilledParameter": [ - "MemberName", + "Attributes", + "BucketName", + "Name", "PolicyName" ], "ProbeProperties": [ - "context", - "member", - "policy" + "id", + "name", + "others_per_sec", + "read_buckets_per_sec", + "read_objects_per_sec", + "time", + "usec_per_other_op", + "usec_per_read_bucket_op", + "usec_per_read_object_op", + "usec_per_write_bucket_op", + "usec_per_write_object_op", + "write_buckets_per_sec", + "write_objects_per_sec" ], "ProbeTypes": { - "context": "object", - "member": "object", - "policy": "object" + "id": "string", + "name": "string", + "others_per_sec": "number", + "read_buckets_per_sec": "number", + "read_objects_per_sec": "number", + "time": "integer", + "usec_per_other_op": "number", + "usec_per_read_bucket_op": "number", + "usec_per_read_object_op": "number", + "usec_per_write_bucket_op": "number", + "usec_per_write_object_op": "number", + "write_buckets_per_sec": "number", + "write_objects_per_sec": "number" } }, { - "Cmdlet": "Remove-PfbActiveDirectory", - "Verb": "Remove", - "Parameter": "Name", - "Producer": "GET /active-directory", - "IsPrimary": true, - "FromExample": true, - "WireName": "names", - "IsCandidate": false, - "Gate": "Matched", - "ValueFromPipeline": true, - "Outcome": "Bound", - "Evidence": "names=PROBE-name (from property 'name')", - "BoundWireKey": "names", - "BoundValue": "PROBE-name", - "ErrorKind": null, - "FilledParameter": [], + "Cmdlet": "New-PfbBucketCorsPolicy", + "Verb": "New", + "Parameter": "BucketName", + "Producer": "GET /buckets", + "IsPrimary": false, + "FromExample": false, + "WireName": "bucket_names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", + "FilledParameter": [ + "BucketName" + ], "ProbeProperties": [ - "ca_certificate", - "ca_certificate_group", - "computer_name", - "directory_servers", - "domain", - "encryption_types", - "global_catalog_servers", + "account", + "bucket_type", + "context", + "created", + "destroyed", + "eradication_config", + "hard_limit_enabled", "id", - "join_ou", - "kerberos_servers", "name", - "realms", - "server", - "service_principal_names" + "object_count", + "object_lock_config", + "public_access_config", + "public_status", + "qos_policy", + "quota_limit", + "retention_lock", + "space", + "storage_class", + "time_remaining", + "time_remaining_status", + "versioning" ], "ProbeTypes": { - "ca_certificate": "object", - "ca_certificate_group": "object", - "computer_name": "string", - "directory_servers": "array", - "domain": "string", - "encryption_types": "array", - "global_catalog_servers": "array", + "account": "object", + "bucket_type": "string", + "context": "object", + "created": "integer", + "destroyed": "boolean", + "eradication_config": "object", + "hard_limit_enabled": "boolean", "id": "string", - "join_ou": "string", - "kerberos_servers": "array", "name": "string", - "realms": "array", - "server": "object", - "service_principal_names": "array" + "object_count": "integer", + "object_lock_config": "object", + "public_access_config": "object", + "public_status": "string", + "qos_policy": "object", + "quota_limit": "integer", + "retention_lock": "string", + "space": "object", + "storage_class": "object", + "time_remaining": "integer", + "time_remaining_status": "string", + "versioning": "string" } }, { - "Cmdlet": "Remove-PfbActiveDirectory", - "Verb": "Remove", - "Parameter": "Name", - "Producer": "GET /active-directory/test", + "Cmdlet": "New-PfbBucketCorsPolicy", + "Verb": "New", + "Parameter": "BucketName", + "Producer": "GET /buckets/audit-filters", "IsPrimary": false, "FromExample": false, - "WireName": "names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", - "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "names=@{component_address=PROBE-component_address; component_name=PROBE-component_name; context=; description=PROBE-description; destination=PROBE-destination; enabled=PROBE-enabled; resource=; result_details=PROBE-result_details; success=PROBE-success; test_type=PROBE-test_type}", - "BoundWireKey": "names", - "BoundValue": "@{component_address=PROBE-component_address; component_name=PROBE-component_name; context=; description=PROBE-description; destination=PROBE-destination; enabled=PROBE-enabled; resource=; result_details=PROBE-result_details; success=PROBE-success; test_type=PROBE-test_type}", - "ErrorKind": null, - "FilledParameter": [], + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", + "FilledParameter": [ + "BucketName" + ], + "ProbeProperties": [ + "actions", + "bucket", + "context", + "name", + "s3_prefixes" + ], + "ProbeTypes": { + "actions": "array", + "bucket": "object", + "context": "object", + "name": "string", + "s3_prefixes": "array" + } + }, + { + "Cmdlet": "New-PfbBucketCorsPolicy", + "Verb": "New", + "Parameter": "BucketName", + "Producer": "GET /buckets/bucket-access-policies", + "IsPrimary": false, + "FromExample": false, + "WireName": "bucket_names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", + "FilledParameter": [ + "BucketName" + ], + "ProbeProperties": [ + "bucket", + "context", + "enabled", + "id", + "is_local", + "location", + "name", + "policy_type", + "realms", + "rules" + ], + "ProbeTypes": { + "bucket": "object", + "context": "object", + "enabled": "boolean", + "id": "string", + "is_local": "boolean", + "location": "object", + "name": "string", + "policy_type": "string", + "realms": "array", + "rules": "array" + } + }, + { + "Cmdlet": "New-PfbBucketCorsPolicy", + "Verb": "New", + "Parameter": "BucketName", + "Producer": "GET /buckets/bucket-access-policies/rules", + "IsPrimary": false, + "FromExample": false, + "WireName": "bucket_names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", + "FilledParameter": [ + "BucketName" + ], + "ProbeProperties": [ + "actions", + "context", + "effect", + "name", + "policy", + "principals", + "resources" + ], + "ProbeTypes": { + "actions": "array", + "context": "object", + "effect": "string", + "name": "string", + "policy": "object", + "principals": "object", + "resources": "array" + } + }, + { + "Cmdlet": "New-PfbBucketCorsPolicy", + "Verb": "New", + "Parameter": "BucketName", + "Producer": "GET /buckets/cross-origin-resource-sharing-policies", + "IsPrimary": true, + "FromExample": false, + "WireName": "bucket_names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", + "FilledParameter": [ + "BucketName" + ], + "ProbeProperties": [ + "bucket", + "context", + "enabled", + "id", + "is_local", + "location", + "name", + "policy_type", + "realms", + "rules" + ], + "ProbeTypes": { + "bucket": "object", + "context": "object", + "enabled": "boolean", + "id": "string", + "is_local": "boolean", + "location": "object", + "name": "string", + "policy_type": "string", + "realms": "array", + "rules": "array" + } + }, + { + "Cmdlet": "New-PfbBucketCorsPolicy", + "Verb": "New", + "Parameter": "BucketName", + "Producer": "GET /buckets/cross-origin-resource-sharing-policies/rules", + "IsPrimary": false, + "FromExample": false, + "WireName": "bucket_names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", + "FilledParameter": [ + "BucketName" + ], + "ProbeProperties": [ + "allowed_headers", + "allowed_methods", + "allowed_origins", + "context", + "name", + "policy" + ], + "ProbeTypes": { + "allowed_headers": "array", + "allowed_methods": "array", + "allowed_origins": "array", + "context": "object", + "name": "string", + "policy": "object" + } + }, + { + "Cmdlet": "New-PfbBucketCorsPolicy", + "Verb": "New", + "Parameter": "BucketName", + "Producer": "GET /buckets/performance", + "IsPrimary": false, + "FromExample": false, + "WireName": "bucket_names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", + "FilledParameter": [ + "BucketName" + ], + "ProbeProperties": [ + "bytes_per_op", + "bytes_per_read", + "bytes_per_write", + "id", + "max_total_bytes_per_sec", + "max_total_ops_per_sec", + "name", + "others_per_sec", + "read_bytes_per_sec", + "reads_per_sec", + "time", + "usec_per_other_op", + "usec_per_read_op", + "usec_per_write_op", + "write_bytes_per_sec", + "writes_per_sec" + ], + "ProbeTypes": { + "bytes_per_op": "number", + "bytes_per_read": "number", + "bytes_per_write": "number", + "id": "string", + "max_total_bytes_per_sec": "number", + "max_total_ops_per_sec": "number", + "name": "string", + "others_per_sec": "number", + "read_bytes_per_sec": "number", + "reads_per_sec": "number", + "time": "integer", + "usec_per_other_op": "number", + "usec_per_read_op": "number", + "usec_per_write_op": "number", + "write_bytes_per_sec": "number", + "writes_per_sec": "number" + } + }, + { + "Cmdlet": "New-PfbBucketCorsPolicy", + "Verb": "New", + "Parameter": "BucketName", + "Producer": "GET /buckets/s3-specific-performance", + "IsPrimary": false, + "FromExample": false, + "WireName": "bucket_names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", + "FilledParameter": [ + "BucketName" + ], + "ProbeProperties": [ + "id", + "name", + "others_per_sec", + "read_buckets_per_sec", + "read_objects_per_sec", + "time", + "usec_per_other_op", + "usec_per_read_bucket_op", + "usec_per_read_object_op", + "usec_per_write_bucket_op", + "usec_per_write_object_op", + "write_buckets_per_sec", + "write_objects_per_sec" + ], + "ProbeTypes": { + "id": "string", + "name": "string", + "others_per_sec": "number", + "read_buckets_per_sec": "number", + "read_objects_per_sec": "number", + "time": "integer", + "usec_per_other_op": "number", + "usec_per_read_bucket_op": "number", + "usec_per_read_object_op": "number", + "usec_per_write_bucket_op": "number", + "usec_per_write_object_op": "number", + "write_buckets_per_sec": "number", + "write_objects_per_sec": "number" + } + }, + { + "Cmdlet": "New-PfbBucketCorsPolicyRule", + "Verb": "New", + "Parameter": "BucketName", + "Producer": "GET /buckets", + "IsPrimary": false, + "FromExample": false, + "WireName": "bucket_names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", + "FilledParameter": [ + "Attributes", + "BucketName", + "Name", + "PolicyName" + ], + "ProbeProperties": [ + "account", + "bucket_type", + "context", + "created", + "destroyed", + "eradication_config", + "hard_limit_enabled", + "id", + "name", + "object_count", + "object_lock_config", + "public_access_config", + "public_status", + "qos_policy", + "quota_limit", + "retention_lock", + "space", + "storage_class", + "time_remaining", + "time_remaining_status", + "versioning" + ], + "ProbeTypes": { + "account": "object", + "bucket_type": "string", + "context": "object", + "created": "integer", + "destroyed": "boolean", + "eradication_config": "object", + "hard_limit_enabled": "boolean", + "id": "string", + "name": "string", + "object_count": "integer", + "object_lock_config": "object", + "public_access_config": "object", + "public_status": "string", + "qos_policy": "object", + "quota_limit": "integer", + "retention_lock": "string", + "space": "object", + "storage_class": "object", + "time_remaining": "integer", + "time_remaining_status": "string", + "versioning": "string" + } + }, + { + "Cmdlet": "New-PfbBucketCorsPolicyRule", + "Verb": "New", + "Parameter": "BucketName", + "Producer": "GET /buckets/audit-filters", + "IsPrimary": false, + "FromExample": false, + "WireName": "bucket_names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", + "FilledParameter": [ + "Attributes", + "BucketName", + "Name", + "PolicyName" + ], + "ProbeProperties": [ + "actions", + "bucket", + "context", + "name", + "s3_prefixes" + ], + "ProbeTypes": { + "actions": "array", + "bucket": "object", + "context": "object", + "name": "string", + "s3_prefixes": "array" + } + }, + { + "Cmdlet": "New-PfbBucketCorsPolicyRule", + "Verb": "New", + "Parameter": "BucketName", + "Producer": "GET /buckets/bucket-access-policies", + "IsPrimary": false, + "FromExample": false, + "WireName": "bucket_names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", + "FilledParameter": [ + "Attributes", + "BucketName", + "Name", + "PolicyName" + ], + "ProbeProperties": [ + "bucket", + "context", + "enabled", + "id", + "is_local", + "location", + "name", + "policy_type", + "realms", + "rules" + ], + "ProbeTypes": { + "bucket": "object", + "context": "object", + "enabled": "boolean", + "id": "string", + "is_local": "boolean", + "location": "object", + "name": "string", + "policy_type": "string", + "realms": "array", + "rules": "array" + } + }, + { + "Cmdlet": "New-PfbBucketCorsPolicyRule", + "Verb": "New", + "Parameter": "BucketName", + "Producer": "GET /buckets/bucket-access-policies/rules", + "IsPrimary": false, + "FromExample": false, + "WireName": "bucket_names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", + "FilledParameter": [ + "Attributes", + "BucketName", + "Name", + "PolicyName" + ], + "ProbeProperties": [ + "actions", + "context", + "effect", + "name", + "policy", + "principals", + "resources" + ], + "ProbeTypes": { + "actions": "array", + "context": "object", + "effect": "string", + "name": "string", + "policy": "object", + "principals": "object", + "resources": "array" + } + }, + { + "Cmdlet": "New-PfbBucketCorsPolicyRule", + "Verb": "New", + "Parameter": "BucketName", + "Producer": "GET /buckets/cross-origin-resource-sharing-policies", + "IsPrimary": false, + "FromExample": false, + "WireName": "bucket_names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", + "FilledParameter": [ + "Attributes", + "BucketName", + "Name", + "PolicyName" + ], + "ProbeProperties": [ + "bucket", + "context", + "enabled", + "id", + "is_local", + "location", + "name", + "policy_type", + "realms", + "rules" + ], + "ProbeTypes": { + "bucket": "object", + "context": "object", + "enabled": "boolean", + "id": "string", + "is_local": "boolean", + "location": "object", + "name": "string", + "policy_type": "string", + "realms": "array", + "rules": "array" + } + }, + { + "Cmdlet": "New-PfbBucketCorsPolicyRule", + "Verb": "New", + "Parameter": "BucketName", + "Producer": "GET /buckets/cross-origin-resource-sharing-policies/rules", + "IsPrimary": true, + "FromExample": false, + "WireName": "bucket_names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", + "FilledParameter": [ + "Attributes", + "BucketName", + "Name", + "PolicyName" + ], + "ProbeProperties": [ + "allowed_headers", + "allowed_methods", + "allowed_origins", + "context", + "name", + "policy" + ], + "ProbeTypes": { + "allowed_headers": "array", + "allowed_methods": "array", + "allowed_origins": "array", + "context": "object", + "name": "string", + "policy": "object" + } + }, + { + "Cmdlet": "New-PfbBucketCorsPolicyRule", + "Verb": "New", + "Parameter": "BucketName", + "Producer": "GET /buckets/performance", + "IsPrimary": false, + "FromExample": false, + "WireName": "bucket_names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", + "FilledParameter": [ + "Attributes", + "BucketName", + "Name", + "PolicyName" + ], + "ProbeProperties": [ + "bytes_per_op", + "bytes_per_read", + "bytes_per_write", + "id", + "max_total_bytes_per_sec", + "max_total_ops_per_sec", + "name", + "others_per_sec", + "read_bytes_per_sec", + "reads_per_sec", + "time", + "usec_per_other_op", + "usec_per_read_op", + "usec_per_write_op", + "write_bytes_per_sec", + "writes_per_sec" + ], + "ProbeTypes": { + "bytes_per_op": "number", + "bytes_per_read": "number", + "bytes_per_write": "number", + "id": "string", + "max_total_bytes_per_sec": "number", + "max_total_ops_per_sec": "number", + "name": "string", + "others_per_sec": "number", + "read_bytes_per_sec": "number", + "reads_per_sec": "number", + "time": "integer", + "usec_per_other_op": "number", + "usec_per_read_op": "number", + "usec_per_write_op": "number", + "write_bytes_per_sec": "number", + "writes_per_sec": "number" + } + }, + { + "Cmdlet": "New-PfbBucketCorsPolicyRule", + "Verb": "New", + "Parameter": "BucketName", + "Producer": "GET /buckets/s3-specific-performance", + "IsPrimary": false, + "FromExample": false, + "WireName": "bucket_names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", + "FilledParameter": [ + "Attributes", + "BucketName", + "Name", + "PolicyName" + ], + "ProbeProperties": [ + "id", + "name", + "others_per_sec", + "read_buckets_per_sec", + "read_objects_per_sec", + "time", + "usec_per_other_op", + "usec_per_read_bucket_op", + "usec_per_read_object_op", + "usec_per_write_bucket_op", + "usec_per_write_object_op", + "write_buckets_per_sec", + "write_objects_per_sec" + ], + "ProbeTypes": { + "id": "string", + "name": "string", + "others_per_sec": "number", + "read_buckets_per_sec": "number", + "read_objects_per_sec": "number", + "time": "integer", + "usec_per_other_op": "number", + "usec_per_read_bucket_op": "number", + "usec_per_read_object_op": "number", + "usec_per_write_bucket_op": "number", + "usec_per_write_object_op": "number", + "write_buckets_per_sec": "number", + "write_objects_per_sec": "number" + } + }, + { + "Cmdlet": "New-PfbBucketCorsPolicyRule", + "Verb": "New", + "Parameter": "PolicyName", + "Producer": "GET /buckets", + "IsPrimary": false, + "FromExample": false, + "WireName": "policy_names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", + "FilledParameter": [ + "Attributes", + "BucketName", + "Name", + "PolicyName" + ], + "ProbeProperties": [ + "account", + "bucket_type", + "context", + "created", + "destroyed", + "eradication_config", + "hard_limit_enabled", + "id", + "name", + "object_count", + "object_lock_config", + "public_access_config", + "public_status", + "qos_policy", + "quota_limit", + "retention_lock", + "space", + "storage_class", + "time_remaining", + "time_remaining_status", + "versioning" + ], + "ProbeTypes": { + "account": "object", + "bucket_type": "string", + "context": "object", + "created": "integer", + "destroyed": "boolean", + "eradication_config": "object", + "hard_limit_enabled": "boolean", + "id": "string", + "name": "string", + "object_count": "integer", + "object_lock_config": "object", + "public_access_config": "object", + "public_status": "string", + "qos_policy": "object", + "quota_limit": "integer", + "retention_lock": "string", + "space": "object", + "storage_class": "object", + "time_remaining": "integer", + "time_remaining_status": "string", + "versioning": "string" + } + }, + { + "Cmdlet": "New-PfbBucketCorsPolicyRule", + "Verb": "New", + "Parameter": "PolicyName", + "Producer": "GET /buckets/audit-filters", + "IsPrimary": false, + "FromExample": false, + "WireName": "policy_names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", + "FilledParameter": [ + "Attributes", + "BucketName", + "Name", + "PolicyName" + ], + "ProbeProperties": [ + "actions", + "bucket", + "context", + "name", + "s3_prefixes" + ], + "ProbeTypes": { + "actions": "array", + "bucket": "object", + "context": "object", + "name": "string", + "s3_prefixes": "array" + } + }, + { + "Cmdlet": "New-PfbBucketCorsPolicyRule", + "Verb": "New", + "Parameter": "PolicyName", + "Producer": "GET /buckets/bucket-access-policies", + "IsPrimary": false, + "FromExample": false, + "WireName": "policy_names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", + "FilledParameter": [ + "Attributes", + "BucketName", + "Name", + "PolicyName" + ], + "ProbeProperties": [ + "bucket", + "context", + "enabled", + "id", + "is_local", + "location", + "name", + "policy_type", + "realms", + "rules" + ], + "ProbeTypes": { + "bucket": "object", + "context": "object", + "enabled": "boolean", + "id": "string", + "is_local": "boolean", + "location": "object", + "name": "string", + "policy_type": "string", + "realms": "array", + "rules": "array" + } + }, + { + "Cmdlet": "New-PfbBucketCorsPolicyRule", + "Verb": "New", + "Parameter": "PolicyName", + "Producer": "GET /buckets/bucket-access-policies/rules", + "IsPrimary": false, + "FromExample": false, + "WireName": "policy_names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", + "FilledParameter": [ + "Attributes", + "BucketName", + "Name", + "PolicyName" + ], + "ProbeProperties": [ + "actions", + "context", + "effect", + "name", + "policy", + "principals", + "resources" + ], + "ProbeTypes": { + "actions": "array", + "context": "object", + "effect": "string", + "name": "string", + "policy": "object", + "principals": "object", + "resources": "array" + } + }, + { + "Cmdlet": "New-PfbBucketCorsPolicyRule", + "Verb": "New", + "Parameter": "PolicyName", + "Producer": "GET /buckets/cross-origin-resource-sharing-policies", + "IsPrimary": false, + "FromExample": false, + "WireName": "policy_names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", + "FilledParameter": [ + "Attributes", + "BucketName", + "Name", + "PolicyName" + ], + "ProbeProperties": [ + "bucket", + "context", + "enabled", + "id", + "is_local", + "location", + "name", + "policy_type", + "realms", + "rules" + ], + "ProbeTypes": { + "bucket": "object", + "context": "object", + "enabled": "boolean", + "id": "string", + "is_local": "boolean", + "location": "object", + "name": "string", + "policy_type": "string", + "realms": "array", + "rules": "array" + } + }, + { + "Cmdlet": "New-PfbBucketCorsPolicyRule", + "Verb": "New", + "Parameter": "PolicyName", + "Producer": "GET /buckets/cross-origin-resource-sharing-policies/rules", + "IsPrimary": true, + "FromExample": false, + "WireName": "policy_names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", + "FilledParameter": [ + "Attributes", + "BucketName", + "Name", + "PolicyName" + ], + "ProbeProperties": [ + "allowed_headers", + "allowed_methods", + "allowed_origins", + "context", + "name", + "policy" + ], + "ProbeTypes": { + "allowed_headers": "array", + "allowed_methods": "array", + "allowed_origins": "array", + "context": "object", + "name": "string", + "policy": "object" + } + }, + { + "Cmdlet": "New-PfbBucketCorsPolicyRule", + "Verb": "New", + "Parameter": "PolicyName", + "Producer": "GET /buckets/performance", + "IsPrimary": false, + "FromExample": false, + "WireName": "policy_names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", + "FilledParameter": [ + "Attributes", + "BucketName", + "Name", + "PolicyName" + ], + "ProbeProperties": [ + "bytes_per_op", + "bytes_per_read", + "bytes_per_write", + "id", + "max_total_bytes_per_sec", + "max_total_ops_per_sec", + "name", + "others_per_sec", + "read_bytes_per_sec", + "reads_per_sec", + "time", + "usec_per_other_op", + "usec_per_read_op", + "usec_per_write_op", + "write_bytes_per_sec", + "writes_per_sec" + ], + "ProbeTypes": { + "bytes_per_op": "number", + "bytes_per_read": "number", + "bytes_per_write": "number", + "id": "string", + "max_total_bytes_per_sec": "number", + "max_total_ops_per_sec": "number", + "name": "string", + "others_per_sec": "number", + "read_bytes_per_sec": "number", + "reads_per_sec": "number", + "time": "integer", + "usec_per_other_op": "number", + "usec_per_read_op": "number", + "usec_per_write_op": "number", + "write_bytes_per_sec": "number", + "writes_per_sec": "number" + } + }, + { + "Cmdlet": "New-PfbBucketCorsPolicyRule", + "Verb": "New", + "Parameter": "PolicyName", + "Producer": "GET /buckets/s3-specific-performance", + "IsPrimary": false, + "FromExample": false, + "WireName": "policy_names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", + "FilledParameter": [ + "Attributes", + "BucketName", + "Name", + "PolicyName" + ], + "ProbeProperties": [ + "id", + "name", + "others_per_sec", + "read_buckets_per_sec", + "read_objects_per_sec", + "time", + "usec_per_other_op", + "usec_per_read_bucket_op", + "usec_per_read_object_op", + "usec_per_write_bucket_op", + "usec_per_write_object_op", + "write_buckets_per_sec", + "write_objects_per_sec" + ], + "ProbeTypes": { + "id": "string", + "name": "string", + "others_per_sec": "number", + "read_buckets_per_sec": "number", + "read_objects_per_sec": "number", + "time": "integer", + "usec_per_other_op": "number", + "usec_per_read_bucket_op": "number", + "usec_per_read_object_op": "number", + "usec_per_write_bucket_op": "number", + "usec_per_write_object_op": "number", + "write_buckets_per_sec": "number", + "write_objects_per_sec": "number" + } + }, + { + "Cmdlet": "New-PfbFileSystemSnapshot", + "Verb": "New", + "Parameter": "SourceName", + "Producer": "GET /file-system-snapshots", + "IsPrimary": true, + "FromExample": false, + "WireName": null, + "IsCandidate": false, + "Gate": "SelectorUnresolved", + "ValueFromPipeline": false, + "Outcome": "NoSelector", + "Evidence": "the parameter resolves to no wire key, so nothing can be attributed to it", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": null, + "FilledParameter": [], + "ProbeProperties": [ + "context", + "created", + "destroyed", + "id", + "name", + "owner", + "owner_destroyed", + "policies", + "policy", + "source", + "suffix", + "time_remaining" + ], + "ProbeTypes": { + "context": "object", + "created": "integer", + "destroyed": "boolean", + "id": "string", + "name": "string", + "owner": "object", + "owner_destroyed": "boolean", + "policies": "array", + "policy": "object", + "source": "object", + "suffix": "string", + "time_remaining": "integer" + } + }, + { + "Cmdlet": "New-PfbFileSystemSnapshot", + "Verb": "New", + "Parameter": "SourceName", + "Producer": "GET /file-system-snapshots/policies", + "IsPrimary": false, + "FromExample": false, + "WireName": null, + "IsCandidate": false, + "Gate": "SelectorUnresolved", + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", + "FilledParameter": [ + "SourceName" + ], + "ProbeProperties": [ + "context", + "member", + "policy" + ], + "ProbeTypes": { + "context": "object", + "member": "object", + "policy": "object" + } + }, + { + "Cmdlet": "New-PfbFileSystemSnapshot", + "Verb": "New", + "Parameter": "SourceName", + "Producer": "GET /file-system-snapshots/transfer", + "IsPrimary": false, + "FromExample": false, + "WireName": null, + "IsCandidate": false, + "Gate": "SelectorUnresolved", + "ValueFromPipeline": false, + "Outcome": "NoSelector", + "Evidence": "the parameter resolves to no wire key, so nothing can be attributed to it", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": null, + "FilledParameter": [], + "ProbeProperties": [ + "completed", + "context", + "data_transferred", + "direction", + "id", + "local_snapshot", + "name", + "progress", + "remote", + "remote_snapshot", + "started", + "status" + ], + "ProbeTypes": { + "completed": "integer", + "context": "object", + "data_transferred": "integer", + "direction": "string", + "id": "string", + "local_snapshot": "object", + "name": "string", + "progress": "number", + "remote": "object", + "remote_snapshot": "object", + "started": "integer", + "status": "string" + } + }, + { + "Cmdlet": "New-PfbFileSystemSnapshot", + "Verb": "New", + "Parameter": "SourceName", + "Producer": "GET /file-systems", + "IsPrimary": false, + "FromExample": true, + "WireName": null, + "IsCandidate": false, + "Gate": "SelectorUnresolved", + "ValueFromPipeline": false, + "Outcome": "NoSelector", + "Evidence": "the parameter resolves to no wire key, so nothing can be attributed to it", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": null, + "FilledParameter": [], + "ProbeProperties": [ + "context", + "created", + "default_group_quota", + "default_user_quota", + "destroyed", + "eradication_config", + "fast_remove_directory_enabled", + "group_ownership", + "hard_limit_enabled", + "http", + "id", + "multi_protocol", + "name", + "nfs", + "node_group", + "promotion_status", + "provisioned", + "qos_policy", + "realms", + "requested_promotion_state", + "smb", + "snapshot_directory_enabled", + "source", + "space", + "storage_class", + "time_remaining", + "workload", + "writable" + ], + "ProbeTypes": { + "context": "object", + "created": "integer", + "default_group_quota": "integer", + "default_user_quota": "integer", + "destroyed": "boolean", + "eradication_config": "object", + "fast_remove_directory_enabled": "boolean", + "group_ownership": "string", + "hard_limit_enabled": "boolean", + "http": "object", + "id": "string", + "multi_protocol": "object", + "name": "string", + "nfs": "object", + "node_group": "object", + "promotion_status": "string", + "provisioned": "integer", + "qos_policy": "object", + "realms": "array", + "requested_promotion_state": "string", + "smb": "object", + "snapshot_directory_enabled": "boolean", + "source": "object", + "space": "object", + "storage_class": "object", + "time_remaining": "integer", + "workload": "object", + "writable": "boolean" + } + }, + { + "Cmdlet": "New-PfbObjectStoreAccessPolicyRole", + "Verb": "New", + "Parameter": "MemberName", + "Producer": "GET /object-store-access-policies", + "IsPrimary": false, + "FromExample": false, + "WireName": "member_names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", + "FilledParameter": [ + "MemberName", + "PolicyName" + ], + "ProbeProperties": [ + "account", + "arn", + "context", + "created", + "description", + "enabled", + "id", + "is_local", + "location", + "name", + "policy_type", + "realms", + "rules", + "updated" + ], + "ProbeTypes": { + "account": "object", + "arn": "string", + "context": "object", + "created": "integer", + "description": "string", + "enabled": "boolean", + "id": "string", + "is_local": "boolean", + "location": "object", + "name": "string", + "policy_type": "string", + "realms": "array", + "rules": "array", + "updated": "integer" + } + }, + { + "Cmdlet": "New-PfbObjectStoreAccessPolicyRole", + "Verb": "New", + "Parameter": "MemberName", + "Producer": "GET /object-store-access-policies/object-store-roles", + "IsPrimary": true, + "FromExample": true, + "WireName": "member_names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", + "FilledParameter": [ + "MemberName", + "PolicyName" + ], + "ProbeProperties": [ + "context", + "member", + "policy" + ], + "ProbeTypes": { + "context": "object", + "member": "object", + "policy": "object" + } + }, + { + "Cmdlet": "New-PfbObjectStoreAccessPolicyRole", + "Verb": "New", + "Parameter": "MemberName", + "Producer": "GET /object-store-access-policies/object-store-users", + "IsPrimary": false, + "FromExample": false, + "WireName": "member_names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", + "FilledParameter": [ + "MemberName", + "PolicyName" + ], + "ProbeProperties": [ + "context", + "member", + "policy" + ], + "ProbeTypes": { + "context": "object", + "member": "object", + "policy": "object" + } + }, + { + "Cmdlet": "New-PfbObjectStoreAccessPolicyRole", + "Verb": "New", + "Parameter": "MemberName", + "Producer": "GET /object-store-access-policies/rules", + "IsPrimary": false, + "FromExample": false, + "WireName": "member_names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", + "FilledParameter": [ + "MemberName", + "PolicyName" + ], + "ProbeProperties": [ + "actions", + "conditions", + "context", + "effect", + "name", + "policy", + "resources" + ], + "ProbeTypes": { + "actions": "array", + "conditions": "object", + "context": "object", + "effect": "string", + "name": "string", + "policy": "object", + "resources": "array" + } + }, + { + "Cmdlet": "New-PfbObjectStoreAccessPolicyRole", + "Verb": "New", + "Parameter": "PolicyName", + "Producer": "GET /object-store-access-policies", + "IsPrimary": false, + "FromExample": false, + "WireName": "policy_names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", + "FilledParameter": [ + "MemberName", + "PolicyName" + ], + "ProbeProperties": [ + "account", + "arn", + "context", + "created", + "description", + "enabled", + "id", + "is_local", + "location", + "name", + "policy_type", + "realms", + "rules", + "updated" + ], + "ProbeTypes": { + "account": "object", + "arn": "string", + "context": "object", + "created": "integer", + "description": "string", + "enabled": "boolean", + "id": "string", + "is_local": "boolean", + "location": "object", + "name": "string", + "policy_type": "string", + "realms": "array", + "rules": "array", + "updated": "integer" + } + }, + { + "Cmdlet": "New-PfbObjectStoreAccessPolicyRole", + "Verb": "New", + "Parameter": "PolicyName", + "Producer": "GET /object-store-access-policies/object-store-roles", + "IsPrimary": true, + "FromExample": true, + "WireName": "policy_names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", + "FilledParameter": [ + "MemberName", + "PolicyName" + ], + "ProbeProperties": [ + "context", + "member", + "policy" + ], + "ProbeTypes": { + "context": "object", + "member": "object", + "policy": "object" + } + }, + { + "Cmdlet": "New-PfbObjectStoreAccessPolicyRole", + "Verb": "New", + "Parameter": "PolicyName", + "Producer": "GET /object-store-access-policies/object-store-users", + "IsPrimary": false, + "FromExample": false, + "WireName": "policy_names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", + "FilledParameter": [ + "MemberName", + "PolicyName" + ], + "ProbeProperties": [ + "context", + "member", + "policy" + ], + "ProbeTypes": { + "context": "object", + "member": "object", + "policy": "object" + } + }, + { + "Cmdlet": "New-PfbObjectStoreAccessPolicyRole", + "Verb": "New", + "Parameter": "PolicyName", + "Producer": "GET /object-store-access-policies/rules", + "IsPrimary": false, + "FromExample": false, + "WireName": "policy_names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", + "FilledParameter": [ + "MemberName", + "PolicyName" + ], + "ProbeProperties": [ + "actions", + "conditions", + "context", + "effect", + "name", + "policy", + "resources" + ], + "ProbeTypes": { + "actions": "array", + "conditions": "object", + "context": "object", + "effect": "string", + "name": "string", + "policy": "object", + "resources": "array" + } + }, + { + "Cmdlet": "New-PfbObjectStoreAccessPolicyUser", + "Verb": "New", + "Parameter": "MemberName", + "Producer": "GET /object-store-access-policies", + "IsPrimary": false, + "FromExample": false, + "WireName": "member_names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", + "FilledParameter": [ + "MemberName", + "PolicyName" + ], + "ProbeProperties": [ + "account", + "arn", + "context", + "created", + "description", + "enabled", + "id", + "is_local", + "location", + "name", + "policy_type", + "realms", + "rules", + "updated" + ], + "ProbeTypes": { + "account": "object", + "arn": "string", + "context": "object", + "created": "integer", + "description": "string", + "enabled": "boolean", + "id": "string", + "is_local": "boolean", + "location": "object", + "name": "string", + "policy_type": "string", + "realms": "array", + "rules": "array", + "updated": "integer" + } + }, + { + "Cmdlet": "New-PfbObjectStoreAccessPolicyUser", + "Verb": "New", + "Parameter": "MemberName", + "Producer": "GET /object-store-access-policies/object-store-roles", + "IsPrimary": false, + "FromExample": false, + "WireName": "member_names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", + "FilledParameter": [ + "MemberName", + "PolicyName" + ], + "ProbeProperties": [ + "context", + "member", + "policy" + ], + "ProbeTypes": { + "context": "object", + "member": "object", + "policy": "object" + } + }, + { + "Cmdlet": "New-PfbObjectStoreAccessPolicyUser", + "Verb": "New", + "Parameter": "MemberName", + "Producer": "GET /object-store-access-policies/object-store-users", + "IsPrimary": true, + "FromExample": true, + "WireName": "member_names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", + "FilledParameter": [ + "MemberName", + "PolicyName" + ], + "ProbeProperties": [ + "context", + "member", + "policy" + ], + "ProbeTypes": { + "context": "object", + "member": "object", + "policy": "object" + } + }, + { + "Cmdlet": "New-PfbObjectStoreAccessPolicyUser", + "Verb": "New", + "Parameter": "MemberName", + "Producer": "GET /object-store-access-policies/rules", + "IsPrimary": false, + "FromExample": false, + "WireName": "member_names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", + "FilledParameter": [ + "MemberName", + "PolicyName" + ], + "ProbeProperties": [ + "actions", + "conditions", + "context", + "effect", + "name", + "policy", + "resources" + ], + "ProbeTypes": { + "actions": "array", + "conditions": "object", + "context": "object", + "effect": "string", + "name": "string", + "policy": "object", + "resources": "array" + } + }, + { + "Cmdlet": "New-PfbObjectStoreAccessPolicyUser", + "Verb": "New", + "Parameter": "PolicyName", + "Producer": "GET /object-store-access-policies", + "IsPrimary": false, + "FromExample": false, + "WireName": "policy_names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", + "FilledParameter": [ + "MemberName", + "PolicyName" + ], + "ProbeProperties": [ + "account", + "arn", + "context", + "created", + "description", + "enabled", + "id", + "is_local", + "location", + "name", + "policy_type", + "realms", + "rules", + "updated" + ], + "ProbeTypes": { + "account": "object", + "arn": "string", + "context": "object", + "created": "integer", + "description": "string", + "enabled": "boolean", + "id": "string", + "is_local": "boolean", + "location": "object", + "name": "string", + "policy_type": "string", + "realms": "array", + "rules": "array", + "updated": "integer" + } + }, + { + "Cmdlet": "New-PfbObjectStoreAccessPolicyUser", + "Verb": "New", + "Parameter": "PolicyName", + "Producer": "GET /object-store-access-policies/object-store-roles", + "IsPrimary": false, + "FromExample": false, + "WireName": "policy_names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", + "FilledParameter": [ + "MemberName", + "PolicyName" + ], + "ProbeProperties": [ + "context", + "member", + "policy" + ], + "ProbeTypes": { + "context": "object", + "member": "object", + "policy": "object" + } + }, + { + "Cmdlet": "New-PfbObjectStoreAccessPolicyUser", + "Verb": "New", + "Parameter": "PolicyName", + "Producer": "GET /object-store-access-policies/object-store-users", + "IsPrimary": true, + "FromExample": true, + "WireName": "policy_names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", + "FilledParameter": [ + "MemberName", + "PolicyName" + ], + "ProbeProperties": [ + "context", + "member", + "policy" + ], + "ProbeTypes": { + "context": "object", + "member": "object", + "policy": "object" + } + }, + { + "Cmdlet": "New-PfbObjectStoreAccessPolicyUser", + "Verb": "New", + "Parameter": "PolicyName", + "Producer": "GET /object-store-access-policies/rules", + "IsPrimary": false, + "FromExample": false, + "WireName": "policy_names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", + "FilledParameter": [ + "MemberName", + "PolicyName" + ], + "ProbeProperties": [ + "actions", + "conditions", + "context", + "effect", + "name", + "policy", + "resources" + ], + "ProbeTypes": { + "actions": "array", + "conditions": "object", + "context": "object", + "effect": "string", + "name": "string", + "policy": "object", + "resources": "array" + } + }, + { + "Cmdlet": "New-PfbObjectStoreUserAccessPolicy", + "Verb": "New", + "Parameter": "MemberName", + "Producer": "GET /object-store-users", + "IsPrimary": false, + "FromExample": false, + "WireName": "member_names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", + "FilledParameter": [ + "MemberName", + "PolicyName" + ], + "ProbeProperties": [ + "access_keys", + "account", + "context", + "created", + "id", + "name" + ], + "ProbeTypes": { + "access_keys": "array", + "account": "object", + "context": "object", + "created": "integer", + "id": "string", + "name": "string" + } + }, + { + "Cmdlet": "New-PfbObjectStoreUserAccessPolicy", + "Verb": "New", + "Parameter": "MemberName", + "Producer": "GET /object-store-users/object-store-access-policies", + "IsPrimary": true, + "FromExample": true, + "WireName": "member_names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", + "FilledParameter": [ + "MemberName", + "PolicyName" + ], + "ProbeProperties": [ + "context", + "member", + "policy" + ], + "ProbeTypes": { + "context": "object", + "member": "object", + "policy": "object" + } + }, + { + "Cmdlet": "New-PfbObjectStoreUserAccessPolicy", + "Verb": "New", + "Parameter": "PolicyName", + "Producer": "GET /object-store-users", + "IsPrimary": false, + "FromExample": false, + "WireName": "policy_names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", + "FilledParameter": [ + "MemberName", + "PolicyName" + ], + "ProbeProperties": [ + "access_keys", + "account", + "context", + "created", + "id", + "name" + ], + "ProbeTypes": { + "access_keys": "array", + "account": "object", + "context": "object", + "created": "integer", + "id": "string", + "name": "string" + } + }, + { + "Cmdlet": "New-PfbObjectStoreUserAccessPolicy", + "Verb": "New", + "Parameter": "PolicyName", + "Producer": "GET /object-store-users/object-store-access-policies", + "IsPrimary": true, + "FromExample": true, + "WireName": "policy_names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", + "FilledParameter": [ + "MemberName", + "PolicyName" + ], + "ProbeProperties": [ + "context", + "member", + "policy" + ], + "ProbeTypes": { + "context": "object", + "member": "object", + "policy": "object" + } + }, + { + "Cmdlet": "Remove-PfbActiveDirectory", + "Verb": "Remove", + "Parameter": "Name", + "Producer": "GET /active-directory", + "IsPrimary": true, + "FromExample": true, + "WireName": "names", + "IsCandidate": false, + "Gate": "Matched", + "ValueFromPipeline": true, + "Outcome": "Bound", + "Evidence": "names=PROBE-name (from property 'name')", + "BoundWireKey": "names", + "BoundValue": "PROBE-name", + "ErrorKind": null, + "FilledParameter": [], + "ProbeProperties": [ + "ca_certificate", + "ca_certificate_group", + "computer_name", + "directory_servers", + "domain", + "encryption_types", + "global_catalog_servers", + "id", + "join_ou", + "kerberos_servers", + "name", + "realms", + "server", + "service_principal_names" + ], + "ProbeTypes": { + "ca_certificate": "object", + "ca_certificate_group": "object", + "computer_name": "string", + "directory_servers": "array", + "domain": "string", + "encryption_types": "array", + "global_catalog_servers": "array", + "id": "string", + "join_ou": "string", + "kerberos_servers": "array", + "name": "string", + "realms": "array", + "server": "object", + "service_principal_names": "array" + } + }, + { + "Cmdlet": "Remove-PfbActiveDirectory", + "Verb": "Remove", + "Parameter": "Name", + "Producer": "GET /active-directory/test", + "IsPrimary": false, + "FromExample": false, + "WireName": "names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": true, + "Outcome": "Coerced", + "Evidence": "names=@{component_address=PROBE-component_address; component_name=PROBE-component_name; context=; description=PROBE-description; destination=PROBE-destination; enabled=PROBE-enabled; resource=; result_details=PROBE-result_details; success=PROBE-success; test_type=PROBE-test_type}", + "BoundWireKey": "names", + "BoundValue": "@{component_address=PROBE-component_address; component_name=PROBE-component_name; context=; description=PROBE-description; destination=PROBE-destination; enabled=PROBE-enabled; resource=; result_details=PROBE-result_details; success=PROBE-success; test_type=PROBE-test_type}", + "ErrorKind": null, + "FilledParameter": [], + "ProbeProperties": [ + "component_address", + "component_name", + "context", + "description", + "destination", + "enabled", + "resource", + "result_details", + "success", + "test_type" + ], + "ProbeTypes": { + "component_address": "string", + "component_name": "string", + "context": "object", + "description": "string", + "destination": "string", + "enabled": "boolean", + "resource": "object", + "result_details": "string", + "success": "boolean", + "test_type": "string" + } + }, + { + "Cmdlet": "Remove-PfbAdminCache", + "Verb": "Remove", + "Parameter": "Name", + "Producer": "GET /admins", + "IsPrimary": false, + "FromExample": false, + "WireName": "names", + "IsCandidate": false, + "Gate": "Matched", + "ValueFromPipeline": true, + "Outcome": "Bound", + "Evidence": "names=PROBE-name (from property 'name')", + "BoundWireKey": "names", + "BoundValue": "PROBE-name", + "ErrorKind": null, + "FilledParameter": [], + "ProbeProperties": [ + "admin_type", + "api_token", + "authorization_model", + "context", + "id", + "is_local", + "locked", + "lockout_remaining", + "management_access_policies", + "name", + "public_key", + "role" + ], + "ProbeTypes": { + "admin_type": "string", + "api_token": "object", + "authorization_model": "string", + "context": "object", + "id": "string", + "is_local": "boolean", + "locked": "boolean", + "lockout_remaining": "integer", + "management_access_policies": "array", + "name": "string", + "public_key": "string", + "role": "object" + } + }, + { + "Cmdlet": "Remove-PfbAdminCache", + "Verb": "Remove", + "Parameter": "Name", + "Producer": "GET /admins/api-tokens", + "IsPrimary": false, + "FromExample": false, + "WireName": "names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": true, + "Outcome": "Coerced", + "Evidence": "names=@{admin=; api_token=; context=}", + "BoundWireKey": "names", + "BoundValue": "@{admin=; api_token=; context=}", + "ErrorKind": null, + "FilledParameter": [], + "ProbeProperties": [ + "admin", + "api_token", + "context" + ], + "ProbeTypes": { + "admin": "object", + "api_token": "object", + "context": "object" + } + }, + { + "Cmdlet": "Remove-PfbAdminCache", + "Verb": "Remove", + "Parameter": "Name", + "Producer": "GET /admins/cache", + "IsPrimary": true, + "FromExample": true, + "WireName": "names", + "IsCandidate": false, + "Gate": "Matched", + "ValueFromPipeline": true, + "Outcome": "Bound", + "Evidence": "names=PROBE-name (from property 'name')", + "BoundWireKey": "names", + "BoundValue": "PROBE-name", + "ErrorKind": null, + "FilledParameter": [], + "ProbeProperties": [ + "authorization_model", + "context", + "id", + "management_access_policies", + "name", + "role", + "time" + ], + "ProbeTypes": { + "authorization_model": "string", + "context": "object", + "id": "string", + "management_access_policies": "array", + "name": "string", + "role": "object", + "time": "integer" + } + }, + { + "Cmdlet": "Remove-PfbAdminCache", + "Verb": "Remove", + "Parameter": "Name", + "Producer": "GET /admins/management-access-policies", + "IsPrimary": false, + "FromExample": false, + "WireName": "names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": true, + "Outcome": "Coerced", + "Evidence": "names=@{context=; member=; policy=}", + "BoundWireKey": "names", + "BoundValue": "@{context=; member=; policy=}", + "ErrorKind": null, + "FilledParameter": [], + "ProbeProperties": [ + "context", + "member", + "policy" + ], + "ProbeTypes": { + "context": "object", + "member": "object", + "policy": "object" + } + }, + { + "Cmdlet": "Remove-PfbAdminCache", + "Verb": "Remove", + "Parameter": "Name", + "Producer": "GET /admins/management-authentication-policies", + "IsPrimary": false, + "FromExample": false, + "WireName": "names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": true, + "Outcome": "Coerced", + "Evidence": "names=@{context=; member=; policy=}", + "BoundWireKey": "names", + "BoundValue": "@{context=; member=; policy=}", + "ErrorKind": null, + "FilledParameter": [], + "ProbeProperties": [ + "context", + "member", + "policy" + ], + "ProbeTypes": { + "context": "object", + "member": "object", + "policy": "object" + } + }, + { + "Cmdlet": "Remove-PfbAdminCache", + "Verb": "Remove", + "Parameter": "Name", + "Producer": "GET /admins/settings", + "IsPrimary": false, + "FromExample": false, + "WireName": "names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": true, + "Outcome": "Coerced", + "Evidence": "names=@{lockout_duration=PROBE-lockout_duration; max_login_attempts=PROBE-max_login_attempts; min_password_length=PROBE-min_password_length}", + "BoundWireKey": "names", + "BoundValue": "@{lockout_duration=PROBE-lockout_duration; max_login_attempts=PROBE-max_login_attempts; min_password_length=PROBE-min_password_length}", + "ErrorKind": null, + "FilledParameter": [], + "ProbeProperties": [ + "lockout_duration", + "max_login_attempts", + "min_password_length" + ], + "ProbeTypes": { + "lockout_duration": "integer", + "max_login_attempts": "integer", + "min_password_length": "integer" + } + }, + { + "Cmdlet": "Remove-PfbAdminCache", + "Verb": "Remove", + "Parameter": "Name", + "Producer": "GET /admins/ssh-certificate-authority-policies", + "IsPrimary": false, + "FromExample": false, + "WireName": "names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": true, + "Outcome": "Coerced", + "Evidence": "names=@{context=; member=; policy=}", + "BoundWireKey": "names", + "BoundValue": "@{context=; member=; policy=}", + "ErrorKind": null, + "FilledParameter": [], + "ProbeProperties": [ + "context", + "member", + "policy" + ], + "ProbeTypes": { + "context": "object", + "member": "object", + "policy": "object" + } + }, + { + "Cmdlet": "Remove-PfbAlertWatcher", + "Verb": "Remove", + "Parameter": "Name", + "Producer": "GET /alert-watchers", + "IsPrimary": true, + "FromExample": false, + "WireName": "names", + "IsCandidate": false, + "Gate": "Matched", + "ValueFromPipeline": true, + "Outcome": "Bound", + "Evidence": "names=PROBE-name (from property 'name')", + "BoundWireKey": "names", + "BoundValue": "PROBE-name", + "ErrorKind": null, + "FilledParameter": [], + "ProbeProperties": [ + "enabled", + "id", + "minimum_notification_severity", + "name" + ], + "ProbeTypes": { + "enabled": "boolean", + "id": "string", + "minimum_notification_severity": "string", + "name": "string" + } + }, + { + "Cmdlet": "Remove-PfbAlertWatcher", + "Verb": "Remove", + "Parameter": "Name", + "Producer": "GET /alert-watchers/test", + "IsPrimary": false, + "FromExample": false, + "WireName": "names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": true, + "Outcome": "Coerced", + "Evidence": "names=@{component_address=PROBE-component_address; component_name=PROBE-component_name; description=PROBE-description; destination=PROBE-destination; enabled=PROBE-enabled; resource=; result_details=PROBE-result_details; success=PROBE-success; test_type=PROBE-test_type}", + "BoundWireKey": "names", + "BoundValue": "@{component_address=PROBE-component_address; component_name=PROBE-component_name; description=PROBE-description; destination=PROBE-destination; enabled=PROBE-enabled; resource=; result_details=PROBE-result_details; success=PROBE-success; test_type=PROBE-test_type}", + "ErrorKind": null, + "FilledParameter": [], "ProbeProperties": [ "component_address", "component_name", + "description", + "destination", + "enabled", + "resource", + "result_details", + "success", + "test_type" + ], + "ProbeTypes": { + "component_address": "string", + "component_name": "string", + "description": "string", + "destination": "string", + "enabled": "boolean", + "resource": "object", + "result_details": "string", + "success": "boolean", + "test_type": "string" + } + }, + { + "Cmdlet": "Remove-PfbApiClient", + "Verb": "Remove", + "Parameter": "Name", + "Producer": "GET /api-clients", + "IsPrimary": true, + "FromExample": true, + "WireName": "names", + "IsCandidate": false, + "Gate": "Matched", + "ValueFromPipeline": true, + "Outcome": "Bound", + "Evidence": "names=PROBE-name (from property 'name')", + "BoundWireKey": "names", + "BoundValue": "PROBE-name", + "ErrorKind": null, + "FilledParameter": [], + "ProbeProperties": [ + "access_policies", + "access_token_ttl_in_ms", + "enabled", + "id", + "issuer", + "key_id", + "max_role", + "name", + "public_key" + ], + "ProbeTypes": { + "access_policies": "array", + "access_token_ttl_in_ms": "integer", + "enabled": "boolean", + "id": "string", + "issuer": "string", + "key_id": "string", + "max_role": "object", + "name": "string", + "public_key": "string" + } + }, + { + "Cmdlet": "Remove-PfbApiToken", + "Verb": "Remove", + "Parameter": "Name", + "Producer": "GET /admins", + "IsPrimary": false, + "FromExample": false, + "WireName": "admin_names", + "IsCandidate": false, + "Gate": "Matched", + "ValueFromPipeline": true, + "Outcome": "Bound", + "Evidence": "admin_names=PROBE-name (from property 'name')", + "BoundWireKey": "admin_names", + "BoundValue": "PROBE-name", + "ErrorKind": null, + "FilledParameter": [], + "ProbeProperties": [ + "admin_type", + "api_token", + "authorization_model", + "context", + "id", + "is_local", + "locked", + "lockout_remaining", + "management_access_policies", + "name", + "public_key", + "role" + ], + "ProbeTypes": { + "admin_type": "string", + "api_token": "object", + "authorization_model": "string", + "context": "object", + "id": "string", + "is_local": "boolean", + "locked": "boolean", + "lockout_remaining": "integer", + "management_access_policies": "array", + "name": "string", + "public_key": "string", + "role": "object" + } + }, + { + "Cmdlet": "Remove-PfbApiToken", + "Verb": "Remove", + "Parameter": "Name", + "Producer": "GET /admins/api-tokens", + "IsPrimary": true, + "FromExample": false, + "WireName": "admin_names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": true, + "Outcome": "Guarded", + "Evidence": "-Name received a stringified object ('@{admin=; api_token=; context=}') instead of an administrator name. Get-PfbApiToken output has no top-level name property -- the administrator name is nested at .admin.name -- so a piped API-token object is coerced whole into -Name. Pipe the name instead, e.g. Get-PfbApiToken | ForEach-Object { $_.admin.name } | Remove-PfbApiToken, or pass -Name explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", + "FilledParameter": [], + "ProbeProperties": [ + "admin", + "api_token", + "context" + ], + "ProbeTypes": { + "admin": "object", + "api_token": "object", + "context": "object" + } + }, + { + "Cmdlet": "Remove-PfbApiToken", + "Verb": "Remove", + "Parameter": "Name", + "Producer": "GET /admins/cache", + "IsPrimary": false, + "FromExample": false, + "WireName": "admin_names", + "IsCandidate": false, + "Gate": "Matched", + "ValueFromPipeline": true, + "Outcome": "Bound", + "Evidence": "admin_names=PROBE-name (from property 'name')", + "BoundWireKey": "admin_names", + "BoundValue": "PROBE-name", + "ErrorKind": null, + "FilledParameter": [], + "ProbeProperties": [ + "authorization_model", + "context", + "id", + "management_access_policies", + "name", + "role", + "time" + ], + "ProbeTypes": { + "authorization_model": "string", + "context": "object", + "id": "string", + "management_access_policies": "array", + "name": "string", + "role": "object", + "time": "integer" + } + }, + { + "Cmdlet": "Remove-PfbApiToken", + "Verb": "Remove", + "Parameter": "Name", + "Producer": "GET /admins/management-access-policies", + "IsPrimary": false, + "FromExample": false, + "WireName": "admin_names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": true, + "Outcome": "Guarded", + "Evidence": "-Name received a stringified object ('@{context=; member=; policy=}') instead of an administrator name. Get-PfbApiToken output has no top-level name property -- the administrator name is nested at .admin.name -- so a piped API-token object is coerced whole into -Name. Pipe the name instead, e.g. Get-PfbApiToken | ForEach-Object { $_.admin.name } | Remove-PfbApiToken, or pass -Name explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", + "FilledParameter": [], + "ProbeProperties": [ + "context", + "member", + "policy" + ], + "ProbeTypes": { + "context": "object", + "member": "object", + "policy": "object" + } + }, + { + "Cmdlet": "Remove-PfbApiToken", + "Verb": "Remove", + "Parameter": "Name", + "Producer": "GET /admins/management-authentication-policies", + "IsPrimary": false, + "FromExample": false, + "WireName": "admin_names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": true, + "Outcome": "Guarded", + "Evidence": "-Name received a stringified object ('@{context=; member=; policy=}') instead of an administrator name. Get-PfbApiToken output has no top-level name property -- the administrator name is nested at .admin.name -- so a piped API-token object is coerced whole into -Name. Pipe the name instead, e.g. Get-PfbApiToken | ForEach-Object { $_.admin.name } | Remove-PfbApiToken, or pass -Name explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", + "FilledParameter": [], + "ProbeProperties": [ + "context", + "member", + "policy" + ], + "ProbeTypes": { + "context": "object", + "member": "object", + "policy": "object" + } + }, + { + "Cmdlet": "Remove-PfbApiToken", + "Verb": "Remove", + "Parameter": "Name", + "Producer": "GET /admins/settings", + "IsPrimary": false, + "FromExample": false, + "WireName": "admin_names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": true, + "Outcome": "Guarded", + "Evidence": "-Name received a stringified object ('@{lockout_duration=PROBE-lockout_duration; max_login_attempts=PROBE-max_login_attempts; min_password_length=PROBE-min_password_length}') instead of an administrator name. Get-PfbApiToken output has no top-level name property -- the administrator name is nested at .admin.name -- so a piped API-token object is coerced whole into -Name. Pipe the name instead, e.g. Get-PfbApiToken | ForEach-Object { $_.admin.name } | Remove-PfbApiToken, or pass -Name explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", + "FilledParameter": [], + "ProbeProperties": [ + "lockout_duration", + "max_login_attempts", + "min_password_length" + ], + "ProbeTypes": { + "lockout_duration": "integer", + "max_login_attempts": "integer", + "min_password_length": "integer" + } + }, + { + "Cmdlet": "Remove-PfbApiToken", + "Verb": "Remove", + "Parameter": "Name", + "Producer": "GET /admins/ssh-certificate-authority-policies", + "IsPrimary": false, + "FromExample": false, + "WireName": "admin_names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": true, + "Outcome": "Guarded", + "Evidence": "-Name received a stringified object ('@{context=; member=; policy=}') instead of an administrator name. Get-PfbApiToken output has no top-level name property -- the administrator name is nested at .admin.name -- so a piped API-token object is coerced whole into -Name. Pipe the name instead, e.g. Get-PfbApiToken | ForEach-Object { $_.admin.name } | Remove-PfbApiToken, or pass -Name explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", + "FilledParameter": [], + "ProbeProperties": [ + "context", + "member", + "policy" + ], + "ProbeTypes": { + "context": "object", + "member": "object", + "policy": "object" + } + }, + { + "Cmdlet": "Remove-PfbArrayConnection", + "Verb": "Remove", + "Parameter": "Id", + "Producer": "GET /array-connections", + "IsPrimary": true, + "FromExample": false, + "WireName": "ids", + "IsCandidate": false, + "Gate": "Matched", + "ValueFromPipeline": false, + "Outcome": "Bound", + "Evidence": "ids=PROBE-id (from property 'id')", + "BoundWireKey": "ids", + "BoundValue": "PROBE-id", + "ErrorKind": null, + "FilledParameter": [], + "ProbeProperties": [ + "ca_certificate_group", + "context", + "encrypted", + "id", + "management_address", + "os", + "remote", + "replication_addresses", + "status", + "throttle", + "type", + "version" + ], + "ProbeTypes": { + "ca_certificate_group": "object", + "context": "object", + "encrypted": "boolean", + "id": "string", + "management_address": "string", + "os": "string", + "remote": "object", + "replication_addresses": "array", + "status": "string", + "throttle": "object", + "type": "string", + "version": "string" + } + }, + { + "Cmdlet": "Remove-PfbArrayConnection", + "Verb": "Remove", + "Parameter": "Id", + "Producer": "GET /array-connections/connection-key", + "IsPrimary": false, + "FromExample": false, + "WireName": "ids", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": false, + "Outcome": "Guarded", + "Evidence": "-RemoteName received a stringified object ('@{connection_key=PROBE-connection_key; created=PROBE-created; expires=PROBE-expires}') instead of a remote array name. A piped object that binds to neither -Id nor a name property is coerced whole into -RemoteName. Pipe the remote name instead, e.g. Get-PfbArrayConnection | Select-Object -ExpandProperty remote | Select-Object -ExpandProperty name | Get-PfbArrayConnectionPath, or pass -RemoteName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", + "FilledParameter": [], + "ProbeProperties": [ + "connection_key", + "created", + "expires" + ], + "ProbeTypes": { + "connection_key": "string", + "created": "integer", + "expires": "integer" + } + }, + { + "Cmdlet": "Remove-PfbArrayConnection", + "Verb": "Remove", + "Parameter": "Id", + "Producer": "GET /array-connections/path", + "IsPrimary": false, + "FromExample": false, + "WireName": "ids", + "IsCandidate": false, + "Gate": "Matched", + "ValueFromPipeline": false, + "Outcome": "Bound", + "Evidence": "ids=PROBE-id (from property 'id')", + "BoundWireKey": "ids", + "BoundValue": "PROBE-id", + "ErrorKind": null, + "FilledParameter": [], + "ProbeProperties": [ "context", - "description", "destination", - "enabled", - "resource", - "result_details", - "success", - "test_type" + "id", + "remote", + "source", + "status", + "status_details", + "type" + ], + "ProbeTypes": { + "context": "object", + "destination": "string", + "id": "string", + "remote": "object", + "source": "string", + "status": "string", + "status_details": "string", + "type": "string" + } + }, + { + "Cmdlet": "Remove-PfbArrayConnection", + "Verb": "Remove", + "Parameter": "Id", + "Producer": "GET /array-connections/performance/replication", + "IsPrimary": false, + "FromExample": false, + "WireName": "ids", + "IsCandidate": false, + "Gate": "Matched", + "ValueFromPipeline": false, + "Outcome": "Bound", + "Evidence": "ids=PROBE-id (from property 'id')", + "BoundWireKey": "ids", + "BoundValue": "PROBE-id", + "ErrorKind": null, + "FilledParameter": [], + "ProbeProperties": [ + "aggregate", + "continuous", + "id", + "periodic", + "remote", + "time" + ], + "ProbeTypes": { + "aggregate": "object", + "continuous": "object", + "id": "string", + "periodic": "object", + "remote": "object", + "time": "integer" + } + }, + { + "Cmdlet": "Remove-PfbArrayConnection", + "Verb": "Remove", + "Parameter": "RemoteName", + "Producer": "GET /array-connections", + "IsPrimary": true, + "FromExample": false, + "WireName": "remote_names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": true, + "Outcome": "NoSelector", + "Evidence": "the request carried no 'remote_names' key, so this parameter did not bind", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": null, + "FilledParameter": [], + "ProbeProperties": [ + "ca_certificate_group", + "context", + "encrypted", + "id", + "management_address", + "os", + "remote", + "replication_addresses", + "status", + "throttle", + "type", + "version" + ], + "ProbeTypes": { + "ca_certificate_group": "object", + "context": "object", + "encrypted": "boolean", + "id": "string", + "management_address": "string", + "os": "string", + "remote": "object", + "replication_addresses": "array", + "status": "string", + "throttle": "object", + "type": "string", + "version": "string" + } + }, + { + "Cmdlet": "Remove-PfbArrayConnection", + "Verb": "Remove", + "Parameter": "RemoteName", + "Producer": "GET /array-connections/connection-key", + "IsPrimary": false, + "FromExample": false, + "WireName": "remote_names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": true, + "Outcome": "Guarded", + "Evidence": "-RemoteName received a stringified object ('@{connection_key=PROBE-connection_key; created=PROBE-created; expires=PROBE-expires}') instead of a remote array name. A piped object that binds to neither -Id nor a name property is coerced whole into -RemoteName. Pipe the remote name instead, e.g. Get-PfbArrayConnection | Select-Object -ExpandProperty remote | Select-Object -ExpandProperty name | Get-PfbArrayConnectionPath, or pass -RemoteName explicitly.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "CmdletError", + "FilledParameter": [], + "ProbeProperties": [ + "connection_key", + "created", + "expires" + ], + "ProbeTypes": { + "connection_key": "string", + "created": "integer", + "expires": "integer" + } + }, + { + "Cmdlet": "Remove-PfbArrayConnection", + "Verb": "Remove", + "Parameter": "RemoteName", + "Producer": "GET /array-connections/path", + "IsPrimary": false, + "FromExample": false, + "WireName": "remote_names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": true, + "Outcome": "NoSelector", + "Evidence": "the request carried no 'remote_names' key, so this parameter did not bind", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": null, + "FilledParameter": [], + "ProbeProperties": [ + "context", + "destination", + "id", + "remote", + "source", + "status", + "status_details", + "type" ], "ProbeTypes": { - "component_address": "string", - "component_name": "string", "context": "object", - "description": "string", "destination": "string", + "id": "string", + "remote": "object", + "source": "string", + "status": "string", + "status_details": "string", + "type": "string" + } + }, + { + "Cmdlet": "Remove-PfbArrayConnection", + "Verb": "Remove", + "Parameter": "RemoteName", + "Producer": "GET /array-connections/performance/replication", + "IsPrimary": false, + "FromExample": false, + "WireName": "remote_names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": true, + "Outcome": "NoSelector", + "Evidence": "the request carried no 'remote_names' key, so this parameter did not bind", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": null, + "FilledParameter": [], + "ProbeProperties": [ + "aggregate", + "continuous", + "id", + "periodic", + "remote", + "time" + ], + "ProbeTypes": { + "aggregate": "object", + "continuous": "object", + "id": "string", + "periodic": "object", + "remote": "object", + "time": "integer" + } + }, + { + "Cmdlet": "Remove-PfbAuditFileSystemPolicy", + "Verb": "Remove", + "Parameter": "Name", + "Producer": "GET /audit-file-systems-policies", + "IsPrimary": true, + "FromExample": true, + "WireName": "names", + "IsCandidate": false, + "Gate": "Matched", + "ValueFromPipeline": true, + "Outcome": "Bound", + "Evidence": "names=PROBE-name (from property 'name')", + "BoundWireKey": "names", + "BoundValue": "PROBE-name", + "ErrorKind": null, + "FilledParameter": [], + "ProbeProperties": [ + "context", + "control_type", + "enabled", + "id", + "is_local", + "location", + "log_targets", + "name", + "policy_type", + "realms", + "rules" + ], + "ProbeTypes": { + "context": "object", + "control_type": "string", "enabled": "boolean", - "resource": "object", - "result_details": "string", - "success": "boolean", - "test_type": "string" + "id": "string", + "is_local": "boolean", + "location": "object", + "log_targets": "array", + "name": "string", + "policy_type": "string", + "realms": "array", + "rules": "array" } }, { - "Cmdlet": "Remove-PfbAdminCache", + "Cmdlet": "Remove-PfbAuditFileSystemPolicy", "Verb": "Remove", "Parameter": "Name", - "Producer": "GET /admins", + "Producer": "GET /audit-file-systems-policies/members", "IsPrimary": false, "FromExample": false, "WireName": "names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": true, + "Outcome": "Coerced", + "Evidence": "names=@{context=; member=; policy=}", + "BoundWireKey": "names", + "BoundValue": "@{context=; member=; policy=}", + "ErrorKind": null, + "FilledParameter": [], + "ProbeProperties": [ + "context", + "member", + "policy" + ], + "ProbeTypes": { + "context": "object", + "member": "object", + "policy": "object" + } + }, + { + "Cmdlet": "Remove-PfbAuditObjectStorePolicy", + "Verb": "Remove", + "Parameter": "Name", + "Producer": "GET /audit-object-store-policies", + "IsPrimary": true, + "FromExample": true, + "WireName": "names", "IsCandidate": false, "Gate": "Matched", "ValueFromPipeline": true, @@ -23326,39 +26126,33 @@ "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ - "admin_type", - "api_token", - "authorization_model", "context", + "enabled", "id", "is_local", - "locked", - "lockout_remaining", - "management_access_policies", + "location", + "log_targets", "name", - "public_key", - "role" + "policy_type", + "realms" ], "ProbeTypes": { - "admin_type": "string", - "api_token": "object", - "authorization_model": "string", "context": "object", + "enabled": "boolean", "id": "string", "is_local": "boolean", - "locked": "boolean", - "lockout_remaining": "integer", - "management_access_policies": "array", + "location": "object", + "log_targets": "array", "name": "string", - "public_key": "string", - "role": "object" + "policy_type": "string", + "realms": "array" } }, { - "Cmdlet": "Remove-PfbAdminCache", + "Cmdlet": "Remove-PfbAuditObjectStorePolicy", "Verb": "Remove", "Parameter": "Name", - "Producer": "GET /admins/api-tokens", + "Producer": "GET /audit-object-store-policies/members", "IsPrimary": false, "FromExample": false, "WireName": "names", @@ -23366,29 +26160,29 @@ "Gate": "Candidate", "ValueFromPipeline": true, "Outcome": "Coerced", - "Evidence": "names=@{admin=; api_token=; context=}", + "Evidence": "names=@{context=; member=; policy=}", "BoundWireKey": "names", - "BoundValue": "@{admin=; api_token=; context=}", + "BoundValue": "@{context=; member=; policy=}", "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ - "admin", - "api_token", - "context" + "context", + "member", + "policy" ], "ProbeTypes": { - "admin": "object", - "api_token": "object", - "context": "object" + "context": "object", + "member": "object", + "policy": "object" } }, { - "Cmdlet": "Remove-PfbAdminCache", + "Cmdlet": "Remove-PfbBucket", "Verb": "Remove", "Parameter": "Name", - "Producer": "GET /admins/cache", + "Producer": "GET /buckets", "IsPrimary": true, - "FromExample": true, + "FromExample": false, "WireName": "names", "IsCandidate": false, "Gate": "Matched", @@ -23400,142 +26194,210 @@ "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ - "authorization_model", + "account", + "bucket_type", "context", + "created", + "destroyed", + "eradication_config", + "hard_limit_enabled", "id", - "management_access_policies", "name", - "role", - "time" + "object_count", + "object_lock_config", + "public_access_config", + "public_status", + "qos_policy", + "quota_limit", + "retention_lock", + "space", + "storage_class", + "time_remaining", + "time_remaining_status", + "versioning" ], "ProbeTypes": { - "authorization_model": "string", + "account": "object", + "bucket_type": "string", "context": "object", + "created": "integer", + "destroyed": "boolean", + "eradication_config": "object", + "hard_limit_enabled": "boolean", "id": "string", - "management_access_policies": "array", "name": "string", - "role": "object", - "time": "integer" + "object_count": "integer", + "object_lock_config": "object", + "public_access_config": "object", + "public_status": "string", + "qos_policy": "object", + "quota_limit": "integer", + "retention_lock": "string", + "space": "object", + "storage_class": "object", + "time_remaining": "integer", + "time_remaining_status": "string", + "versioning": "string" } }, { - "Cmdlet": "Remove-PfbAdminCache", + "Cmdlet": "Remove-PfbBucket", "Verb": "Remove", "Parameter": "Name", - "Producer": "GET /admins/management-access-policies", + "Producer": "GET /buckets/audit-filters", "IsPrimary": false, "FromExample": false, "WireName": "names", - "IsCandidate": true, - "Gate": "Candidate", + "IsCandidate": false, + "Gate": "Matched", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "names=@{context=; member=; policy=}", + "Outcome": "Bound", + "Evidence": "names=PROBE-name (from property 'name')", "BoundWireKey": "names", - "BoundValue": "@{context=; member=; policy=}", + "BoundValue": "PROBE-name", "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ + "actions", + "bucket", "context", - "member", - "policy" + "name", + "s3_prefixes" ], "ProbeTypes": { + "actions": "array", + "bucket": "object", "context": "object", - "member": "object", - "policy": "object" + "name": "string", + "s3_prefixes": "array" } }, { - "Cmdlet": "Remove-PfbAdminCache", + "Cmdlet": "Remove-PfbBucket", "Verb": "Remove", "Parameter": "Name", - "Producer": "GET /admins/management-authentication-policies", + "Producer": "GET /buckets/bucket-access-policies", "IsPrimary": false, "FromExample": false, "WireName": "names", - "IsCandidate": true, - "Gate": "Candidate", + "IsCandidate": false, + "Gate": "Matched", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "names=@{context=; member=; policy=}", + "Outcome": "Bound", + "Evidence": "names=PROBE-name (from property 'name')", "BoundWireKey": "names", - "BoundValue": "@{context=; member=; policy=}", + "BoundValue": "PROBE-name", "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ + "bucket", "context", - "member", - "policy" + "enabled", + "id", + "is_local", + "location", + "name", + "policy_type", + "realms", + "rules" ], "ProbeTypes": { + "bucket": "object", "context": "object", - "member": "object", - "policy": "object" + "enabled": "boolean", + "id": "string", + "is_local": "boolean", + "location": "object", + "name": "string", + "policy_type": "string", + "realms": "array", + "rules": "array" } }, { - "Cmdlet": "Remove-PfbAdminCache", + "Cmdlet": "Remove-PfbBucket", "Verb": "Remove", "Parameter": "Name", - "Producer": "GET /admins/settings", + "Producer": "GET /buckets/bucket-access-policies/rules", "IsPrimary": false, "FromExample": false, "WireName": "names", - "IsCandidate": true, - "Gate": "Candidate", + "IsCandidate": false, + "Gate": "Matched", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "names=@{lockout_duration=PROBE-lockout_duration; max_login_attempts=PROBE-max_login_attempts; min_password_length=PROBE-min_password_length}", + "Outcome": "Bound", + "Evidence": "names=PROBE-name (from property 'name')", "BoundWireKey": "names", - "BoundValue": "@{lockout_duration=PROBE-lockout_duration; max_login_attempts=PROBE-max_login_attempts; min_password_length=PROBE-min_password_length}", + "BoundValue": "PROBE-name", "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ - "lockout_duration", - "max_login_attempts", - "min_password_length" + "actions", + "context", + "effect", + "name", + "policy", + "principals", + "resources" ], "ProbeTypes": { - "lockout_duration": "integer", - "max_login_attempts": "integer", - "min_password_length": "integer" + "actions": "array", + "context": "object", + "effect": "string", + "name": "string", + "policy": "object", + "principals": "object", + "resources": "array" } }, { - "Cmdlet": "Remove-PfbAdminCache", + "Cmdlet": "Remove-PfbBucket", "Verb": "Remove", "Parameter": "Name", - "Producer": "GET /admins/ssh-certificate-authority-policies", + "Producer": "GET /buckets/cross-origin-resource-sharing-policies", "IsPrimary": false, "FromExample": false, "WireName": "names", - "IsCandidate": true, - "Gate": "Candidate", + "IsCandidate": false, + "Gate": "Matched", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "names=@{context=; member=; policy=}", + "Outcome": "Bound", + "Evidence": "names=PROBE-name (from property 'name')", "BoundWireKey": "names", - "BoundValue": "@{context=; member=; policy=}", + "BoundValue": "PROBE-name", "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ + "bucket", "context", - "member", - "policy" + "enabled", + "id", + "is_local", + "location", + "name", + "policy_type", + "realms", + "rules" ], "ProbeTypes": { + "bucket": "object", "context": "object", - "member": "object", - "policy": "object" + "enabled": "boolean", + "id": "string", + "is_local": "boolean", + "location": "object", + "name": "string", + "policy_type": "string", + "realms": "array", + "rules": "array" } }, { - "Cmdlet": "Remove-PfbAlertWatcher", + "Cmdlet": "Remove-PfbBucket", "Verb": "Remove", "Parameter": "Name", - "Producer": "GET /alert-watchers", - "IsPrimary": true, + "Producer": "GET /buckets/cross-origin-resource-sharing-policies/rules", + "IsPrimary": false, "FromExample": false, "WireName": "names", "IsCandidate": false, @@ -23548,65 +26410,83 @@ "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ - "enabled", - "id", - "minimum_notification_severity", - "name" + "allowed_headers", + "allowed_methods", + "allowed_origins", + "context", + "name", + "policy" ], "ProbeTypes": { - "enabled": "boolean", - "id": "string", - "minimum_notification_severity": "string", - "name": "string" + "allowed_headers": "array", + "allowed_methods": "array", + "allowed_origins": "array", + "context": "object", + "name": "string", + "policy": "object" } }, { - "Cmdlet": "Remove-PfbAlertWatcher", + "Cmdlet": "Remove-PfbBucket", "Verb": "Remove", "Parameter": "Name", - "Producer": "GET /alert-watchers/test", + "Producer": "GET /buckets/performance", "IsPrimary": false, "FromExample": false, "WireName": "names", - "IsCandidate": true, - "Gate": "Candidate", + "IsCandidate": false, + "Gate": "Matched", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "names=@{component_address=PROBE-component_address; component_name=PROBE-component_name; description=PROBE-description; destination=PROBE-destination; enabled=PROBE-enabled; resource=; result_details=PROBE-result_details; success=PROBE-success; test_type=PROBE-test_type}", + "Outcome": "Bound", + "Evidence": "names=PROBE-name (from property 'name')", "BoundWireKey": "names", - "BoundValue": "@{component_address=PROBE-component_address; component_name=PROBE-component_name; description=PROBE-description; destination=PROBE-destination; enabled=PROBE-enabled; resource=; result_details=PROBE-result_details; success=PROBE-success; test_type=PROBE-test_type}", + "BoundValue": "PROBE-name", "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ - "component_address", - "component_name", - "description", - "destination", - "enabled", - "resource", - "result_details", - "success", - "test_type" + "bytes_per_op", + "bytes_per_read", + "bytes_per_write", + "id", + "max_total_bytes_per_sec", + "max_total_ops_per_sec", + "name", + "others_per_sec", + "read_bytes_per_sec", + "reads_per_sec", + "time", + "usec_per_other_op", + "usec_per_read_op", + "usec_per_write_op", + "write_bytes_per_sec", + "writes_per_sec" ], "ProbeTypes": { - "component_address": "string", - "component_name": "string", - "description": "string", - "destination": "string", - "enabled": "boolean", - "resource": "object", - "result_details": "string", - "success": "boolean", - "test_type": "string" + "bytes_per_op": "number", + "bytes_per_read": "number", + "bytes_per_write": "number", + "id": "string", + "max_total_bytes_per_sec": "number", + "max_total_ops_per_sec": "number", + "name": "string", + "others_per_sec": "number", + "read_bytes_per_sec": "number", + "reads_per_sec": "number", + "time": "integer", + "usec_per_other_op": "number", + "usec_per_read_op": "number", + "usec_per_write_op": "number", + "write_bytes_per_sec": "number", + "writes_per_sec": "number" } }, { - "Cmdlet": "Remove-PfbApiClient", + "Cmdlet": "Remove-PfbBucket", "Verb": "Remove", "Parameter": "Name", - "Producer": "GET /api-clients", - "IsPrimary": true, - "FromExample": true, + "Producer": "GET /buckets/s3-specific-performance", + "IsPrimary": false, + "FromExample": false, "WireName": "names", "IsCandidate": false, "Gate": "Matched", @@ -23618,549 +26498,843 @@ "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ - "access_policies", - "access_token_ttl_in_ms", - "enabled", "id", - "issuer", - "key_id", - "max_role", "name", - "public_key" + "others_per_sec", + "read_buckets_per_sec", + "read_objects_per_sec", + "time", + "usec_per_other_op", + "usec_per_read_bucket_op", + "usec_per_read_object_op", + "usec_per_write_bucket_op", + "usec_per_write_object_op", + "write_buckets_per_sec", + "write_objects_per_sec" ], "ProbeTypes": { - "access_policies": "array", - "access_token_ttl_in_ms": "integer", - "enabled": "boolean", "id": "string", - "issuer": "string", - "key_id": "string", - "max_role": "object", "name": "string", - "public_key": "string" + "others_per_sec": "number", + "read_buckets_per_sec": "number", + "read_objects_per_sec": "number", + "time": "integer", + "usec_per_other_op": "number", + "usec_per_read_bucket_op": "number", + "usec_per_read_object_op": "number", + "usec_per_write_bucket_op": "number", + "usec_per_write_object_op": "number", + "write_buckets_per_sec": "number", + "write_objects_per_sec": "number" } }, { - "Cmdlet": "Remove-PfbApiToken", + "Cmdlet": "Remove-PfbBucketAccessPolicy", "Verb": "Remove", - "Parameter": "Name", - "Producer": "GET /admins", + "Parameter": "BucketName", + "Producer": "GET /buckets", "IsPrimary": false, "FromExample": false, - "WireName": "admin_names", - "IsCandidate": false, - "Gate": "Matched", + "WireName": "bucket_names", + "IsCandidate": true, + "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Bound", - "Evidence": "admin_names=PROBE-name (from property 'name')", - "BoundWireKey": "admin_names", - "BoundValue": "PROBE-name", + "Outcome": "NoSelector", + "Evidence": "the request carried no 'bucket_names' key, so this parameter did not bind", + "BoundWireKey": null, + "BoundValue": null, "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ - "admin_type", - "api_token", - "authorization_model", + "account", + "bucket_type", + "context", + "created", + "destroyed", + "eradication_config", + "hard_limit_enabled", + "id", + "name", + "object_count", + "object_lock_config", + "public_access_config", + "public_status", + "qos_policy", + "quota_limit", + "retention_lock", + "space", + "storage_class", + "time_remaining", + "time_remaining_status", + "versioning" + ], + "ProbeTypes": { + "account": "object", + "bucket_type": "string", + "context": "object", + "created": "integer", + "destroyed": "boolean", + "eradication_config": "object", + "hard_limit_enabled": "boolean", + "id": "string", + "name": "string", + "object_count": "integer", + "object_lock_config": "object", + "public_access_config": "object", + "public_status": "string", + "qos_policy": "object", + "quota_limit": "integer", + "retention_lock": "string", + "space": "object", + "storage_class": "object", + "time_remaining": "integer", + "time_remaining_status": "string", + "versioning": "string" + } + }, + { + "Cmdlet": "Remove-PfbBucketAccessPolicy", + "Verb": "Remove", + "Parameter": "BucketName", + "Producer": "GET /buckets/audit-filters", + "IsPrimary": false, + "FromExample": false, + "WireName": "bucket_names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": true, + "Outcome": "NoSelector", + "Evidence": "the request carried no 'bucket_names' key, so this parameter did not bind", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": null, + "FilledParameter": [], + "ProbeProperties": [ + "actions", + "bucket", + "context", + "name", + "s3_prefixes" + ], + "ProbeTypes": { + "actions": "array", + "bucket": "object", + "context": "object", + "name": "string", + "s3_prefixes": "array" + } + }, + { + "Cmdlet": "Remove-PfbBucketAccessPolicy", + "Verb": "Remove", + "Parameter": "BucketName", + "Producer": "GET /buckets/bucket-access-policies", + "IsPrimary": true, + "FromExample": false, + "WireName": "bucket_names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": true, + "Outcome": "NoSelector", + "Evidence": "the request carried no 'bucket_names' key, so this parameter did not bind", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": null, + "FilledParameter": [], + "ProbeProperties": [ + "bucket", "context", + "enabled", "id", "is_local", - "locked", - "lockout_remaining", - "management_access_policies", + "location", "name", - "public_key", - "role" + "policy_type", + "realms", + "rules" ], "ProbeTypes": { - "admin_type": "string", - "api_token": "object", - "authorization_model": "string", + "bucket": "object", "context": "object", + "enabled": "boolean", "id": "string", "is_local": "boolean", - "locked": "boolean", - "lockout_remaining": "integer", - "management_access_policies": "array", + "location": "object", "name": "string", - "public_key": "string", - "role": "object" + "policy_type": "string", + "realms": "array", + "rules": "array" } }, { - "Cmdlet": "Remove-PfbApiToken", + "Cmdlet": "Remove-PfbBucketAccessPolicy", "Verb": "Remove", - "Parameter": "Name", - "Producer": "GET /admins/api-tokens", - "IsPrimary": true, + "Parameter": "BucketName", + "Producer": "GET /buckets/bucket-access-policies/rules", + "IsPrimary": false, "FromExample": false, - "WireName": "admin_names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Guarded", - "Evidence": "-Name received a stringified object ('@{admin=; api_token=; context=}') instead of an administrator name. Get-PfbApiToken output has no top-level name property -- the administrator name is nested at .admin.name -- so a piped API-token object is coerced whole into -Name. Pipe the name instead, e.g. Get-PfbApiToken | ForEach-Object { $_.admin.name } | Remove-PfbApiToken, or pass -Name explicitly.", + "Outcome": "NoSelector", + "Evidence": "the request carried no 'bucket_names' key, so this parameter did not bind", "BoundWireKey": null, "BoundValue": null, - "ErrorKind": "CmdletError", + "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ - "admin", - "api_token", - "context" + "actions", + "context", + "effect", + "name", + "policy", + "principals", + "resources" ], "ProbeTypes": { - "admin": "object", - "api_token": "object", - "context": "object" + "actions": "array", + "context": "object", + "effect": "string", + "name": "string", + "policy": "object", + "principals": "object", + "resources": "array" } }, { - "Cmdlet": "Remove-PfbApiToken", + "Cmdlet": "Remove-PfbBucketAccessPolicy", "Verb": "Remove", - "Parameter": "Name", - "Producer": "GET /admins/cache", + "Parameter": "BucketName", + "Producer": "GET /buckets/cross-origin-resource-sharing-policies", "IsPrimary": false, "FromExample": false, - "WireName": "admin_names", - "IsCandidate": false, - "Gate": "Matched", + "WireName": "bucket_names", + "IsCandidate": true, + "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Bound", - "Evidence": "admin_names=PROBE-name (from property 'name')", - "BoundWireKey": "admin_names", - "BoundValue": "PROBE-name", + "Outcome": "NoSelector", + "Evidence": "the request carried no 'bucket_names' key, so this parameter did not bind", + "BoundWireKey": null, + "BoundValue": null, "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ - "authorization_model", + "bucket", "context", + "enabled", "id", - "management_access_policies", + "is_local", + "location", "name", - "role", - "time" + "policy_type", + "realms", + "rules" ], "ProbeTypes": { - "authorization_model": "string", + "bucket": "object", "context": "object", + "enabled": "boolean", "id": "string", - "management_access_policies": "array", + "is_local": "boolean", + "location": "object", "name": "string", - "role": "object", - "time": "integer" + "policy_type": "string", + "realms": "array", + "rules": "array" } }, { - "Cmdlet": "Remove-PfbApiToken", + "Cmdlet": "Remove-PfbBucketAccessPolicy", "Verb": "Remove", - "Parameter": "Name", - "Producer": "GET /admins/management-access-policies", + "Parameter": "BucketName", + "Producer": "GET /buckets/cross-origin-resource-sharing-policies/rules", "IsPrimary": false, "FromExample": false, - "WireName": "admin_names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Guarded", - "Evidence": "-Name received a stringified object ('@{context=; member=; policy=}') instead of an administrator name. Get-PfbApiToken output has no top-level name property -- the administrator name is nested at .admin.name -- so a piped API-token object is coerced whole into -Name. Pipe the name instead, e.g. Get-PfbApiToken | ForEach-Object { $_.admin.name } | Remove-PfbApiToken, or pass -Name explicitly.", + "Outcome": "NoSelector", + "Evidence": "the request carried no 'bucket_names' key, so this parameter did not bind", "BoundWireKey": null, "BoundValue": null, - "ErrorKind": "CmdletError", + "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ + "allowed_headers", + "allowed_methods", + "allowed_origins", "context", - "member", + "name", "policy" ], "ProbeTypes": { + "allowed_headers": "array", + "allowed_methods": "array", + "allowed_origins": "array", "context": "object", - "member": "object", + "name": "string", "policy": "object" } }, { - "Cmdlet": "Remove-PfbApiToken", + "Cmdlet": "Remove-PfbBucketAccessPolicy", "Verb": "Remove", - "Parameter": "Name", - "Producer": "GET /admins/management-authentication-policies", + "Parameter": "BucketName", + "Producer": "GET /buckets/performance", "IsPrimary": false, "FromExample": false, - "WireName": "admin_names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Guarded", - "Evidence": "-Name received a stringified object ('@{context=; member=; policy=}') instead of an administrator name. Get-PfbApiToken output has no top-level name property -- the administrator name is nested at .admin.name -- so a piped API-token object is coerced whole into -Name. Pipe the name instead, e.g. Get-PfbApiToken | ForEach-Object { $_.admin.name } | Remove-PfbApiToken, or pass -Name explicitly.", + "Outcome": "NoSelector", + "Evidence": "the request carried no 'bucket_names' key, so this parameter did not bind", "BoundWireKey": null, "BoundValue": null, - "ErrorKind": "CmdletError", + "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ - "context", - "member", - "policy" + "bytes_per_op", + "bytes_per_read", + "bytes_per_write", + "id", + "max_total_bytes_per_sec", + "max_total_ops_per_sec", + "name", + "others_per_sec", + "read_bytes_per_sec", + "reads_per_sec", + "time", + "usec_per_other_op", + "usec_per_read_op", + "usec_per_write_op", + "write_bytes_per_sec", + "writes_per_sec" ], "ProbeTypes": { - "context": "object", - "member": "object", - "policy": "object" + "bytes_per_op": "number", + "bytes_per_read": "number", + "bytes_per_write": "number", + "id": "string", + "max_total_bytes_per_sec": "number", + "max_total_ops_per_sec": "number", + "name": "string", + "others_per_sec": "number", + "read_bytes_per_sec": "number", + "reads_per_sec": "number", + "time": "integer", + "usec_per_other_op": "number", + "usec_per_read_op": "number", + "usec_per_write_op": "number", + "write_bytes_per_sec": "number", + "writes_per_sec": "number" } }, { - "Cmdlet": "Remove-PfbApiToken", + "Cmdlet": "Remove-PfbBucketAccessPolicy", "Verb": "Remove", - "Parameter": "Name", - "Producer": "GET /admins/settings", + "Parameter": "BucketName", + "Producer": "GET /buckets/s3-specific-performance", "IsPrimary": false, "FromExample": false, - "WireName": "admin_names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Guarded", - "Evidence": "-Name received a stringified object ('@{lockout_duration=PROBE-lockout_duration; max_login_attempts=PROBE-max_login_attempts; min_password_length=PROBE-min_password_length}') instead of an administrator name. Get-PfbApiToken output has no top-level name property -- the administrator name is nested at .admin.name -- so a piped API-token object is coerced whole into -Name. Pipe the name instead, e.g. Get-PfbApiToken | ForEach-Object { $_.admin.name } | Remove-PfbApiToken, or pass -Name explicitly.", + "Outcome": "NoSelector", + "Evidence": "the request carried no 'bucket_names' key, so this parameter did not bind", "BoundWireKey": null, "BoundValue": null, - "ErrorKind": "CmdletError", + "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ - "lockout_duration", - "max_login_attempts", - "min_password_length" + "id", + "name", + "others_per_sec", + "read_buckets_per_sec", + "read_objects_per_sec", + "time", + "usec_per_other_op", + "usec_per_read_bucket_op", + "usec_per_read_object_op", + "usec_per_write_bucket_op", + "usec_per_write_object_op", + "write_buckets_per_sec", + "write_objects_per_sec" ], "ProbeTypes": { - "lockout_duration": "integer", - "max_login_attempts": "integer", - "min_password_length": "integer" + "id": "string", + "name": "string", + "others_per_sec": "number", + "read_buckets_per_sec": "number", + "read_objects_per_sec": "number", + "time": "integer", + "usec_per_other_op": "number", + "usec_per_read_bucket_op": "number", + "usec_per_read_object_op": "number", + "usec_per_write_bucket_op": "number", + "usec_per_write_object_op": "number", + "write_buckets_per_sec": "number", + "write_objects_per_sec": "number" } }, { - "Cmdlet": "Remove-PfbApiToken", + "Cmdlet": "Remove-PfbBucketAccessPolicy", "Verb": "Remove", "Parameter": "Name", - "Producer": "GET /admins/ssh-certificate-authority-policies", + "Producer": "GET /buckets", "IsPrimary": false, "FromExample": false, - "WireName": "admin_names", - "IsCandidate": true, - "Gate": "Candidate", - "ValueFromPipeline": true, - "Outcome": "Guarded", - "Evidence": "-Name received a stringified object ('@{context=; member=; policy=}') instead of an administrator name. Get-PfbApiToken output has no top-level name property -- the administrator name is nested at .admin.name -- so a piped API-token object is coerced whole into -Name. Pipe the name instead, e.g. Get-PfbApiToken | ForEach-Object { $_.admin.name } | Remove-PfbApiToken, or pass -Name explicitly.", - "BoundWireKey": null, - "BoundValue": null, - "ErrorKind": "CmdletError", + "WireName": "names", + "IsCandidate": false, + "Gate": "Matched", + "ValueFromPipeline": false, + "Outcome": "Bound", + "Evidence": "names=PROBE-name (from property 'name')", + "BoundWireKey": "names", + "BoundValue": "PROBE-name", + "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ + "account", + "bucket_type", "context", - "member", - "policy" + "created", + "destroyed", + "eradication_config", + "hard_limit_enabled", + "id", + "name", + "object_count", + "object_lock_config", + "public_access_config", + "public_status", + "qos_policy", + "quota_limit", + "retention_lock", + "space", + "storage_class", + "time_remaining", + "time_remaining_status", + "versioning" ], "ProbeTypes": { + "account": "object", + "bucket_type": "string", "context": "object", - "member": "object", - "policy": "object" + "created": "integer", + "destroyed": "boolean", + "eradication_config": "object", + "hard_limit_enabled": "boolean", + "id": "string", + "name": "string", + "object_count": "integer", + "object_lock_config": "object", + "public_access_config": "object", + "public_status": "string", + "qos_policy": "object", + "quota_limit": "integer", + "retention_lock": "string", + "space": "object", + "storage_class": "object", + "time_remaining": "integer", + "time_remaining_status": "string", + "versioning": "string" } }, { - "Cmdlet": "Remove-PfbArrayConnection", + "Cmdlet": "Remove-PfbBucketAccessPolicy", "Verb": "Remove", - "Parameter": "Id", - "Producer": "GET /array-connections", + "Parameter": "Name", + "Producer": "GET /buckets/audit-filters", + "IsPrimary": false, + "FromExample": false, + "WireName": "names", + "IsCandidate": false, + "Gate": "Matched", + "ValueFromPipeline": false, + "Outcome": "Bound", + "Evidence": "names=PROBE-name (from property 'name')", + "BoundWireKey": "names", + "BoundValue": "PROBE-name", + "ErrorKind": null, + "FilledParameter": [], + "ProbeProperties": [ + "actions", + "bucket", + "context", + "name", + "s3_prefixes" + ], + "ProbeTypes": { + "actions": "array", + "bucket": "object", + "context": "object", + "name": "string", + "s3_prefixes": "array" + } + }, + { + "Cmdlet": "Remove-PfbBucketAccessPolicy", + "Verb": "Remove", + "Parameter": "Name", + "Producer": "GET /buckets/bucket-access-policies", "IsPrimary": true, "FromExample": false, - "WireName": "ids", + "WireName": "names", "IsCandidate": false, "Gate": "Matched", "ValueFromPipeline": false, "Outcome": "Bound", - "Evidence": "ids=PROBE-id (from property 'id')", - "BoundWireKey": "ids", - "BoundValue": "PROBE-id", + "Evidence": "names=PROBE-name (from property 'name')", + "BoundWireKey": "names", + "BoundValue": "PROBE-name", "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ - "ca_certificate_group", + "bucket", "context", - "encrypted", + "enabled", "id", - "management_address", - "os", - "remote", - "replication_addresses", - "status", - "throttle", - "type", - "version" + "is_local", + "location", + "name", + "policy_type", + "realms", + "rules" ], "ProbeTypes": { - "ca_certificate_group": "object", + "bucket": "object", "context": "object", - "encrypted": "boolean", + "enabled": "boolean", "id": "string", - "management_address": "string", - "os": "string", - "remote": "object", - "replication_addresses": "array", - "status": "string", - "throttle": "object", - "type": "string", - "version": "string" + "is_local": "boolean", + "location": "object", + "name": "string", + "policy_type": "string", + "realms": "array", + "rules": "array" } }, { - "Cmdlet": "Remove-PfbArrayConnection", + "Cmdlet": "Remove-PfbBucketAccessPolicy", "Verb": "Remove", - "Parameter": "Id", - "Producer": "GET /array-connections/connection-key", + "Parameter": "Name", + "Producer": "GET /buckets/bucket-access-policies/rules", "IsPrimary": false, "FromExample": false, - "WireName": "ids", - "IsCandidate": true, - "Gate": "Candidate", + "WireName": "names", + "IsCandidate": false, + "Gate": "Matched", "ValueFromPipeline": false, - "Outcome": "Guarded", - "Evidence": "-RemoteName received a stringified object ('@{connection_key=PROBE-connection_key; created=PROBE-created; expires=PROBE-expires}') instead of a remote array name. A piped object that binds to neither -Id nor a name property is coerced whole into -RemoteName. Pipe the remote name instead, e.g. Get-PfbArrayConnection | Select-Object -ExpandProperty remote | Select-Object -ExpandProperty name | Get-PfbArrayConnectionPath, or pass -RemoteName explicitly.", - "BoundWireKey": null, - "BoundValue": null, - "ErrorKind": "CmdletError", + "Outcome": "Bound", + "Evidence": "names=PROBE-name (from property 'name')", + "BoundWireKey": "names", + "BoundValue": "PROBE-name", + "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ - "connection_key", - "created", - "expires" + "actions", + "context", + "effect", + "name", + "policy", + "principals", + "resources" ], "ProbeTypes": { - "connection_key": "string", - "created": "integer", - "expires": "integer" + "actions": "array", + "context": "object", + "effect": "string", + "name": "string", + "policy": "object", + "principals": "object", + "resources": "array" } }, { - "Cmdlet": "Remove-PfbArrayConnection", + "Cmdlet": "Remove-PfbBucketAccessPolicy", "Verb": "Remove", - "Parameter": "Id", - "Producer": "GET /array-connections/path", + "Parameter": "Name", + "Producer": "GET /buckets/cross-origin-resource-sharing-policies", "IsPrimary": false, "FromExample": false, - "WireName": "ids", + "WireName": "names", "IsCandidate": false, "Gate": "Matched", "ValueFromPipeline": false, "Outcome": "Bound", - "Evidence": "ids=PROBE-id (from property 'id')", - "BoundWireKey": "ids", - "BoundValue": "PROBE-id", + "Evidence": "names=PROBE-name (from property 'name')", + "BoundWireKey": "names", + "BoundValue": "PROBE-name", "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ + "bucket", "context", - "destination", + "enabled", "id", - "remote", - "source", - "status", - "status_details", - "type" + "is_local", + "location", + "name", + "policy_type", + "realms", + "rules" ], "ProbeTypes": { + "bucket": "object", "context": "object", - "destination": "string", + "enabled": "boolean", "id": "string", - "remote": "object", - "source": "string", - "status": "string", - "status_details": "string", - "type": "string" + "is_local": "boolean", + "location": "object", + "name": "string", + "policy_type": "string", + "realms": "array", + "rules": "array" } }, { - "Cmdlet": "Remove-PfbArrayConnection", + "Cmdlet": "Remove-PfbBucketAccessPolicy", "Verb": "Remove", - "Parameter": "Id", - "Producer": "GET /array-connections/performance/replication", + "Parameter": "Name", + "Producer": "GET /buckets/cross-origin-resource-sharing-policies/rules", "IsPrimary": false, "FromExample": false, - "WireName": "ids", + "WireName": "names", "IsCandidate": false, "Gate": "Matched", "ValueFromPipeline": false, "Outcome": "Bound", - "Evidence": "ids=PROBE-id (from property 'id')", - "BoundWireKey": "ids", - "BoundValue": "PROBE-id", + "Evidence": "names=PROBE-name (from property 'name')", + "BoundWireKey": "names", + "BoundValue": "PROBE-name", "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ - "aggregate", - "continuous", - "id", - "periodic", - "remote", - "time" + "allowed_headers", + "allowed_methods", + "allowed_origins", + "context", + "name", + "policy" ], "ProbeTypes": { - "aggregate": "object", - "continuous": "object", - "id": "string", - "periodic": "object", - "remote": "object", - "time": "integer" + "allowed_headers": "array", + "allowed_methods": "array", + "allowed_origins": "array", + "context": "object", + "name": "string", + "policy": "object" } }, { - "Cmdlet": "Remove-PfbArrayConnection", + "Cmdlet": "Remove-PfbBucketAccessPolicy", "Verb": "Remove", - "Parameter": "RemoteName", - "Producer": "GET /array-connections", - "IsPrimary": true, + "Parameter": "Name", + "Producer": "GET /buckets/performance", + "IsPrimary": false, "FromExample": false, - "WireName": "remote_names", - "IsCandidate": true, - "Gate": "Candidate", - "ValueFromPipeline": true, - "Outcome": "NoSelector", - "Evidence": "the request carried no 'remote_names' key, so this parameter did not bind", - "BoundWireKey": null, - "BoundValue": null, + "WireName": "names", + "IsCandidate": false, + "Gate": "Matched", + "ValueFromPipeline": false, + "Outcome": "Bound", + "Evidence": "names=PROBE-name (from property 'name')", + "BoundWireKey": "names", + "BoundValue": "PROBE-name", "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ - "ca_certificate_group", - "context", - "encrypted", + "bytes_per_op", + "bytes_per_read", + "bytes_per_write", "id", - "management_address", - "os", - "remote", - "replication_addresses", - "status", - "throttle", - "type", - "version" + "max_total_bytes_per_sec", + "max_total_ops_per_sec", + "name", + "others_per_sec", + "read_bytes_per_sec", + "reads_per_sec", + "time", + "usec_per_other_op", + "usec_per_read_op", + "usec_per_write_op", + "write_bytes_per_sec", + "writes_per_sec" ], "ProbeTypes": { - "ca_certificate_group": "object", - "context": "object", - "encrypted": "boolean", + "bytes_per_op": "number", + "bytes_per_read": "number", + "bytes_per_write": "number", "id": "string", - "management_address": "string", - "os": "string", - "remote": "object", - "replication_addresses": "array", - "status": "string", - "throttle": "object", - "type": "string", - "version": "string" + "max_total_bytes_per_sec": "number", + "max_total_ops_per_sec": "number", + "name": "string", + "others_per_sec": "number", + "read_bytes_per_sec": "number", + "reads_per_sec": "number", + "time": "integer", + "usec_per_other_op": "number", + "usec_per_read_op": "number", + "usec_per_write_op": "number", + "write_bytes_per_sec": "number", + "writes_per_sec": "number" } }, { - "Cmdlet": "Remove-PfbArrayConnection", + "Cmdlet": "Remove-PfbBucketAccessPolicy", "Verb": "Remove", - "Parameter": "RemoteName", - "Producer": "GET /array-connections/connection-key", + "Parameter": "Name", + "Producer": "GET /buckets/s3-specific-performance", "IsPrimary": false, "FromExample": false, - "WireName": "remote_names", - "IsCandidate": true, - "Gate": "Candidate", - "ValueFromPipeline": true, - "Outcome": "Guarded", - "Evidence": "-RemoteName received a stringified object ('@{connection_key=PROBE-connection_key; created=PROBE-created; expires=PROBE-expires}') instead of a remote array name. A piped object that binds to neither -Id nor a name property is coerced whole into -RemoteName. Pipe the remote name instead, e.g. Get-PfbArrayConnection | Select-Object -ExpandProperty remote | Select-Object -ExpandProperty name | Get-PfbArrayConnectionPath, or pass -RemoteName explicitly.", - "BoundWireKey": null, - "BoundValue": null, - "ErrorKind": "CmdletError", + "WireName": "names", + "IsCandidate": false, + "Gate": "Matched", + "ValueFromPipeline": false, + "Outcome": "Bound", + "Evidence": "names=PROBE-name (from property 'name')", + "BoundWireKey": "names", + "BoundValue": "PROBE-name", + "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ - "connection_key", - "created", - "expires" + "id", + "name", + "others_per_sec", + "read_buckets_per_sec", + "read_objects_per_sec", + "time", + "usec_per_other_op", + "usec_per_read_bucket_op", + "usec_per_read_object_op", + "usec_per_write_bucket_op", + "usec_per_write_object_op", + "write_buckets_per_sec", + "write_objects_per_sec" ], "ProbeTypes": { - "connection_key": "string", - "created": "integer", - "expires": "integer" + "id": "string", + "name": "string", + "others_per_sec": "number", + "read_buckets_per_sec": "number", + "read_objects_per_sec": "number", + "time": "integer", + "usec_per_other_op": "number", + "usec_per_read_bucket_op": "number", + "usec_per_read_object_op": "number", + "usec_per_write_bucket_op": "number", + "usec_per_write_object_op": "number", + "write_buckets_per_sec": "number", + "write_objects_per_sec": "number" } }, { - "Cmdlet": "Remove-PfbArrayConnection", + "Cmdlet": "Remove-PfbBucketAccessPolicyRule", "Verb": "Remove", - "Parameter": "RemoteName", - "Producer": "GET /array-connections/path", + "Parameter": "Name", + "Producer": "GET /buckets", "IsPrimary": false, "FromExample": false, - "WireName": "remote_names", - "IsCandidate": true, - "Gate": "Candidate", + "WireName": "names", + "IsCandidate": false, + "Gate": "Matched", "ValueFromPipeline": true, - "Outcome": "NoSelector", - "Evidence": "the request carried no 'remote_names' key, so this parameter did not bind", - "BoundWireKey": null, - "BoundValue": null, + "Outcome": "Bound", + "Evidence": "names=PROBE-name (from property 'name')", + "BoundWireKey": "names", + "BoundValue": "PROBE-name", "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ + "account", + "bucket_type", "context", - "destination", + "created", + "destroyed", + "eradication_config", + "hard_limit_enabled", "id", - "remote", - "source", - "status", - "status_details", - "type" + "name", + "object_count", + "object_lock_config", + "public_access_config", + "public_status", + "qos_policy", + "quota_limit", + "retention_lock", + "space", + "storage_class", + "time_remaining", + "time_remaining_status", + "versioning" ], "ProbeTypes": { + "account": "object", + "bucket_type": "string", "context": "object", - "destination": "string", + "created": "integer", + "destroyed": "boolean", + "eradication_config": "object", + "hard_limit_enabled": "boolean", "id": "string", - "remote": "object", - "source": "string", - "status": "string", - "status_details": "string", - "type": "string" + "name": "string", + "object_count": "integer", + "object_lock_config": "object", + "public_access_config": "object", + "public_status": "string", + "qos_policy": "object", + "quota_limit": "integer", + "retention_lock": "string", + "space": "object", + "storage_class": "object", + "time_remaining": "integer", + "time_remaining_status": "string", + "versioning": "string" } }, { - "Cmdlet": "Remove-PfbArrayConnection", + "Cmdlet": "Remove-PfbBucketAccessPolicyRule", "Verb": "Remove", - "Parameter": "RemoteName", - "Producer": "GET /array-connections/performance/replication", + "Parameter": "Name", + "Producer": "GET /buckets/audit-filters", "IsPrimary": false, "FromExample": false, - "WireName": "remote_names", - "IsCandidate": true, - "Gate": "Candidate", + "WireName": "names", + "IsCandidate": false, + "Gate": "Matched", "ValueFromPipeline": true, - "Outcome": "NoSelector", - "Evidence": "the request carried no 'remote_names' key, so this parameter did not bind", - "BoundWireKey": null, - "BoundValue": null, + "Outcome": "Bound", + "Evidence": "names=PROBE-name (from property 'name')", + "BoundWireKey": "names", + "BoundValue": "PROBE-name", "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ - "aggregate", - "continuous", - "id", - "periodic", - "remote", - "time" + "actions", + "bucket", + "context", + "name", + "s3_prefixes" ], "ProbeTypes": { - "aggregate": "object", - "continuous": "object", - "id": "string", - "periodic": "object", - "remote": "object", - "time": "integer" + "actions": "array", + "bucket": "object", + "context": "object", + "name": "string", + "s3_prefixes": "array" } }, { - "Cmdlet": "Remove-PfbAuditFileSystemPolicy", + "Cmdlet": "Remove-PfbBucketAccessPolicyRule", "Verb": "Remove", "Parameter": "Name", - "Producer": "GET /audit-file-systems-policies", - "IsPrimary": true, - "FromExample": true, + "Producer": "GET /buckets/bucket-access-policies", + "IsPrimary": false, + "FromExample": false, "WireName": "names", "IsCandidate": false, "Gate": "Matched", @@ -24172,26 +27346,24 @@ "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ + "bucket", "context", - "control_type", "enabled", "id", "is_local", "location", - "log_targets", "name", "policy_type", "realms", "rules" ], "ProbeTypes": { + "bucket": "object", "context": "object", - "control_type": "string", "enabled": "boolean", "id": "string", "is_local": "boolean", "location": "object", - "log_targets": "array", "name": "string", "policy_type": "string", "realms": "array", @@ -24199,40 +27371,48 @@ } }, { - "Cmdlet": "Remove-PfbAuditFileSystemPolicy", + "Cmdlet": "Remove-PfbBucketAccessPolicyRule", "Verb": "Remove", "Parameter": "Name", - "Producer": "GET /audit-file-systems-policies/members", - "IsPrimary": false, + "Producer": "GET /buckets/bucket-access-policies/rules", + "IsPrimary": true, "FromExample": false, "WireName": "names", - "IsCandidate": true, - "Gate": "Candidate", + "IsCandidate": false, + "Gate": "Matched", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "names=@{context=; member=; policy=}", + "Outcome": "Bound", + "Evidence": "names=PROBE-name (from property 'name')", "BoundWireKey": "names", - "BoundValue": "@{context=; member=; policy=}", + "BoundValue": "PROBE-name", "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ + "actions", "context", - "member", - "policy" + "effect", + "name", + "policy", + "principals", + "resources" ], "ProbeTypes": { + "actions": "array", "context": "object", - "member": "object", - "policy": "object" + "effect": "string", + "name": "string", + "policy": "object", + "principals": "object", + "resources": "array" } }, { - "Cmdlet": "Remove-PfbAuditObjectStorePolicy", + "Cmdlet": "Remove-PfbBucketAccessPolicyRule", "Verb": "Remove", "Parameter": "Name", - "Producer": "GET /audit-object-store-policies", - "IsPrimary": true, - "FromExample": true, + "Producer": "GET /buckets/cross-origin-resource-sharing-policies", + "IsPrimary": false, + "FromExample": false, "WireName": "names", "IsCandidate": false, "Gate": "Matched", @@ -24244,62 +27424,124 @@ "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ + "bucket", "context", "enabled", "id", "is_local", "location", - "log_targets", "name", "policy_type", - "realms" + "realms", + "rules" ], "ProbeTypes": { + "bucket": "object", "context": "object", "enabled": "boolean", "id": "string", "is_local": "boolean", "location": "object", - "log_targets": "array", "name": "string", "policy_type": "string", - "realms": "array" + "realms": "array", + "rules": "array" } }, { - "Cmdlet": "Remove-PfbAuditObjectStorePolicy", + "Cmdlet": "Remove-PfbBucketAccessPolicyRule", "Verb": "Remove", "Parameter": "Name", - "Producer": "GET /audit-object-store-policies/members", + "Producer": "GET /buckets/cross-origin-resource-sharing-policies/rules", "IsPrimary": false, "FromExample": false, "WireName": "names", - "IsCandidate": true, - "Gate": "Candidate", + "IsCandidate": false, + "Gate": "Matched", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "names=@{context=; member=; policy=}", + "Outcome": "Bound", + "Evidence": "names=PROBE-name (from property 'name')", "BoundWireKey": "names", - "BoundValue": "@{context=; member=; policy=}", + "BoundValue": "PROBE-name", "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ + "allowed_headers", + "allowed_methods", + "allowed_origins", "context", - "member", + "name", "policy" ], "ProbeTypes": { + "allowed_headers": "array", + "allowed_methods": "array", + "allowed_origins": "array", "context": "object", - "member": "object", + "name": "string", "policy": "object" } }, { - "Cmdlet": "Remove-PfbBucket", + "Cmdlet": "Remove-PfbBucketAccessPolicyRule", "Verb": "Remove", "Parameter": "Name", - "Producer": "GET /buckets", - "IsPrimary": true, + "Producer": "GET /buckets/performance", + "IsPrimary": false, + "FromExample": false, + "WireName": "names", + "IsCandidate": false, + "Gate": "Matched", + "ValueFromPipeline": true, + "Outcome": "Bound", + "Evidence": "names=PROBE-name (from property 'name')", + "BoundWireKey": "names", + "BoundValue": "PROBE-name", + "ErrorKind": null, + "FilledParameter": [], + "ProbeProperties": [ + "bytes_per_op", + "bytes_per_read", + "bytes_per_write", + "id", + "max_total_bytes_per_sec", + "max_total_ops_per_sec", + "name", + "others_per_sec", + "read_bytes_per_sec", + "reads_per_sec", + "time", + "usec_per_other_op", + "usec_per_read_op", + "usec_per_write_op", + "write_bytes_per_sec", + "writes_per_sec" + ], + "ProbeTypes": { + "bytes_per_op": "number", + "bytes_per_read": "number", + "bytes_per_write": "number", + "id": "string", + "max_total_bytes_per_sec": "number", + "max_total_ops_per_sec": "number", + "name": "string", + "others_per_sec": "number", + "read_bytes_per_sec": "number", + "reads_per_sec": "number", + "time": "integer", + "usec_per_other_op": "number", + "usec_per_read_op": "number", + "usec_per_write_op": "number", + "write_bytes_per_sec": "number", + "writes_per_sec": "number" + } + }, + { + "Cmdlet": "Remove-PfbBucketAccessPolicyRule", + "Verb": "Remove", + "Parameter": "Name", + "Producer": "GET /buckets/s3-specific-performance", + "IsPrimary": false, "FromExample": false, "WireName": "names", "IsCandidate": false, @@ -24311,6 +27553,54 @@ "BoundValue": "PROBE-name", "ErrorKind": null, "FilledParameter": [], + "ProbeProperties": [ + "id", + "name", + "others_per_sec", + "read_buckets_per_sec", + "read_objects_per_sec", + "time", + "usec_per_other_op", + "usec_per_read_bucket_op", + "usec_per_read_object_op", + "usec_per_write_bucket_op", + "usec_per_write_object_op", + "write_buckets_per_sec", + "write_objects_per_sec" + ], + "ProbeTypes": { + "id": "string", + "name": "string", + "others_per_sec": "number", + "read_buckets_per_sec": "number", + "read_objects_per_sec": "number", + "time": "integer", + "usec_per_other_op": "number", + "usec_per_read_bucket_op": "number", + "usec_per_read_object_op": "number", + "usec_per_write_bucket_op": "number", + "usec_per_write_object_op": "number", + "write_buckets_per_sec": "number", + "write_objects_per_sec": "number" + } + }, + { + "Cmdlet": "Remove-PfbBucketAuditFilter", + "Verb": "Remove", + "Parameter": "BucketName", + "Producer": "GET /buckets", + "IsPrimary": false, + "FromExample": false, + "WireName": "bucket_names", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": true, + "Outcome": "NoSelector", + "Evidence": "the request carried no 'bucket_names' key, so this parameter did not bind", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": null, + "FilledParameter": [], "ProbeProperties": [ "account", "bucket_type", @@ -24359,20 +27649,20 @@ } }, { - "Cmdlet": "Remove-PfbBucket", + "Cmdlet": "Remove-PfbBucketAuditFilter", "Verb": "Remove", - "Parameter": "Name", + "Parameter": "BucketName", "Producer": "GET /buckets/audit-filters", - "IsPrimary": false, + "IsPrimary": true, "FromExample": false, - "WireName": "names", - "IsCandidate": false, - "Gate": "Matched", + "WireName": "bucket_names", + "IsCandidate": true, + "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Bound", - "Evidence": "names=PROBE-name (from property 'name')", - "BoundWireKey": "names", - "BoundValue": "PROBE-name", + "Outcome": "NoSelector", + "Evidence": "the request carried no 'bucket_names' key, so this parameter did not bind", + "BoundWireKey": null, + "BoundValue": null, "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ @@ -24391,20 +27681,20 @@ } }, { - "Cmdlet": "Remove-PfbBucket", + "Cmdlet": "Remove-PfbBucketAuditFilter", "Verb": "Remove", - "Parameter": "Name", + "Parameter": "BucketName", "Producer": "GET /buckets/bucket-access-policies", "IsPrimary": false, "FromExample": false, - "WireName": "names", - "IsCandidate": false, - "Gate": "Matched", + "WireName": "bucket_names", + "IsCandidate": true, + "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Bound", - "Evidence": "names=PROBE-name (from property 'name')", - "BoundWireKey": "names", - "BoundValue": "PROBE-name", + "Outcome": "NoSelector", + "Evidence": "the request carried no 'bucket_names' key, so this parameter did not bind", + "BoundWireKey": null, + "BoundValue": null, "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ @@ -24433,20 +27723,20 @@ } }, { - "Cmdlet": "Remove-PfbBucket", + "Cmdlet": "Remove-PfbBucketAuditFilter", "Verb": "Remove", - "Parameter": "Name", + "Parameter": "BucketName", "Producer": "GET /buckets/bucket-access-policies/rules", "IsPrimary": false, "FromExample": false, - "WireName": "names", - "IsCandidate": false, - "Gate": "Matched", + "WireName": "bucket_names", + "IsCandidate": true, + "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Bound", - "Evidence": "names=PROBE-name (from property 'name')", - "BoundWireKey": "names", - "BoundValue": "PROBE-name", + "Outcome": "NoSelector", + "Evidence": "the request carried no 'bucket_names' key, so this parameter did not bind", + "BoundWireKey": null, + "BoundValue": null, "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ @@ -24469,20 +27759,20 @@ } }, { - "Cmdlet": "Remove-PfbBucket", + "Cmdlet": "Remove-PfbBucketAuditFilter", "Verb": "Remove", - "Parameter": "Name", + "Parameter": "BucketName", "Producer": "GET /buckets/cross-origin-resource-sharing-policies", "IsPrimary": false, "FromExample": false, - "WireName": "names", - "IsCandidate": false, - "Gate": "Matched", + "WireName": "bucket_names", + "IsCandidate": true, + "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Bound", - "Evidence": "names=PROBE-name (from property 'name')", - "BoundWireKey": "names", - "BoundValue": "PROBE-name", + "Outcome": "NoSelector", + "Evidence": "the request carried no 'bucket_names' key, so this parameter did not bind", + "BoundWireKey": null, + "BoundValue": null, "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ @@ -24511,20 +27801,20 @@ } }, { - "Cmdlet": "Remove-PfbBucket", + "Cmdlet": "Remove-PfbBucketAuditFilter", "Verb": "Remove", - "Parameter": "Name", + "Parameter": "BucketName", "Producer": "GET /buckets/cross-origin-resource-sharing-policies/rules", "IsPrimary": false, "FromExample": false, - "WireName": "names", - "IsCandidate": false, - "Gate": "Matched", + "WireName": "bucket_names", + "IsCandidate": true, + "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Bound", - "Evidence": "names=PROBE-name (from property 'name')", - "BoundWireKey": "names", - "BoundValue": "PROBE-name", + "Outcome": "NoSelector", + "Evidence": "the request carried no 'bucket_names' key, so this parameter did not bind", + "BoundWireKey": null, + "BoundValue": null, "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ @@ -24545,20 +27835,20 @@ } }, { - "Cmdlet": "Remove-PfbBucket", + "Cmdlet": "Remove-PfbBucketAuditFilter", "Verb": "Remove", - "Parameter": "Name", + "Parameter": "BucketName", "Producer": "GET /buckets/performance", "IsPrimary": false, "FromExample": false, - "WireName": "names", - "IsCandidate": false, - "Gate": "Matched", + "WireName": "bucket_names", + "IsCandidate": true, + "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Bound", - "Evidence": "names=PROBE-name (from property 'name')", - "BoundWireKey": "names", - "BoundValue": "PROBE-name", + "Outcome": "NoSelector", + "Evidence": "the request carried no 'bucket_names' key, so this parameter did not bind", + "BoundWireKey": null, + "BoundValue": null, "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ @@ -24599,20 +27889,20 @@ } }, { - "Cmdlet": "Remove-PfbBucket", + "Cmdlet": "Remove-PfbBucketAuditFilter", "Verb": "Remove", - "Parameter": "Name", + "Parameter": "BucketName", "Producer": "GET /buckets/s3-specific-performance", "IsPrimary": false, "FromExample": false, - "WireName": "names", - "IsCandidate": false, - "Gate": "Matched", + "WireName": "bucket_names", + "IsCandidate": true, + "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Bound", - "Evidence": "names=PROBE-name (from property 'name')", - "BoundWireKey": "names", - "BoundValue": "PROBE-name", + "Outcome": "NoSelector", + "Evidence": "the request carried no 'bucket_names' key, so this parameter did not bind", + "BoundWireKey": null, + "BoundValue": null, "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ @@ -24647,7 +27937,7 @@ } }, { - "Cmdlet": "Remove-PfbBucketAccessPolicyRule", + "Cmdlet": "Remove-PfbBucketAuditFilter", "Verb": "Remove", "Parameter": "Name", "Producer": "GET /buckets", @@ -24656,7 +27946,7 @@ "WireName": "names", "IsCandidate": false, "Gate": "Matched", - "ValueFromPipeline": true, + "ValueFromPipeline": false, "Outcome": "Bound", "Evidence": "names=PROBE-name (from property 'name')", "BoundWireKey": "names", @@ -24711,16 +28001,16 @@ } }, { - "Cmdlet": "Remove-PfbBucketAccessPolicyRule", + "Cmdlet": "Remove-PfbBucketAuditFilter", "Verb": "Remove", "Parameter": "Name", "Producer": "GET /buckets/audit-filters", - "IsPrimary": false, + "IsPrimary": true, "FromExample": false, "WireName": "names", "IsCandidate": false, "Gate": "Matched", - "ValueFromPipeline": true, + "ValueFromPipeline": false, "Outcome": "Bound", "Evidence": "names=PROBE-name (from property 'name')", "BoundWireKey": "names", @@ -24743,7 +28033,7 @@ } }, { - "Cmdlet": "Remove-PfbBucketAccessPolicyRule", + "Cmdlet": "Remove-PfbBucketAuditFilter", "Verb": "Remove", "Parameter": "Name", "Producer": "GET /buckets/bucket-access-policies", @@ -24752,7 +28042,7 @@ "WireName": "names", "IsCandidate": false, "Gate": "Matched", - "ValueFromPipeline": true, + "ValueFromPipeline": false, "Outcome": "Bound", "Evidence": "names=PROBE-name (from property 'name')", "BoundWireKey": "names", @@ -24785,16 +28075,16 @@ } }, { - "Cmdlet": "Remove-PfbBucketAccessPolicyRule", + "Cmdlet": "Remove-PfbBucketAuditFilter", "Verb": "Remove", "Parameter": "Name", "Producer": "GET /buckets/bucket-access-policies/rules", - "IsPrimary": true, + "IsPrimary": false, "FromExample": false, "WireName": "names", "IsCandidate": false, "Gate": "Matched", - "ValueFromPipeline": true, + "ValueFromPipeline": false, "Outcome": "Bound", "Evidence": "names=PROBE-name (from property 'name')", "BoundWireKey": "names", @@ -24821,7 +28111,7 @@ } }, { - "Cmdlet": "Remove-PfbBucketAccessPolicyRule", + "Cmdlet": "Remove-PfbBucketAuditFilter", "Verb": "Remove", "Parameter": "Name", "Producer": "GET /buckets/cross-origin-resource-sharing-policies", @@ -24830,7 +28120,7 @@ "WireName": "names", "IsCandidate": false, "Gate": "Matched", - "ValueFromPipeline": true, + "ValueFromPipeline": false, "Outcome": "Bound", "Evidence": "names=PROBE-name (from property 'name')", "BoundWireKey": "names", @@ -24863,7 +28153,7 @@ } }, { - "Cmdlet": "Remove-PfbBucketAccessPolicyRule", + "Cmdlet": "Remove-PfbBucketAuditFilter", "Verb": "Remove", "Parameter": "Name", "Producer": "GET /buckets/cross-origin-resource-sharing-policies/rules", @@ -24872,7 +28162,7 @@ "WireName": "names", "IsCandidate": false, "Gate": "Matched", - "ValueFromPipeline": true, + "ValueFromPipeline": false, "Outcome": "Bound", "Evidence": "names=PROBE-name (from property 'name')", "BoundWireKey": "names", @@ -24897,7 +28187,7 @@ } }, { - "Cmdlet": "Remove-PfbBucketAccessPolicyRule", + "Cmdlet": "Remove-PfbBucketAuditFilter", "Verb": "Remove", "Parameter": "Name", "Producer": "GET /buckets/performance", @@ -24906,7 +28196,7 @@ "WireName": "names", "IsCandidate": false, "Gate": "Matched", - "ValueFromPipeline": true, + "ValueFromPipeline": false, "Outcome": "Bound", "Evidence": "names=PROBE-name (from property 'name')", "BoundWireKey": "names", @@ -24951,7 +28241,7 @@ } }, { - "Cmdlet": "Remove-PfbBucketAccessPolicyRule", + "Cmdlet": "Remove-PfbBucketAuditFilter", "Verb": "Remove", "Parameter": "Name", "Producer": "GET /buckets/s3-specific-performance", @@ -24960,7 +28250,7 @@ "WireName": "names", "IsCandidate": false, "Gate": "Matched", - "ValueFromPipeline": true, + "ValueFromPipeline": false, "Outcome": "Bound", "Evidence": "names=PROBE-name (from property 'name')", "BoundWireKey": "names", @@ -24999,20 +28289,20 @@ } }, { - "Cmdlet": "Remove-PfbBucketAuditFilter", + "Cmdlet": "Remove-PfbBucketCorsPolicy", "Verb": "Remove", - "Parameter": "MemberName", + "Parameter": "BucketName", "Producer": "GET /buckets", "IsPrimary": false, "FromExample": false, - "WireName": "member_names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "member_names=@{account=; bucket_type=PROBE-bucket_type; context=; created=PROBE-created; destroyed=PROBE-destroyed; eradication_config=; hard_limit_enabled=PROBE-hard_limit_enabled; id=PROBE-id; name=PROBE-name; object_count=PROBE-object_count; object_lock_config=; public_access_config=; public_status=PROBE-public_status; qos_policy=; quota_limit=PROBE-quota_limit; retention_lock=PROBE-retention_lock; space=; storage_class=; time_remaining=PROBE-time_remaining; time_remaining_status=PROBE-time_remaining_status; versioning=PROBE-versioning}", - "BoundWireKey": "member_names", - "BoundValue": "@{account=; bucket_type=PROBE-bucket_type; context=; created=PROBE-created; destroyed=PROBE-destroyed; eradication_config=; hard_limit_enabled=PROBE-hard_limit_enabled; id=PROBE-id; name=PROBE-name; object_count=PROBE-object_count; object_lock_config=; public_access_config=; public_status=PROBE-public_status; qos_policy=; quota_limit=PROBE-quota_limit; retention_lock=PROBE-retention_lock; space=; storage_class=; time_remaining=PROBE-time_remaining; time_remaining_status=PROBE-time_remaining_status; versioning=PROBE-versioning}", + "Outcome": "NoSelector", + "Evidence": "the request carried no 'bucket_names' key, so this parameter did not bind", + "BoundWireKey": null, + "BoundValue": null, "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ @@ -25063,20 +28353,20 @@ } }, { - "Cmdlet": "Remove-PfbBucketAuditFilter", + "Cmdlet": "Remove-PfbBucketCorsPolicy", "Verb": "Remove", - "Parameter": "MemberName", + "Parameter": "BucketName", "Producer": "GET /buckets/audit-filters", - "IsPrimary": true, + "IsPrimary": false, "FromExample": false, - "WireName": "member_names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "member_names=@{actions=System.Object[]; bucket=; context=; name=PROBE-name; s3_prefixes=System.Object[]}", - "BoundWireKey": "member_names", - "BoundValue": "@{actions=System.Object[]; bucket=; context=; name=PROBE-name; s3_prefixes=System.Object[]}", + "Outcome": "NoSelector", + "Evidence": "the request carried no 'bucket_names' key, so this parameter did not bind", + "BoundWireKey": null, + "BoundValue": null, "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ @@ -25095,20 +28385,20 @@ } }, { - "Cmdlet": "Remove-PfbBucketAuditFilter", + "Cmdlet": "Remove-PfbBucketCorsPolicy", "Verb": "Remove", - "Parameter": "MemberName", + "Parameter": "BucketName", "Producer": "GET /buckets/bucket-access-policies", "IsPrimary": false, "FromExample": false, - "WireName": "member_names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "member_names=@{bucket=; context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]}", - "BoundWireKey": "member_names", - "BoundValue": "@{bucket=; context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]}", + "Outcome": "NoSelector", + "Evidence": "the request carried no 'bucket_names' key, so this parameter did not bind", + "BoundWireKey": null, + "BoundValue": null, "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ @@ -25137,20 +28427,20 @@ } }, { - "Cmdlet": "Remove-PfbBucketAuditFilter", + "Cmdlet": "Remove-PfbBucketCorsPolicy", "Verb": "Remove", - "Parameter": "MemberName", + "Parameter": "BucketName", "Producer": "GET /buckets/bucket-access-policies/rules", "IsPrimary": false, "FromExample": false, - "WireName": "member_names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "member_names=@{actions=System.Object[]; context=; effect=PROBE-effect; name=PROBE-name; policy=; principals=; resources=System.Object[]}", - "BoundWireKey": "member_names", - "BoundValue": "@{actions=System.Object[]; context=; effect=PROBE-effect; name=PROBE-name; policy=; principals=; resources=System.Object[]}", + "Outcome": "NoSelector", + "Evidence": "the request carried no 'bucket_names' key, so this parameter did not bind", + "BoundWireKey": null, + "BoundValue": null, "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ @@ -25173,20 +28463,20 @@ } }, { - "Cmdlet": "Remove-PfbBucketAuditFilter", + "Cmdlet": "Remove-PfbBucketCorsPolicy", "Verb": "Remove", - "Parameter": "MemberName", + "Parameter": "BucketName", "Producer": "GET /buckets/cross-origin-resource-sharing-policies", - "IsPrimary": false, + "IsPrimary": true, "FromExample": false, - "WireName": "member_names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "member_names=@{bucket=; context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]}", - "BoundWireKey": "member_names", - "BoundValue": "@{bucket=; context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]}", + "Outcome": "NoSelector", + "Evidence": "the request carried no 'bucket_names' key, so this parameter did not bind", + "BoundWireKey": null, + "BoundValue": null, "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ @@ -25215,20 +28505,20 @@ } }, { - "Cmdlet": "Remove-PfbBucketAuditFilter", + "Cmdlet": "Remove-PfbBucketCorsPolicy", "Verb": "Remove", - "Parameter": "MemberName", + "Parameter": "BucketName", "Producer": "GET /buckets/cross-origin-resource-sharing-policies/rules", "IsPrimary": false, "FromExample": false, - "WireName": "member_names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "member_names=@{allowed_headers=System.Object[]; allowed_methods=System.Object[]; allowed_origins=System.Object[]; context=; name=PROBE-name; policy=}", - "BoundWireKey": "member_names", - "BoundValue": "@{allowed_headers=System.Object[]; allowed_methods=System.Object[]; allowed_origins=System.Object[]; context=; name=PROBE-name; policy=}", + "Outcome": "NoSelector", + "Evidence": "the request carried no 'bucket_names' key, so this parameter did not bind", + "BoundWireKey": null, + "BoundValue": null, "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ @@ -25249,20 +28539,20 @@ } }, { - "Cmdlet": "Remove-PfbBucketAuditFilter", + "Cmdlet": "Remove-PfbBucketCorsPolicy", "Verb": "Remove", - "Parameter": "MemberName", + "Parameter": "BucketName", "Producer": "GET /buckets/performance", "IsPrimary": false, "FromExample": false, - "WireName": "member_names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "member_names=@{bytes_per_op=PROBE-bytes_per_op; bytes_per_read=PROBE-bytes_per_read; bytes_per_write=PROBE-bytes_per_write; id=PROBE-id; max_total_bytes_per_sec=PROBE-max_total_bytes_per_sec; max_total_ops_per_sec=PROBE-max_total_ops_per_sec; name=PROBE-name; others_per_sec=PROBE-others_per_sec; read_bytes_per_sec=PROBE-read_bytes_per_sec; reads_per_sec=PROBE-reads_per_sec; time=PROBE-time; usec_per_other_op=PROBE-usec_per_other_op; usec_per_read_op=PROBE-usec_per_read_op; usec_per_write_op=PROBE-usec_per_write_op; write_bytes_per_sec=PROBE-write_bytes_per_sec; writes_per_sec=PROBE-writes_per_sec}", - "BoundWireKey": "member_names", - "BoundValue": "@{bytes_per_op=PROBE-bytes_per_op; bytes_per_read=PROBE-bytes_per_read; bytes_per_write=PROBE-bytes_per_write; id=PROBE-id; max_total_bytes_per_sec=PROBE-max_total_bytes_per_sec; max_total_ops_per_sec=PROBE-max_total_ops_per_sec; name=PROBE-name; others_per_sec=PROBE-others_per_sec; read_bytes_per_sec=PROBE-read_bytes_per_sec; reads_per_sec=PROBE-reads_per_sec; time=PROBE-time; usec_per_other_op=PROBE-usec_per_other_op; usec_per_read_op=PROBE-usec_per_read_op; usec_per_write_op=PROBE-usec_per_write_op; write_bytes_per_sec=PROBE-write_bytes_per_sec; writes_per_sec=PROBE-writes_per_sec}", + "Outcome": "NoSelector", + "Evidence": "the request carried no 'bucket_names' key, so this parameter did not bind", + "BoundWireKey": null, + "BoundValue": null, "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ @@ -25303,20 +28593,20 @@ } }, { - "Cmdlet": "Remove-PfbBucketAuditFilter", + "Cmdlet": "Remove-PfbBucketCorsPolicy", "Verb": "Remove", - "Parameter": "MemberName", + "Parameter": "BucketName", "Producer": "GET /buckets/s3-specific-performance", "IsPrimary": false, "FromExample": false, - "WireName": "member_names", + "WireName": "bucket_names", "IsCandidate": true, "Gate": "Candidate", "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "member_names=@{id=PROBE-id; name=PROBE-name; others_per_sec=PROBE-others_per_sec; read_buckets_per_sec=PROBE-read_buckets_per_sec; read_objects_per_sec=PROBE-read_objects_per_sec; time=PROBE-time; usec_per_other_op=PROBE-usec_per_other_op; usec_per_read_bucket_op=PROBE-usec_per_read_bucket_op; usec_per_read_object_op=PROBE-usec_per_read_object_op; usec_per_write_bucket_op=PROBE-usec_per_write_bucket_op; usec_per_write_object_op=PROBE-usec_per_write_object_op; write_buckets_per_sec=PROBE-write_buckets_per_sec; write_objects_per_sec=PROBE-write_objects_per_sec}", - "BoundWireKey": "member_names", - "BoundValue": "@{id=PROBE-id; name=PROBE-name; others_per_sec=PROBE-others_per_sec; read_buckets_per_sec=PROBE-read_buckets_per_sec; read_objects_per_sec=PROBE-read_objects_per_sec; time=PROBE-time; usec_per_other_op=PROBE-usec_per_other_op; usec_per_read_bucket_op=PROBE-usec_per_read_bucket_op; usec_per_read_object_op=PROBE-usec_per_read_object_op; usec_per_write_bucket_op=PROBE-usec_per_write_bucket_op; usec_per_write_object_op=PROBE-usec_per_write_object_op; write_buckets_per_sec=PROBE-write_buckets_per_sec; write_objects_per_sec=PROBE-write_objects_per_sec}", + "Outcome": "NoSelector", + "Evidence": "the request carried no 'bucket_names' key, so this parameter did not bind", + "BoundWireKey": null, + "BoundValue": null, "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ @@ -25353,18 +28643,18 @@ { "Cmdlet": "Remove-PfbBucketCorsPolicy", "Verb": "Remove", - "Parameter": "MemberName", + "Parameter": "Name", "Producer": "GET /buckets", "IsPrimary": false, "FromExample": false, - "WireName": "member_names", - "IsCandidate": true, - "Gate": "Candidate", - "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "member_names=@{account=; bucket_type=PROBE-bucket_type; context=; created=PROBE-created; destroyed=PROBE-destroyed; eradication_config=; hard_limit_enabled=PROBE-hard_limit_enabled; id=PROBE-id; name=PROBE-name; object_count=PROBE-object_count; object_lock_config=; public_access_config=; public_status=PROBE-public_status; qos_policy=; quota_limit=PROBE-quota_limit; retention_lock=PROBE-retention_lock; space=; storage_class=; time_remaining=PROBE-time_remaining; time_remaining_status=PROBE-time_remaining_status; versioning=PROBE-versioning}", - "BoundWireKey": "member_names", - "BoundValue": "@{account=; bucket_type=PROBE-bucket_type; context=; created=PROBE-created; destroyed=PROBE-destroyed; eradication_config=; hard_limit_enabled=PROBE-hard_limit_enabled; id=PROBE-id; name=PROBE-name; object_count=PROBE-object_count; object_lock_config=; public_access_config=; public_status=PROBE-public_status; qos_policy=; quota_limit=PROBE-quota_limit; retention_lock=PROBE-retention_lock; space=; storage_class=; time_remaining=PROBE-time_remaining; time_remaining_status=PROBE-time_remaining_status; versioning=PROBE-versioning}", + "WireName": "names", + "IsCandidate": false, + "Gate": "Matched", + "ValueFromPipeline": false, + "Outcome": "Bound", + "Evidence": "names=PROBE-name (from property 'name')", + "BoundWireKey": "names", + "BoundValue": "PROBE-name", "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ @@ -25417,18 +28707,18 @@ { "Cmdlet": "Remove-PfbBucketCorsPolicy", "Verb": "Remove", - "Parameter": "MemberName", + "Parameter": "Name", "Producer": "GET /buckets/audit-filters", "IsPrimary": false, "FromExample": false, - "WireName": "member_names", - "IsCandidate": true, - "Gate": "Candidate", - "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "member_names=@{actions=System.Object[]; bucket=; context=; name=PROBE-name; s3_prefixes=System.Object[]}", - "BoundWireKey": "member_names", - "BoundValue": "@{actions=System.Object[]; bucket=; context=; name=PROBE-name; s3_prefixes=System.Object[]}", + "WireName": "names", + "IsCandidate": false, + "Gate": "Matched", + "ValueFromPipeline": false, + "Outcome": "Bound", + "Evidence": "names=PROBE-name (from property 'name')", + "BoundWireKey": "names", + "BoundValue": "PROBE-name", "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ @@ -25449,18 +28739,18 @@ { "Cmdlet": "Remove-PfbBucketCorsPolicy", "Verb": "Remove", - "Parameter": "MemberName", + "Parameter": "Name", "Producer": "GET /buckets/bucket-access-policies", "IsPrimary": false, "FromExample": false, - "WireName": "member_names", - "IsCandidate": true, - "Gate": "Candidate", - "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "member_names=@{bucket=; context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]}", - "BoundWireKey": "member_names", - "BoundValue": "@{bucket=; context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]}", + "WireName": "names", + "IsCandidate": false, + "Gate": "Matched", + "ValueFromPipeline": false, + "Outcome": "Bound", + "Evidence": "names=PROBE-name (from property 'name')", + "BoundWireKey": "names", + "BoundValue": "PROBE-name", "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ @@ -25491,18 +28781,18 @@ { "Cmdlet": "Remove-PfbBucketCorsPolicy", "Verb": "Remove", - "Parameter": "MemberName", + "Parameter": "Name", "Producer": "GET /buckets/bucket-access-policies/rules", "IsPrimary": false, "FromExample": false, - "WireName": "member_names", - "IsCandidate": true, - "Gate": "Candidate", - "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "member_names=@{actions=System.Object[]; context=; effect=PROBE-effect; name=PROBE-name; policy=; principals=; resources=System.Object[]}", - "BoundWireKey": "member_names", - "BoundValue": "@{actions=System.Object[]; context=; effect=PROBE-effect; name=PROBE-name; policy=; principals=; resources=System.Object[]}", + "WireName": "names", + "IsCandidate": false, + "Gate": "Matched", + "ValueFromPipeline": false, + "Outcome": "Bound", + "Evidence": "names=PROBE-name (from property 'name')", + "BoundWireKey": "names", + "BoundValue": "PROBE-name", "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ @@ -25527,18 +28817,18 @@ { "Cmdlet": "Remove-PfbBucketCorsPolicy", "Verb": "Remove", - "Parameter": "MemberName", + "Parameter": "Name", "Producer": "GET /buckets/cross-origin-resource-sharing-policies", "IsPrimary": true, "FromExample": false, - "WireName": "member_names", - "IsCandidate": true, - "Gate": "Candidate", - "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "member_names=@{bucket=; context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]}", - "BoundWireKey": "member_names", - "BoundValue": "@{bucket=; context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]}", + "WireName": "names", + "IsCandidate": false, + "Gate": "Matched", + "ValueFromPipeline": false, + "Outcome": "Bound", + "Evidence": "names=PROBE-name (from property 'name')", + "BoundWireKey": "names", + "BoundValue": "PROBE-name", "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ @@ -25569,18 +28859,18 @@ { "Cmdlet": "Remove-PfbBucketCorsPolicy", "Verb": "Remove", - "Parameter": "MemberName", + "Parameter": "Name", "Producer": "GET /buckets/cross-origin-resource-sharing-policies/rules", "IsPrimary": false, "FromExample": false, - "WireName": "member_names", - "IsCandidate": true, - "Gate": "Candidate", - "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "member_names=@{allowed_headers=System.Object[]; allowed_methods=System.Object[]; allowed_origins=System.Object[]; context=; name=PROBE-name; policy=}", - "BoundWireKey": "member_names", - "BoundValue": "@{allowed_headers=System.Object[]; allowed_methods=System.Object[]; allowed_origins=System.Object[]; context=; name=PROBE-name; policy=}", + "WireName": "names", + "IsCandidate": false, + "Gate": "Matched", + "ValueFromPipeline": false, + "Outcome": "Bound", + "Evidence": "names=PROBE-name (from property 'name')", + "BoundWireKey": "names", + "BoundValue": "PROBE-name", "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ @@ -25603,18 +28893,18 @@ { "Cmdlet": "Remove-PfbBucketCorsPolicy", "Verb": "Remove", - "Parameter": "MemberName", + "Parameter": "Name", "Producer": "GET /buckets/performance", "IsPrimary": false, "FromExample": false, - "WireName": "member_names", - "IsCandidate": true, - "Gate": "Candidate", - "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "member_names=@{bytes_per_op=PROBE-bytes_per_op; bytes_per_read=PROBE-bytes_per_read; bytes_per_write=PROBE-bytes_per_write; id=PROBE-id; max_total_bytes_per_sec=PROBE-max_total_bytes_per_sec; max_total_ops_per_sec=PROBE-max_total_ops_per_sec; name=PROBE-name; others_per_sec=PROBE-others_per_sec; read_bytes_per_sec=PROBE-read_bytes_per_sec; reads_per_sec=PROBE-reads_per_sec; time=PROBE-time; usec_per_other_op=PROBE-usec_per_other_op; usec_per_read_op=PROBE-usec_per_read_op; usec_per_write_op=PROBE-usec_per_write_op; write_bytes_per_sec=PROBE-write_bytes_per_sec; writes_per_sec=PROBE-writes_per_sec}", - "BoundWireKey": "member_names", - "BoundValue": "@{bytes_per_op=PROBE-bytes_per_op; bytes_per_read=PROBE-bytes_per_read; bytes_per_write=PROBE-bytes_per_write; id=PROBE-id; max_total_bytes_per_sec=PROBE-max_total_bytes_per_sec; max_total_ops_per_sec=PROBE-max_total_ops_per_sec; name=PROBE-name; others_per_sec=PROBE-others_per_sec; read_bytes_per_sec=PROBE-read_bytes_per_sec; reads_per_sec=PROBE-reads_per_sec; time=PROBE-time; usec_per_other_op=PROBE-usec_per_other_op; usec_per_read_op=PROBE-usec_per_read_op; usec_per_write_op=PROBE-usec_per_write_op; write_bytes_per_sec=PROBE-write_bytes_per_sec; writes_per_sec=PROBE-writes_per_sec}", + "WireName": "names", + "IsCandidate": false, + "Gate": "Matched", + "ValueFromPipeline": false, + "Outcome": "Bound", + "Evidence": "names=PROBE-name (from property 'name')", + "BoundWireKey": "names", + "BoundValue": "PROBE-name", "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ @@ -25657,18 +28947,18 @@ { "Cmdlet": "Remove-PfbBucketCorsPolicy", "Verb": "Remove", - "Parameter": "MemberName", + "Parameter": "Name", "Producer": "GET /buckets/s3-specific-performance", "IsPrimary": false, "FromExample": false, - "WireName": "member_names", - "IsCandidate": true, - "Gate": "Candidate", - "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "member_names=@{id=PROBE-id; name=PROBE-name; others_per_sec=PROBE-others_per_sec; read_buckets_per_sec=PROBE-read_buckets_per_sec; read_objects_per_sec=PROBE-read_objects_per_sec; time=PROBE-time; usec_per_other_op=PROBE-usec_per_other_op; usec_per_read_bucket_op=PROBE-usec_per_read_bucket_op; usec_per_read_object_op=PROBE-usec_per_read_object_op; usec_per_write_bucket_op=PROBE-usec_per_write_bucket_op; usec_per_write_object_op=PROBE-usec_per_write_object_op; write_buckets_per_sec=PROBE-write_buckets_per_sec; write_objects_per_sec=PROBE-write_objects_per_sec}", - "BoundWireKey": "member_names", - "BoundValue": "@{id=PROBE-id; name=PROBE-name; others_per_sec=PROBE-others_per_sec; read_buckets_per_sec=PROBE-read_buckets_per_sec; read_objects_per_sec=PROBE-read_objects_per_sec; time=PROBE-time; usec_per_other_op=PROBE-usec_per_other_op; usec_per_read_bucket_op=PROBE-usec_per_read_bucket_op; usec_per_read_object_op=PROBE-usec_per_read_object_op; usec_per_write_bucket_op=PROBE-usec_per_write_bucket_op; usec_per_write_object_op=PROBE-usec_per_write_object_op; write_buckets_per_sec=PROBE-write_buckets_per_sec; write_objects_per_sec=PROBE-write_objects_per_sec}", + "WireName": "names", + "IsCandidate": false, + "Gate": "Matched", + "ValueFromPipeline": false, + "Outcome": "Bound", + "Evidence": "names=PROBE-name (from property 'name')", + "BoundWireKey": "names", + "BoundValue": "PROBE-name", "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ @@ -32693,18 +35983,18 @@ { "Cmdlet": "Remove-PfbOpenFile", "Verb": "Remove", - "Parameter": "Name", + "Parameter": "Id", "Producer": "GET /file-systems", "IsPrimary": false, "FromExample": false, - "WireName": "names", + "WireName": "ids", "IsCandidate": false, "Gate": "Matched", - "ValueFromPipeline": true, + "ValueFromPipeline": false, "Outcome": "Bound", - "Evidence": "names=PROBE-name (from property 'name')", - "BoundWireKey": "names", - "BoundValue": "PROBE-name", + "Evidence": "ids=PROBE-id (from property 'id')", + "BoundWireKey": "ids", + "BoundValue": "PROBE-id", "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ @@ -32771,20 +36061,22 @@ { "Cmdlet": "Remove-PfbOpenFile", "Verb": "Remove", - "Parameter": "Name", + "Parameter": "Id", "Producer": "GET /file-systems/audit-policies", "IsPrimary": false, "FromExample": false, - "WireName": "names", + "WireName": "ids", "IsCandidate": true, "Gate": "Candidate", - "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "names=@{context=; member=; policy=}", - "BoundWireKey": "names", - "BoundValue": "@{context=; member=; policy=}", - "ErrorKind": null, - "FilledParameter": [], + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", + "FilledParameter": [ + "Id" + ], "ProbeProperties": [ "context", "member", @@ -32799,20 +36091,22 @@ { "Cmdlet": "Remove-PfbOpenFile", "Verb": "Remove", - "Parameter": "Name", + "Parameter": "Id", "Producer": "GET /file-systems/data-eviction-policies", "IsPrimary": false, "FromExample": false, - "WireName": "names", + "WireName": "ids", "IsCandidate": true, "Gate": "Candidate", - "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "names=@{context=; member=; policy=}", - "BoundWireKey": "names", - "BoundValue": "@{context=; member=; policy=}", - "ErrorKind": null, - "FilledParameter": [], + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", + "FilledParameter": [ + "Id" + ], "ProbeProperties": [ "context", "member", @@ -32827,20 +36121,22 @@ { "Cmdlet": "Remove-PfbOpenFile", "Verb": "Remove", - "Parameter": "Name", + "Parameter": "Id", "Producer": "GET /file-systems/groups", "IsPrimary": false, "FromExample": false, - "WireName": "names", + "WireName": "ids", "IsCandidate": true, "Gate": "Candidate", - "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "names=@{context=; file_system=; group=; limited_by=; percentage_used=PROBE-percentage_used; quota_limit=PROBE-quota_limit; usage=PROBE-usage}", - "BoundWireKey": "names", - "BoundValue": "@{context=; file_system=; group=; limited_by=; percentage_used=PROBE-percentage_used; quota_limit=PROBE-quota_limit; usage=PROBE-usage}", - "ErrorKind": null, - "FilledParameter": [], + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", + "FilledParameter": [ + "Id" + ], "ProbeProperties": [ "context", "file_system", @@ -32863,20 +36159,22 @@ { "Cmdlet": "Remove-PfbOpenFile", "Verb": "Remove", - "Parameter": "Name", + "Parameter": "Id", "Producer": "GET /file-systems/groups/performance", "IsPrimary": false, "FromExample": false, - "WireName": "names", - "IsCandidate": false, - "Gate": "Matched", - "ValueFromPipeline": true, - "Outcome": "Bound", - "Evidence": "names=PROBE-name (from property 'name')", - "BoundWireKey": "names", - "BoundValue": "PROBE-name", - "ErrorKind": null, - "FilledParameter": [], + "WireName": "ids", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", + "FilledParameter": [ + "Id" + ], "ProbeProperties": [ "bytes_per_op", "bytes_per_read", @@ -32915,20 +36213,22 @@ { "Cmdlet": "Remove-PfbOpenFile", "Verb": "Remove", - "Parameter": "Name", + "Parameter": "Id", "Producer": "GET /file-systems/locks", "IsPrimary": false, "FromExample": false, - "WireName": "names", - "IsCandidate": false, - "Gate": "Matched", - "ValueFromPipeline": true, - "Outcome": "Bound", - "Evidence": "names=PROBE-name (from property 'name')", - "BoundWireKey": "names", - "BoundValue": "PROBE-name", - "ErrorKind": null, - "FilledParameter": [], + "WireName": "ids", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", + "FilledParameter": [ + "Id" + ], "ProbeProperties": [ "access_type", "client", @@ -32957,20 +36257,22 @@ { "Cmdlet": "Remove-PfbOpenFile", "Verb": "Remove", - "Parameter": "Name", + "Parameter": "Id", "Producer": "GET /file-systems/locks/clients", "IsPrimary": false, "FromExample": false, - "WireName": "names", - "IsCandidate": false, - "Gate": "Matched", - "ValueFromPipeline": true, - "Outcome": "Bound", - "Evidence": "names=PROBE-name (from property 'name')", - "BoundWireKey": "names", - "BoundValue": "PROBE-name", - "ErrorKind": null, - "FilledParameter": [], + "WireName": "ids", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", + "FilledParameter": [ + "Id" + ], "ProbeProperties": [ "context", "name" @@ -32983,18 +36285,18 @@ { "Cmdlet": "Remove-PfbOpenFile", "Verb": "Remove", - "Parameter": "Name", + "Parameter": "Id", "Producer": "GET /file-systems/open-files", "IsPrimary": true, "FromExample": false, - "WireName": "names", - "IsCandidate": true, - "Gate": "Candidate", - "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "names=@{client=; id=PROBE-id; lock_count=PROBE-lock_count; mode=PROBE-mode; path=PROBE-path; session=; source=; user=}", - "BoundWireKey": "names", - "BoundValue": "@{client=; id=PROBE-id; lock_count=PROBE-lock_count; mode=PROBE-mode; path=PROBE-path; session=; source=; user=}", + "WireName": "ids", + "IsCandidate": false, + "Gate": "Matched", + "ValueFromPipeline": false, + "Outcome": "Bound", + "Evidence": "ids=PROBE-id (from property 'id')", + "BoundWireKey": "ids", + "BoundValue": "PROBE-id", "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ @@ -33021,18 +36323,18 @@ { "Cmdlet": "Remove-PfbOpenFile", "Verb": "Remove", - "Parameter": "Name", + "Parameter": "Id", "Producer": "GET /file-systems/performance", "IsPrimary": false, "FromExample": false, - "WireName": "names", + "WireName": "ids", "IsCandidate": false, "Gate": "Matched", - "ValueFromPipeline": true, + "ValueFromPipeline": false, "Outcome": "Bound", - "Evidence": "names=PROBE-name (from property 'name')", - "BoundWireKey": "names", - "BoundValue": "PROBE-name", + "Evidence": "ids=PROBE-id (from property 'id')", + "BoundWireKey": "ids", + "BoundValue": "PROBE-id", "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ @@ -33071,20 +36373,22 @@ { "Cmdlet": "Remove-PfbOpenFile", "Verb": "Remove", - "Parameter": "Name", + "Parameter": "Id", "Producer": "GET /file-systems/policies", "IsPrimary": false, "FromExample": false, - "WireName": "names", + "WireName": "ids", "IsCandidate": true, "Gate": "Candidate", - "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "names=@{context=; member=; policy=}", - "BoundWireKey": "names", - "BoundValue": "@{context=; member=; policy=}", - "ErrorKind": null, - "FilledParameter": [], + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", + "FilledParameter": [ + "Id" + ], "ProbeProperties": [ "context", "member", @@ -33099,20 +36403,22 @@ { "Cmdlet": "Remove-PfbOpenFile", "Verb": "Remove", - "Parameter": "Name", + "Parameter": "Id", "Producer": "GET /file-systems/policies-all", "IsPrimary": false, "FromExample": false, - "WireName": "names", + "WireName": "ids", "IsCandidate": true, "Gate": "Candidate", - "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "names=@{context=; member=; policy=}", - "BoundWireKey": "names", - "BoundValue": "@{context=; member=; policy=}", - "ErrorKind": null, - "FilledParameter": [], + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", + "FilledParameter": [ + "Id" + ], "ProbeProperties": [ "context", "member", @@ -33127,20 +36433,22 @@ { "Cmdlet": "Remove-PfbOpenFile", "Verb": "Remove", - "Parameter": "Name", + "Parameter": "Id", "Producer": "GET /file-systems/sessions", "IsPrimary": false, "FromExample": false, - "WireName": "names", - "IsCandidate": false, - "Gate": "Matched", - "ValueFromPipeline": true, - "Outcome": "Bound", - "Evidence": "names=PROBE-name (from property 'name')", - "BoundWireKey": "names", - "BoundValue": "PROBE-name", - "ErrorKind": null, - "FilledParameter": [], + "WireName": "ids", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", + "FilledParameter": [ + "Id" + ], "ProbeProperties": [ "authentication", "client", @@ -33171,18 +36479,18 @@ { "Cmdlet": "Remove-PfbOpenFile", "Verb": "Remove", - "Parameter": "Name", + "Parameter": "Id", "Producer": "GET /file-systems/space/storage-classes", "IsPrimary": false, "FromExample": false, - "WireName": "names", + "WireName": "ids", "IsCandidate": false, "Gate": "Matched", - "ValueFromPipeline": true, + "ValueFromPipeline": false, "Outcome": "Bound", - "Evidence": "names=PROBE-name (from property 'name')", - "BoundWireKey": "names", - "BoundValue": "PROBE-name", + "Evidence": "ids=PROBE-id (from property 'id')", + "BoundWireKey": "ids", + "BoundValue": "PROBE-id", "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ @@ -33203,20 +36511,22 @@ { "Cmdlet": "Remove-PfbOpenFile", "Verb": "Remove", - "Parameter": "Name", + "Parameter": "Id", "Producer": "GET /file-systems/user-group-quota-policies", "IsPrimary": false, "FromExample": false, - "WireName": "names", + "WireName": "ids", "IsCandidate": true, "Gate": "Candidate", - "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "names=@{context=; member=; policy=}", - "BoundWireKey": "names", - "BoundValue": "@{context=; member=; policy=}", - "ErrorKind": null, - "FilledParameter": [], + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", + "FilledParameter": [ + "Id" + ], "ProbeProperties": [ "context", "member", @@ -33231,20 +36541,22 @@ { "Cmdlet": "Remove-PfbOpenFile", "Verb": "Remove", - "Parameter": "Name", + "Parameter": "Id", "Producer": "GET /file-systems/users", "IsPrimary": false, "FromExample": false, - "WireName": "names", + "WireName": "ids", "IsCandidate": true, "Gate": "Candidate", - "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "names=@{context=; file_system=; limited_by=; percentage_used=PROBE-percentage_used; quota_limit=PROBE-quota_limit; usage=PROBE-usage; user=}", - "BoundWireKey": "names", - "BoundValue": "@{context=; file_system=; limited_by=; percentage_used=PROBE-percentage_used; quota_limit=PROBE-quota_limit; usage=PROBE-usage; user=}", - "ErrorKind": null, - "FilledParameter": [], + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", + "FilledParameter": [ + "Id" + ], "ProbeProperties": [ "context", "file_system", @@ -33267,20 +36579,22 @@ { "Cmdlet": "Remove-PfbOpenFile", "Verb": "Remove", - "Parameter": "Name", + "Parameter": "Id", "Producer": "GET /file-systems/users/performance", "IsPrimary": false, "FromExample": false, - "WireName": "names", - "IsCandidate": false, - "Gate": "Matched", - "ValueFromPipeline": true, - "Outcome": "Bound", - "Evidence": "names=PROBE-name (from property 'name')", - "BoundWireKey": "names", - "BoundValue": "PROBE-name", - "ErrorKind": null, - "FilledParameter": [], + "WireName": "ids", + "IsCandidate": true, + "Gate": "Candidate", + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", + "FilledParameter": [ + "Id" + ], "ProbeProperties": [ "bytes_per_op", "bytes_per_read", @@ -33319,20 +36633,22 @@ { "Cmdlet": "Remove-PfbOpenFile", "Verb": "Remove", - "Parameter": "Name", + "Parameter": "Id", "Producer": "GET /file-systems/worm-data-policies", "IsPrimary": false, "FromExample": false, - "WireName": "names", + "WireName": "ids", "IsCandidate": true, "Gate": "Candidate", - "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "names=@{context=; member=; policy=}", - "BoundWireKey": "names", - "BoundValue": "@{context=; member=; policy=}", - "ErrorKind": null, - "FilledParameter": [], + "ValueFromPipeline": false, + "Outcome": "Unbindable", + "Evidence": "The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its properties do not match any of the parameters that take pipeline input.", + "BoundWireKey": null, + "BoundValue": null, + "ErrorKind": "InputObjectNotBound", + "FilledParameter": [ + "Id" + ], "ProbeProperties": [ "context", "member", @@ -34319,18 +37635,18 @@ { "Cmdlet": "Remove-PfbResourceAccess", "Verb": "Remove", - "Parameter": "Name", + "Parameter": "Id", "Producer": "GET /resource-accesses", "IsPrimary": true, "FromExample": false, - "WireName": "names", - "IsCandidate": true, - "Gate": "Candidate", - "ValueFromPipeline": true, - "Outcome": "Coerced", - "Evidence": "names=@{id=PROBE-id; resource=; scope=}", - "BoundWireKey": "names", - "BoundValue": "@{id=PROBE-id; resource=; scope=}", + "WireName": "ids", + "IsCandidate": false, + "Gate": "Matched", + "ValueFromPipeline": false, + "Outcome": "Bound", + "Evidence": "ids=PROBE-id (from property 'id')", + "BoundWireKey": "ids", + "BoundValue": "PROBE-id", "ErrorKind": null, "FilledParameter": [], "ProbeProperties": [ @@ -37469,7 +40785,7 @@ { "Cmdlet": "Update-PfbBucketAuditFilter", "Verb": "Update", - "Parameter": "MemberName", + "Parameter": "BucketName", "Producer": "GET /buckets", "IsPrimary": false, "FromExample": false, @@ -37483,7 +40799,7 @@ "BoundValue": null, "ErrorKind": "InputObjectNotBound", "FilledParameter": [ - "MemberName" + "BucketName" ], "ProbeProperties": [ "account", @@ -37535,7 +40851,7 @@ { "Cmdlet": "Update-PfbBucketAuditFilter", "Verb": "Update", - "Parameter": "MemberName", + "Parameter": "BucketName", "Producer": "GET /buckets/audit-filters", "IsPrimary": true, "FromExample": false, @@ -37549,7 +40865,7 @@ "BoundValue": null, "ErrorKind": "InputObjectNotBound", "FilledParameter": [ - "MemberName" + "BucketName" ], "ProbeProperties": [ "actions", @@ -37569,7 +40885,7 @@ { "Cmdlet": "Update-PfbBucketAuditFilter", "Verb": "Update", - "Parameter": "MemberName", + "Parameter": "BucketName", "Producer": "GET /buckets/bucket-access-policies", "IsPrimary": false, "FromExample": false, @@ -37583,7 +40899,7 @@ "BoundValue": null, "ErrorKind": "InputObjectNotBound", "FilledParameter": [ - "MemberName" + "BucketName" ], "ProbeProperties": [ "bucket", @@ -37613,7 +40929,7 @@ { "Cmdlet": "Update-PfbBucketAuditFilter", "Verb": "Update", - "Parameter": "MemberName", + "Parameter": "BucketName", "Producer": "GET /buckets/bucket-access-policies/rules", "IsPrimary": false, "FromExample": false, @@ -37627,7 +40943,7 @@ "BoundValue": null, "ErrorKind": "InputObjectNotBound", "FilledParameter": [ - "MemberName" + "BucketName" ], "ProbeProperties": [ "actions", @@ -37651,7 +40967,7 @@ { "Cmdlet": "Update-PfbBucketAuditFilter", "Verb": "Update", - "Parameter": "MemberName", + "Parameter": "BucketName", "Producer": "GET /buckets/cross-origin-resource-sharing-policies", "IsPrimary": false, "FromExample": false, @@ -37665,7 +40981,7 @@ "BoundValue": null, "ErrorKind": "InputObjectNotBound", "FilledParameter": [ - "MemberName" + "BucketName" ], "ProbeProperties": [ "bucket", @@ -37695,7 +41011,7 @@ { "Cmdlet": "Update-PfbBucketAuditFilter", "Verb": "Update", - "Parameter": "MemberName", + "Parameter": "BucketName", "Producer": "GET /buckets/cross-origin-resource-sharing-policies/rules", "IsPrimary": false, "FromExample": false, @@ -37709,7 +41025,7 @@ "BoundValue": null, "ErrorKind": "InputObjectNotBound", "FilledParameter": [ - "MemberName" + "BucketName" ], "ProbeProperties": [ "allowed_headers", @@ -37731,7 +41047,7 @@ { "Cmdlet": "Update-PfbBucketAuditFilter", "Verb": "Update", - "Parameter": "MemberName", + "Parameter": "BucketName", "Producer": "GET /buckets/performance", "IsPrimary": false, "FromExample": false, @@ -37745,7 +41061,7 @@ "BoundValue": null, "ErrorKind": "InputObjectNotBound", "FilledParameter": [ - "MemberName" + "BucketName" ], "ProbeProperties": [ "bytes_per_op", @@ -37787,7 +41103,7 @@ { "Cmdlet": "Update-PfbBucketAuditFilter", "Verb": "Update", - "Parameter": "MemberName", + "Parameter": "BucketName", "Producer": "GET /buckets/s3-specific-performance", "IsPrimary": false, "FromExample": false, @@ -37801,7 +41117,7 @@ "BoundValue": null, "ErrorKind": "InputObjectNotBound", "FilledParameter": [ - "MemberName" + "BucketName" ], "ProbeProperties": [ "id", diff --git a/Reports/PfbPipelineSelectorMap.md b/Reports/PfbPipelineSelectorMap.md index bcbc6a95..4023d3e7 100644 --- a/Reports/PfbPipelineSelectorMap.md +++ b/Reports/PfbPipelineSelectorMap.md @@ -10,15 +10,15 @@ no request leaves the machine, and nothing here is inferred from pattern-matchin | Metric | Value | |---|---:| -| `probePairs` | 1179 | -| `evaluatedPairs` | 1145 | -| `candidatePairs` | 565 | -| `candidateRate` | 0.4934 | -| `findings` | 389 | -| `findingPairs` | 127 | -| `confirmationRate` | 0.6885 | -| `controlLeakage` | 2 | -| `assistedRows` | 152 | +| `probePairs` | 1247 | +| `evaluatedPairs` | 1213 | +| `candidatePairs` | 629 | +| `candidateRate` | 0.5185 | +| `findings` | 264 | +| `findingPairs` | 101 | +| `confirmationRate` | 0.4197 | +| `controlLeakage` | 0 | +| `assistedRows` | 213 | `findings` counts probe ROWS; `findingPairs` counts distinct (cmdlet, parameter) pairs. One defect appears once per producing endpoint, so rows always exceed pairs. @@ -28,12 +28,12 @@ defect appears once per producing endpoint, so rows always exceed pairs. | Outcome | Rows | Finding? | |---|---:|---| | `BindError` | 2 | triage -- the harness never invoked, the only unmeasured outcome | -| `Bound` | 574 | no -- the selector bound as intended | +| `Bound` | 578 | no -- the selector bound as intended | | `CmdletError` | 6 | no -- the cmdlet threw before any request was built | -| `Coerced` | 389 | **yes** -- a stringified object reached the wire | -| `Guarded` | 25 | no -- the #64 guard fired | -| `NoSelector` | 23 | no -- reported observation | -| `Unbindable` | 160 | no -- PowerShell declined to bind; pass 3 is ByValue so this cannot coerce | +| `Coerced` | 264 | **yes** -- a stringified object reached the wire | +| `Guarded` | 116 | no -- a #64/#90 coercion guard fired | +| `NoSelector` | 47 | no -- reported observation | +| `Unbindable` | 234 | no -- PowerShell declined to bind this probe object at all. Note that pass 4 is ByPropertyName WITH coercion, so a ByPropertyName-only parameter whose alias matches an object-valued property CAN still coerce; this outcome is not a structural immunity | ## Findings @@ -41,33 +41,7 @@ Ordered with primary-producer rows first: those are the chains a user would most | Cmdlet | Parameter | Producer | Primary | Evidence | |---|---|---|---|---| -| `Get-PfbArrayConnectionKey` | `Name` | `GET /array-connections/connection-key` | yes | `names=@{connection_key=PROBE-connection_key; created=PROBE-created; expires=PROBE-expires}` | -| `Get-PfbBucketAccessPolicy` | `MemberName` | `GET /buckets/bucket-access-policies` | yes | `member_names=@{bucket=; context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]}` | -| `Get-PfbBucketAccessPolicyRule` | `MemberName` | `GET /buckets/bucket-access-policies/rules` | yes | `member_names=@{actions=System.Object[]; context=; effect=PROBE-effect; name=PROBE-name; policy=; principals=; resources=System.Object[]}` | -| `Get-PfbBucketAuditFilter` | `MemberName` | `GET /buckets/audit-filters` | yes | `member_names=@{actions=System.Object[]; bucket=; context=; name=PROBE-name; s3_prefixes=System.Object[]}` | -| `Get-PfbBucketCorsPolicy` | `MemberName` | `GET /buckets/cross-origin-resource-sharing-policies` | yes | `member_names=@{bucket=; context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]}` | -| `Get-PfbBucketCorsPolicyRule` | `MemberName` | `GET /buckets/cross-origin-resource-sharing-policies/rules` | yes | `member_names=@{allowed_headers=System.Object[]; allowed_methods=System.Object[]; allowed_origins=System.Object[]; context=; name=PROBE-name; policy=}` | -| `Get-PfbCertificateGroupCertificate` | `Name` | `GET /certificate-groups/certificates` | yes | `names=@{group=; member=}` | -| `Get-PfbFleetKey` | `Name` | `GET /fleets/fleet-key` | yes | `names=@{created=PROBE-created; expires=PROBE-expires; fleet_key=PROBE-fleet_key}` | -| `Get-PfbLocalGroupMember` | `Group` | `GET /directory-services/local/groups/members` | yes | `group_names=@{context=; group=; group_gid=PROBE-group_gid; is_primary_group=PROBE-is_primary_group; local_directory_service=; member=; member_id=PROBE-member_id; realms=System.Object[]; server=}` | -| `Get-PfbNetworkAccessRule` | `PolicyName` | `GET /network-access-policies/rules` | yes | `policy_names=@{client=PROBE-client; effect=PROBE-effect; id=PROBE-id; index=PROBE-index; interfaces=System.Object[]; name=PROBE-name; policy=; policy_version=PROBE-policy_version}` | -| `Get-PfbNetworkConnectionStatistics` | `Name` | `GET /network-interfaces/network-connection-statistics` | yes | `names=@{current_state=PROBE-current_state; local=; remote=; time=PROBE-time}` | -| `Get-PfbNetworkInterfaceNeighbor` | `Name` | `GET /network-interfaces/neighbors` | yes | `names=@{initial_ttl_in_sec=PROBE-initial_ttl_in_sec; local_port=; neighbor_chassis=; neighbor_port=}` | -| `Get-PfbNfsExportRule` | `PolicyName` | `GET /nfs-export-policies/rules` | yes | `policy_names=@{access=PROBE-access; anongid=PROBE-anongid; anonuid=PROBE-anonuid; atime=PROBE-atime; client=PROBE-client; context=; fileid_32bit=PROBE-fileid_32bit; id=PROBE-id; index=PROBE-index; name=PROBE-name; permission=PROBE-permission; policy=; policy_version=PROBE-policy_version; required_transport_security=PROBE-required_transport_security; secure=PROBE-secure; security=System.Object[]}` | -| `Get-PfbObjectStoreAccessPolicyRule` | `PolicyName` | `GET /object-store-access-policies/rules` | yes | `policy_names=@{actions=System.Object[]; conditions=; context=; effect=PROBE-effect; name=PROBE-name; policy=; resources=System.Object[]}` | -| `Get-PfbObjectStoreTrustPolicy` | `RoleName` | `GET /object-store-roles/object-store-trust-policies` | yes | `role_names=@{context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; role=; rules=System.Object[]}` | -| `Get-PfbObjectStoreTrustPolicyRule` | `PolicyName` | `GET /object-store-roles/object-store-trust-policies/rules` | yes | `policy_names=@{actions=System.Object[]; conditions=System.Object[]; context=; effect=PROBE-effect; index=PROBE-index; name=PROBE-name; policy=; principals=System.Object[]}` | -| `Get-PfbOpenFile` | `Name` | `GET /file-systems/open-files` | yes | `names=@{client=; id=PROBE-id; lock_count=PROBE-lock_count; mode=PROBE-mode; path=PROBE-path; session=; source=; user=}` | -| `Get-PfbRealmDefaults` | `Name` | `GET /realms/defaults` | yes | `names=@{context=; object_store=System.Object[]; realm=}` | -| `Get-PfbResourceAccess` | `Name` | `GET /resource-accesses` | yes | `names=@{id=PROBE-id; resource=; scope=}` | -| `Get-PfbS3ExportRule` | `PolicyName` | `GET /s3-export-policies/rules` | yes | `policy_names=@{actions=System.Object[]; context=; effect=PROBE-effect; name=PROBE-name; policy=; resources=System.Object[]}` | -| `Get-PfbSmbClientRule` | `PolicyName` | `GET /smb-client-policies/rules` | yes | `policy_names=@{client=PROBE-client; context=; encryption=PROBE-encryption; id=PROBE-id; index=PROBE-index; name=PROBE-name; permission=PROBE-permission; policy=; policy_version=PROBE-policy_version}` | -| `Get-PfbSmbShareRule` | `PolicyName` | `GET /smb-share-policies/rules` | yes | `policy_names=@{change=PROBE-change; context=; full_control=PROBE-full_control; id=PROBE-id; name=PROBE-name; policy=; principal=PROBE-principal; read=PROBE-read}` | | `Get-PfbUserGroupQuotaPolicyRule` | `PolicyName` | `GET /user-group-quota-policies/rules` | yes | `policy_names=@{context=; enforced=PROBE-enforced; id=PROBE-id; index=PROBE-index; name=PROBE-name; notifications=PROBE-notifications; policy=; policy_version=PROBE-policy_version; quota_limit=PROBE-quota_limit; quota_type=PROBE-quota_type; subject=}` | -| `Remove-PfbBucketAuditFilter` | `MemberName` | `GET /buckets/audit-filters` | yes | `member_names=@{actions=System.Object[]; bucket=; context=; name=PROBE-name; s3_prefixes=System.Object[]}` | -| `Remove-PfbBucketCorsPolicy` | `MemberName` | `GET /buckets/cross-origin-resource-sharing-policies` | yes | `member_names=@{bucket=; context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]}` | -| `Remove-PfbOpenFile` | `Name` | `GET /file-systems/open-files` | yes | `names=@{client=; id=PROBE-id; lock_count=PROBE-lock_count; mode=PROBE-mode; path=PROBE-path; session=; source=; user=}` | -| `Remove-PfbResourceAccess` | `Name` | `GET /resource-accesses` | yes | `names=@{id=PROBE-id; resource=; scope=}` | | `Get-PfbActiveDirectory` | `Name` | `GET /active-directory/test` | | `names=@{component_address=PROBE-component_address; component_name=PROBE-component_name; context=; description=PROBE-description; destination=PROBE-destination; enabled=PROBE-enabled; resource=; result_details=PROBE-result_details; success=PROBE-success; test_type=PROBE-test_type}` | | `Get-PfbAdmin` | `Name` | `GET /admins/api-tokens` | | `names=@{admin=; api_token=; context=}` | | `Get-PfbAdmin` | `Name` | `GET /admins/management-access-policies` | | `names=@{context=; member=; policy=}` | @@ -80,46 +54,8 @@ Ordered with primary-producer rows first: those are the chains a user would most | `Get-PfbAdminCache` | `Name` | `GET /admins/settings` | | `names=@{lockout_duration=PROBE-lockout_duration; max_login_attempts=PROBE-max_login_attempts; min_password_length=PROBE-min_password_length}` | | `Get-PfbAdminCache` | `Name` | `GET /admins/ssh-certificate-authority-policies` | | `names=@{context=; member=; policy=}` | | `Get-PfbAlertWatcher` | `Name` | `GET /alert-watchers/test` | | `names=@{component_address=PROBE-component_address; component_name=PROBE-component_name; description=PROBE-description; destination=PROBE-destination; enabled=PROBE-enabled; resource=; result_details=PROBE-result_details; success=PROBE-success; test_type=PROBE-test_type}` | -| `Get-PfbArrayConnectionKey` | `Name` | `GET /array-connections` | | `names=@{ca_certificate_group=; context=; encrypted=PROBE-encrypted; id=PROBE-id; management_address=PROBE-management_address; os=PROBE-os; remote=; replication_addresses=System.Object[]; status=PROBE-status; throttle=; type=PROBE-type; version=PROBE-version}` | -| `Get-PfbArrayConnectionKey` | `Name` | `GET /array-connections/path` | | `names=@{context=; destination=PROBE-destination; id=PROBE-id; remote=; source=PROBE-source; status=PROBE-status; status_details=PROBE-status_details; type=PROBE-type}` | -| `Get-PfbArrayConnectionKey` | `Name` | `GET /array-connections/performance/replication` | | `names=@{aggregate=; continuous=; id=PROBE-id; periodic=; remote=; time=PROBE-time}` | | `Get-PfbAuditFileSystemPolicy` | `Name` | `GET /audit-file-systems-policies/members` | | `names=@{context=; member=; policy=}` | | `Get-PfbAuditObjectStorePolicy` | `Name` | `GET /audit-object-store-policies/members` | | `names=@{context=; member=; policy=}` | -| `Get-PfbBucketAccessPolicy` | `MemberName` | `GET /buckets` | | `member_names=@{account=; bucket_type=PROBE-bucket_type; context=; created=PROBE-created; destroyed=PROBE-destroyed; eradication_config=; hard_limit_enabled=PROBE-hard_limit_enabled; id=PROBE-id; name=PROBE-name; object_count=PROBE-object_count; object_lock_config=; public_access_config=; public_status=PROBE-public_status; qos_policy=; quota_limit=PROBE-quota_limit; retention_lock=PROBE-retention_lock; space=; storage_class=; time_remaining=PROBE-time_remaining; time_remaining_status=PROBE-time_remaining_status; versioning=PROBE-versioning}` | -| `Get-PfbBucketAccessPolicy` | `MemberName` | `GET /buckets/audit-filters` | | `member_names=@{actions=System.Object[]; bucket=; context=; name=PROBE-name; s3_prefixes=System.Object[]}` | -| `Get-PfbBucketAccessPolicy` | `MemberName` | `GET /buckets/bucket-access-policies/rules` | | `member_names=@{actions=System.Object[]; context=; effect=PROBE-effect; name=PROBE-name; policy=; principals=; resources=System.Object[]}` | -| `Get-PfbBucketAccessPolicy` | `MemberName` | `GET /buckets/cross-origin-resource-sharing-policies` | | `member_names=@{bucket=; context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]}` | -| `Get-PfbBucketAccessPolicy` | `MemberName` | `GET /buckets/cross-origin-resource-sharing-policies/rules` | | `member_names=@{allowed_headers=System.Object[]; allowed_methods=System.Object[]; allowed_origins=System.Object[]; context=; name=PROBE-name; policy=}` | -| `Get-PfbBucketAccessPolicy` | `MemberName` | `GET /buckets/performance` | | `member_names=@{bytes_per_op=PROBE-bytes_per_op; bytes_per_read=PROBE-bytes_per_read; bytes_per_write=PROBE-bytes_per_write; id=PROBE-id; max_total_bytes_per_sec=PROBE-max_total_bytes_per_sec; max_total_ops_per_sec=PROBE-max_total_ops_per_sec; name=PROBE-name; others_per_sec=PROBE-others_per_sec; read_bytes_per_sec=PROBE-read_bytes_per_sec; reads_per_sec=PROBE-reads_per_sec; time=PROBE-time; usec_per_other_op=PROBE-usec_per_other_op; usec_per_read_op=PROBE-usec_per_read_op; usec_per_write_op=PROBE-usec_per_write_op; write_bytes_per_sec=PROBE-write_bytes_per_sec; writes_per_sec=PROBE-writes_per_sec}` | -| `Get-PfbBucketAccessPolicy` | `MemberName` | `GET /buckets/s3-specific-performance` | | `member_names=@{id=PROBE-id; name=PROBE-name; others_per_sec=PROBE-others_per_sec; read_buckets_per_sec=PROBE-read_buckets_per_sec; read_objects_per_sec=PROBE-read_objects_per_sec; time=PROBE-time; usec_per_other_op=PROBE-usec_per_other_op; usec_per_read_bucket_op=PROBE-usec_per_read_bucket_op; usec_per_read_object_op=PROBE-usec_per_read_object_op; usec_per_write_bucket_op=PROBE-usec_per_write_bucket_op; usec_per_write_object_op=PROBE-usec_per_write_object_op; write_buckets_per_sec=PROBE-write_buckets_per_sec; write_objects_per_sec=PROBE-write_objects_per_sec}` | -| `Get-PfbBucketAccessPolicyRule` | `MemberName` | `GET /buckets` | | `member_names=@{account=; bucket_type=PROBE-bucket_type; context=; created=PROBE-created; destroyed=PROBE-destroyed; eradication_config=; hard_limit_enabled=PROBE-hard_limit_enabled; id=PROBE-id; name=PROBE-name; object_count=PROBE-object_count; object_lock_config=; public_access_config=; public_status=PROBE-public_status; qos_policy=; quota_limit=PROBE-quota_limit; retention_lock=PROBE-retention_lock; space=; storage_class=; time_remaining=PROBE-time_remaining; time_remaining_status=PROBE-time_remaining_status; versioning=PROBE-versioning}` | -| `Get-PfbBucketAccessPolicyRule` | `MemberName` | `GET /buckets/audit-filters` | | `member_names=@{actions=System.Object[]; bucket=; context=; name=PROBE-name; s3_prefixes=System.Object[]}` | -| `Get-PfbBucketAccessPolicyRule` | `MemberName` | `GET /buckets/bucket-access-policies` | | `member_names=@{bucket=; context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]}` | -| `Get-PfbBucketAccessPolicyRule` | `MemberName` | `GET /buckets/cross-origin-resource-sharing-policies` | | `member_names=@{bucket=; context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]}` | -| `Get-PfbBucketAccessPolicyRule` | `MemberName` | `GET /buckets/cross-origin-resource-sharing-policies/rules` | | `member_names=@{allowed_headers=System.Object[]; allowed_methods=System.Object[]; allowed_origins=System.Object[]; context=; name=PROBE-name; policy=}` | -| `Get-PfbBucketAccessPolicyRule` | `MemberName` | `GET /buckets/performance` | | `member_names=@{bytes_per_op=PROBE-bytes_per_op; bytes_per_read=PROBE-bytes_per_read; bytes_per_write=PROBE-bytes_per_write; id=PROBE-id; max_total_bytes_per_sec=PROBE-max_total_bytes_per_sec; max_total_ops_per_sec=PROBE-max_total_ops_per_sec; name=PROBE-name; others_per_sec=PROBE-others_per_sec; read_bytes_per_sec=PROBE-read_bytes_per_sec; reads_per_sec=PROBE-reads_per_sec; time=PROBE-time; usec_per_other_op=PROBE-usec_per_other_op; usec_per_read_op=PROBE-usec_per_read_op; usec_per_write_op=PROBE-usec_per_write_op; write_bytes_per_sec=PROBE-write_bytes_per_sec; writes_per_sec=PROBE-writes_per_sec}` | -| `Get-PfbBucketAccessPolicyRule` | `MemberName` | `GET /buckets/s3-specific-performance` | | `member_names=@{id=PROBE-id; name=PROBE-name; others_per_sec=PROBE-others_per_sec; read_buckets_per_sec=PROBE-read_buckets_per_sec; read_objects_per_sec=PROBE-read_objects_per_sec; time=PROBE-time; usec_per_other_op=PROBE-usec_per_other_op; usec_per_read_bucket_op=PROBE-usec_per_read_bucket_op; usec_per_read_object_op=PROBE-usec_per_read_object_op; usec_per_write_bucket_op=PROBE-usec_per_write_bucket_op; usec_per_write_object_op=PROBE-usec_per_write_object_op; write_buckets_per_sec=PROBE-write_buckets_per_sec; write_objects_per_sec=PROBE-write_objects_per_sec}` | -| `Get-PfbBucketAuditFilter` | `MemberName` | `GET /buckets` | | `member_names=@{account=; bucket_type=PROBE-bucket_type; context=; created=PROBE-created; destroyed=PROBE-destroyed; eradication_config=; hard_limit_enabled=PROBE-hard_limit_enabled; id=PROBE-id; name=PROBE-name; object_count=PROBE-object_count; object_lock_config=; public_access_config=; public_status=PROBE-public_status; qos_policy=; quota_limit=PROBE-quota_limit; retention_lock=PROBE-retention_lock; space=; storage_class=; time_remaining=PROBE-time_remaining; time_remaining_status=PROBE-time_remaining_status; versioning=PROBE-versioning}` | -| `Get-PfbBucketAuditFilter` | `MemberName` | `GET /buckets/bucket-access-policies` | | `member_names=@{bucket=; context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]}` | -| `Get-PfbBucketAuditFilter` | `MemberName` | `GET /buckets/bucket-access-policies/rules` | | `member_names=@{actions=System.Object[]; context=; effect=PROBE-effect; name=PROBE-name; policy=; principals=; resources=System.Object[]}` | -| `Get-PfbBucketAuditFilter` | `MemberName` | `GET /buckets/cross-origin-resource-sharing-policies` | | `member_names=@{bucket=; context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]}` | -| `Get-PfbBucketAuditFilter` | `MemberName` | `GET /buckets/cross-origin-resource-sharing-policies/rules` | | `member_names=@{allowed_headers=System.Object[]; allowed_methods=System.Object[]; allowed_origins=System.Object[]; context=; name=PROBE-name; policy=}` | -| `Get-PfbBucketAuditFilter` | `MemberName` | `GET /buckets/performance` | | `member_names=@{bytes_per_op=PROBE-bytes_per_op; bytes_per_read=PROBE-bytes_per_read; bytes_per_write=PROBE-bytes_per_write; id=PROBE-id; max_total_bytes_per_sec=PROBE-max_total_bytes_per_sec; max_total_ops_per_sec=PROBE-max_total_ops_per_sec; name=PROBE-name; others_per_sec=PROBE-others_per_sec; read_bytes_per_sec=PROBE-read_bytes_per_sec; reads_per_sec=PROBE-reads_per_sec; time=PROBE-time; usec_per_other_op=PROBE-usec_per_other_op; usec_per_read_op=PROBE-usec_per_read_op; usec_per_write_op=PROBE-usec_per_write_op; write_bytes_per_sec=PROBE-write_bytes_per_sec; writes_per_sec=PROBE-writes_per_sec}` | -| `Get-PfbBucketAuditFilter` | `MemberName` | `GET /buckets/s3-specific-performance` | | `member_names=@{id=PROBE-id; name=PROBE-name; others_per_sec=PROBE-others_per_sec; read_buckets_per_sec=PROBE-read_buckets_per_sec; read_objects_per_sec=PROBE-read_objects_per_sec; time=PROBE-time; usec_per_other_op=PROBE-usec_per_other_op; usec_per_read_bucket_op=PROBE-usec_per_read_bucket_op; usec_per_read_object_op=PROBE-usec_per_read_object_op; usec_per_write_bucket_op=PROBE-usec_per_write_bucket_op; usec_per_write_object_op=PROBE-usec_per_write_object_op; write_buckets_per_sec=PROBE-write_buckets_per_sec; write_objects_per_sec=PROBE-write_objects_per_sec}` | -| `Get-PfbBucketCorsPolicy` | `MemberName` | `GET /buckets` | | `member_names=@{account=; bucket_type=PROBE-bucket_type; context=; created=PROBE-created; destroyed=PROBE-destroyed; eradication_config=; hard_limit_enabled=PROBE-hard_limit_enabled; id=PROBE-id; name=PROBE-name; object_count=PROBE-object_count; object_lock_config=; public_access_config=; public_status=PROBE-public_status; qos_policy=; quota_limit=PROBE-quota_limit; retention_lock=PROBE-retention_lock; space=; storage_class=; time_remaining=PROBE-time_remaining; time_remaining_status=PROBE-time_remaining_status; versioning=PROBE-versioning}` | -| `Get-PfbBucketCorsPolicy` | `MemberName` | `GET /buckets/audit-filters` | | `member_names=@{actions=System.Object[]; bucket=; context=; name=PROBE-name; s3_prefixes=System.Object[]}` | -| `Get-PfbBucketCorsPolicy` | `MemberName` | `GET /buckets/bucket-access-policies` | | `member_names=@{bucket=; context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]}` | -| `Get-PfbBucketCorsPolicy` | `MemberName` | `GET /buckets/bucket-access-policies/rules` | | `member_names=@{actions=System.Object[]; context=; effect=PROBE-effect; name=PROBE-name; policy=; principals=; resources=System.Object[]}` | -| `Get-PfbBucketCorsPolicy` | `MemberName` | `GET /buckets/cross-origin-resource-sharing-policies/rules` | | `member_names=@{allowed_headers=System.Object[]; allowed_methods=System.Object[]; allowed_origins=System.Object[]; context=; name=PROBE-name; policy=}` | -| `Get-PfbBucketCorsPolicy` | `MemberName` | `GET /buckets/performance` | | `member_names=@{bytes_per_op=PROBE-bytes_per_op; bytes_per_read=PROBE-bytes_per_read; bytes_per_write=PROBE-bytes_per_write; id=PROBE-id; max_total_bytes_per_sec=PROBE-max_total_bytes_per_sec; max_total_ops_per_sec=PROBE-max_total_ops_per_sec; name=PROBE-name; others_per_sec=PROBE-others_per_sec; read_bytes_per_sec=PROBE-read_bytes_per_sec; reads_per_sec=PROBE-reads_per_sec; time=PROBE-time; usec_per_other_op=PROBE-usec_per_other_op; usec_per_read_op=PROBE-usec_per_read_op; usec_per_write_op=PROBE-usec_per_write_op; write_bytes_per_sec=PROBE-write_bytes_per_sec; writes_per_sec=PROBE-writes_per_sec}` | -| `Get-PfbBucketCorsPolicy` | `MemberName` | `GET /buckets/s3-specific-performance` | | `member_names=@{id=PROBE-id; name=PROBE-name; others_per_sec=PROBE-others_per_sec; read_buckets_per_sec=PROBE-read_buckets_per_sec; read_objects_per_sec=PROBE-read_objects_per_sec; time=PROBE-time; usec_per_other_op=PROBE-usec_per_other_op; usec_per_read_bucket_op=PROBE-usec_per_read_bucket_op; usec_per_read_object_op=PROBE-usec_per_read_object_op; usec_per_write_bucket_op=PROBE-usec_per_write_bucket_op; usec_per_write_object_op=PROBE-usec_per_write_object_op; write_buckets_per_sec=PROBE-write_buckets_per_sec; write_objects_per_sec=PROBE-write_objects_per_sec}` | -| `Get-PfbBucketCorsPolicyRule` | `MemberName` | `GET /buckets` | | `member_names=@{account=; bucket_type=PROBE-bucket_type; context=; created=PROBE-created; destroyed=PROBE-destroyed; eradication_config=; hard_limit_enabled=PROBE-hard_limit_enabled; id=PROBE-id; name=PROBE-name; object_count=PROBE-object_count; object_lock_config=; public_access_config=; public_status=PROBE-public_status; qos_policy=; quota_limit=PROBE-quota_limit; retention_lock=PROBE-retention_lock; space=; storage_class=; time_remaining=PROBE-time_remaining; time_remaining_status=PROBE-time_remaining_status; versioning=PROBE-versioning}` | -| `Get-PfbBucketCorsPolicyRule` | `MemberName` | `GET /buckets/audit-filters` | | `member_names=@{actions=System.Object[]; bucket=; context=; name=PROBE-name; s3_prefixes=System.Object[]}` | -| `Get-PfbBucketCorsPolicyRule` | `MemberName` | `GET /buckets/bucket-access-policies` | | `member_names=@{bucket=; context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]}` | -| `Get-PfbBucketCorsPolicyRule` | `MemberName` | `GET /buckets/bucket-access-policies/rules` | | `member_names=@{actions=System.Object[]; context=; effect=PROBE-effect; name=PROBE-name; policy=; principals=; resources=System.Object[]}` | -| `Get-PfbBucketCorsPolicyRule` | `MemberName` | `GET /buckets/cross-origin-resource-sharing-policies` | | `member_names=@{bucket=; context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]}` | -| `Get-PfbBucketCorsPolicyRule` | `MemberName` | `GET /buckets/performance` | | `member_names=@{bytes_per_op=PROBE-bytes_per_op; bytes_per_read=PROBE-bytes_per_read; bytes_per_write=PROBE-bytes_per_write; id=PROBE-id; max_total_bytes_per_sec=PROBE-max_total_bytes_per_sec; max_total_ops_per_sec=PROBE-max_total_ops_per_sec; name=PROBE-name; others_per_sec=PROBE-others_per_sec; read_bytes_per_sec=PROBE-read_bytes_per_sec; reads_per_sec=PROBE-reads_per_sec; time=PROBE-time; usec_per_other_op=PROBE-usec_per_other_op; usec_per_read_op=PROBE-usec_per_read_op; usec_per_write_op=PROBE-usec_per_write_op; write_bytes_per_sec=PROBE-write_bytes_per_sec; writes_per_sec=PROBE-writes_per_sec}` | -| `Get-PfbBucketCorsPolicyRule` | `MemberName` | `GET /buckets/s3-specific-performance` | | `member_names=@{id=PROBE-id; name=PROBE-name; others_per_sec=PROBE-others_per_sec; read_buckets_per_sec=PROBE-read_buckets_per_sec; read_objects_per_sec=PROBE-read_objects_per_sec; time=PROBE-time; usec_per_other_op=PROBE-usec_per_other_op; usec_per_read_bucket_op=PROBE-usec_per_read_bucket_op; usec_per_read_object_op=PROBE-usec_per_read_object_op; usec_per_write_bucket_op=PROBE-usec_per_write_bucket_op; usec_per_write_object_op=PROBE-usec_per_write_object_op; write_buckets_per_sec=PROBE-write_buckets_per_sec; write_objects_per_sec=PROBE-write_objects_per_sec}` | | `Get-PfbCertificate` | `Name` | `GET /certificates/certificate-groups` | | `names=@{group=; member=}` | | `Get-PfbCertificateGroup` | `Name` | `GET /certificate-groups/certificates` | | `names=@{group=; member=}` | | `Get-PfbCertificateGroupUse` | `Name` | `GET /certificate-groups/certificates` | | `names=@{group=; member=}` | @@ -201,7 +137,6 @@ Ordered with primary-producer rows first: those are the chains a user would most | `Get-PfbFileSystemUserPerformance` | `Name` | `GET /file-systems/worm-data-policies` | | `file_system_names=@{context=; member=; policy=}` | | `Get-PfbFleet` | `Name` | `GET /fleets/fleet-key` | | `names=@{created=PROBE-created; expires=PROBE-expires; fleet_key=PROBE-fleet_key}` | | `Get-PfbFleet` | `Name` | `GET /fleets/members` | | `names=@{coordinator_of=System.Object[]; fleet=; member=; status=PROBE-status; status_details=PROBE-status_details}` | -| `Get-PfbFleetKey` | `Name` | `GET /fleets/members` | | `names=@{coordinator_of=System.Object[]; fleet=; member=; status=PROBE-status; status_details=PROBE-status_details}` | | `Get-PfbKmip` | `Name` | `GET /kmip/test` | | `names=@{component_address=PROBE-component_address; component_name=PROBE-component_name; description=PROBE-description; destination=PROBE-destination; enabled=PROBE-enabled; resource=; result_details=PROBE-result_details; success=PROBE-success; test_type=PROBE-test_type}` | | `Get-PfbLegalHold` | `Name` | `GET /legal-holds/held-entities` | | `names=@{file_system=; legal_hold=; path=PROBE-path; status=PROBE-status}` | | `Get-PfbLocalDirectoryService` | `Name` | `GET /directory-services/local/groups/members` | | `names=@{context=; group=; group_gid=PROBE-group_gid; is_primary_group=PROBE-is_primary_group; local_directory_service=; member=; member_id=PROBE-member_id; realms=System.Object[]; server=}` | @@ -212,23 +147,10 @@ Ordered with primary-producer rows first: those are the chains a user would most | `Get-PfbLocalGroup` | `Name` | `GET /directory-services/local/users/members` | | `names=@{context=; group=; group_gid=PROBE-group_gid; is_primary_group=PROBE-is_primary_group; local_directory_service=; member=; member_id=PROBE-member_id; realms=System.Object[]; server=}` | | `Get-PfbLocalGroup` | `Name` | `GET /directory-services/roles/management-access-policies` | | `names=@{member=; policy=}` | | `Get-PfbLocalGroup` | `Name` | `GET /directory-services/test` | | `names=@{component_address=PROBE-component_address; component_name=PROBE-component_name; context=; description=PROBE-description; destination=PROBE-destination; enabled=PROBE-enabled; resource=; result_details=PROBE-result_details; success=PROBE-success; test_type=PROBE-test_type}` | -| `Get-PfbLocalGroupMember` | `Group` | `GET /directory-services` | | `group_names=@{base_dn=PROBE-base_dn; bind_password=PROBE-bind_password; bind_user=PROBE-bind_user; ca_certificate=; ca_certificate_group=; enabled=PROBE-enabled; id=PROBE-id; management=; name=PROBE-name; nfs=; services=System.Object[]; smb=; uris=System.Object[]}` | -| `Get-PfbLocalGroupMember` | `Group` | `GET /directory-services/local/directory-services` | | `group_names=@{context=; destroyed=PROBE-destroyed; domain=PROBE-domain; id=PROBE-id; name=PROBE-name; realms=System.Object[]; server=; time_remaining=PROBE-time_remaining}` | -| `Get-PfbLocalGroupMember` | `Group` | `GET /directory-services/local/groups` | | `group_names=@{built_in=PROBE-built_in; context=; email=PROBE-email; gid=PROBE-gid; local_directory_service=; name=PROBE-name; realms=System.Object[]; server=; sid=PROBE-sid}` | -| `Get-PfbLocalGroupMember` | `Group` | `GET /directory-services/local/users` | | `group_names=@{built_in=PROBE-built_in; context=; email=PROBE-email; enabled=PROBE-enabled; local_directory_service=; name=PROBE-name; primary_group=; realms=System.Object[]; server=; sid=PROBE-sid; uid=PROBE-uid}` | -| `Get-PfbLocalGroupMember` | `Group` | `GET /directory-services/local/users/members` | | `group_names=@{context=; group=; group_gid=PROBE-group_gid; is_primary_group=PROBE-is_primary_group; local_directory_service=; member=; member_id=PROBE-member_id; realms=System.Object[]; server=}` | -| `Get-PfbLocalGroupMember` | `Group` | `GET /directory-services/roles/management-access-policies` | | `group_names=@{member=; policy=}` | -| `Get-PfbLocalGroupMember` | `Group` | `GET /directory-services/test` | | `group_names=@{component_address=PROBE-component_address; component_name=PROBE-component_name; context=; description=PROBE-description; destination=PROBE-destination; enabled=PROBE-enabled; resource=; result_details=PROBE-result_details; success=PROBE-success; test_type=PROBE-test_type}` | | `Get-PfbManagementAccessPolicy` | `Name` | `GET /management-access-policies/admins` | | `names=@{context=; member=; policy=}` | | `Get-PfbManagementAccessPolicy` | `Name` | `GET /management-access-policies/directory-services/roles` | | `names=@{member=; policy=}` | | `Get-PfbManagementAccessPolicy` | `Name` | `GET /management-access-policies/members` | | `names=@{context=; member=; policy=}` | | `Get-PfbNetworkAccessPolicy` | `Name` | `GET /network-access-policies/members` | | `names=@{member=; policy=}` | -| `Get-PfbNetworkAccessRule` | `PolicyName` | `GET /network-access-policies` | | `policy_names=@{enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]; version=PROBE-version}` | -| `Get-PfbNetworkAccessRule` | `PolicyName` | `GET /network-access-policies/members` | | `policy_names=@{member=; policy=}` | -| `Get-PfbNetworkConnectionStatistics` | `Name` | `GET /network-interfaces/neighbors` | | `names=@{initial_ttl_in_sec=PROBE-initial_ttl_in_sec; local_port=; neighbor_chassis=; neighbor_port=}` | -| `Get-PfbNetworkConnectionStatistics` | `Name` | `GET /network-interfaces/ping` | | `names=@{component_name=PROBE-component_name; destination=PROBE-destination; details=PROBE-details; source=PROBE-source}` | -| `Get-PfbNetworkConnectionStatistics` | `Name` | `GET /network-interfaces/tls-policies` | | `names=@{member=; policy=}` | -| `Get-PfbNetworkConnectionStatistics` | `Name` | `GET /network-interfaces/trace` | | `names=@{component_name=PROBE-component_name; destination=PROBE-destination; details=PROBE-details; source=PROBE-source}` | | `Get-PfbNetworkInterface` | `Name` | `GET /network-interfaces/neighbors` | | `names=@{initial_ttl_in_sec=PROBE-initial_ttl_in_sec; local_port=; neighbor_chassis=; neighbor_port=}` | | `Get-PfbNetworkInterface` | `Name` | `GET /network-interfaces/network-connection-statistics` | | `names=@{current_state=PROBE-current_state; local=; remote=; time=PROBE-time}` | | `Get-PfbNetworkInterface` | `Name` | `GET /network-interfaces/ping` | | `names=@{component_name=PROBE-component_name; destination=PROBE-destination; details=PROBE-details; source=PROBE-source}` | @@ -249,35 +171,13 @@ Ordered with primary-producer rows first: those are the chains a user would most | `Get-PfbNetworkInterfaceConnectorSettings` | `Name` | `GET /network-interfaces/ping` | | `names=@{component_name=PROBE-component_name; destination=PROBE-destination; details=PROBE-details; source=PROBE-source}` | | `Get-PfbNetworkInterfaceConnectorSettings` | `Name` | `GET /network-interfaces/tls-policies` | | `names=@{member=; policy=}` | | `Get-PfbNetworkInterfaceConnectorSettings` | `Name` | `GET /network-interfaces/trace` | | `names=@{component_name=PROBE-component_name; destination=PROBE-destination; details=PROBE-details; source=PROBE-source}` | -| `Get-PfbNetworkInterfaceNeighbor` | `Name` | `GET /network-interfaces/network-connection-statistics` | | `names=@{current_state=PROBE-current_state; local=; remote=; time=PROBE-time}` | -| `Get-PfbNetworkInterfaceNeighbor` | `Name` | `GET /network-interfaces/ping` | | `names=@{component_name=PROBE-component_name; destination=PROBE-destination; details=PROBE-details; source=PROBE-source}` | -| `Get-PfbNetworkInterfaceNeighbor` | `Name` | `GET /network-interfaces/tls-policies` | | `names=@{member=; policy=}` | -| `Get-PfbNetworkInterfaceNeighbor` | `Name` | `GET /network-interfaces/trace` | | `names=@{component_name=PROBE-component_name; destination=PROBE-destination; details=PROBE-details; source=PROBE-source}` | -| `Get-PfbNfsExportRule` | `PolicyName` | `GET /nfs-export-policies` | | `policy_names=@{context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]; version=PROBE-version; workload=}` | | `Get-PfbNodeGroup` | `Name` | `GET /node-groups/nodes` | | `names=@{group=; member=}` | | `Get-PfbNodeGroupUse` | `Name` | `GET /node-groups/nodes` | | `names=@{group=; member=}` | | `Get-PfbObjectStoreAccessPolicy` | `Name` | `GET /object-store-access-policies/object-store-roles` | | `names=@{context=; member=; policy=}` | | `Get-PfbObjectStoreAccessPolicy` | `Name` | `GET /object-store-access-policies/object-store-users` | | `names=@{context=; member=; policy=}` | -| `Get-PfbObjectStoreAccessPolicyRule` | `PolicyName` | `GET /object-store-access-policies` | | `policy_names=@{account=; arn=PROBE-arn; context=; created=PROBE-created; description=PROBE-description; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]; updated=PROBE-updated}` | -| `Get-PfbObjectStoreAccessPolicyRule` | `PolicyName` | `GET /object-store-access-policies/object-store-roles` | | `policy_names=@{context=; member=; policy=}` | -| `Get-PfbObjectStoreAccessPolicyRule` | `PolicyName` | `GET /object-store-access-policies/object-store-users` | | `policy_names=@{context=; member=; policy=}` | | `Get-PfbObjectStoreRole` | `Name` | `GET /object-store-roles/object-store-access-policies` | | `names=@{context=; member=; policy=}` | -| `Get-PfbObjectStoreTrustPolicy` | `RoleName` | `GET /object-store-roles` | | `role_names=@{account=; context=; created=PROBE-created; id=PROBE-id; max_session_duration=PROBE-max_session_duration; name=PROBE-name; prn=PROBE-prn; trusted_entities=System.Object[]}` | -| `Get-PfbObjectStoreTrustPolicy` | `RoleName` | `GET /object-store-roles/object-store-access-policies` | | `role_names=@{context=; member=; policy=}` | -| `Get-PfbObjectStoreTrustPolicy` | `RoleName` | `GET /object-store-roles/object-store-trust-policies/rules` | | `role_names=@{actions=System.Object[]; conditions=System.Object[]; context=; effect=PROBE-effect; index=PROBE-index; name=PROBE-name; policy=; principals=System.Object[]}` | -| `Get-PfbObjectStoreTrustPolicyRule` | `PolicyName` | `GET /object-store-roles` | | `policy_names=@{account=; context=; created=PROBE-created; id=PROBE-id; max_session_duration=PROBE-max_session_duration; name=PROBE-name; prn=PROBE-prn; trusted_entities=System.Object[]}` | -| `Get-PfbObjectStoreTrustPolicyRule` | `PolicyName` | `GET /object-store-roles/object-store-access-policies` | | `policy_names=@{context=; member=; policy=}` | -| `Get-PfbObjectStoreTrustPolicyRule` | `PolicyName` | `GET /object-store-roles/object-store-trust-policies` | | `policy_names=@{context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; role=; rules=System.Object[]}` | | `Get-PfbObjectStoreUser` | `Name` | `GET /object-store-users/object-store-access-policies` | | `names=@{context=; member=; policy=}` | | `Get-PfbOidcIdp` | `Name` | `GET /sso/saml2/idps/test` | | `names=@{component_address=PROBE-component_address; component_name=PROBE-component_name; description=PROBE-description; destination=PROBE-destination; enabled=PROBE-enabled; resource=; result_details=PROBE-result_details; success=PROBE-success; test_type=PROBE-test_type}` | -| `Get-PfbOpenFile` | `Name` | `GET /file-systems/audit-policies` | | `names=@{context=; member=; policy=}` | -| `Get-PfbOpenFile` | `Name` | `GET /file-systems/data-eviction-policies` | | `names=@{context=; member=; policy=}` | -| `Get-PfbOpenFile` | `Name` | `GET /file-systems/groups` | | `names=@{context=; file_system=; group=; limited_by=; percentage_used=PROBE-percentage_used; quota_limit=PROBE-quota_limit; usage=PROBE-usage}` | -| `Get-PfbOpenFile` | `Name` | `GET /file-systems/policies` | | `names=@{context=; member=; policy=}` | -| `Get-PfbOpenFile` | `Name` | `GET /file-systems/policies-all` | | `names=@{context=; member=; policy=}` | -| `Get-PfbOpenFile` | `Name` | `GET /file-systems/user-group-quota-policies` | | `names=@{context=; member=; policy=}` | -| `Get-PfbOpenFile` | `Name` | `GET /file-systems/users` | | `names=@{context=; file_system=; limited_by=; percentage_used=PROBE-percentage_used; quota_limit=PROBE-quota_limit; usage=PROBE-usage; user=}` | -| `Get-PfbOpenFile` | `Name` | `GET /file-systems/worm-data-policies` | | `names=@{context=; member=; policy=}` | | `Get-PfbPolicy` | `Name` | `GET /policies/file-system-replica-links` | | `names=@{context=; link=; member=; policy=}` | | `Get-PfbPolicy` | `Name` | `GET /policies/file-system-snapshots` | | `names=@{context=; member=; policy=}` | | `Get-PfbPolicy` | `Name` | `GET /policies/file-systems` | | `names=@{context=; member=; policy=}` | @@ -290,10 +190,7 @@ Ordered with primary-producer rows first: those are the chains a user would most | `Get-PfbRealmSpace` | `Name` | `GET /realms/defaults` | | `names=@{context=; object_store=System.Object[]; realm=}` | | `Get-PfbRealmStorageClass` | `Name` | `GET /realms/defaults` | | `names=@{context=; object_store=System.Object[]; realm=}` | | `Get-PfbResiliencyGroup` | `Name` | `GET /resiliency-groups/members` | | `names=@{group=; member=}` | -| `Get-PfbS3ExportRule` | `PolicyName` | `GET /s3-export-policies` | | `policy_names=@{context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]}` | | `Get-PfbSaml2Idp` | `Name` | `GET /sso/saml2/idps/test` | | `names=@{component_address=PROBE-component_address; component_name=PROBE-component_name; description=PROBE-description; destination=PROBE-destination; enabled=PROBE-enabled; resource=; result_details=PROBE-result_details; success=PROBE-success; test_type=PROBE-test_type}` | -| `Get-PfbSmbClientRule` | `PolicyName` | `GET /smb-client-policies` | | `policy_names=@{access_based_enumeration_enabled=PROBE-access_based_enumeration_enabled; context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]; version=PROBE-version; workload=}` | -| `Get-PfbSmbShareRule` | `PolicyName` | `GET /smb-share-policies` | | `policy_names=@{context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]; workload=}` | | `Get-PfbSnmpManager` | `Name` | `GET /snmp-managers/test` | | `names=@{component_address=PROBE-component_address; component_name=PROBE-component_name; description=PROBE-description; destination=PROBE-destination; enabled=PROBE-enabled; resource=; result_details=PROBE-result_details; success=PROBE-success; test_type=PROBE-test_type}` | | `Get-PfbSshCaPolicy` | `Name` | `GET /ssh-certificate-authority-policies/admins` | | `names=@{context=; member=; policy=}` | | `Get-PfbSshCaPolicy` | `Name` | `GET /ssh-certificate-authority-policies/arrays` | | `names=@{context=; member=; policy=}` | @@ -320,20 +217,6 @@ Ordered with primary-producer rows first: those are the chains a user would most | `Remove-PfbAlertWatcher` | `Name` | `GET /alert-watchers/test` | | `names=@{component_address=PROBE-component_address; component_name=PROBE-component_name; description=PROBE-description; destination=PROBE-destination; enabled=PROBE-enabled; resource=; result_details=PROBE-result_details; success=PROBE-success; test_type=PROBE-test_type}` | | `Remove-PfbAuditFileSystemPolicy` | `Name` | `GET /audit-file-systems-policies/members` | | `names=@{context=; member=; policy=}` | | `Remove-PfbAuditObjectStorePolicy` | `Name` | `GET /audit-object-store-policies/members` | | `names=@{context=; member=; policy=}` | -| `Remove-PfbBucketAuditFilter` | `MemberName` | `GET /buckets` | | `member_names=@{account=; bucket_type=PROBE-bucket_type; context=; created=PROBE-created; destroyed=PROBE-destroyed; eradication_config=; hard_limit_enabled=PROBE-hard_limit_enabled; id=PROBE-id; name=PROBE-name; object_count=PROBE-object_count; object_lock_config=; public_access_config=; public_status=PROBE-public_status; qos_policy=; quota_limit=PROBE-quota_limit; retention_lock=PROBE-retention_lock; space=; storage_class=; time_remaining=PROBE-time_remaining; time_remaining_status=PROBE-time_remaining_status; versioning=PROBE-versioning}` | -| `Remove-PfbBucketAuditFilter` | `MemberName` | `GET /buckets/bucket-access-policies` | | `member_names=@{bucket=; context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]}` | -| `Remove-PfbBucketAuditFilter` | `MemberName` | `GET /buckets/bucket-access-policies/rules` | | `member_names=@{actions=System.Object[]; context=; effect=PROBE-effect; name=PROBE-name; policy=; principals=; resources=System.Object[]}` | -| `Remove-PfbBucketAuditFilter` | `MemberName` | `GET /buckets/cross-origin-resource-sharing-policies` | | `member_names=@{bucket=; context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]}` | -| `Remove-PfbBucketAuditFilter` | `MemberName` | `GET /buckets/cross-origin-resource-sharing-policies/rules` | | `member_names=@{allowed_headers=System.Object[]; allowed_methods=System.Object[]; allowed_origins=System.Object[]; context=; name=PROBE-name; policy=}` | -| `Remove-PfbBucketAuditFilter` | `MemberName` | `GET /buckets/performance` | | `member_names=@{bytes_per_op=PROBE-bytes_per_op; bytes_per_read=PROBE-bytes_per_read; bytes_per_write=PROBE-bytes_per_write; id=PROBE-id; max_total_bytes_per_sec=PROBE-max_total_bytes_per_sec; max_total_ops_per_sec=PROBE-max_total_ops_per_sec; name=PROBE-name; others_per_sec=PROBE-others_per_sec; read_bytes_per_sec=PROBE-read_bytes_per_sec; reads_per_sec=PROBE-reads_per_sec; time=PROBE-time; usec_per_other_op=PROBE-usec_per_other_op; usec_per_read_op=PROBE-usec_per_read_op; usec_per_write_op=PROBE-usec_per_write_op; write_bytes_per_sec=PROBE-write_bytes_per_sec; writes_per_sec=PROBE-writes_per_sec}` | -| `Remove-PfbBucketAuditFilter` | `MemberName` | `GET /buckets/s3-specific-performance` | | `member_names=@{id=PROBE-id; name=PROBE-name; others_per_sec=PROBE-others_per_sec; read_buckets_per_sec=PROBE-read_buckets_per_sec; read_objects_per_sec=PROBE-read_objects_per_sec; time=PROBE-time; usec_per_other_op=PROBE-usec_per_other_op; usec_per_read_bucket_op=PROBE-usec_per_read_bucket_op; usec_per_read_object_op=PROBE-usec_per_read_object_op; usec_per_write_bucket_op=PROBE-usec_per_write_bucket_op; usec_per_write_object_op=PROBE-usec_per_write_object_op; write_buckets_per_sec=PROBE-write_buckets_per_sec; write_objects_per_sec=PROBE-write_objects_per_sec}` | -| `Remove-PfbBucketCorsPolicy` | `MemberName` | `GET /buckets` | | `member_names=@{account=; bucket_type=PROBE-bucket_type; context=; created=PROBE-created; destroyed=PROBE-destroyed; eradication_config=; hard_limit_enabled=PROBE-hard_limit_enabled; id=PROBE-id; name=PROBE-name; object_count=PROBE-object_count; object_lock_config=; public_access_config=; public_status=PROBE-public_status; qos_policy=; quota_limit=PROBE-quota_limit; retention_lock=PROBE-retention_lock; space=; storage_class=; time_remaining=PROBE-time_remaining; time_remaining_status=PROBE-time_remaining_status; versioning=PROBE-versioning}` | -| `Remove-PfbBucketCorsPolicy` | `MemberName` | `GET /buckets/audit-filters` | | `member_names=@{actions=System.Object[]; bucket=; context=; name=PROBE-name; s3_prefixes=System.Object[]}` | -| `Remove-PfbBucketCorsPolicy` | `MemberName` | `GET /buckets/bucket-access-policies` | | `member_names=@{bucket=; context=; enabled=PROBE-enabled; id=PROBE-id; is_local=PROBE-is_local; location=; name=PROBE-name; policy_type=PROBE-policy_type; realms=System.Object[]; rules=System.Object[]}` | -| `Remove-PfbBucketCorsPolicy` | `MemberName` | `GET /buckets/bucket-access-policies/rules` | | `member_names=@{actions=System.Object[]; context=; effect=PROBE-effect; name=PROBE-name; policy=; principals=; resources=System.Object[]}` | -| `Remove-PfbBucketCorsPolicy` | `MemberName` | `GET /buckets/cross-origin-resource-sharing-policies/rules` | | `member_names=@{allowed_headers=System.Object[]; allowed_methods=System.Object[]; allowed_origins=System.Object[]; context=; name=PROBE-name; policy=}` | -| `Remove-PfbBucketCorsPolicy` | `MemberName` | `GET /buckets/performance` | | `member_names=@{bytes_per_op=PROBE-bytes_per_op; bytes_per_read=PROBE-bytes_per_read; bytes_per_write=PROBE-bytes_per_write; id=PROBE-id; max_total_bytes_per_sec=PROBE-max_total_bytes_per_sec; max_total_ops_per_sec=PROBE-max_total_ops_per_sec; name=PROBE-name; others_per_sec=PROBE-others_per_sec; read_bytes_per_sec=PROBE-read_bytes_per_sec; reads_per_sec=PROBE-reads_per_sec; time=PROBE-time; usec_per_other_op=PROBE-usec_per_other_op; usec_per_read_op=PROBE-usec_per_read_op; usec_per_write_op=PROBE-usec_per_write_op; write_bytes_per_sec=PROBE-write_bytes_per_sec; writes_per_sec=PROBE-writes_per_sec}` | -| `Remove-PfbBucketCorsPolicy` | `MemberName` | `GET /buckets/s3-specific-performance` | | `member_names=@{id=PROBE-id; name=PROBE-name; others_per_sec=PROBE-others_per_sec; read_buckets_per_sec=PROBE-read_buckets_per_sec; read_objects_per_sec=PROBE-read_objects_per_sec; time=PROBE-time; usec_per_other_op=PROBE-usec_per_other_op; usec_per_read_bucket_op=PROBE-usec_per_read_bucket_op; usec_per_read_object_op=PROBE-usec_per_read_object_op; usec_per_write_bucket_op=PROBE-usec_per_write_bucket_op; usec_per_write_object_op=PROBE-usec_per_write_object_op; write_buckets_per_sec=PROBE-write_buckets_per_sec; write_objects_per_sec=PROBE-write_objects_per_sec}` | | `Remove-PfbCertificate` | `Name` | `GET /certificates/certificate-groups` | | `names=@{group=; member=}` | | `Remove-PfbCertificateGroup` | `Name` | `GET /certificate-groups/certificates` | | `names=@{group=; member=}` | | `Remove-PfbDataEvictionPolicy` | `Name` | `GET /data-eviction-policies/file-systems` | | `names=@{context=; member=; policy=}` | @@ -396,14 +279,6 @@ Ordered with primary-producer rows first: those are the chains a user would most | `Remove-PfbObjectStoreTrustPolicyRule` | `Name` | `GET /object-store-roles/object-store-access-policies` | | `names=@{context=; member=; policy=}` | | `Remove-PfbObjectStoreUser` | `Name` | `GET /object-store-users/object-store-access-policies` | | `names=@{context=; member=; policy=}` | | `Remove-PfbOidcIdp` | `Name` | `GET /sso/saml2/idps/test` | | `names=@{component_address=PROBE-component_address; component_name=PROBE-component_name; description=PROBE-description; destination=PROBE-destination; enabled=PROBE-enabled; resource=; result_details=PROBE-result_details; success=PROBE-success; test_type=PROBE-test_type}` | -| `Remove-PfbOpenFile` | `Name` | `GET /file-systems/audit-policies` | | `names=@{context=; member=; policy=}` | -| `Remove-PfbOpenFile` | `Name` | `GET /file-systems/data-eviction-policies` | | `names=@{context=; member=; policy=}` | -| `Remove-PfbOpenFile` | `Name` | `GET /file-systems/groups` | | `names=@{context=; file_system=; group=; limited_by=; percentage_used=PROBE-percentage_used; quota_limit=PROBE-quota_limit; usage=PROBE-usage}` | -| `Remove-PfbOpenFile` | `Name` | `GET /file-systems/policies` | | `names=@{context=; member=; policy=}` | -| `Remove-PfbOpenFile` | `Name` | `GET /file-systems/policies-all` | | `names=@{context=; member=; policy=}` | -| `Remove-PfbOpenFile` | `Name` | `GET /file-systems/user-group-quota-policies` | | `names=@{context=; member=; policy=}` | -| `Remove-PfbOpenFile` | `Name` | `GET /file-systems/users` | | `names=@{context=; file_system=; limited_by=; percentage_used=PROBE-percentage_used; quota_limit=PROBE-quota_limit; usage=PROBE-usage; user=}` | -| `Remove-PfbOpenFile` | `Name` | `GET /file-systems/worm-data-policies` | | `names=@{context=; member=; policy=}` | | `Remove-PfbPolicy` | `Name` | `GET /policies/file-system-replica-links` | | `names=@{context=; link=; member=; policy=}` | | `Remove-PfbPolicy` | `Name` | `GET /policies/file-system-snapshots` | | `names=@{context=; member=; policy=}` | | `Remove-PfbPolicy` | `Name` | `GET /policies/file-systems` | | `names=@{context=; member=; policy=}` | diff --git a/Tests/Assert-PfbSelectorNotCoerced.Tests.ps1 b/Tests/Assert-PfbSelectorNotCoerced.Tests.ps1 new file mode 100644 index 00000000..47960fa0 --- /dev/null +++ b/Tests/Assert-PfbSelectorNotCoerced.Tests.ps1 @@ -0,0 +1,175 @@ +#Requires -Modules @{ ModuleName = 'Pester'; ModuleVersion = '5.0' } + +BeforeAll { + $moduleRoot = Split-Path -Parent $PSScriptRoot + $manifest = Join-Path $moduleRoot 'PureStorageFlashBladePowerShell.psd1' + Import-Module $manifest -Force + $script:fakeArray = [PSCustomObject]@{ + Endpoint = 'fb.example.test' + ApiVersion = '2.0' + AuthToken = 'x' + } +} + +Describe 'Assert-PfbSelectorNotCoerced (#90)' { + BeforeEach { + Mock -ModuleName PureStorageFlashBladePowerShell Assert-PfbConnection { } + Mock -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest { } + } + + It 'accepts a plain name' { + InModuleScope PureStorageFlashBladePowerShell { + { Assert-PfbSelectorNotCoerced -Value 'nfs-export-01' -ParameterName 'PolicyName' -Hint 'h' } | + Should -Not -Throw + } + } + + It 'accepts an array of plain names' { + InModuleScope PureStorageFlashBladePowerShell { + { Assert-PfbSelectorNotCoerced -Value @('a', 'b', 'c') -ParameterName 'PolicyName' -Hint 'h' } | + Should -Not -Throw + } + } + + It 'accepts $null, because an unbound parameter is not a defect' { + InModuleScope PureStorageFlashBladePowerShell { + { Assert-PfbSelectorNotCoerced -Value $null -ParameterName 'PolicyName' -Hint 'h' } | + Should -Not -Throw + } + } + + It 'accepts an empty array' { + InModuleScope PureStorageFlashBladePowerShell { + { Assert-PfbSelectorNotCoerced -Value @() -ParameterName 'PolicyName' -Hint 'h' } | + Should -Not -Throw + } + } + + It 'emits nothing to the success stream on success' { + InModuleScope PureStorageFlashBladePowerShell { + $out = Assert-PfbSelectorNotCoerced -Value 'nfs-export-01' -ParameterName 'PolicyName' -Hint 'h' + $out | Should -BeNullOrEmpty + } + } + + It 'throws on a stringified object' { + InModuleScope PureStorageFlashBladePowerShell { + { Assert-PfbSelectorNotCoerced -Value '@{name=nfs-01; rules=}' -ParameterName 'PolicyName' -Hint 'h' } | + Should -Throw + } + } + + It 'puts the exact substring "stringified object" in the message, which is how the rail classifies Guarded' { + InModuleScope PureStorageFlashBladePowerShell { + { Assert-PfbSelectorNotCoerced -Value '@{name=nfs-01}' -ParameterName 'PolicyName' -Hint 'h' } | + Should -Throw -ExpectedMessage '*stringified object*' + } + } + + It 'names the parameter with its leading dash' { + InModuleScope PureStorageFlashBladePowerShell { + { Assert-PfbSelectorNotCoerced -Value '@{name=nfs-01}' -ParameterName 'PolicyName' -Hint 'h' } | + Should -Throw -ExpectedMessage '*-PolicyName*' + } + } + + It 'names the parameter it was actually given, not a hardcoded one' { + InModuleScope PureStorageFlashBladePowerShell { + { Assert-PfbSelectorNotCoerced -Value '@{name=b1}' -ParameterName 'BucketName' -Hint 'h' } | + Should -Throw -ExpectedMessage '*-BucketName*' + } + } + + It 'carries the caller-supplied hint through to the message' { + InModuleScope PureStorageFlashBladePowerShell { + { Assert-PfbSelectorNotCoerced -Value '@{name=nfs-01}' -ParameterName 'PolicyName' ` + -Hint 'Pipe the policy name instead, e.g. Get-PfbNfsExportPolicy | Select-Object -ExpandProperty name | Get-PfbNfsExportRule.' } | + Should -Throw -ExpectedMessage '*Get-PfbNfsExportPolicy*' + } + } + + It 'leaves no unexpanded format placeholder in the message' { + # Guards the -f precedence trap: '+' binds looser than the format operator, so a + # message split across concatenated literals formats only the last one and ships + # a literal {0} to the caller. + InModuleScope PureStorageFlashBladePowerShell { + $captured = $null + try { + Assert-PfbSelectorNotCoerced -Value '@{name=nfs-01}' -ParameterName 'PolicyName' -Hint 'pipe .name' + } catch { + $captured = $_.Exception.Message + } + $captured | Should -Not -BeNullOrEmpty + $captured.Contains('stringified object') | Should -BeTrue + $captured.Contains('{0}') | Should -BeFalse + $captured.Contains('{1}') | Should -BeFalse + $captured.Contains('{2}') | Should -BeFalse + } + } + + It 'checks every element of an array, not just the first' { + InModuleScope PureStorageFlashBladePowerShell { + { Assert-PfbSelectorNotCoerced -Value @('good-name', '@{name=nfs-01}') -ParameterName 'PolicyName' -Hint 'h' } | + Should -Throw -ExpectedMessage '*stringified object*' + } + } + + It 'ignores a non-string value' { + InModuleScope PureStorageFlashBladePowerShell { + { Assert-PfbSelectorNotCoerced -Value ([PSCustomObject]@{ name = 'nfs-01' }) ` + -ParameterName 'PolicyName' -Hint 'h' } | Should -Not -Throw + } + } + + It 'detects a stringified object whose text contains a backtick' { + InModuleScope PureStorageFlashBladePowerShell { + { Assert-PfbSelectorNotCoerced -Value ("@{name=nfs" + [char]96 + "01}") -ParameterName 'PolicyName' -Hint 'h' } | + Should -Throw -ExpectedMessage '*stringified object*' + } + } + + It 'rejects a hashtable piped into an actual selector cmdlet before any request' { + { , @{ name = 'nfs-policy-1' } | + Get-PfbNfsExportRule -Array $script:fakeArray -ErrorAction Stop } | + Should -Throw -ExpectedMessage '*stringified object*' + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 0 -Exactly + } + + It 'rejects a generic dictionary piped into an actual selector cmdlet before any request' { + $dictionary = [System.Collections.Generic.Dictionary[string, string]]::new() + $dictionary['name'] = 'nfs-policy-1' + + { , $dictionary | + Get-PfbNfsExportRule -Array $script:fakeArray -ErrorAction Stop } | + Should -Throw -ExpectedMessage '*stringified object*' + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 0 -Exactly + } + + It 'rejects a PSCustomObject piped into an actual selector cmdlet before any request' { + { [PSCustomObject]@{ name = 'nfs-policy-1' } | + Get-PfbNfsExportRule -Array $script:fakeArray -ErrorAction Stop } | + Should -Throw -ExpectedMessage '*stringified object*' + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 0 -Exactly + } + + It 'accepts a legitimate piped name' { + { 'prod-policy' | Get-PfbNfsExportRule -Array $script:fakeArray -ErrorAction Stop } | + Should -Not -Throw + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $QueryParams['policy_names'] -eq 'prod-policy' + } + } + + It 'accepts a legitimate piped name that looks type-ish' { + { 'System.backup' | Get-PfbNfsExportRule -Array $script:fakeArray -ErrorAction Stop } | + Should -Not -Throw + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $QueryParams['policy_names'] -eq 'System.backup' + } + } +} diff --git a/Tests/Build-PfbPipelineSelectorMap.Tests.ps1 b/Tests/Build-PfbPipelineSelectorMap.Tests.ps1 index 28b8a69f..a8e3270e 100644 --- a/Tests/Build-PfbPipelineSelectorMap.Tests.ps1 +++ b/Tests/Build-PfbPipelineSelectorMap.Tests.ps1 @@ -54,19 +54,35 @@ Describe 'Build-PfbPipelineSelectorMap' { } } - It 'reproduces the Stage 1 headline numbers' { + It 'reproduces the measured headline numbers' { # A tripwire, not a snapshot. These are the measured baseline the audit report is # written against; if the generator drifts from the sweep that produced it, the # narrative and the artifact stop agreeing and neither says so. + # + # Re-baselined from the Stage 1 audit figures (1179 / 389 / 127) when the Stage 2 + # fixes landed, because those fixes deliberately moved all three. A tripwire is only + # worth keeping if each re-baseline is justified rather than merely applied, so: + # + # probePairs 1179 -> 1247 more pipeline-bound parameters now exist to probe. The + # module-wide population moved 303 -> 311, accounted for + # row by row in PfbPipelineSelectorTools.Tests.ps1, and + # renamed selectors resolve to more producers each. + # findings 389 -> 264 the point of the branch: coercions that were fixed are + # no longer found. + # pairs 127 -> 101 unique cmdlet/parameter pairs still coercing. This must + # equal the entry count of Fixtures/PfbSelectorWaivers.psd1, + # which Rail A pins from the opposite direction -- a waiver + # for a pair that no longer coerces fails there -- so the + # two figures cannot drift apart quietly. $report = Get-Content $script:reportPath -Raw | ConvertFrom-Json - $report.totals.probePairs | Should -Be 1179 - $report.totals.findings | Should -Be 389 + $report.totals.probePairs | Should -Be 1247 + $report.totals.findings | Should -Be 264 $pairs = @($report.results | Where-Object { $_.Outcome -in @('Coerced', 'WrongScalar') } | ForEach-Object { "$($_.Cmdlet)/$($_.Parameter)" } | Sort-Object -Unique) - $pairs.Count | Should -Be 127 + $pairs.Count | Should -Be 101 } It 'records only BindError as unmeasured' { diff --git a/Tests/CommittedDeadKeyReport.Tests.ps1 b/Tests/CommittedDeadKeyReport.Tests.ps1 index f4842921..6a3bc295 100644 --- a/Tests/CommittedDeadKeyReport.Tests.ps1 +++ b/Tests/CommittedDeadKeyReport.Tests.ps1 @@ -30,13 +30,13 @@ dead key reds this file in exactly one place -- the two non-emptiness assertions at the bottom of assertion 1 -- and nowhere else, and the edit that case needs is stated precisely at the SHRINK-TO-ZERO RELAX POINT note on assertion 1, which is the single authority for it. - Any PARTIAL fix, up to and including all 22 destructive entries or all 18 groups at once, + Any PARTIAL fix, up to and including all 13 destructive entries or all 6 groups at once, needs no edit at all. HOW THE BASELINE WAS DERIVED, and what would / would not red this file: - The artifact is itself the committed thing, so the baseline is the artifact as committed - at the HEAD this file was written against (bde3270, specVersion 2.28): 126 deadKeys - (22 DESTRUCTIVE / 8 CREATE / 96 WRONG-RESULTS) and 18 noSurvivingSelector groups. The + The artifact is itself the committed thing, so the baseline is the artifact as regenerated + for the issue-90 selector fixes (specVersion 2.28): 85 deadKeys + (13 DESTRUCTIVE / 2 CREATE / 70 WRONG-RESULTS) and 6 noSurvivingSelector groups. The DESTRUCTIVE identities and the noSurvivingSelector identities were read out of that file and pinned below as ALLOWLISTS; the dead-key and skip counts were pinned as CEILINGS; and the inventory counts were pinned as FLOORS, which is the one direction the monotone design @@ -92,18 +92,11 @@ BeforeAll { } $script:committedReport = Get-Content -Path $committedReportPath -Raw | ConvertFrom-Json - # --- Pinned baseline, read out of the committed artifact at HEAD bde3270 ------------- + # --- Pinned baseline, read out of the regenerated issue-90 artifact ----------------- # Identity of a dead key = cmdlet|parameter|wireKey|method|endpoint. Identity of a # no-surviving-selector group = cmdlet|method|endpoint (exactly the fields the artifact # carries for each; there is no file/line in either record). $script:baselineDestructive = @( - 'Remove-PfbBucketAccessPolicy|MemberName|member_names|DELETE|buckets/bucket-access-policies' - 'Remove-PfbBucketAccessPolicy|PolicyName|policy_names|DELETE|buckets/bucket-access-policies' - 'Remove-PfbBucketAuditFilter|MemberId|member_ids|DELETE|buckets/audit-filters' - 'Remove-PfbBucketAuditFilter|MemberName|member_names|DELETE|buckets/audit-filters' - 'Remove-PfbBucketCorsPolicy|MemberId|member_ids|DELETE|buckets/cross-origin-resource-sharing-policies' - 'Remove-PfbBucketCorsPolicy|MemberName|member_names|DELETE|buckets/cross-origin-resource-sharing-policies' - 'Remove-PfbBucketCorsPolicy|PolicyName|policy_names|DELETE|buckets/cross-origin-resource-sharing-policies' 'Remove-PfbFileLock|Id|ids|DELETE|file-systems/locks' 'Remove-PfbFleetMember|FleetName|fleet_names|DELETE|fleets/members' 'Remove-PfbLocalGroup|Id|ids|DELETE|directory-services/local/groups' @@ -115,36 +108,28 @@ BeforeAll { 'Remove-PfbNodeGroupNode|MemberName|member_names|DELETE|node-groups/nodes' 'Remove-PfbObjectStoreAccessKey|Id|ids|DELETE|object-store-access-keys' 'Remove-PfbObjectStoreRoleAccessPolicy|RoleName|role_names|DELETE|object-store-roles/object-store-access-policies' - 'Remove-PfbOpenFile|Name|names|DELETE|file-systems/open-files' - 'Remove-PfbResourceAccess|Name|names|DELETE|resource-accesses' 'Remove-PfbSmbClientRule|PolicyId|policy_ids|DELETE|smb-client-policies/rules' 'Remove-PfbSmbClientRule|PolicyName|policy_names|DELETE|smb-client-policies/rules' ) $script:baselineNoSurvivingSelector = @( - 'Get-PfbBucketAuditFilter|GET|buckets/audit-filters' - 'Get-PfbCertificateGroupCertificate|GET|certificate-groups/certificates' 'Get-PfbFileLockClient|GET|file-systems/locks/clients' - 'Get-PfbFleetKey|GET|fleets/fleet-key' 'Get-PfbKeytabDownload|GET|keytabs/download' 'Get-PfbLegalHoldEntity|GET|legal-holds/held-entities' - 'Get-PfbNetworkConnectionStatistics|GET|network-interfaces/network-connection-statistics' - 'Get-PfbNetworkInterfaceNeighbor|GET|network-interfaces/neighbors' 'Get-PfbNodeGroupNode|GET|node-groups/nodes' - 'Get-PfbRealmDefaults|GET|realms/defaults' - 'New-PfbBucketAccessPolicy|POST|buckets/bucket-access-policies' - 'New-PfbBucketAuditFilter|POST|buckets/audit-filters' - 'New-PfbBucketCorsPolicy|POST|buckets/cross-origin-resource-sharing-policies' 'New-PfbNlmReclamation|POST|file-systems/locks/nlm-reclamations' - 'Remove-PfbBucketAccessPolicy|DELETE|buckets/bucket-access-policies' - 'Remove-PfbBucketAuditFilter|DELETE|buckets/audit-filters' - 'Remove-PfbBucketCorsPolicy|DELETE|buckets/cross-origin-resource-sharing-policies' 'Remove-PfbNodeGroupNode|DELETE|node-groups/nodes' ) # CEILINGS, not pins -- see the monotone note above. - $script:baselineDeadKeyCount = 126 - $script:baselineNoSurvivingSelectorCount = 18 + $script:baselineDeadKeyCount = 85 + $script:baselineNoSurvivingSelectorCount = 6 $script:baselineSkipReasons = @{ - 'wire name unresolved' = 125 + # New-PfbBucketAuditFilter|Name was introduced by 9d08ecc as a new parameter, so + # nothing that was evaluable stopped being evaluated. The parameter demonstrably + # reaches the wire through `$filterNames = if ($Name) { $Name } else { $BucketName }` + # and `$queryParams['names'] = $filterNames -join ','`; it is unresolvable only because + # the AST resolver cannot trace that conditional. This is the `body property` case, + # not the coverage-loss case this ceiling guards against. + 'wire name unresolved' = 126 'endpoint/method ambiguous' = 14 'endpoint/verb absent from spec' = 0 } @@ -192,7 +177,7 @@ Describe 'Committed dead-key report (REGRESSION guard, no spec cache required)' # It is a real decision rather than a formality: past that point the file no longer # proves it scanned anything, and its guarantee narrows to the monotone one. # - # A PARTIAL fix -- even all 22 destructive entries, or all 18 groups, at once -- needs + # A PARTIAL fix -- even all 13 destructive entries, or all 6 groups, at once -- needs # no edit at all. Every one of these cases was constructed and confirmed. # specVersion is asserted PRESENT AND VERSION-SHAPED, never pinned to a value. It is the # spec the whole report was computed against, so an artifact that lost it is not @@ -226,7 +211,7 @@ Describe 'Committed dead-key report (REGRESSION guard, no spec cache required)' # that, and was confirmed to by construction. # - It is trivially satisfied at zero (0 -eq 0), so the case where a future PR fixes # every dead key needs no edit here at all. Counting the DESTRUCTIVE matches instead - # would have made "all 22 destructive dead keys got fixed" -- a tractable single PR, + # would have made "all 13 destructive dead keys got fixed" -- a tractable single PR, # and the outcome this artifact exists to produce -- red the gate. # - It keeps this test self-sufficient: it proves its own faithfulness without # depending on assertion 1 having run first. @@ -241,12 +226,12 @@ Describe 'Committed dead-key report (REGRESSION guard, no spec cache required)' # produced P7 F0 -- a clean green with this file's highest-value assertion covering # zero entries: # 1. delete the `severity` property from the artifact -- `$null -ne 'DESTRUCTIVE'` - # is true for all 126 records, so every entry `continue`s; + # is true for all 85 records, so every entry `continue`s; # 2. rename the vocabulary in the generator (DESTRUCTIVE -> DELETE-RISK) and # regenerate honestly -- same total skip, no failure anywhere. # The only thing otherwise pinning the vocabulary is one synthetic assertion in # Tests/Build-PfbDeadKeyReport.Tests.ps1, which is PS7-gated -- so on the 5.1 leg, - # the leg this ungated file exists to serve, the 22-identity destructive allowlist + # the leg this ungated file exists to serve, the 13-identity destructive allowlist # had no proof it matched anything. This assertion makes a renamed or dropped # severity a red instead of a silent full-skip. # diff --git a/Tests/Fixtures/PfbSelectorWaivers.psd1 b/Tests/Fixtures/PfbSelectorWaivers.psd1 index 8a0e5bf5..243363f8 100644 --- a/Tests/Fixtures/PfbSelectorWaivers.psd1 +++ b/Tests/Fixtures/PfbSelectorWaivers.psd1 @@ -6,10 +6,11 @@ listed here. It also fails on a waiver whose pair no longer coerces, so a fix must delete its waiver rather than leave a licence behind for the next reintroduction. - ONE ENTRY PER (Cmdlet, Parameter) PAIR, NOT PER PRODUCING ENDPOINT. The audit's 389 - finding rows are producer multiplicity over 127 real defects; keying by triple would be - 389 entries against psd1's hard 500-element cap for a single collection literal, and would - list the same defect up to a dozen times. + ONE ENTRY PER (Cmdlet, Parameter) PAIR, NOT PER PRODUCING ENDPOINT. The current report's + 264 finding rows are producer multiplicity over 101 real defects; keying by triple would be + 264 entries against psd1's hard 500-element cap for a single collection literal, and would + list the same defect up to a dozen times. (The pre-fix audit measured 389 rows over 127 + pairs; the guards and renames delivered for #90 account for the reduction.) Scope and Producers are LOAD-BEARING, not annotation -- pair-level keying is otherwise blind to where a coercion happens. Rail A fails if a Family-scoped waiver's pair starts @@ -30,77 +31,37 @@ @{ Waivers = @( - # === Cluster 1 -- the rule/member family (16 pairs, all on a PRIMARY producer). + # === Cluster 1 -- the rule/member family (1 pair still waived here, all on a PRIMARY + # producer; the audit found 16 and the other 15 are now guarded or renamed). # The parent is returned as a nested object (policy, member, role), never as a flat # policy_name/member_name/role_name string, so a name-shaped selector can never bind by # property name. One API design decision repeated across roughly a dozen endpoint # families: fix it as one change, not sixteen. - @{ Cmdlet = 'Get-PfbBucketAccessPolicy'; Parameter = 'MemberName'; Scope = 'Primary'; Issue = '#90'; Producers = 8 - Why = 'GET /buckets/bucket-access-policies items carry no member/member_name field -- membership is a separate endpoint -- so member_names receives the stringified policy item.' } - @{ Cmdlet = 'Get-PfbBucketAccessPolicyRule'; Parameter = 'MemberName'; Scope = 'Primary'; Issue = '#90'; Producers = 8 - Why = 'GET /buckets/bucket-access-policies/rules items carry no member/member_name field -- membership is a separate endpoint -- so member_names receives the stringified rule item.' } - @{ Cmdlet = 'Get-PfbBucketAuditFilter'; Parameter = 'MemberName'; Scope = 'Primary'; Issue = '#90'; Producers = 8 - Why = 'GET /buckets/audit-filters items carry no member/member_name field -- membership is a separate endpoint -- so member_names receives the stringified filter item.' } - @{ Cmdlet = 'Get-PfbBucketCorsPolicy'; Parameter = 'MemberName'; Scope = 'Primary'; Issue = '#90'; Producers = 8 - Why = 'GET /buckets/cross-origin-resource-sharing-policies items carry no member/member_name field -- membership is a separate endpoint -- so member_names receives the stringified policy item.' } - @{ Cmdlet = 'Get-PfbBucketCorsPolicyRule'; Parameter = 'MemberName'; Scope = 'Primary'; Issue = '#90'; Producers = 8 - Why = 'GET /buckets/cross-origin-resource-sharing-policies/rules items carry no member/member_name field -- membership is a separate endpoint -- so member_names receives the stringified rule item.' } - @{ Cmdlet = 'Get-PfbNetworkAccessRule'; Parameter = 'PolicyName'; Scope = 'Primary'; Issue = '#90'; Producers = 3 - Why = 'GET /network-access-policies/rules returns policy as a nested object, never a flat policy_name, so policy_names receives the stringified rule item.' } - @{ Cmdlet = 'Get-PfbNfsExportRule'; Parameter = 'PolicyName'; Scope = 'Primary'; Issue = '#90'; Producers = 2 - Why = 'GET /nfs-export-policies/rules returns policy as a nested object, never a flat policy_name, so policy_names receives the stringified rule item.' } - @{ Cmdlet = 'Get-PfbObjectStoreAccessPolicyRule'; Parameter = 'PolicyName'; Scope = 'Primary'; Issue = '#90'; Producers = 4 - Why = 'GET /object-store-access-policies/rules returns policy as a nested object, never a flat policy_name, so policy_names receives the stringified rule item.' } - @{ Cmdlet = 'Get-PfbObjectStoreTrustPolicy'; Parameter = 'RoleName'; Scope = 'Primary'; Issue = '#90'; Producers = 4 - Why = 'GET /object-store-roles/object-store-trust-policies returns role as a nested object, never a flat role_name, so role_names receives the stringified policy item.' } - @{ Cmdlet = 'Get-PfbObjectStoreTrustPolicyRule'; Parameter = 'PolicyName'; Scope = 'Primary'; Issue = '#90'; Producers = 4 - Why = 'GET /object-store-roles/object-store-trust-policies/rules returns policy as a nested object, never a flat policy_name, so policy_names receives the stringified rule item.' } - @{ Cmdlet = 'Get-PfbS3ExportRule'; Parameter = 'PolicyName'; Scope = 'Primary'; Issue = '#90'; Producers = 2 - Why = 'GET /s3-export-policies/rules returns policy as a nested object, never a flat policy_name, so policy_names receives the stringified rule item.' } - @{ Cmdlet = 'Get-PfbSmbClientRule'; Parameter = 'PolicyName'; Scope = 'Primary'; Issue = '#90'; Producers = 2 - Why = 'GET /smb-client-policies/rules returns policy as a nested object, never a flat policy_name, so policy_names receives the stringified rule item.' } - @{ Cmdlet = 'Get-PfbSmbShareRule'; Parameter = 'PolicyName'; Scope = 'Primary'; Issue = '#90'; Producers = 2 - Why = 'GET /smb-share-policies/rules returns policy as a nested object, never a flat policy_name, so policy_names receives the stringified rule item.' } @{ Cmdlet = 'Get-PfbUserGroupQuotaPolicyRule'; Parameter = 'PolicyName'; Scope = 'Primary'; Issue = '#90'; Producers = 4 - Why = 'GET /user-group-quota-policies/rules returns policy as a nested object, never a flat policy_name, so policy_names receives the stringified rule item.' } - @{ Cmdlet = 'Remove-PfbBucketAuditFilter'; Parameter = 'MemberName'; Scope = 'Primary'; Issue = '#90'; Producers = 8 - Why = 'DESTRUCTIVE -- GET /buckets/audit-filters items carry no member/member_name field, so a piped filter item lands in member_names of a DELETE as a stringified object.' } - @{ Cmdlet = 'Remove-PfbBucketCorsPolicy'; Parameter = 'MemberName'; Scope = 'Primary'; Issue = '#90'; Producers = 8 - Why = 'DESTRUCTIVE -- GET /buckets/cross-origin-resource-sharing-policies items carry no member/member_name field, so a piped policy item lands in member_names of a DELETE as a stringified object.' } + Why = 'GET /user-group-quota-policies/rules returns policy as a nested object, never a flat policy_name, so policy_names receives the stringified rule item. Waived rather than fixed because the array honours a policy_names key the published OpenAPI omits, and the published spec governs.' } - # === Cluster 2 -- sub-resources that have no name at all (10 pairs, all on a PRIMARY producer). + # === Cluster 2 -- sub-resources that have no name at all (0 pairs still waived here; the + # audit found 10, 9 had the dead parameter removed, and the last one was fixed outright). # -Name is pipeline-bound on a resource whose items carry no name field. Dropping - # ValueFromPipeline eliminates the class outright: zero coercions occurred without it. - # The four Remove-* pairs are the highest-severity findings in the audit -- a DELETE - # whose selector is a stringified object is where selects-the-wrong-thing and - # destructive intersect. - @{ Cmdlet = 'Get-PfbArrayConnectionKey'; Parameter = 'Name'; Scope = 'Primary'; Issue = '#90'; Producers = 4 - Why = 'GET /array-connections/connection-key items carry no name (connection_key, created, expires), yet -Name is pipeline-bound, so names receives the stringified item.' } - @{ Cmdlet = 'Get-PfbCertificateGroupCertificate'; Parameter = 'Name'; Scope = 'Primary'; Issue = '#90'; Producers = 1 - Why = 'GET /certificate-groups/certificates items carry no name (group, member -- both objects), yet -Name is pipeline-bound, so names receives the stringified item.' } - @{ Cmdlet = 'Get-PfbFleetKey'; Parameter = 'Name'; Scope = 'Primary'; Issue = '#90'; Producers = 2 - Why = 'GET /fleets/fleet-key items carry no name (created, expires, fleet_key), yet -Name is pipeline-bound, so names receives the stringified item.' } - @{ Cmdlet = 'Get-PfbNetworkConnectionStatistics'; Parameter = 'Name'; Scope = 'Primary'; Issue = '#90'; Producers = 5 - Why = 'GET /network-interfaces/network-connection-statistics items carry no name (current_state, local, remote, time), yet -Name is pipeline-bound, so names receives the stringified item.' } - @{ Cmdlet = 'Get-PfbNetworkInterfaceNeighbor'; Parameter = 'Name'; Scope = 'Primary'; Issue = '#90'; Producers = 5 - Why = 'GET /network-interfaces/neighbors items carry no name (initial_ttl_in_sec, local_port, neighbor_chassis, neighbor_port), yet -Name is pipeline-bound, so names receives the stringified item.' } - @{ Cmdlet = 'Get-PfbOpenFile'; Parameter = 'Name'; Scope = 'Primary'; Issue = '#90'; Producers = 9 - Why = 'GET /file-systems/open-files items carry no name (client, id, lock_count, mode, path, session, source, user), yet -Name is pipeline-bound, so names receives the stringified item.' } - @{ Cmdlet = 'Get-PfbRealmDefaults'; Parameter = 'Name'; Scope = 'Primary'; Issue = '#90'; Producers = 1 - Why = 'GET /realms/defaults items carry no name (context, object_store, realm), yet -Name is pipeline-bound, so names receives the stringified item.' } - @{ Cmdlet = 'Get-PfbResourceAccess'; Parameter = 'Name'; Scope = 'Primary'; Issue = '#90'; Producers = 1 - Why = 'GET /resource-accesses items carry no name (id, resource, scope), yet -Name is pipeline-bound, so names receives the stringified item.' } - @{ Cmdlet = 'Remove-PfbOpenFile'; Parameter = 'Name'; Scope = 'Primary'; Issue = '#90'; Producers = 9 - Why = 'DESTRUCTIVE -- GET /file-systems/open-files items carry no name (client, id, lock_count, mode, path, session, source, user), so a piped open file lands in names of a DELETE as a stringified object.' } - @{ Cmdlet = 'Remove-PfbResourceAccess'; Parameter = 'Name'; Scope = 'Primary'; Issue = '#90'; Producers = 1 - Why = 'DESTRUCTIVE -- GET /resource-accesses items carry no name (id, resource, scope), so a piped access record lands in names of a DELETE as a stringified object.' } - - # === Cluster 3 -- a type mismatch on a name that does match (1 pair). - # The field exists but is an object. This is also the audit control-leakage case, and - # the only pair whose verdict depends on the probe carrying real spec types: force every - # probe property to string and this pair alone stops coercing. - @{ Cmdlet = 'Get-PfbLocalGroupMember'; Parameter = 'Group'; Scope = 'Primary'; Issue = '#90'; Producers = 8 - Why = 'GET /directory-services/local/groups/members returns group as an object, so -Group receives a stringified group rather than its name.' } + # ValueFromPipeline narrows the class but does not eliminate it: the four-pass finding + # showed pass 4 is ByPropertyName WITH coercion, so an alias matching an object-valued + # property still coerces with ValueFromPipeline absent. The two Remove-* pairs the audit + # found here (Remove-PfbOpenFile, Remove-PfbResourceAccess, both since fixed by parameter + # removal) were its highest-severity findings -- a DELETE whose selector is a stringified + # object is where selects-the-wrong-thing and destructive intersect. + # + # Get-PfbArrayConnectionKey/-Name was waived here and is now deleted rather than downgraded. + # The process-block coercion guard alone is the fix, and it is the only fix available: the + # published spec's components.schemas.ArrayConnectionKey -- the item type GET + # array-connections/connection-key returns -- declares exactly connection_key, created and + # expires at every version 2.0 through 2.28, with no allOf, so it never inherits the base + # schema that supplies id and name to ordinary resources. Both the generic names and ids + # query keys select by an identifier the returned resource carries, so on an item carrying + # neither, neither key can select and no identity parameter could rescue the chain. The + # guard converts the silently unfiltered result into a loud error, which turns the pair + # from Coerced into Guarded -- and Guarded is not a finding, so Rail A's stale-waiver test + # requires the licence to go with it. + # Keep this cluster heading: the root cause it describes is still what the guard defends. # === Cluster 4 -- family-only exposure (100 pairs, NOT reachable from the primary producer). # Each cmdlet's own primary producer returns name correctly, so the obvious chain is diff --git a/Tests/Get-PfbArrayConnectionKey.Tests.ps1 b/Tests/Get-PfbArrayConnectionKey.Tests.ps1 new file mode 100644 index 00000000..44fefaf5 --- /dev/null +++ b/Tests/Get-PfbArrayConnectionKey.Tests.ps1 @@ -0,0 +1,79 @@ +#Requires -Modules @{ ModuleName = 'Pester'; ModuleVersion = '5.0' } + +BeforeAll { + $moduleRoot = Split-Path -Parent $PSScriptRoot + $manifest = Join-Path $moduleRoot 'PureStorageFlashBladePowerShell.psd1' + Import-Module $manifest -Force + + $script:fakeArray = [PSCustomObject]@{ Endpoint = 'fb.example.test'; ApiVersion = '2.0'; AuthToken = 'x' } +} + +Describe 'Get-PfbArrayConnectionKey - name selector and coercion guard (#90)' { + + BeforeEach { + Mock -ModuleName PureStorageFlashBladePowerShell Assert-PfbConnection { } + Mock -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest { } + } + + It 'rejects a piped object carrying neither name nor id instead of stringifying it into -Name' { + # The self-chain shape: connection-key items carry only connection_key/created/expires. + { + [PSCustomObject]@{ connection_key = 'abc123'; created = 1; expires = 2 } | + Get-PfbArrayConnectionKey -Array $script:fakeArray -ErrorAction Stop + } | Should -Throw -ExpectedMessage '*stringified object*' + } + + It 'issues no request at all when the guard trips' { + try { + [PSCustomObject]@{ connection_key = 'abc123'; created = 1; expires = 2 } | + Get-PfbArrayConnectionKey -Array $script:fakeArray -ErrorAction Stop + } catch { + # Expected: the guard throws terminatingly, so the end block never runs. + } + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 0 -Exactly + } + + It 'still binds a bare string to -Name by value and sends names' { + 'remote-fb-dc2' | Get-PfbArrayConnectionKey -Array $script:fakeArray + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $QueryParams['names'] -eq 'remote-fb-dc2' -and -not $QueryParams.ContainsKey('ids') + } + } + + It 'still sends names when -Name is passed explicitly' { + Get-PfbArrayConnectionKey -Name 'remote-fb-dc2','remote-fb-dc3' -Array $script:fakeArray + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $QueryParams['names'] -eq 'remote-fb-dc2,remote-fb-dc3' -and -not $QueryParams.ContainsKey('ids') + } + } + + It 'binds -Name alongside -Filter and -Limit and emits all three wire keys' { + Get-PfbArrayConnectionKey -Name 'remote-fb-dc2' -Filter "expires>0" -Limit 3 -Array $script:fakeArray + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $QueryParams['names'] -eq 'remote-fb-dc2' -and $QueryParams['filter'] -eq "expires>0" -and + $QueryParams['limit'] -eq 3 -and -not $QueryParams.ContainsKey('ids') + } + } + + It 'still routes filter/sort/limit through the common helper with no selector key' { + Get-PfbArrayConnectionKey -Filter "expires>0" -Sort 'created' -Limit 5 -Array $script:fakeArray + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $QueryParams['filter'] -eq "expires>0" -and $QueryParams['sort'] -eq 'created' -and + $QueryParams['limit'] -eq 5 -and + -not $QueryParams.ContainsKey('names') -and -not $QueryParams.ContainsKey('ids') + } + } + + It 'sends no selector key at all when listing everything' { + Get-PfbArrayConnectionKey -Array $script:fakeArray + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + -not $QueryParams.ContainsKey('names') -and -not $QueryParams.ContainsKey('ids') + } + } +} diff --git a/Tests/PfbBucketPolicySelectors.Tests.ps1 b/Tests/PfbBucketPolicySelectors.Tests.ps1 new file mode 100644 index 00000000..3197f211 --- /dev/null +++ b/Tests/PfbBucketPolicySelectors.Tests.ps1 @@ -0,0 +1,732 @@ +#Requires -Modules @{ ModuleName = 'Pester'; ModuleVersion = '5.0' } + +# Every cmdlet in Task 1 scope. All of them publish [string[]]$Name and +# [string[]]$BucketName, and none of them may still publish MemberName. +$script:metadataCases = @( + @{ Cmdlet = 'Get-PfbBucketAuditFilter' } + @{ Cmdlet = 'Get-PfbBucketCorsPolicy' } + @{ Cmdlet = 'Get-PfbBucketAccessPolicy' } + @{ Cmdlet = 'Remove-PfbBucketAuditFilter' } + @{ Cmdlet = 'Remove-PfbBucketCorsPolicy' } + @{ Cmdlet = 'Get-PfbBucketAccessPolicyRule' } + @{ Cmdlet = 'Get-PfbBucketCorsPolicyRule' } + @{ Cmdlet = 'New-PfbBucketAuditFilter' } +) + +# Cmdlets whose -Name / -BucketName selectors are exercised on the wire. +# New-PfbBucketAuditFilter is excluded: POST buckets/audit-filters declares +# `names` as required and carries no bucket identity in its body, so its call +# shape is Name+BucketName combined and is covered by its own Context below. +$script:selectorCases = @( + @{ Cmdlet = 'Get-PfbBucketAuditFilter'; NameKey = 'names'; BucketKey = 'bucket_names'; Endpoint = 'buckets/audit-filters'; Method = 'GET' } + @{ Cmdlet = 'Get-PfbBucketCorsPolicy'; NameKey = 'names'; BucketKey = 'bucket_names'; Endpoint = 'buckets/cross-origin-resource-sharing-policies'; Method = 'GET' } + @{ Cmdlet = 'Get-PfbBucketAccessPolicy'; NameKey = 'names'; BucketKey = 'bucket_names'; Endpoint = 'buckets/bucket-access-policies'; Method = 'GET' } + @{ Cmdlet = 'Remove-PfbBucketAuditFilter'; NameKey = 'names'; BucketKey = 'bucket_names'; Endpoint = 'buckets/audit-filters'; Method = 'DELETE' } + @{ Cmdlet = 'Remove-PfbBucketCorsPolicy'; NameKey = 'names'; BucketKey = 'bucket_names'; Endpoint = 'buckets/cross-origin-resource-sharing-policies'; Method = 'DELETE' } + @{ Cmdlet = 'Get-PfbBucketAccessPolicyRule'; NameKey = 'names'; BucketKey = 'bucket_names'; Endpoint = 'buckets/bucket-access-policies/rules'; Method = 'GET' } + @{ Cmdlet = 'Get-PfbBucketCorsPolicyRule'; NameKey = 'names'; BucketKey = 'bucket_names'; Endpoint = 'buckets/cross-origin-resource-sharing-policies/rules'; Method = 'GET' } +) + +# The two rule endpoints are the only ones that declare `policy_names`. +$script:ruleCases = @( + @{ Cmdlet = 'Get-PfbBucketAccessPolicyRule'; Endpoint = 'buckets/bucket-access-policies/rules' } + @{ Cmdlet = 'Get-PfbBucketCorsPolicyRule'; Endpoint = 'buckets/cross-origin-resource-sharing-policies/rules' } +) + +# The five cmdlets that previously carried -MemberId / `member_ids`. The +# endpoints declare `bucket_ids`, never `member_ids`. +$script:bucketIdCases = @( + @{ Cmdlet = 'Get-PfbBucketAuditFilter'; Endpoint = 'buckets/audit-filters'; Method = 'GET' } + @{ Cmdlet = 'Get-PfbBucketCorsPolicy'; Endpoint = 'buckets/cross-origin-resource-sharing-policies'; Method = 'GET' } + @{ Cmdlet = 'Get-PfbBucketAccessPolicy'; Endpoint = 'buckets/bucket-access-policies'; Method = 'GET' } + @{ Cmdlet = 'Remove-PfbBucketAuditFilter'; Endpoint = 'buckets/audit-filters'; Method = 'DELETE' } + @{ Cmdlet = 'Remove-PfbBucketCorsPolicy'; Endpoint = 'buckets/cross-origin-resource-sharing-policies'; Method = 'DELETE' } +) + +# `policy_names` is declared only on the /rules variants; `policy_ids` is +# declared on none of these operations, so these cmdlets must not publish them. +$script:noPolicySelectorCases = @( + @{ Cmdlet = 'Get-PfbBucketAccessPolicy'; Forbidden = 'PolicyName' } + @{ Cmdlet = 'Get-PfbBucketAccessPolicy'; Forbidden = 'PolicyId' } + @{ Cmdlet = 'Get-PfbBucketCorsPolicy'; Forbidden = 'PolicyName' } + @{ Cmdlet = 'Get-PfbBucketCorsPolicy'; Forbidden = 'PolicyId' } + @{ Cmdlet = 'Remove-PfbBucketCorsPolicy'; Forbidden = 'PolicyName' } + # Task 1b: same rule on the access-policy parent operations. + @{ Cmdlet = 'Remove-PfbBucketAccessPolicy'; Forbidden = 'PolicyName' } + @{ Cmdlet = 'Remove-PfbBucketAccessPolicy'; Forbidden = 'PolicyId' } + @{ Cmdlet = 'New-PfbBucketAccessPolicy'; Forbidden = 'PolicyName' } + @{ Cmdlet = 'New-PfbBucketCorsPolicy'; Forbidden = 'PolicyName' } +) + +# Pipeline binding: a bare piped string must mean "bucket" on the destructive +# cmdlets exactly as it does on their Get-* siblings. +$script:pipelineCases = @( + @{ Cmdlet = 'Get-PfbBucketAuditFilter'; Endpoint = 'buckets/audit-filters'; Method = 'GET' } + @{ Cmdlet = 'Remove-PfbBucketAuditFilter'; Endpoint = 'buckets/audit-filters'; Method = 'DELETE' } + @{ Cmdlet = 'Remove-PfbBucketCorsPolicy'; Endpoint = 'buckets/cross-origin-resource-sharing-policies'; Method = 'DELETE' } + @{ Cmdlet = 'Remove-PfbBucketAccessPolicy'; Endpoint = 'buckets/bucket-access-policies'; Method = 'DELETE' } +) + +# --------------------------------------------------------------------------- +# Task 1b -- the remaining bucket selector surface. +# --------------------------------------------------------------------------- + +# The five siblings that still carried -MemberName / `member_names`. Verified +# per endpoint against tools/specs/fb2.0-2.28: `member_names` and `member_ids` +# are declared on NONE of these operations in ANY version, while `bucket_names` +# and `bucket_ids` have been declared since each endpoint first appeared. +$script:task1bMemberCases = @( + @{ Cmdlet = 'New-PfbBucketAccessPolicy' } + @{ Cmdlet = 'New-PfbBucketAccessPolicyRule' } + @{ Cmdlet = 'New-PfbBucketCorsPolicy' } + @{ Cmdlet = 'Remove-PfbBucketAccessPolicy' } + @{ Cmdlet = 'Update-PfbBucketAuditFilter' } +) + +# The four bucket Get-* cmdlets that published a generic -Id emitting `ids`. +# Verified INDIVIDUALLY: none of these four GET operations declares `ids` in +# any version 2.12-2.28 (2.12 is where all four paths first appear), so -Id +# silently returned the unfiltered collection. `names` IS declared on all +# four, so -Name survives. +$script:deadIdCases = @( + @{ Cmdlet = 'Get-PfbBucketAccessPolicy'; Endpoint = 'buckets/bucket-access-policies'; Method = 'GET' } + @{ Cmdlet = 'Get-PfbBucketCorsPolicy'; Endpoint = 'buckets/cross-origin-resource-sharing-policies'; Method = 'GET' } + @{ Cmdlet = 'Get-PfbBucketAccessPolicyRule'; Endpoint = 'buckets/bucket-access-policies/rules'; Method = 'GET' } + @{ Cmdlet = 'Get-PfbBucketCorsPolicyRule'; Endpoint = 'buckets/cross-origin-resource-sharing-policies/rules'; Method = 'GET' } +) + +# POST /buckets/bucket-access-policies and +# POST /buckets/cross-origin-resource-sharing-policies declare ONLY +# bucket_names / bucket_ids (plus context_names from 2.17). Neither `names` +# nor `policy_names` exists on either, so these two cmdlets carry no +# policy-level and no name-level selector at all. +$script:bucketOnlyPostCases = @( + @{ Cmdlet = 'New-PfbBucketAccessPolicy'; Endpoint = 'buckets/bucket-access-policies' } + @{ Cmdlet = 'New-PfbBucketCorsPolicy'; Endpoint = 'buckets/cross-origin-resource-sharing-policies' } +) + +BeforeAll { + $moduleRoot = Split-Path -Parent $PSScriptRoot + $manifest = Join-Path $moduleRoot 'PureStorageFlashBladePowerShell.psd1' + Import-Module $manifest -Force + + $script:fakeArray = [PSCustomObject]@{ + Endpoint = 'fb.example.test' + ApiVersion = '2.0' + AuthToken = 'x' + } +} + +Describe 'Bucket policy and filter selectors (#90)' { + BeforeEach { + Mock -ModuleName PureStorageFlashBladePowerShell Assert-PfbConnection { } + Mock -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest { } + } + + Context 'Parameter surface' { + It ' removes MemberName and publishes BucketName' -ForEach $script:metadataCases { + $keys = (Get-Command $Cmdlet).Parameters.Keys + $keys | Should -Not -Contain 'MemberName' + $keys | Should -Contain 'BucketName' + } + + It ' publishes Name and BucketName as [string[]]' -ForEach $script:metadataCases { + $parameters = (Get-Command $Cmdlet).Parameters + $parameters.Keys | Should -Contain 'Name' + $parameters['Name'].ParameterType.FullName | Should -Be 'System.String[]' + $parameters['BucketName'].ParameterType.FullName | Should -Be 'System.String[]' + } + + It ' replaces MemberId with a [string[]] BucketId' -ForEach $script:bucketIdCases { + $parameters = (Get-Command $Cmdlet).Parameters + $parameters.Keys | Should -Not -Contain 'MemberId' + $parameters.Keys | Should -Contain 'BucketId' + $parameters['BucketId'].ParameterType.FullName | Should -Be 'System.String[]' + } + + It ' does not publish (undeclared on this endpoint)' -ForEach $script:noPolicySelectorCases { + (Get-Command $Cmdlet).Parameters.Keys | Should -Not -Contain $Forbidden + } + } + + Context 'Wire keys' { + It ' maps Name to with exact endpoint, method, and no member_names' -ForEach $script:selectorCases { + $parameters = @{ Name = 'pslivetest-selector-a'; Array = $script:fakeArray } + if ($Cmdlet -like 'Remove-*') { $parameters['Confirm'] = $false } + & $Cmdlet @parameters + + $expectedMethod = $Method + $expectedEndpoint = $Endpoint + $expectedNameKey = $NameKey + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $Method -eq $expectedMethod -and $Endpoint -eq $expectedEndpoint -and + $QueryParams.Count -eq 1 -and $QueryParams[$expectedNameKey] -eq 'pslivetest-selector-a' -and + -not $QueryParams.ContainsKey('member_names') + } + } + + It ' maps BucketName to with exact endpoint, method, and no member_names' -ForEach $script:selectorCases { + $parameters = @{ BucketName = 'pslivetest-bucket-a'; Array = $script:fakeArray } + if ($Cmdlet -like 'Remove-*') { $parameters['Confirm'] = $false } + & $Cmdlet @parameters + + $expectedMethod = $Method + $expectedEndpoint = $Endpoint + $expectedBucketKey = $BucketKey + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $Method -eq $expectedMethod -and $Endpoint -eq $expectedEndpoint -and + $QueryParams.Count -eq 1 -and $QueryParams[$expectedBucketKey] -eq 'pslivetest-bucket-a' -and + -not $QueryParams.ContainsKey('member_names') + } + } + + It ' maps BucketId to bucket_ids and never member_ids' -ForEach $script:bucketIdCases { + $parameters = @{ BucketId = 'pslivetest-bucket-id-a'; Array = $script:fakeArray } + if ($Cmdlet -like 'Remove-*') { $parameters['Confirm'] = $false } + & $Cmdlet @parameters + + $expectedMethod = $Method + $expectedEndpoint = $Endpoint + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $Method -eq $expectedMethod -and $Endpoint -eq $expectedEndpoint -and + $QueryParams.Count -eq 1 -and $QueryParams['bucket_ids'] -eq 'pslivetest-bucket-id-a' -and + -not $QueryParams.ContainsKey('member_ids') + } + } + + It ' maps PolicyName to policy_names without member_names' -ForEach $script:ruleCases { + & $Cmdlet -PolicyName 'pslivetest-selector-a' -Array $script:fakeArray + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $Method -eq 'GET' -and $QueryParams.Count -eq 1 -and + $QueryParams['policy_names'] -eq 'pslivetest-selector-a' -and + -not $QueryParams.ContainsKey('member_names') + } + } + } + + Context 'Pipeline binding' { + It ' binds a bare piped string to BucketName' -ForEach $script:pipelineCases { + $parameters = @{ Array = $script:fakeArray } + if ($Cmdlet -like 'Remove-*') { $parameters['Confirm'] = $false } + 'pslivetest-bucket-a' | & $Cmdlet @parameters + + $expectedMethod = $Method + $expectedEndpoint = $Endpoint + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $Method -eq $expectedMethod -and $Endpoint -eq $expectedEndpoint -and + $QueryParams.Count -eq 1 -and $QueryParams['bucket_names'] -eq 'pslivetest-bucket-a' + } + } + } + + # Get-PfbBucket | Get-PfbBucketAccessPolicy is a chain a user would naturally write. No + # producer emits `BucketName` (the bucket item's own selector is `name`, and -Name here is + # not pipeline-bound), so the bucket object fell through to by-value coercion and + # bucket_names=@{...whole bucket...} went on the wire: HTTP 200 and the UNFILTERED policy + # list. ValueFromPipeline stays, so bare-string piping keeps working; the guard rejects the + # coerced object instead. + Context 'Coercion guard on the bucket Get-* selectors (#90)' { + $script:bucketGuardCases = @( + @{ Cmdlet = 'Get-PfbBucketAccessPolicy' } + @{ Cmdlet = 'Get-PfbBucketAccessPolicyRule' } + @{ Cmdlet = 'Get-PfbBucketAuditFilter' } + @{ Cmdlet = 'Get-PfbBucketCorsPolicy' } + @{ Cmdlet = 'Get-PfbBucketCorsPolicyRule' } + ) + + It ' rejects a coerced bucket object before any request is built' -ForEach $script:bucketGuardCases { + { [PSCustomObject]@{ name = 'pslivetest-bucket-a'; destroyed = $false } | + & $Cmdlet -Array $script:fakeArray -ErrorAction Stop } | + Should -Throw -ExpectedMessage '*stringified object*' + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 0 -Exactly + } + + It ' names -BucketName and Get-PfbBucket in the guard message' -ForEach $script:bucketGuardCases { + { [PSCustomObject]@{ name = 'pslivetest-bucket-a' } | + & $Cmdlet -Array $script:fakeArray -ErrorAction Stop } | + Should -Throw -ExpectedMessage '*-BucketName*' + { [PSCustomObject]@{ name = 'pslivetest-bucket-a' } | + & $Cmdlet -Array $script:fakeArray -ErrorAction Stop } | + Should -Throw -ExpectedMessage '*Get-PfbBucket*' + } + + It ' still binds a bare piped string to bucket_names' -ForEach $script:bucketGuardCases { + { 'pslivetest-bucket-a' | & $Cmdlet -Array $script:fakeArray } | Should -Not -Throw + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $QueryParams['bucket_names'] -eq 'pslivetest-bucket-a' + } + } + } + + Context 'New-PfbBucketAuditFilter POST shape' { + It 'sends the spec-required names alongside bucket_names, defaulting names from the bucket' { + New-PfbBucketAuditFilter -BucketName 'pslivetest-bucket-a' -Attributes @{ actions = @('s3.GetObject') } -Array $script:fakeArray -Confirm:$false + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $Method -eq 'POST' -and $Endpoint -eq 'buckets/audit-filters' -and + $QueryParams.Count -eq 2 -and + $QueryParams['names'] -eq 'pslivetest-bucket-a' -and + $QueryParams['bucket_names'] -eq 'pslivetest-bucket-a' -and + -not $QueryParams.ContainsKey('member_names') + } + } + + It 'accepts Name and BucketName in one invocation' { + New-PfbBucketAuditFilter -BucketName 'pslivetest-bucket-a' -Name 'pslivetest-filter-a' -Attributes @{ actions = @('s3.GetObject') } -Array $script:fakeArray -Confirm:$false + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $Method -eq 'POST' -and $Endpoint -eq 'buckets/audit-filters' -and + $QueryParams.Count -eq 2 -and + $QueryParams['names'] -eq 'pslivetest-filter-a' -and + $QueryParams['bucket_names'] -eq 'pslivetest-bucket-a' + } + } + + It 'passes the supplied attributes through as the POST body' { + New-PfbBucketAuditFilter -BucketName 'pslivetest-bucket-a' -Attributes @{ actions = @('s3.GetObject'); s3_prefixes = @('logs/') } -Array $script:fakeArray -Confirm:$false + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $Method -eq 'POST' -and + $Body['actions'] -contains 's3.GetObject' -and + $Body['s3_prefixes'] -contains 'logs/' -and + -not $Body.ContainsKey('bucket_names') -and + -not $Body.ContainsKey('names') + } + } + } + + # ======================================================================= + # Task 1b + # ======================================================================= + + Context 'Task 1b -- remaining member selector surface' { + It ' publishes neither MemberName nor MemberId, and does publish BucketName' -ForEach $script:task1bMemberCases { + $keys = (Get-Command $Cmdlet).Parameters.Keys + $keys | Should -Not -Contain 'MemberName' + $keys | Should -Not -Contain 'MemberId' + $keys | Should -Contain 'BucketName' + } + + # NOTE: deliberately no behavioural "rejects -MemberName at bind time" case here. + # Every one of these five cmdlets carries at least one other Mandatory parameter, + # so an invocation supplying only -MemberName can drop into the interactive + # "Supply values for parameters" prompt and hang a non-interactive run. Parameter + # absence from the metadata is the same guarantee -- PowerShell cannot bind a name + # it does not publish -- without the hang risk. Do not "fix" this by adding one. + It ' exposes MemberName/MemberId in no parameter set' -ForEach $script:task1bMemberCases { + foreach ($set in (Get-Command $Cmdlet).ParameterSets) { + @($set.Parameters.Name) | Should -Not -Contain 'MemberName' + @($set.Parameters.Name) | Should -Not -Contain 'MemberId' + } + } + } + + Context 'Task 1b -- New-PfbBucketAccessPolicy / New-PfbBucketCorsPolicy POST shape' { + It ' emits exactly bucket_names, with no member_names and no policy_names' -ForEach $script:bucketOnlyPostCases { + $expectedEndpoint = $Endpoint + $expectedBucket = 'pslivetest-bucket-a' + + & $Cmdlet -BucketName $expectedBucket -Array $script:fakeArray -Confirm:$false + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $Method -eq 'POST' -and + $Endpoint -eq $expectedEndpoint -and + $QueryParams.Count -eq 1 -and + $QueryParams['bucket_names'] -eq $expectedBucket -and + -not $QueryParams.ContainsKey('member_names') -and + -not $QueryParams.ContainsKey('policy_names') -and + -not $QueryParams.ContainsKey('names') + } + } + + # NOTE: metadata-only, deliberately. -BucketName is Mandatory on both of these + # POST cmdlets, so a behavioural "pipe an unbindable object" case can drop into + # the interactive "Supply values for parameters" prompt and hang a + # non-interactive run -- the same hazard documented on Remove-PfbOpenFile in + # Tests/PfbDeadSelectorRemoval.Tests.ps1. The absence of bare ValueFromPipeline + # from the attribute metadata is the same guarantee without the hang risk. + # Do not "fix" this by adding a piped-object case. + It ' declares bare ValueFromPipeline on NO parameter at all' -ForEach $script:bucketOnlyPostCases { + $piped = @((Get-Command $Cmdlet).Parameters.Values | + ForEach-Object { $_.Attributes } | + Where-Object { $_ -is [System.Management.Automation.ParameterAttribute] } | + ForEach-Object { $_.ValueFromPipeline }) + $piped | Should -Not -Contain $true + } + + It ' keeps ValueFromPipelineByPropertyName on BucketName' -ForEach $script:bucketOnlyPostCases { + $paramAttrs = @((Get-Command $Cmdlet).Parameters['BucketName'].Attributes | + Where-Object { $_ -is [System.Management.Automation.ParameterAttribute] }) + @($paramAttrs | ForEach-Object { $_.ValueFromPipelineByPropertyName }) | Should -Contain $true + @($paramAttrs | ForEach-Object { $_.ValueFromPipeline }) | Should -Not -Contain $true + } + + It ' publishes BucketName as a mandatory [string[]] and no Name' -ForEach $script:bucketOnlyPostCases { + $parameters = (Get-Command $Cmdlet).Parameters + $parameters.Keys | Should -Not -Contain 'Name' + $parameters['BucketName'].ParameterType.FullName | Should -Be 'System.String[]' + $mandatory = @($parameters['BucketName'].Attributes | + Where-Object { $_ -is [System.Management.Automation.ParameterAttribute] } | + ForEach-Object { $_.Mandatory }) + $mandatory | Should -Contain $true + } + } + + Context 'Task 1b -- New-PfbBucketAccessPolicyRule POST shape' { + It 'sends the spec-required names alongside bucket_names and policy_names' { + $expectedName = 'pslivetest-rule-a' + $expectedBucket = 'pslivetest-bucket-a' + $expectedPolicy = 'pslivetest-policy-a' + + # `effect` is readOnly in BucketAccessPolicyRulePost, so a caller cannot + # send it -- the fixture uses only sendable properties. `principals` is an + # OBJECT shaped { all: boolean }, not a string array. + New-PfbBucketAccessPolicyRule -BucketName $expectedBucket -PolicyName $expectedPolicy ` + -Name $expectedName ` + -Attributes @{ actions = @('s3:GetObject'); principals = @{ all = $true } } ` + -Array $script:fakeArray -Confirm:$false + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $Method -eq 'POST' -and + $Endpoint -eq 'buckets/bucket-access-policies/rules' -and + $QueryParams.Count -eq 3 -and + $QueryParams['names'] -eq $expectedName -and + $QueryParams['bucket_names'] -eq $expectedBucket -and + $QueryParams['policy_names'] -eq $expectedPolicy -and + -not $QueryParams.ContainsKey('member_names') + } + } + + It 'makes -Name mandatory, because POST .../rules declares names as required' { + $nameParam = (Get-Command New-PfbBucketAccessPolicyRule).Parameters['Name'] + $nameParam | Should -Not -BeNullOrEmpty + $nameParam.ParameterType.FullName | Should -Be 'System.String[]' + $mandatory = @($nameParam.Attributes | + Where-Object { $_ -is [System.Management.Automation.ParameterAttribute] } | + ForEach-Object { $_.Mandatory }) + $mandatory | Should -Contain $true + } + + It 'keeps -Name reachable in every parameter set' { + $command = Get-Command New-PfbBucketAccessPolicyRule + foreach ($set in $command.ParameterSets) { + @($set.Parameters.Name) | Should -Contain 'Name' + } + } + + It 'still passes -Attributes through as the POST body without leaking a query key into it' { + New-PfbBucketAccessPolicyRule -BucketName 'pslivetest-bucket-a' -PolicyName 'pslivetest-policy-a' ` + -Name 'pslivetest-rule-a' ` + -Attributes @{ actions = @('s3:GetObject'); principals = @{ all = $true } } ` + -Array $script:fakeArray -Confirm:$false + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $Body['principals']['all'] -eq $true -and + $Body['actions'] -contains 's3:GetObject' -and + -not $Body.ContainsKey('effect') -and + -not $Body.ContainsKey('bucket_names') -and + -not $Body.ContainsKey('policy_names') -and + -not $Body.ContainsKey('names') + } + } + } + + # Coordinator ruling (round 3): POST + # /buckets/cross-origin-resource-sharing-policies/rules declares + # `bucket_ids bucket_names names* policy_names` in every version it exists in + # (2.12-2.28; `context_names` joins at 2.17), where * is required:true. The + # cmdlet previously sent NO query parameters at all, so it could not satisfy + # the required `names` and was inoperable -- not merely mis-keyed. The request + # body declares only allowed_headers/allowed_methods/allowed_origins and + # carries no identity, so there is no overlap with the query keys. + Context 'Task 1b/3 -- New-PfbBucketCorsPolicyRule POST shape' { + It 'sends the spec-required names alongside bucket_names and policy_names' { + $expectedName = 'pslivetest-cors-rule-a' + $expectedBucket = 'pslivetest-bucket-a' + $expectedPolicy = 'pslivetest-cors-policy-a' + + New-PfbBucketCorsPolicyRule -BucketName $expectedBucket -PolicyName $expectedPolicy ` + -Name $expectedName -Attributes @{ allowed_origins = @('*'); allowed_methods = @('GET','PUT','HEAD','POST','DELETE') } ` + -Array $script:fakeArray -Confirm:$false + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $Method -eq 'POST' -and + $Endpoint -eq 'buckets/cross-origin-resource-sharing-policies/rules' -and + $QueryParams.Count -eq 3 -and + $QueryParams['names'] -eq $expectedName -and + $QueryParams['bucket_names'] -eq $expectedBucket -and + $QueryParams['policy_names'] -eq $expectedPolicy -and + -not $QueryParams.ContainsKey('member_names') + } + } + + It 'makes -Name mandatory, because POST .../rules declares names as required' { + $nameParam = (Get-Command New-PfbBucketCorsPolicyRule).Parameters['Name'] + $nameParam | Should -Not -BeNullOrEmpty + $nameParam.ParameterType.FullName | Should -Be 'System.String[]' + $mandatory = @($nameParam.Attributes | + Where-Object { $_ -is [System.Management.Automation.ParameterAttribute] } | + ForEach-Object { $_.Mandatory }) + $mandatory | Should -Contain $true + } + + It 'keeps -Name reachable in every parameter set, so the required key can never be unsendable' { + $command = Get-Command New-PfbBucketCorsPolicyRule + @($command.ParameterSets).Count | Should -BeGreaterThan 0 + foreach ($set in $command.ParameterSets) { + @($set.Parameters.Name) | Should -Contain 'Name' + } + } + + It 'emits the required names on every reachable parameter set' { + # Review finding 5, addressed: each set gets a UNIQUE -Name value and is + # asserted immediately after its own invocation, so this is a per-set + # assertion rather than a total-invocation count. A set that failed to send + # `names` can no longer be masked by a sibling set that did. + $command = Get-Command New-PfbBucketCorsPolicyRule + $setIndex = 0 + foreach ($set in $command.ParameterSets) { + $setIndex++ + $expectedSetName = "pslivetest-set-$setIndex-name" + $splat = @{ + Array = $script:fakeArray + Confirm = $false + } + foreach ($p in $set.Parameters) { + if (-not $p.IsMandatory) { continue } + switch ($p.Name) { + 'Attributes' { $splat['Attributes'] = @{ allowed_origins = @('*') } } + 'Name' { $splat['Name'] = $expectedSetName } + default { $splat[$p.Name] = "pslivetest-$($p.Name.ToLowerInvariant())" } + } + } + + # Every Mandatory parameter of the set is bound, so this cannot fall into + # the interactive "Supply values for parameters" prompt. + New-PfbBucketCorsPolicyRule @splat + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest ` + -Times 1 -Exactly -ParameterFilter { + $QueryParams.ContainsKey('names') -and + $QueryParams['names'] -eq $expectedSetName + } + } + + $setIndex | Should -BeGreaterThan 0 + } + + It 'passes -Attributes through as the POST body without leaking a query key into it' { + New-PfbBucketCorsPolicyRule -BucketName 'pslivetest-bucket-a' -PolicyName 'pslivetest-cors-policy-a' ` + -Name 'pslivetest-cors-rule-a' -Attributes @{ allowed_origins = @('*'); allowed_methods = @('GET','PUT','HEAD','POST','DELETE') } ` + -Array $script:fakeArray -Confirm:$false + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $Body['allowed_origins'] -contains '*' -and + $Body['allowed_methods'] -contains 'GET' -and + -not $Body.ContainsKey('bucket_names') -and + -not $Body.ContainsKey('policy_names') -and + -not $Body.ContainsKey('names') + } + } + + It 'exposes no BucketId parameter, matching its access-policy-rule sibling' { + # bucket_ids IS declared on this operation but no -BucketId parameter exists + # here or on New-PfbBucketAccessPolicyRule; adding one is out of scope for + # this ruling. This case pins the current surface so the omission stays a + # deliberate, visible decision rather than drift. + (Get-Command New-PfbBucketCorsPolicyRule).Parameters.Keys | Should -Not -Contain 'BucketId' + } + } + + Context 'Task 1b -- Remove-PfbBucketAccessPolicy DELETE shape' { + It 'maps -Name to names only' { + $expectedName = 'pslivetest-bucket-a/pslivetest-account:pslivetest-policy-a' + + Remove-PfbBucketAccessPolicy -Name $expectedName -Array $script:fakeArray -Confirm:$false + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $Method -eq 'DELETE' -and + $Endpoint -eq 'buckets/bucket-access-policies' -and + $QueryParams.Count -eq 1 -and + $QueryParams['names'] -eq $expectedName -and + -not $QueryParams.ContainsKey('member_names') -and + -not $QueryParams.ContainsKey('policy_names') + } + } + + It 'maps -BucketId to bucket_ids only' { + $expectedBucketId = 'pslivetest-bucket-id-a' + + Remove-PfbBucketAccessPolicy -BucketId $expectedBucketId -Array $script:fakeArray -Confirm:$false + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $Method -eq 'DELETE' -and + $Endpoint -eq 'buckets/bucket-access-policies' -and + $QueryParams.Count -eq 1 -and + $QueryParams['bucket_ids'] -eq $expectedBucketId -and + -not $QueryParams.ContainsKey('member_ids') + } + } + + It 'maps -BucketName to bucket_names only' { + $expectedBucket = 'pslivetest-bucket-a' + + Remove-PfbBucketAccessPolicy -BucketName $expectedBucket -Array $script:fakeArray -Confirm:$false + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $Method -eq 'DELETE' -and + $Endpoint -eq 'buckets/bucket-access-policies' -and + $QueryParams.Count -eq 1 -and + $QueryParams['bucket_names'] -eq $expectedBucket -and + -not $QueryParams.ContainsKey('member_names') -and + -not $QueryParams.ContainsKey('policy_names') + } + } + } + + Context 'Task 1b -- Update-PfbBucketAuditFilter renamed selectors' { + It 'maps -BucketName to bucket_names and defaults the required names from it' { + $expectedBucket = 'pslivetest-bucket-a' + + Update-PfbBucketAuditFilter -BucketName $expectedBucket -Array $script:fakeArray -Confirm:$false + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $Method -eq 'PATCH' -and + $Endpoint -eq 'buckets/audit-filters' -and + $QueryParams.Count -eq 2 -and + $QueryParams['bucket_names'] -eq $expectedBucket -and + $QueryParams['names'] -eq $expectedBucket -and + -not $QueryParams.ContainsKey('member_names') + } + } + + It 'maps -BucketId to bucket_ids and takes the required names from -Name' { + $expectedBucketId = 'pslivetest-bucket-id-a' + $expectedName = 'pslivetest-filter-a' + + Update-PfbBucketAuditFilter -BucketId $expectedBucketId -Name $expectedName ` + -Array $script:fakeArray -Confirm:$false + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $Method -eq 'PATCH' -and + $Endpoint -eq 'buckets/audit-filters' -and + $QueryParams.Count -eq 2 -and + $QueryParams['bucket_ids'] -eq $expectedBucketId -and + $QueryParams['names'] -eq $expectedName -and + -not $QueryParams.ContainsKey('member_ids') -and + -not $QueryParams.ContainsKey('bucket_names') + } + } + + It 'still throws when -BucketId is used alone, since names cannot be inferred from an ID' { + { Update-PfbBucketAuditFilter -BucketId 'pslivetest-bucket-id-a' -Array $script:fakeArray -Confirm:$false -ErrorAction Stop } | + Should -Throw -ExpectedMessage '*-Name is required*' + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 0 -Exactly + } + + It 'resolves the legacy FilterNames, MemberName, and MemberId names as aliases' { + $parameters = (Get-Command Update-PfbBucketAuditFilter).Parameters + $parameters['Name'].Aliases | Should -Contain 'FilterNames' + $parameters['BucketName'].Aliases | Should -Contain 'MemberName' + $parameters['BucketId'].Aliases | Should -Contain 'MemberId' + } + } + + # An empty array must never reach the wire as a dropped selector. All three + # cmdlets below carry a parameter that satisfies a `required: true` query key + # (`names`), so binding `@()` or `@('')` must be rejected outright rather than + # producing a request with the required key missing or blank -- which would + # silently reconstruct the dead-selector defect this task removes. + Context 'Task 1b/4 -- required selectors reject an empty array' { + $script:emptyRequiredCases = @( + @{ Cmdlet = 'Update-PfbBucketAuditFilter'; Parameter = 'Name' + Extra = @{ BucketName = 'pslivetest-bucket-a' } } + @{ Cmdlet = 'New-PfbBucketAccessPolicyRule'; Parameter = 'Name' + Extra = @{ BucketName = 'pslivetest-bucket-a'; PolicyName = 'pslivetest-policy-a' + Attributes = @{ actions = @('s3:GetObject') } } } + @{ Cmdlet = 'New-PfbBucketAccessPolicyRule'; Parameter = 'BucketName' + Extra = @{ PolicyName = 'pslivetest-policy-a'; Name = 'pslivetest-rule-a' + Attributes = @{ actions = @('s3:GetObject') } } } + @{ Cmdlet = 'New-PfbBucketAccessPolicyRule'; Parameter = 'PolicyName' + Extra = @{ BucketName = 'pslivetest-bucket-a'; Name = 'pslivetest-rule-a' + Attributes = @{ actions = @('s3:GetObject') } } } + @{ Cmdlet = 'New-PfbBucketCorsPolicyRule'; Parameter = 'Name' + Extra = @{ BucketName = 'pslivetest-bucket-a'; PolicyName = 'pslivetest-policy-a' + Attributes = @{ allowed_origins = @('*') } } } + @{ Cmdlet = 'New-PfbBucketCorsPolicyRule'; Parameter = 'BucketName' + Extra = @{ PolicyName = 'pslivetest-policy-a'; Name = 'pslivetest-rule-a' + Attributes = @{ allowed_origins = @('*') } } } + @{ Cmdlet = 'New-PfbBucketCorsPolicyRule'; Parameter = 'PolicyName' + Extra = @{ BucketName = 'pslivetest-bucket-a'; Name = 'pslivetest-rule-a' + Attributes = @{ allowed_origins = @('*') } } } + ) + + It ' rejects - @() instead of sending the request' -ForEach $script:emptyRequiredCases { + $splat = @{ Array = $script:fakeArray; Confirm = $false; ErrorAction = 'Stop' } + foreach ($k in $Extra.Keys) { $splat[$k] = $Extra[$k] } + $splat[$Parameter] = @() + + { & $Cmdlet @splat } | Should -Throw + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 0 -Exactly + } + + It ' rejects - @('''') instead of sending the request' -ForEach $script:emptyRequiredCases { + $splat = @{ Array = $script:fakeArray; Confirm = $false; ErrorAction = 'Stop' } + foreach ($k in $Extra.Keys) { $splat[$k] = $Extra[$k] } + $splat[$Parameter] = @('') + + { & $Cmdlet @splat } | Should -Throw + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 0 -Exactly + } + } + + Context 'Task 1b -- dead generic Id on the four bucket Get-* cmdlets' { + It ' no longer declares an Id parameter' -ForEach $script:deadIdCases { + (Get-Command $Cmdlet).Parameters.Keys | Should -Not -Contain 'Id' + } + + It ' rejects -Id at bind time' -ForEach $script:deadIdCases { + { & $Cmdlet -Id 'pslivetest-id-a' -Array $script:fakeArray -ErrorAction Stop } | Should -Throw + } + + It ' leaves no ById parameter set behind' -ForEach $script:deadIdCases { + (Get-Command $Cmdlet).ParameterSets.Name | Should -Not -Contain 'ById' + } + + It ' emits exactly names for -Name and never ids' -ForEach $script:deadIdCases { + $expectedEndpoint = $Endpoint + $expectedMethod = $Method + $expectedNames = 'pslivetest-selector-a' + + & $Cmdlet -Name $expectedNames -Array $script:fakeArray + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $Method -eq $expectedMethod -and + $Endpoint -eq $expectedEndpoint -and + $QueryParams.Count -eq 1 -and + $QueryParams['names'] -eq $expectedNames -and + -not $QueryParams.ContainsKey('ids') + } + } + + It ' emits no query keys at all for a bare read' -ForEach $script:deadIdCases { + $expectedEndpoint = $Endpoint + $expectedMethod = $Method + + & $Cmdlet -Array $script:fakeArray + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $Method -eq $expectedMethod -and + $Endpoint -eq $expectedEndpoint -and + $QueryParams.Count -eq 0 -and + -not $QueryParams.ContainsKey('ids') + } + } + } +} diff --git a/Tests/PfbDeadSelectorRemoval.Tests.ps1 b/Tests/PfbDeadSelectorRemoval.Tests.ps1 new file mode 100644 index 00000000..c20222f2 --- /dev/null +++ b/Tests/PfbDeadSelectorRemoval.Tests.ps1 @@ -0,0 +1,621 @@ +#Requires -Modules @{ ModuleName = 'Pester'; ModuleVersion = '5.0' } + +BeforeAll { + $moduleRoot = Split-Path -Parent $PSScriptRoot + $manifest = Join-Path $moduleRoot 'PureStorageFlashBladePowerShell.psd1' + Import-Module $manifest -Force + + $script:fakeArray = [PSCustomObject]@{ + Endpoint = 'fb.example.test' + ApiVersion = '2.0' + AuthToken = 'x' + } +} + +Describe 'Issue #90 dead selector removal' { + BeforeEach { + Mock -ModuleName PureStorageFlashBladePowerShell Assert-PfbConnection { } + Mock -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest { } + } + + # ------------------------------------------------------------------ + # Get-PfbOpenFile -- GET /file-systems/open-files declares + # ids/limit/continuation_token and friends, but NOT names. + # ------------------------------------------------------------------ + Context 'Get-PfbOpenFile' { + It 'no longer declares a Name parameter' { + (Get-Command Get-PfbOpenFile).Parameters.Keys | Should -Not -Contain 'Name' + } + + It 'rejects -Name at bind time' { + { Get-PfbOpenFile -Name 'fs01' -Array $script:fakeArray } | Should -Throw + } + + It 'leaves no ByName parameter set behind' { + (Get-Command Get-PfbOpenFile).ParameterSets.Name | Should -Not -Contain 'ByName' + } + + It 'still declares Id as a string array' { + $idParam = (Get-Command Get-PfbOpenFile).Parameters['Id'] + $idParam | Should -Not -BeNullOrEmpty + $idParam.ParameterType.FullName | Should -Be 'System.String[]' + } + + It 'declares neither Filter nor Sort because the GET operation never declares those keys' { + $parameters = (Get-Command Get-PfbOpenFile).Parameters.Keys + $parameters | Should -Not -Contain 'Filter' + $parameters | Should -Not -Contain 'Sort' + } + + It 'declares ValueFromPipelineByPropertyName on Id, and not bare ValueFromPipeline' { + $paramAttrs = @((Get-Command Get-PfbOpenFile).Parameters['Id'].Attributes | + Where-Object { $_ -is [System.Management.Automation.ParameterAttribute] }) + @($paramAttrs | ForEach-Object { $_.ValueFromPipelineByPropertyName }) | Should -Contain $true + @($paramAttrs | ForEach-Object { $_.ValueFromPipeline }) | Should -Not -Contain $true + } + + It 'binds Id from a piped wire item by property name' { + $expectedEndpoint = 'file-systems/open-files' + $expectedMethod = 'GET' + $expectedIds = 'id-1' + + [PSCustomObject]@{ id = 'id-1' } | Get-PfbOpenFile -Array $script:fakeArray + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $Method -eq $expectedMethod -and + $Endpoint -eq $expectedEndpoint -and + $QueryParams.Count -eq 1 -and + $QueryParams['ids'] -eq $expectedIds -and + -not $QueryParams.ContainsKey('names') + } + } + + It 'accumulates ids across several piped wire items into one request' { + $expectedEndpoint = 'file-systems/open-files' + $expectedIds = 'id-1,id-2' + + @([PSCustomObject]@{ id = 'id-1' }, [PSCustomObject]@{ id = 'id-2' }) | + Get-PfbOpenFile -Array $script:fakeArray + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $Endpoint -eq $expectedEndpoint -and + $QueryParams.Count -eq 1 -and + $QueryParams['ids'] -eq $expectedIds + } + } + + It 'refuses a bare piped string rather than coercing it into ids' { + { 'id-1' | Get-PfbOpenFile -Array $script:fakeArray -ErrorAction Stop } | Should -Throw + } + + It 'emits exactly ids for -Id on GET file-systems/open-files' { + $expectedEndpoint = 'file-systems/open-files' + $expectedMethod = 'GET' + $expectedIds = 'id-1,id-2' + + Get-PfbOpenFile -Id 'id-1', 'id-2' -Array $script:fakeArray + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $Method -eq $expectedMethod -and + $Endpoint -eq $expectedEndpoint -and + $QueryParams.Count -eq 1 -and + $QueryParams.ContainsKey('ids') -and + $QueryParams['ids'] -eq $expectedIds -and + -not $QueryParams.ContainsKey('names') + } + } + + It 'emits no query keys at all for a bare read' { + $expectedEndpoint = 'file-systems/open-files' + $expectedMethod = 'GET' + + Get-PfbOpenFile -Array $script:fakeArray + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $Method -eq $expectedMethod -and + $Endpoint -eq $expectedEndpoint -and + $QueryParams.Count -eq 0 + } + } + } + + # ------------------------------------------------------------------ + # Remove-PfbOpenFile -- DELETE /file-systems/open-files declares + # ids ONLY. + # ------------------------------------------------------------------ + Context 'Remove-PfbOpenFile' { + It 'no longer declares a Name parameter' { + (Get-Command Remove-PfbOpenFile).Parameters.Keys | Should -Not -Contain 'Name' + } + + It 'rejects -Name at bind time' { + { Remove-PfbOpenFile -Name 'fs01' -Array $script:fakeArray -Confirm:$false } | Should -Throw + } + + It 'leaves no ByName parameter set behind' { + (Get-Command Remove-PfbOpenFile).ParameterSets.Name | Should -Not -Contain 'ByName' + } + + It 'keeps Id mandatory' { + $idParam = (Get-Command Remove-PfbOpenFile).Parameters['Id'] + $idParam | Should -Not -BeNullOrEmpty + $mandatory = @($idParam.Attributes | + Where-Object { $_ -is [System.Management.Automation.ParameterAttribute] } | + ForEach-Object { $_.Mandatory }) + $mandatory | Should -Contain $true + } + + # NOTE: no bare-piped-string case here. Id is Mandatory on this cmdlet, so an + # unbindable pipeline object can drop into the interactive "Supply values for + # parameters" prompt and hang a non-interactive run. The absence of bare + # ValueFromPipeline is asserted from the attribute metadata instead, which is + # the same guarantee without the hang risk. + It 'declares ValueFromPipelineByPropertyName on Id, and not bare ValueFromPipeline' { + $paramAttrs = @((Get-Command Remove-PfbOpenFile).Parameters['Id'].Attributes | + Where-Object { $_ -is [System.Management.Automation.ParameterAttribute] }) + @($paramAttrs | ForEach-Object { $_.ValueFromPipelineByPropertyName }) | Should -Contain $true + @($paramAttrs | ForEach-Object { $_.ValueFromPipeline }) | Should -Not -Contain $true + } + + It 'declares bare ValueFromPipeline on NO parameter at all' { + # Broader than the Id-scoped assertion above: the no-bare-pipeline guarantee + # covers the cmdlet's whole surface, so a future parameter cannot reintroduce + # bare ValueFromPipeline and slip past a check that only looks at Id. + $piped = @((Get-Command Remove-PfbOpenFile).Parameters.Values | + ForEach-Object { $_.Attributes } | + Where-Object { $_ -is [System.Management.Automation.ParameterAttribute] -and $_.ValueFromPipeline }) + $piped.Count | Should -Be 0 + } + + It 'binds Id from a piped wire item by property name' { + $expectedEndpoint = 'file-systems/open-files' + $expectedMethod = 'DELETE' + $expectedIds = 'id-1' + + [PSCustomObject]@{ id = 'id-1' } | Remove-PfbOpenFile -Array $script:fakeArray -Confirm:$false + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $Method -eq $expectedMethod -and + $Endpoint -eq $expectedEndpoint -and + $QueryParams.Count -eq 1 -and + $QueryParams['ids'] -eq $expectedIds -and + -not $QueryParams.ContainsKey('names') + } + } + + It 'issues one DELETE per piped wire item' { + $expectedEndpoint = 'file-systems/open-files' + $expectedFirst = 'id-1' + $expectedSecond = 'id-2' + + @([PSCustomObject]@{ id = 'id-1' }, [PSCustomObject]@{ id = 'id-2' }) | + Remove-PfbOpenFile -Array $script:fakeArray -Confirm:$false + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 2 -Exactly + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $Endpoint -eq $expectedEndpoint -and $QueryParams.Count -eq 1 -and $QueryParams['ids'] -eq $expectedFirst + } + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $Endpoint -eq $expectedEndpoint -and $QueryParams.Count -eq 1 -and $QueryParams['ids'] -eq $expectedSecond + } + } + + It 'emits exactly ids for -Id on DELETE file-systems/open-files' { + $expectedEndpoint = 'file-systems/open-files' + $expectedMethod = 'DELETE' + $expectedIds = 'id-1' + + Remove-PfbOpenFile -Id 'id-1' -Array $script:fakeArray -Confirm:$false + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $Method -eq $expectedMethod -and + $Endpoint -eq $expectedEndpoint -and + $QueryParams.Count -eq 1 -and + $QueryParams.ContainsKey('ids') -and + $QueryParams['ids'] -eq $expectedIds -and + -not $QueryParams.ContainsKey('names') + } + } + } + + # ------------------------------------------------------------------ + # Get-PfbResourceAccess -- GET /resource-accesses declares + # continuation_token/filter/ids/limit/offset/sort, but NOT names. + # ------------------------------------------------------------------ + Context 'Get-PfbResourceAccess' { + It 'no longer declares a Name parameter' { + (Get-Command Get-PfbResourceAccess).Parameters.Keys | Should -Not -Contain 'Name' + } + + It 'rejects -Name at bind time' { + { Get-PfbResourceAccess -Name 'access-prod' -Array $script:fakeArray } | Should -Throw + } + + It 'leaves no ByName parameter set behind' { + (Get-Command Get-PfbResourceAccess).ParameterSets.Name | Should -Not -Contain 'ByName' + } + + It 'still declares Id as a string array' { + $idParam = (Get-Command Get-PfbResourceAccess).Parameters['Id'] + $idParam | Should -Not -BeNullOrEmpty + $idParam.ParameterType.FullName | Should -Be 'System.String[]' + } + + It 'declares ValueFromPipelineByPropertyName on Id, and not bare ValueFromPipeline' { + $paramAttrs = @((Get-Command Get-PfbResourceAccess).Parameters['Id'].Attributes | + Where-Object { $_ -is [System.Management.Automation.ParameterAttribute] }) + @($paramAttrs | ForEach-Object { $_.ValueFromPipelineByPropertyName }) | Should -Contain $true + @($paramAttrs | ForEach-Object { $_.ValueFromPipeline }) | Should -Not -Contain $true + } + + It 'binds Id from a piped wire item by property name' { + $expectedEndpoint = 'resource-accesses' + $expectedMethod = 'GET' + $expectedIds = 'id-1' + + [PSCustomObject]@{ id = 'id-1' } | Get-PfbResourceAccess -Array $script:fakeArray + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $Method -eq $expectedMethod -and + $Endpoint -eq $expectedEndpoint -and + $QueryParams.Count -eq 1 -and + $QueryParams['ids'] -eq $expectedIds -and + -not $QueryParams.ContainsKey('names') + } + } + + It 'accumulates ids across several piped wire items into one request' { + $expectedEndpoint = 'resource-accesses' + $expectedIds = 'id-1,id-2' + + @([PSCustomObject]@{ id = 'id-1' }, [PSCustomObject]@{ id = 'id-2' }) | + Get-PfbResourceAccess -Array $script:fakeArray + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $Endpoint -eq $expectedEndpoint -and + $QueryParams.Count -eq 1 -and + $QueryParams['ids'] -eq $expectedIds + } + } + + It 'refuses a bare piped string rather than coercing it into ids' { + { 'id-1' | Get-PfbResourceAccess -Array $script:fakeArray -ErrorAction Stop } | Should -Throw + } + + It 'emits exactly ids for -Id on GET resource-accesses' { + $expectedEndpoint = 'resource-accesses' + $expectedMethod = 'GET' + $expectedIds = 'id-1,id-2' + + Get-PfbResourceAccess -Id 'id-1', 'id-2' -Array $script:fakeArray + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $Method -eq $expectedMethod -and + $Endpoint -eq $expectedEndpoint -and + $QueryParams.Count -eq 1 -and + $QueryParams.ContainsKey('ids') -and + $QueryParams['ids'] -eq $expectedIds -and + -not $QueryParams.ContainsKey('names') + } + } + + It 'still emits the declared filter/sort/limit keys and nothing else' { + $expectedEndpoint = 'resource-accesses' + $expectedMethod = 'GET' + $expectedFilter = "resource_type='file-system'" + $expectedSort = 'name' + $expectedLimit = 20 + + Get-PfbResourceAccess -Filter $expectedFilter -Sort $expectedSort -Limit $expectedLimit -Array $script:fakeArray + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $Method -eq $expectedMethod -and + $Endpoint -eq $expectedEndpoint -and + $QueryParams.Count -eq 3 -and + $QueryParams['filter'] -eq $expectedFilter -and + $QueryParams['sort'] -eq $expectedSort -and + $QueryParams['limit'] -eq $expectedLimit -and + -not $QueryParams.ContainsKey('names') + } + } + + It 'emits no query keys at all for a bare read' { + $expectedEndpoint = 'resource-accesses' + $expectedMethod = 'GET' + + Get-PfbResourceAccess -Array $script:fakeArray + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $Method -eq $expectedMethod -and + $Endpoint -eq $expectedEndpoint -and + $QueryParams.Count -eq 0 + } + } + } + + # ------------------------------------------------------------------ + # Remove-PfbResourceAccess -- DELETE /resource-accesses declares + # ids ONLY. + # ------------------------------------------------------------------ + Context 'Remove-PfbResourceAccess' { + It 'no longer declares a Name parameter' { + (Get-Command Remove-PfbResourceAccess).Parameters.Keys | Should -Not -Contain 'Name' + } + + It 'rejects -Name at bind time' { + { Remove-PfbResourceAccess -Name 'access-old' -Array $script:fakeArray -Confirm:$false } | Should -Throw + } + + It 'leaves no ByName parameter set behind' { + (Get-Command Remove-PfbResourceAccess).ParameterSets.Name | Should -Not -Contain 'ByName' + } + + It 'keeps Id mandatory' { + $idParam = (Get-Command Remove-PfbResourceAccess).Parameters['Id'] + $idParam | Should -Not -BeNullOrEmpty + $mandatory = @($idParam.Attributes | + Where-Object { $_ -is [System.Management.Automation.ParameterAttribute] } | + ForEach-Object { $_.Mandatory }) + $mandatory | Should -Contain $true + } + + # NOTE: no bare-piped-string case here, for the same mandatory-parameter + # prompt-hang reason documented on Remove-PfbOpenFile above. + It 'declares ValueFromPipelineByPropertyName on Id, and not bare ValueFromPipeline' { + $paramAttrs = @((Get-Command Remove-PfbResourceAccess).Parameters['Id'].Attributes | + Where-Object { $_ -is [System.Management.Automation.ParameterAttribute] }) + @($paramAttrs | ForEach-Object { $_.ValueFromPipelineByPropertyName }) | Should -Contain $true + @($paramAttrs | ForEach-Object { $_.ValueFromPipeline }) | Should -Not -Contain $true + } + + It 'declares bare ValueFromPipeline on NO parameter at all' { + # Broader than the Id-scoped assertion above: the no-bare-pipeline guarantee + # covers the cmdlet's whole surface, so a future parameter cannot reintroduce + # bare ValueFromPipeline and slip past a check that only looks at Id. + $piped = @((Get-Command Remove-PfbResourceAccess).Parameters.Values | + ForEach-Object { $_.Attributes } | + Where-Object { $_ -is [System.Management.Automation.ParameterAttribute] -and $_.ValueFromPipeline }) + $piped.Count | Should -Be 0 + } + + It 'binds Id from a piped wire item by property name' { + $expectedEndpoint = 'resource-accesses' + $expectedMethod = 'DELETE' + $expectedIds = 'id-1' + + [PSCustomObject]@{ id = 'id-1' } | Remove-PfbResourceAccess -Array $script:fakeArray -Confirm:$false + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $Method -eq $expectedMethod -and + $Endpoint -eq $expectedEndpoint -and + $QueryParams.Count -eq 1 -and + $QueryParams['ids'] -eq $expectedIds -and + -not $QueryParams.ContainsKey('names') + } + } + + It 'issues one DELETE per piped wire item' { + $expectedEndpoint = 'resource-accesses' + $expectedFirst = 'id-1' + $expectedSecond = 'id-2' + + @([PSCustomObject]@{ id = 'id-1' }, [PSCustomObject]@{ id = 'id-2' }) | + Remove-PfbResourceAccess -Array $script:fakeArray -Confirm:$false + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 2 -Exactly + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $Endpoint -eq $expectedEndpoint -and $QueryParams.Count -eq 1 -and $QueryParams['ids'] -eq $expectedFirst + } + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $Endpoint -eq $expectedEndpoint -and $QueryParams.Count -eq 1 -and $QueryParams['ids'] -eq $expectedSecond + } + } + + It 'emits exactly ids for -Id on DELETE resource-accesses' { + $expectedEndpoint = 'resource-accesses' + $expectedMethod = 'DELETE' + $expectedIds = 'id-1' + + Remove-PfbResourceAccess -Id 'id-1' -Array $script:fakeArray -Confirm:$false + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $Method -eq $expectedMethod -and + $Endpoint -eq $expectedEndpoint -and + $QueryParams.Count -eq 1 -and + $QueryParams.ContainsKey('ids') -and + $QueryParams['ids'] -eq $expectedIds -and + -not $QueryParams.ContainsKey('names') + } + } + } + + # ------------------------------------------------------------------ + # Get-PfbFleetKey -- GET /fleets/fleet-key declares + # continuation_token/filter/limit/offset/sort/total_only, but no + # names and no ids. It is an unfiltered read plus filter/sort/limit. + # ------------------------------------------------------------------ + Context 'Get-PfbFleetKey' { + It 'no longer declares a Name parameter' { + (Get-Command Get-PfbFleetKey).Parameters.Keys | Should -Not -Contain 'Name' + } + + It 'rejects -Name at bind time' { + { Get-PfbFleetKey -Name 'fleet-prod' -Array $script:fakeArray } | Should -Throw + } + + It 'emits no query keys at all for a bare read' { + $expectedEndpoint = 'fleets/fleet-key' + $expectedMethod = 'GET' + + Get-PfbFleetKey -Array $script:fakeArray + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $Method -eq $expectedMethod -and + $Endpoint -eq $expectedEndpoint -and + $QueryParams.Count -eq 0 -and + -not $QueryParams.ContainsKey('names') + } + } + + It 'still emits the declared filter/sort/limit keys and nothing else' { + $expectedEndpoint = 'fleets/fleet-key' + $expectedMethod = 'GET' + $expectedFilter = "name='fleet*'" + $expectedSort = 'name' + $expectedLimit = 5 + + Get-PfbFleetKey -Filter $expectedFilter -Sort $expectedSort -Limit $expectedLimit -Array $script:fakeArray + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $Method -eq $expectedMethod -and + $Endpoint -eq $expectedEndpoint -and + $QueryParams.Count -eq 3 -and + $QueryParams['filter'] -eq $expectedFilter -and + $QueryParams['sort'] -eq $expectedSort -and + $QueryParams['limit'] -eq $expectedLimit -and + -not $QueryParams.ContainsKey('names') + } + } + } + + # ------------------------------------------------------------------ + # Get-PfbNetworkConnectionStatistics -- GET + # /network-interfaces/network-connection-statistics declares + # current_state/filter/limit/local_host/local_port/offset/ + # remote_host/remote_port/sort, but NOT names. + # ------------------------------------------------------------------ + Context 'Get-PfbNetworkConnectionStatistics' { + It 'no longer declares a Name parameter' { + (Get-Command Get-PfbNetworkConnectionStatistics).Parameters.Keys | Should -Not -Contain 'Name' + } + + It 'rejects -Name at bind time' { + { Get-PfbNetworkConnectionStatistics -Name 'vip1' -Array $script:fakeArray } | Should -Throw + } + + It 'emits no query keys at all for a bare read' { + $expectedEndpoint = 'network-interfaces/network-connection-statistics' + $expectedMethod = 'GET' + + Get-PfbNetworkConnectionStatistics -Array $script:fakeArray + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $Method -eq $expectedMethod -and + $Endpoint -eq $expectedEndpoint -and + $QueryParams.Count -eq 0 -and + -not $QueryParams.ContainsKey('names') + } + } + + It 'still emits the declared filter/sort/limit keys and nothing else' { + $expectedEndpoint = 'network-interfaces/network-connection-statistics' + $expectedMethod = 'GET' + $expectedFilter = "interface_type='vip'" + $expectedSort = 'name' + $expectedLimit = 10 + + Get-PfbNetworkConnectionStatistics -Filter $expectedFilter -Sort $expectedSort -Limit $expectedLimit -Array $script:fakeArray + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $Method -eq $expectedMethod -and + $Endpoint -eq $expectedEndpoint -and + $QueryParams.Count -eq 3 -and + $QueryParams['filter'] -eq $expectedFilter -and + $QueryParams['sort'] -eq $expectedSort -and + $QueryParams['limit'] -eq $expectedLimit -and + -not $QueryParams.ContainsKey('names') + } + } + } + + # ------------------------------------------------------------------ + # Get-PfbObjectStoreTrustPolicyRule -- GET + # /object-store-roles/object-store-trust-policies/rules declares + # names/policy_names/role_ids/role_names/indices/filter/sort/limit/ + # offset/allow_errors/context_names/continuation_token -- but NOT + # policy_ids. Only PolicyId goes; PolicyName must survive intact. + # ------------------------------------------------------------------ + Context 'Get-PfbObjectStoreTrustPolicyRule' { + It 'no longer declares a PolicyId parameter' { + (Get-Command Get-PfbObjectStoreTrustPolicyRule).Parameters.Keys | Should -Not -Contain 'PolicyId' + } + + It 'rejects -PolicyId at bind time' { + { Get-PfbObjectStoreTrustPolicyRule -PolicyId 'pid-1' -Array $script:fakeArray } | Should -Throw + } + + It 'leaves no ByPolicyId parameter set behind' { + (Get-Command Get-PfbObjectStoreTrustPolicyRule).ParameterSets.Name | Should -Not -Contain 'ByPolicyId' + } + + It 'keeps ByPolicyName as the default parameter set' { + $defaultSet = @((Get-Command Get-PfbObjectStoreTrustPolicyRule).ParameterSets | + Where-Object { $_.IsDefault } | ForEach-Object { $_.Name }) + $defaultSet | Should -Be 'ByPolicyName' + } + + It 'keeps PolicyName with its pipeline attributes and no schema-less alias' { + $policyNameParam = (Get-Command Get-PfbObjectStoreTrustPolicyRule).Parameters['PolicyName'] + $policyNameParam | Should -Not -BeNullOrEmpty + $policyNameParam.ParameterType.FullName | Should -Be 'System.String[]' + $policyNameParam.Aliases | Should -Not -Contain 'policy_name' + + $paramAttrs = @($policyNameParam.Attributes | + Where-Object { $_ -is [System.Management.Automation.ParameterAttribute] }) + @($paramAttrs | ForEach-Object { $_.Mandatory }) | Should -Contain $true + @($paramAttrs | ForEach-Object { $_.ValueFromPipeline }) | Should -Contain $true + @($paramAttrs | ForEach-Object { $_.ValueFromPipelineByPropertyName }) | Should -Contain $true + @($paramAttrs | ForEach-Object { $_.Position }) | Should -Contain 0 + @($paramAttrs | ForEach-Object { $_.ParameterSetName }) | Should -Contain 'ByPolicyName' + } + + It 'emits exactly policy_names for -PolicyName' { + $expectedEndpoint = 'object-store-roles/object-store-trust-policies/rules' + $expectedMethod = 'GET' + $expectedPolicyNames = 's3-admin-role/trust-policy' + + Get-PfbObjectStoreTrustPolicyRule -PolicyName $expectedPolicyNames -Array $script:fakeArray + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $Method -eq $expectedMethod -and + $Endpoint -eq $expectedEndpoint -and + $QueryParams.Count -eq 1 -and + $QueryParams.ContainsKey('policy_names') -and + $QueryParams['policy_names'] -eq $expectedPolicyNames -and + -not $QueryParams.ContainsKey('policy_ids') + } + } + + It 'binds PolicyName from the pipeline by property name' { + $expectedEndpoint = 'object-store-roles/object-store-trust-policies/rules' + $expectedPolicyNames = 's3-admin-role/trust-policy' + + [PSCustomObject]@{ PolicyName = $expectedPolicyNames } | + Get-PfbObjectStoreTrustPolicyRule -Array $script:fakeArray + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $Endpoint -eq $expectedEndpoint -and + $QueryParams.Count -eq 1 -and + $QueryParams['policy_names'] -eq $expectedPolicyNames -and + -not $QueryParams.ContainsKey('policy_ids') + } + } + + It 'emits exactly names for -Name' { + $expectedEndpoint = 'object-store-roles/object-store-trust-policies/rules' + $expectedMethod = 'GET' + $expectedNames = 's3-admin-role/trust-policy/rule1' + + Get-PfbObjectStoreTrustPolicyRule -Name $expectedNames -Array $script:fakeArray + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $Method -eq $expectedMethod -and + $Endpoint -eq $expectedEndpoint -and + $QueryParams.Count -eq 1 -and + $QueryParams.ContainsKey('names') -and + $QueryParams['names'] -eq $expectedNames -and + -not $QueryParams.ContainsKey('policy_ids') + } + } + } +} diff --git a/Tests/PfbPipelineSelectorRail.Tests.ps1 b/Tests/PfbPipelineSelectorRail.Tests.ps1 index 78a822e3..efad14e8 100644 --- a/Tests/PfbPipelineSelectorRail.Tests.ps1 +++ b/Tests/PfbPipelineSelectorRail.Tests.ps1 @@ -16,8 +16,8 @@ object is rebuilt from the report's own ProbeProperties/ProbeTypes fields instead. Waivers are keyed by (cmdlet, parameter) PAIR, not by (cmdlet, parameter, producer) - triple. The 389 finding rows are producer multiplicity over 127 real defects; a - triple-keyed file would be 389 entries against psd1's hard 500-element parse cap for a + triple. The 264 finding rows are producer multiplicity over 101 real defects; a + triple-keyed file would be 264 entries against psd1's hard 500-element parse cap for a single collection literal, and would list the same defect up to a dozen times. The rail still names the producing endpoint in its failure text as evidence. @@ -97,9 +97,9 @@ BeforeAll { } # Enforced, not merely documented. A degraded map is the one failure the rest of this # rail cannot see: an all-string probe binds cleanly to an object-typed field, and - # forcing every type to string today flips 2 of 389 findings (both - # Get-PfbLocalGroupMember/Group) out of Coerced. Pair-level waiving means even that - # would leave all 127 pairs looking defective, so no assertion below would catch it. + # forcing every type to string can turn an object-valued field into a clean + # by-property-name bind and hide a Coerced row. Pair-level waiving can leave the same + # pair defective through another producer, so no assertion below would catch it. if ($probeTypes.Count -ne @($row.ProbeProperties).Count) { throw ("Report row $($row.Cmdlet)/$($row.Parameter) via $($row.Producer) has " + "degraded ProbeTypes ($($probeTypes.Count) of $(@($row.ProbeProperties).Count)); " + @@ -186,7 +186,7 @@ Describe 'Rail A - no unwaived selector coercion' -Skip:($PSVersionTable.PSVersi } It 'no Family-scoped waiver has escalated onto its primary producer' { - # A pair-keyed waiver is blind to WHERE the coercion happens, and 100 of the 127 are + # A pair-keyed waiver is blind to WHERE the coercion happens, and 100 of the 101 are # waived precisely because the obvious chain -- the cmdlet's own base-path GET -- is # safe. Without this, a change that breaks property-name binding on, say, # Remove-PfbFileSystem would turn `Get-PfbFileSystem | Remove-PfbFileSystem` into a @@ -250,8 +250,8 @@ Describe 'Rail A - no unwaived selector coercion' -Skip:($PSVersionTable.PSVersi # A rise here means the harness has started refusing cmdlets it used to measure, which # is precisely the regression that produced the original 33-pair blind spot. # - # BindError is an OUTCOME, not an ErrorKind. ErrorKind is non-null on 193 rows (160 - # InputObjectNotBound, 31 CmdletError, 2 ParameterBindingError); only the 2 + # BindError is an OUTCOME, not an ErrorKind. ErrorKind is non-null on 358 rows (234 + # InputObjectNotBound, 122 CmdletError, 2 ParameterBindingError); only the 2 # ParameterBindingError rows classify as the BindError outcome, and only that outcome # means unmeasured. Asserting on ErrorKind -eq 'BindError' matches nothing at all. @($script:measured | Where-Object { $_.Outcome -eq 'BindError' }).Count | Should -Be 2 diff --git a/Tests/PfbPipelineSelectorTools.Tests.ps1 b/Tests/PfbPipelineSelectorTools.Tests.ps1 index 7ce4c878..290523ee 100644 --- a/Tests/PfbPipelineSelectorTools.Tests.ps1 +++ b/Tests/PfbPipelineSelectorTools.Tests.ps1 @@ -125,8 +125,31 @@ Describe 'Get-PfbPipelineBoundParameter' -Skip:($PSVersionTable.PSVersion.Major } It 'reports the measured module-wide population' { - @($script:bound).Count | Should -Be 303 - @($script:bound | Where-Object ValueFromPipeline).Count | Should -Be 214 + # Re-baselined from 303 / 214 when the Stage 2 selector fixes landed. The whole + # movement is accounted for, which is the only thing that makes a re-baseline + # legitimate rather than a silenced tripwire -- measured by diffing this function's + # output between origin/main and the fix branch: + # + # +26 rows: renames of a selector that carried the wrong wire key + # (MemberName -> BucketName on 11 bucket-policy cmdlets, and + # Name -> CertificateName / GroupName / LocalPortName / RealmName), + # plus selectors that replace a removed dead one (-Id on + # Get/Remove-PfbOpenFile and Get/Remove-PfbResourceAccess) and + # parent-name selectors added so a policy-family pipeline binds by + # property name instead of falling through to coercion. + # -18 rows: the old name of each of those renames, and the dead selectors + # themselves (Get-PfbFleetKey/Name, + # Get-PfbNetworkConnectionStatistics/Name, Get-PfbOpenFile/Name, ...). + # + # Net +8, giving 311. ValueFromPipeline: 214 + 12 added - 17 removed = 209. + # + # NO row changed its ValueFromPipeline value. That is deliberate and worth pinning: + # removing ValueFromPipeline was rejected as a remedy on this branch, because binding + # resolves in FOUR passes and pass 4 coerces a ByPropertyName-only parameter through + # its alias -- so the attribute removal buys no structural immunity, and a guard is + # what the affected parameters got instead. + @($script:bound).Count | Should -Be 311 + @($script:bound | Where-Object ValueFromPipeline).Count | Should -Be 209 } } diff --git a/Tests/PfbSelectorLift.Tests.ps1 b/Tests/PfbSelectorLift.Tests.ps1 new file mode 100644 index 00000000..3c0b89b0 --- /dev/null +++ b/Tests/PfbSelectorLift.Tests.ps1 @@ -0,0 +1,661 @@ +#Requires -Modules @{ ModuleName = 'Pester'; ModuleVersion = '5.0' } + +BeforeAll { + Import-Module "$PSScriptRoot/../PureStorageFlashBladePowerShell.psd1" -Force + $script:fakeArray = [PSCustomObject]@{ + Endpoint = 'fb.example.test' + ApiVersion = '2.0' + AuthToken = 'x' + } +} + +$policyRows = @( + @{ + Cmdlet = 'Get-PfbNetworkAccessRule' + LiftProperty = 'PolicyName' + NestedProperty = 'policy' + WireKey = 'policy_names' + Alias = 'policy_name' + Endpoint = 'network-access-policies/rules' + InitialArgs = @{} + } + @{ + Cmdlet = 'Get-PfbNfsExportRule' + LiftProperty = 'PolicyName' + NestedProperty = 'policy' + WireKey = 'policy_names' + Alias = 'policy_name' + Endpoint = 'nfs-export-policies/rules' + InitialArgs = @{} + } + @{ + Cmdlet = 'Get-PfbObjectStoreAccessPolicyRule' + LiftProperty = 'PolicyName' + NestedProperty = 'policy' + WireKey = 'policy_names' + Alias = 'policy_name' + Endpoint = 'object-store-access-policies/rules' + InitialArgs = @{} + } + @{ + Cmdlet = 'Get-PfbObjectStoreTrustPolicyRule' + LiftProperty = 'PolicyName' + NestedProperty = 'policy' + WireKey = 'policy_names' + Alias = 'policy_name' + Endpoint = 'object-store-roles/object-store-trust-policies/rules' + InitialArgs = @{ PolicyName = 'seed-policy' } + } + @{ + Cmdlet = 'Get-PfbS3ExportRule' + LiftProperty = 'PolicyName' + NestedProperty = 'policy' + WireKey = 'policy_names' + Alias = 'policy_name' + Endpoint = 's3-export-policies/rules' + InitialArgs = @{ PolicyName = 'seed-policy' } + } + @{ + Cmdlet = 'Get-PfbSmbClientRule' + LiftProperty = 'PolicyName' + NestedProperty = 'policy' + WireKey = 'policy_names' + Alias = 'policy_name' + Endpoint = 'smb-client-policies/rules' + InitialArgs = @{} + } + @{ + Cmdlet = 'Get-PfbSmbShareRule' + LiftProperty = 'PolicyName' + NestedProperty = 'policy' + WireKey = 'policy_names' + Alias = 'policy_name' + Endpoint = 'smb-share-policies/rules' + InitialArgs = @{} + } +) + +$roleRows = @( + @{ + Cmdlet = 'Get-PfbObjectStoreTrustPolicy' + LiftProperty = 'RoleName' + NestedProperty = 'role' + WireKey = 'role_names' + Alias = 'role_name' + Endpoint = 'object-store-roles/object-store-trust-policies' + InitialArgs = @{ RoleName = 'seed-role' } + } +) + +Describe 'Policy and role selector lifts' { + BeforeEach { + Mock -ModuleName PureStorageFlashBladePowerShell Assert-PfbConnection { } + } + + It 'lifts .name to without rebuilding the response' -ForEach @($policyRows + $roleRows) { + $fixture = [PSCustomObject]@{ + name = 'rule-1' + context = [PSCustomObject]@{ name = 'array-a' } + marker = 'preserve-me' + } + $nestedName = if ($NestedProperty -eq 'role') { 'role-1' } else { 'policy-1' } + $nested = [PSCustomObject]@{ name = $nestedName } + $fixture | Add-Member -MemberType NoteProperty -Name $NestedProperty -Value $nested + $requests = [System.Collections.Generic.List[object]]::new() + $global:PfbSelectorLiftFixture = $fixture + $global:PfbSelectorLiftRequests = $requests + + Mock -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest { + $global:PfbSelectorLiftRequests.Add([PSCustomObject]@{ + Method = $Method + Endpoint = $Endpoint + QueryParams = $QueryParams + }) + return $global:PfbSelectorLiftFixture + } + + $invokeArgs = @{} + $InitialArgs + $invokeArgs['Array'] = $script:fakeArray + $result = & $Cmdlet @invokeArgs + $expectedName = if ($NestedProperty -eq 'role') { 'role-1' } else { 'policy-1' } + + [object]::ReferenceEquals($result, $fixture) | Should -BeTrue + $result.$LiftProperty | Should -Be $expectedName + $result.name | Should -Be 'rule-1' + $result.context.name | Should -Be 'array-a' + $result.marker | Should -Be 'preserve-me' + $result.$NestedProperty.name | Should -Be $expectedName + # Exactly one property added: the four fixture properties plus the lift, and nothing else. + # Without this a rebuilt-or-over-decorated object could still satisfy every assertion above. + @($result.PSObject.Properties.Name) | Should -Be @('name', 'context', 'marker', $NestedProperty, $LiftProperty) + $requests.Count | Should -Be 1 + $requests[0].Endpoint | Should -Be $Endpoint + } + + It 'pipes the lifted into as scalar ' -ForEach @($policyRows + $roleRows) { + $fixture = [PSCustomObject]@{ + name = 'rule-1' + context = [PSCustomObject]@{ name = 'array-a' } + marker = 'preserve-me' + } + $nestedName = if ($NestedProperty -eq 'role') { 'role-1' } else { 'policy-1' } + $nested = [PSCustomObject]@{ name = $nestedName } + $fixture | Add-Member -MemberType NoteProperty -Name $NestedProperty -Value $nested + $requests = [System.Collections.Generic.List[object]]::new() + $global:PfbSelectorLiftFixture = $fixture + $global:PfbSelectorLiftRequests = $requests + + Mock -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest { + $global:PfbSelectorLiftRequests.Add([PSCustomObject]@{ + Method = $Method + Endpoint = $Endpoint + QueryParams = $QueryParams + }) + return $global:PfbSelectorLiftFixture + } + + $invokeArgs = @{} + $InitialArgs + $invokeArgs['Array'] = $script:fakeArray + $first = & $Cmdlet @invokeArgs + $second = $first | & $Cmdlet -Array $script:fakeArray + + $requests.Count | Should -Be 2 + $expectedName = if ($NestedProperty -eq 'role') { 'role-1' } else { 'policy-1' } + $requests[1].Method | Should -Be 'GET' + $requests[1].Endpoint | Should -Be $Endpoint + $requests[1].QueryParams[$WireKey] | Should -Be $expectedName + $requests[1].QueryParams[$WireKey] | Should -Not -Match '@\{' + # The piped call binds nothing but the selector, so the selector must be the ONLY key on + # the wire. An exact key set is what catches a stray or duplicate selector. + @($requests[1].QueryParams.Keys) | Should -Be @($WireKey) + $second | Should -Not -BeNullOrEmpty + } + + It 'does not need an underscored alias for the runtime lift on ' -ForEach @($policyRows + $roleRows) { + $command = Get-Command $Cmdlet + $command.Parameters[$LiftProperty].Aliases | Should -Not -Contain $Alias + } + + # Both halves of "add only when the nested object AND its name are non-null" need a case: a + # guard that only checks .name blows up or mis-adds when the parent object itself is missing, + # which is exactly what an older REST version or a sparse response gives you. + It 'does not add when is ' -ForEach @( + @{ + Cmdlet = 'Get-PfbNetworkAccessRule' + LiftProperty = 'PolicyName' + NestedProperty = 'policy' + NestedState = 'present with a null name' + OmitNested = $false + InitialArgs = @{} + } + @{ + Cmdlet = 'Get-PfbObjectStoreTrustPolicy' + LiftProperty = 'RoleName' + NestedProperty = 'role' + NestedState = 'present with a null name' + OmitNested = $false + InitialArgs = @{ RoleName = 'seed-role' } + } + @{ + Cmdlet = 'Get-PfbNetworkAccessRule' + LiftProperty = 'PolicyName' + NestedProperty = 'policy' + NestedState = 'absent entirely' + OmitNested = $true + InitialArgs = @{} + } + @{ + Cmdlet = 'Get-PfbObjectStoreTrustPolicy' + LiftProperty = 'RoleName' + NestedProperty = 'role' + NestedState = 'absent entirely' + OmitNested = $true + InitialArgs = @{ RoleName = 'seed-role' } + } + ) { + $fixture = [PSCustomObject]@{ + name = 'rule-1' + context = [PSCustomObject]@{ name = 'array-a' } + marker = 'preserve-me' + } + if (-not $OmitNested) { + $nested = [PSCustomObject]@{ name = $null } + $fixture | Add-Member -MemberType NoteProperty -Name $NestedProperty -Value $nested + } + $global:PfbSelectorLiftFixture = $fixture + + Mock -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest { + return $global:PfbSelectorLiftFixture + } + + $invokeArgs = @{} + $InitialArgs + $invokeArgs['Array'] = $script:fakeArray + $result = & $Cmdlet @invokeArgs + + [object]::ReferenceEquals($result, $fixture) | Should -BeTrue + @($result.PSObject.Properties.Name) | Should -Not -Contain $LiftProperty + $result.context.name | Should -Be 'array-a' + $result.marker | Should -Be 'preserve-me' + } + + It 'does not overwrite an existing ' -ForEach @( + @{ + Cmdlet = 'Get-PfbNetworkAccessRule' + LiftProperty = 'PolicyName' + NestedProperty = 'policy' + InitialArgs = @{} + } + @{ + Cmdlet = 'Get-PfbObjectStoreTrustPolicy' + LiftProperty = 'RoleName' + NestedProperty = 'role' + InitialArgs = @{ RoleName = 'seed-role' } + } + ) { + $fixture = [PSCustomObject]@{ + name = 'rule-1' + context = [PSCustomObject]@{ name = 'array-a' } + marker = 'preserve-me' + } + $nested = [PSCustomObject]@{ name = 'nested-name' } + $fixture | Add-Member -MemberType NoteProperty -Name $NestedProperty -Value $nested + $fixture | Add-Member -MemberType NoteProperty -Name $LiftProperty -Value 'existing-name' + $global:PfbSelectorLiftFixture = $fixture + + Mock -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest { + return $global:PfbSelectorLiftFixture + } + + $invokeArgs = @{} + $InitialArgs + $invokeArgs['Array'] = $script:fakeArray + $result = & $Cmdlet @invokeArgs + + [object]::ReferenceEquals($result, $fixture) | Should -BeTrue + $result.$LiftProperty | Should -Be 'existing-name' + $result.$NestedProperty.name | Should -Be 'nested-name' + $result.context.name | Should -Be 'array-a' + $result.marker | Should -Be 'preserve-me' + } +} + +Describe 'Local group member selector lift' { + BeforeEach { + Mock -ModuleName PureStorageFlashBladePowerShell Assert-PfbConnection { } + } + + It 'lifts group.name to GroupName without rebuilding the response' { + $fixture = [PSCustomObject]@{ + name = 'member-1' + context = [PSCustomObject]@{ name = 'array-a' } + marker = 'preserve-me' + group = [PSCustomObject]@{ name = 'group-1' } + } + $requests = [System.Collections.Generic.List[object]]::new() + $global:PfbSelectorLiftFixture = $fixture + $global:PfbSelectorLiftRequests = $requests + + Mock -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest { + $global:PfbSelectorLiftRequests.Add([PSCustomObject]@{ + Method = $Method + Endpoint = $Endpoint + QueryParams = $QueryParams + }) + return $global:PfbSelectorLiftFixture + } + + $result = Get-PfbLocalGroupMember -Array $script:fakeArray + + [object]::ReferenceEquals($result, $fixture) | Should -BeTrue + $result.GroupName | Should -Be 'group-1' + $result.group.name | Should -Be 'group-1' + $result.context.name | Should -Be 'array-a' + $result.marker | Should -Be 'preserve-me' + @($result.PSObject.Properties.Name) | Should -Be @('name', 'context', 'marker', 'group', 'GroupName') + $requests.Count | Should -Be 1 + $requests[0].Method | Should -Be 'GET' + $requests[0].Endpoint | Should -Be 'directory-services/local/groups/members' + @($requests[0].QueryParams.Keys) | Should -HaveCount 0 + } + + It 'pipes GroupName into Get-PfbLocalGroupMember as scalar group_names' { + $fixture = [PSCustomObject]@{ + name = 'member-1' + context = [PSCustomObject]@{ name = 'array-a' } + marker = 'preserve-me' + group = [PSCustomObject]@{ name = 'group-1' } + } + $requests = [System.Collections.Generic.List[object]]::new() + $global:PfbSelectorLiftFixture = $fixture + $global:PfbSelectorLiftRequests = $requests + + Mock -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest { + $global:PfbSelectorLiftRequests.Add([PSCustomObject]@{ + Method = $Method + Endpoint = $Endpoint + QueryParams = $QueryParams + }) + return $global:PfbSelectorLiftFixture + } + + $first = Get-PfbLocalGroupMember -Array $script:fakeArray + $second = $first | Get-PfbLocalGroupMember -Array $script:fakeArray + $expectedGroupName = 'group-1' + + $requests.Count | Should -Be 2 + $requests[0].Method | Should -Be 'GET' + $requests[0].Endpoint | Should -Be 'directory-services/local/groups/members' + @($requests[0].QueryParams.Keys) | Should -HaveCount 0 + $requests[1].Method | Should -Be 'GET' + $requests[1].Endpoint | Should -Be 'directory-services/local/groups/members' + $requests[1].QueryParams['group_names'] | Should -Be $expectedGroupName + $requests[1].QueryParams['group_names'] | Should -Not -Match '@\{' + @($requests[1].QueryParams.Keys) | Should -Be @('group_names') + $second | Should -Not -BeNullOrEmpty + } + + # The selector parameter is GroupName, not Group: a parameter named Group is shadowed by the + # response's own 'group' property during by-property-name binding (the property matching the + # parameter NAME wins over any property matching an alias), so the lifted GroupName could never + # bind and the whole item was stringified onto group_names instead. Group survives as an alias, + # so -Group stays bindable -- which is the half of this case that must not regress. + It 'declares Group and group_name as aliases of the GroupName selector parameter' { + $command = Get-Command Get-PfbLocalGroupMember + @($command.Parameters.Keys) | Should -Not -Contain 'Group' + $command.Parameters['GroupName'].Aliases | Should -Contain 'group_name' + $command.Parameters['GroupName'].Aliases | Should -Contain 'Group' + } + + It 'still binds -Group on the command line after the rename' { + $requests = [System.Collections.Generic.List[object]]::new() + $global:PfbSelectorLiftRequests = $requests + $global:PfbSelectorLiftFixture = $null + + Mock -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest { + $global:PfbSelectorLiftRequests.Add([PSCustomObject]@{ + Method = $Method + Endpoint = $Endpoint + QueryParams = $QueryParams + }) + return $global:PfbSelectorLiftFixture + } + + Get-PfbLocalGroupMember -Group 'group-1', 'group-2' -Array $script:fakeArray | Out-Null + + $requests.Count | Should -Be 1 + $requests[0].QueryParams['group_names'] | Should -Be 'group-1,group-2' + } + + It 'does not add GroupName when group.name is null' { + $fixture = [PSCustomObject]@{ + name = 'member-1' + context = [PSCustomObject]@{ name = 'array-a' } + marker = 'preserve-me' + group = [PSCustomObject]@{ name = $null } + } + $global:PfbSelectorLiftFixture = $fixture + + Mock -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest { + return $global:PfbSelectorLiftFixture + } + + $result = Get-PfbLocalGroupMember -Array $script:fakeArray + + [object]::ReferenceEquals($result, $fixture) | Should -BeTrue + @($result.PSObject.Properties.Name) | Should -Be @('name', 'context', 'marker', 'group') + @($result.PSObject.Properties.Name) | Should -Not -Contain 'GroupName' + $result.context.name | Should -Be 'array-a' + $result.marker | Should -Be 'preserve-me' + } + + It 'does not add GroupName when group is absent' { + $fixture = [PSCustomObject]@{ + name = 'member-1' + context = [PSCustomObject]@{ name = 'array-a' } + marker = 'preserve-me' + } + $global:PfbSelectorLiftFixture = $fixture + + Mock -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest { + return $global:PfbSelectorLiftFixture + } + + $result = Get-PfbLocalGroupMember -Array $script:fakeArray + + [object]::ReferenceEquals($result, $fixture) | Should -BeTrue + @($result.PSObject.Properties.Name) | Should -Be @('name', 'context', 'marker') + @($result.PSObject.Properties.Name) | Should -Not -Contain 'GroupName' + $result.context.name | Should -Be 'array-a' + $result.marker | Should -Be 'preserve-me' + } + + It 'does not overwrite an existing GroupName' { + $fixture = [PSCustomObject]@{ + name = 'member-1' + context = [PSCustomObject]@{ name = 'array-a' } + marker = 'preserve-me' + group = [PSCustomObject]@{ name = 'nested-group' } + GroupName = 'existing-group' + } + $global:PfbSelectorLiftFixture = $fixture + + Mock -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest { + return $global:PfbSelectorLiftFixture + } + + $result = Get-PfbLocalGroupMember -Array $script:fakeArray + + [object]::ReferenceEquals($result, $fixture) | Should -BeTrue + $result.GroupName | Should -Be 'existing-group' + $result.group.name | Should -Be 'nested-group' + @($result.PSObject.Properties.Name) | Should -Be @('name', 'context', 'marker', 'group', 'GroupName') + $result.context.name | Should -Be 'array-a' + $result.marker | Should -Be 'preserve-me' + } +} + +# The Add-Member lift fixes the SELF-chain (a rule item carries the lifted PolicyName, so +# by-property-name binding wins at pass 2 and the guard never sees it). It cannot fix the +# CROSS-endpoint chain -- Get-PfbNfsExportPolicy emits `name`, not `PolicyName`, so that +# object falls through to by-value coercion and the whole thing goes on the wire +# stringified, HTTP 200, unfiltered collection. The guard closes that residual. +Describe 'Coercion guard on selector parameters (#90)' { + BeforeEach { + Mock -ModuleName PureStorageFlashBladePowerShell Assert-PfbConnection { } + Mock -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest { } + } + + It 'rejects an object matching none of Get-PfbNfsExportRule''s parameters, before any request' { + { [PSCustomObject]@{ name = 'nfs-policy-1'; enabled = $true } | + Get-PfbNfsExportRule -Array $script:fakeArray -ErrorAction Stop } | + Should -Throw -ExpectedMessage '*stringified object*' + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 0 -Exactly + } + + It 'names -PolicyName and the producer to pipe from in the Get-PfbNfsExportRule message' { + { [PSCustomObject]@{ name = 'nfs-policy-1' } | + Get-PfbNfsExportRule -Array $script:fakeArray -ErrorAction Stop } | + Should -Throw -ExpectedMessage '*-PolicyName*' + { [PSCustomObject]@{ name = 'nfs-policy-1' } | + Get-PfbNfsExportRule -Array $script:fakeArray -ErrorAction Stop } | + Should -Throw -ExpectedMessage '*Get-PfbNfsExportPolicy*' + } + + It 'still accepts a bare piped string on Get-PfbNfsExportRule -PolicyName' { + { 'nfs-policy-1' | Get-PfbNfsExportRule -Array $script:fakeArray } | Should -Not -Throw + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $QueryParams['policy_names'] -eq 'nfs-policy-1' + } + } + + # This is the case the guard must NOT break, and the whole point of the lift: an item + # carrying the lifted top-level PolicyName binds at pass 2, so the value the guard sees + # is a clean scalar and it stays silent. + It 'does not fire when the piped object carries the lifted PolicyName' { + { [PSCustomObject]@{ name = 'rule-1'; PolicyName = 'nfs-policy-1'; policy = [PSCustomObject]@{ name = 'nfs-policy-1' } } | + Get-PfbNfsExportRule -Array $script:fakeArray -ErrorAction Stop } | Should -Not -Throw + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $QueryParams['policy_names'] -eq 'nfs-policy-1' + } + } + + It 'rejects an object matching none of Get-PfbLocalGroupMember''s parameters' { + { [PSCustomObject]@{ unrelated = 'x'; other = 1 } | + Get-PfbLocalGroupMember -Array $script:fakeArray -ErrorAction Stop } | + Should -Throw -ExpectedMessage '*stringified object*' + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 0 -Exactly + } + + # Q4(b) in the task-7 diagnosis: `group` is object-valued on the members item and + # `Group` is an alias of -GroupName, so this is the pass-4 shape that would coerce even + # with ValueFromPipeline removed. The guard catches it either way. + It 'rejects an object whose object-valued group matches only the Group alias' { + { [PSCustomObject]@{ group = [PSCustomObject]@{ id = 'g-1'; name = 'group-1' } } | + Get-PfbLocalGroupMember -Array $script:fakeArray -ErrorAction Stop } | + Should -Throw -ExpectedMessage '*stringified object*' + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 0 -Exactly + } + + It 'does not fire when the piped object carries the lifted GroupName' { + { [PSCustomObject]@{ name = 'member-1'; GroupName = 'group-1'; group = [PSCustomObject]@{ name = 'group-1' } } | + Get-PfbLocalGroupMember -Array $script:fakeArray -ErrorAction Stop } | Should -Not -Throw + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $QueryParams['group_names'] -eq 'group-1' + } + } + + It 'still accepts a bare piped string on Get-PfbLocalGroupMember -GroupName' { + { 'group-1' | Get-PfbLocalGroupMember -Array $script:fakeArray } | Should -Not -Throw + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $QueryParams['group_names'] -eq 'group-1' + } + } + + It 'rejects an object coerced into -RoleName on Get-PfbObjectStoreTrustPolicy' { + { [PSCustomObject]@{ name = 'role-1'; unrelated = 'x' } | + Get-PfbObjectStoreTrustPolicy -Array $script:fakeArray -ErrorAction Stop } | + Should -Throw -ExpectedMessage '*stringified object*' + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 0 -Exactly + } +} + +Describe 'ObjectStore access policy role selector lift convergence' { + BeforeEach { + Mock -ModuleName PureStorageFlashBladePowerShell Assert-PfbConnection { } + } + + It 'preserves the original association while lifting policy.name to PolicyName' { + $fixture = [PSCustomObject]@{ + name = 'association-1' + context = [PSCustomObject]@{ name = 'array-a' } + marker = 'preserve-me' + policy = [PSCustomObject]@{ name = 'policy-1' } + member = [PSCustomObject]@{ name = 'member-1' } + } + $requests = [System.Collections.Generic.List[object]]::new() + $global:PfbSelectorLiftFixture = $fixture + $global:PfbSelectorLiftRequests = $requests + + Mock -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest { + $global:PfbSelectorLiftRequests.Add([PSCustomObject]@{ + Method = $Method + Endpoint = $Endpoint + QueryParams = $QueryParams + }) + return $global:PfbSelectorLiftFixture + } + + $result = Get-PfbObjectStoreAccessPolicyRole -Array $script:fakeArray + + [object]::ReferenceEquals($result, $fixture) | Should -BeTrue + $result.PolicyName | Should -Be 'policy-1' + $result.MemberName | Should -Be 'member-1' + $result.policy.name | Should -Be 'policy-1' + $result.member.name | Should -Be 'member-1' + $result.context.name | Should -Be 'array-a' + $result.marker | Should -Be 'preserve-me' + @($result.PSObject.Properties.Name) | Should -Be @('name', 'context', 'marker', 'policy', 'member', 'PolicyName', 'MemberName') + $requests.Count | Should -Be 1 + $requests[0].Method | Should -Be 'GET' + $requests[0].Endpoint | Should -Be 'object-store-access-policies/object-store-roles' + @($requests[0].QueryParams.Keys) | Should -HaveCount 0 + } + + It 'does not add PolicyName when policy.name is null' { + $fixture = [PSCustomObject]@{ + name = 'association-1' + context = [PSCustomObject]@{ name = 'array-a' } + marker = 'preserve-me' + policy = [PSCustomObject]@{ name = $null } + member = [PSCustomObject]@{ name = 'member-1' } + } + $global:PfbSelectorLiftFixture = $fixture + + Mock -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest { + return $global:PfbSelectorLiftFixture + } + + $result = Get-PfbObjectStoreAccessPolicyRole -Array $script:fakeArray + + [object]::ReferenceEquals($result, $fixture) | Should -BeTrue + @($result.PSObject.Properties.Name) | Should -Be @('name', 'context', 'marker', 'policy', 'member', 'MemberName') + @($result.PSObject.Properties.Name) | Should -Not -Contain 'PolicyName' + $result.context.name | Should -Be 'array-a' + $result.marker | Should -Be 'preserve-me' + } + + It 'does not add PolicyName when policy is absent' { + $fixture = [PSCustomObject]@{ + name = 'association-1' + context = [PSCustomObject]@{ name = 'array-a' } + marker = 'preserve-me' + member = [PSCustomObject]@{ name = 'member-1' } + } + $global:PfbSelectorLiftFixture = $fixture + + Mock -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest { + return $global:PfbSelectorLiftFixture + } + + $result = Get-PfbObjectStoreAccessPolicyRole -Array $script:fakeArray + + [object]::ReferenceEquals($result, $fixture) | Should -BeTrue + @($result.PSObject.Properties.Name) | Should -Be @('name', 'context', 'marker', 'member', 'MemberName') + @($result.PSObject.Properties.Name) | Should -Not -Contain 'PolicyName' + $result.context.name | Should -Be 'array-a' + $result.marker | Should -Be 'preserve-me' + } + + It 'does not overwrite an existing PolicyName' { + $fixture = [PSCustomObject]@{ + name = 'association-1' + context = [PSCustomObject]@{ name = 'array-a' } + marker = 'preserve-me' + policy = [PSCustomObject]@{ name = 'nested-policy' } + member = [PSCustomObject]@{ name = 'member-1' } + PolicyName = 'existing-policy' + } + $global:PfbSelectorLiftFixture = $fixture + + Mock -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest { + return $global:PfbSelectorLiftFixture + } + + $result = Get-PfbObjectStoreAccessPolicyRole -Array $script:fakeArray + + [object]::ReferenceEquals($result, $fixture) | Should -BeTrue + $result.PolicyName | Should -Be 'existing-policy' + $result.policy.name | Should -Be 'nested-policy' + $result.MemberName | Should -Be 'member-1' + @($result.PSObject.Properties.Name) | Should -Be @('name', 'context', 'marker', 'policy', 'member', 'PolicyName', 'MemberName') + $result.context.name | Should -Be 'array-a' + $result.marker | Should -Be 'preserve-me' + } +} diff --git a/Tests/PfbSpecializedSelectorKeys.Tests.ps1 b/Tests/PfbSpecializedSelectorKeys.Tests.ps1 new file mode 100644 index 00000000..09c97bc5 --- /dev/null +++ b/Tests/PfbSpecializedSelectorKeys.Tests.ps1 @@ -0,0 +1,193 @@ +#Requires -Modules @{ ModuleName = 'Pester'; ModuleVersion = '5.0' } + +BeforeAll { + $moduleRoot = Split-Path -Parent $PSScriptRoot + $manifest = Join-Path $moduleRoot 'PureStorageFlashBladePowerShell.psd1' + Import-Module $manifest -Force + + $script:fakeArray = [PSCustomObject]@{ + Endpoint = 'fb.example.test' + ApiVersion = '2.0' + AuthToken = 'x' + } + +} + +Describe 'Specialized selector query keys (#90)' { + Context 'parameter metadata' { + It 'removes -Name/-Id and exposes -CertificateName and -CertificateGroupId without legacy aliases' { + $command = Get-Command -Name 'Get-PfbCertificateGroupCertificate' + + $command.Parameters.Keys | Should -Not -Contain 'Name' + $command.Parameters.Keys | Should -Not -Contain 'Id' + $command.Parameters.Keys | Should -Contain 'CertificateName' + $command.Parameters.Keys | Should -Contain 'CertificateGroupId' + $command.Parameters['CertificateName'].Aliases | Should -Not -Contain 'Name' + $command.Parameters['CertificateGroupId'].Aliases | Should -Not -Contain 'Id' + } + + It 'removes -Name and exposes -RealmName without a Name alias' { + $command = Get-Command -Name 'Get-PfbRealmDefaults' + + $command.Parameters.Keys | Should -Not -Contain 'Name' + $command.Parameters.Keys | Should -Contain 'RealmName' + $command.Parameters['RealmName'].Aliases | Should -Not -Contain 'Name' + } + + It 'removes -Name and exposes -LocalPortName without a Name alias' { + $command = Get-Command -Name 'Get-PfbNetworkInterfaceNeighbor' + + $command.Parameters.Keys | Should -Not -Contain 'Name' + $command.Parameters.Keys | Should -Contain 'LocalPortName' + $command.Parameters['LocalPortName'].Aliases | Should -Not -Contain 'Name' + } + } + + # The rename fixed the wire KEY but left bare ValueFromPipeline in place, so a piped + # object matching none of these cmdlets' parameters by property name still fell + # through to by-value coercion and put the whole object on the correct key. The guard + # turns that into a loud module-level failure before any request is built. + Context 'coercion guard on the renamed selectors' { + BeforeEach { + Mock -ModuleName PureStorageFlashBladePowerShell Assert-PfbConnection { } + Mock -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest { } + } + + It 'rejects a stringified object coerced into -LocalPortName' { + { [PSCustomObject]@{ unrelated = 'x'; other = 1 } | + Get-PfbNetworkInterfaceNeighbor -Array $script:fakeArray -ErrorAction Stop } | + Should -Throw -ExpectedMessage '*stringified object*' + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 0 -Exactly + } + + It 'names -LocalPortName and Get-PfbNetworkInterface in the guard message' { + { [PSCustomObject]@{ unrelated = 'x' } | + Get-PfbNetworkInterfaceNeighbor -Array $script:fakeArray -ErrorAction Stop } | + Should -Throw -ExpectedMessage '*-LocalPortName*' + { [PSCustomObject]@{ unrelated = 'x' } | + Get-PfbNetworkInterfaceNeighbor -Array $script:fakeArray -ErrorAction Stop } | + Should -Throw -ExpectedMessage '*Get-PfbNetworkInterface*' + } + + It 'still accepts a bare piped string on -LocalPortName' { + { 'CH1.FM1.ETH1' | Get-PfbNetworkInterfaceNeighbor -Array $script:fakeArray } | Should -Not -Throw + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $QueryParams['local_port_names'] -eq 'CH1.FM1.ETH1' + } + } + + It 'rejects a stringified object coerced into -CertificateName' { + { [PSCustomObject]@{ unrelated = 'x' } | + Get-PfbCertificateGroupCertificate -Array $script:fakeArray -ErrorAction Stop } | + Should -Throw -ExpectedMessage '*stringified object*' + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 0 -Exactly + } + + It 'rejects a stringified object coerced into -RealmName' { + { [PSCustomObject]@{ unrelated = 'x' } | + Get-PfbRealmDefaults -Array $script:fakeArray -ErrorAction Stop } | + Should -Throw -ExpectedMessage '*stringified object*' + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 0 -Exactly + } + } + + Context 'query wire keys' { + BeforeEach { + Mock -ModuleName PureStorageFlashBladePowerShell Assert-PfbConnection { } + Mock -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest { } + } + + It 'emits certificate_names=management as the only query key' { + Get-PfbCertificateGroupCertificate -CertificateName 'management' -Array $script:fakeArray + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $Method -eq 'GET' -and + $Endpoint -eq 'certificate-groups/certificates' -and + $QueryParams.Count -eq 1 -and + $QueryParams['certificate_names'] -eq 'management' -and + -not $QueryParams.ContainsKey('names') -and + -not $QueryParams.ContainsKey('ids') + } + } + + It 'joins multiple certificate names into one certificate_names value' { + Get-PfbCertificateGroupCertificate -CertificateName 'management', 'ad-cert' -Array $script:fakeArray + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $QueryParams.Count -eq 1 -and + $QueryParams['certificate_names'] -eq 'management,ad-cert' + } + } + + It 'emits certificate_group_ids as the only query key' { + Get-PfbCertificateGroupCertificate -CertificateGroupId '10314f42-020d-7080-8013-000ddd11003d' -Array $script:fakeArray + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $Method -eq 'GET' -and + $Endpoint -eq 'certificate-groups/certificates' -and + $QueryParams.Count -eq 1 -and + $QueryParams['certificate_group_ids'] -eq '10314f42-020d-7080-8013-000ddd11003d' -and + -not $QueryParams.ContainsKey('ids') -and + -not $QueryParams.ContainsKey('names') + } + } + + It 'emits realm_names=pslivetest-realm-a as the only query key' { + Get-PfbRealmDefaults -RealmName 'pslivetest-realm-a' -Array $script:fakeArray + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $Method -eq 'GET' -and + $Endpoint -eq 'realms/defaults' -and + $QueryParams.Count -eq 1 -and + $QueryParams['realm_names'] -eq 'pslivetest-realm-a' -and + -not $QueryParams.ContainsKey('names') -and + -not $QueryParams.ContainsKey('ids') + } + } + + It 'emits local_port_names=ch0.eth0 as the only query key' { + Get-PfbNetworkInterfaceNeighbor -LocalPortName 'ch0.eth0' -Array $script:fakeArray + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $Method -eq 'GET' -and + $Endpoint -eq 'network-interfaces/neighbors' -and + $QueryParams.Count -eq 1 -and + $QueryParams['local_port_names'] -eq 'ch0.eth0' -and + -not $QueryParams.ContainsKey('names') -and + -not $QueryParams.ContainsKey('ids') + } + } + + It 'still emits the declared common keys alongside the specialized selector' { + Get-PfbRealmDefaults -RealmName 'pslivetest-realm-a' -Filter "name='x'" -Sort 'name' -Limit 5 -Array $script:fakeArray + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $QueryParams.Count -eq 4 -and + $QueryParams['realm_names'] -eq 'pslivetest-realm-a' -and + $QueryParams['filter'] -eq "name='x'" -and + $QueryParams['sort'] -eq 'name' -and + $QueryParams['limit'] -eq 5 + } + } + + It 'emits no selector key when no selector is supplied' { + Get-PfbNetworkInterfaceNeighbor -Array $script:fakeArray + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $QueryParams.Count -eq 0 + } + } + + It 'accepts pipeline input on the specialized certificate selector' { + 'management', 'ad-cert' | Get-PfbCertificateGroupCertificate -Array $script:fakeArray + + Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { + $QueryParams['certificate_names'] -eq 'management,ad-cert' + } + } + } +} diff --git a/Tests/Update-PfbBucketAuditFilter.Tests.ps1 b/Tests/Update-PfbBucketAuditFilter.Tests.ps1 index 72abd49f..a2594601 100644 --- a/Tests/Update-PfbBucketAuditFilter.Tests.ps1 +++ b/Tests/Update-PfbBucketAuditFilter.Tests.ps1 @@ -17,7 +17,7 @@ Describe 'Update-PfbBucketAuditFilter - typed body parameters (#31)' { Context 'typed parameters build the body' { It 'sends actions and s3_prefixes as body fields' { - Update-PfbBucketAuditFilter -MemberName 'mybucket' -Actions 's3:GetObject', 's3:PutObject' ` + Update-PfbBucketAuditFilter -BucketName 'mybucket' -Actions 's3:GetObject', 's3:PutObject' ` -S3Prefixes 'prefix1', 'prefix2' -Confirm:$false -Array $fakeArray Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { @@ -28,7 +28,7 @@ Describe 'Update-PfbBucketAuditFilter - typed body parameters (#31)' { } It 'sends an EMPTY array for -Actions @() so a list can be cleared (constraint 2, array field)' { - Update-PfbBucketAuditFilter -MemberName 'mybucket' -Actions @() -Confirm:$false -Array $fakeArray + Update-PfbBucketAuditFilter -BucketName 'mybucket' -Actions @() -Confirm:$false -Array $fakeArray Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { $Body.ContainsKey('actions') -and @($Body['actions']).Count -eq 0 @@ -36,7 +36,7 @@ Describe 'Update-PfbBucketAuditFilter - typed body parameters (#31)' { } It 'sends an EMPTY array for -S3Prefixes @() so a list can be cleared (constraint 2, array field)' { - Update-PfbBucketAuditFilter -MemberName 'mybucket' -S3Prefixes @() -Confirm:$false -Array $fakeArray + Update-PfbBucketAuditFilter -BucketName 'mybucket' -S3Prefixes @() -Confirm:$false -Array $fakeArray Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { $Body.ContainsKey('s3_prefixes') -and @($Body['s3_prefixes']).Count -eq 0 @@ -44,7 +44,7 @@ Describe 'Update-PfbBucketAuditFilter - typed body parameters (#31)' { } It 'omits every body key when no typed body parameter is supplied' { - Update-PfbBucketAuditFilter -MemberName 'mybucket' -Confirm:$false -Array $fakeArray + Update-PfbBucketAuditFilter -BucketName 'mybucket' -Confirm:$false -Array $fakeArray Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { $Body.Count -eq 0 @@ -53,16 +53,16 @@ Describe 'Update-PfbBucketAuditFilter - typed body parameters (#31)' { } Context 'query parameters (wire-correctness fix: bucket_names/bucket_ids, not member_names/member_ids)' { - It 'sends -MemberName as bucket_names, NOT member_names' { - Update-PfbBucketAuditFilter -MemberName 'mybucket' -Confirm:$false -Array $fakeArray + It 'sends -BucketName as bucket_names, NOT member_names' { + Update-PfbBucketAuditFilter -BucketName 'mybucket' -Confirm:$false -Array $fakeArray Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { $QueryParams['bucket_names'] -eq 'mybucket' -and -not $QueryParams.ContainsKey('member_names') } } - It 'sends -MemberId as bucket_ids, NOT member_ids' { - Update-PfbBucketAuditFilter -MemberId 'bucket-1' -FilterNames 'mybucket' -Confirm:$false -Array $fakeArray + It 'sends -BucketId as bucket_ids, NOT member_ids' { + Update-PfbBucketAuditFilter -BucketId 'bucket-1' -Name 'mybucket' -Confirm:$false -Array $fakeArray Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { $QueryParams['bucket_ids'] -eq 'bucket-1' -and -not $QueryParams.ContainsKey('member_ids') -and @@ -70,23 +70,23 @@ Describe 'Update-PfbBucketAuditFilter - typed body parameters (#31)' { } } - It 'throws when -MemberId is used alone: the required "names" query parameter cannot be inferred from an ID (review finding)' { - { Update-PfbBucketAuditFilter -MemberId 'bucket-1' -Confirm:$false -Array $fakeArray -ErrorAction Stop } | - Should -Throw -ExpectedMessage '*-FilterNames is required*' + It 'throws when -BucketId is used alone: the required "names" query parameter cannot be inferred from an ID (review finding)' { + { Update-PfbBucketAuditFilter -BucketId 'bucket-1' -Confirm:$false -Array $fakeArray -ErrorAction Stop } | + Should -Throw -ExpectedMessage '*-Name is required*' Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 0 -Exactly } - It 'defaults the required "names" query parameter from -MemberName when -FilterNames is not supplied' { - Update-PfbBucketAuditFilter -MemberName 'mybucket' -Confirm:$false -Array $fakeArray + It 'defaults the required "names" query parameter from -BucketName when -Name is not supplied' { + Update-PfbBucketAuditFilter -BucketName 'mybucket' -Confirm:$false -Array $fakeArray Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { $QueryParams['names'] -eq 'mybucket' } } - It 'sends -FilterNames as names when explicitly supplied, overriding the -MemberName default' { - Update-PfbBucketAuditFilter -MemberId 'bucket-1' -FilterNames 'custom-filter-name' ` + It 'sends -Name as names when explicitly supplied, overriding the -BucketName default' { + Update-PfbBucketAuditFilter -BucketId 'bucket-1' -Name 'custom-filter-name' ` -Confirm:$false -Array $fakeArray Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { @@ -97,7 +97,7 @@ Describe 'Update-PfbBucketAuditFilter - typed body parameters (#31)' { Context '-Attributes remains supported and is mutually exclusive' { It 'still sends a raw -Attributes body' { - Update-PfbBucketAuditFilter -MemberName 'mybucket' -Attributes @{ actions = @('s3:GetObject') } ` + Update-PfbBucketAuditFilter -BucketName 'mybucket' -Attributes @{ actions = @('s3:GetObject') } ` -Confirm:$false -Array $fakeArray Should -Invoke -ModuleName PureStorageFlashBladePowerShell Invoke-PfbApiRequest -Times 1 -Exactly -ParameterFilter { @@ -106,13 +106,13 @@ Describe 'Update-PfbBucketAuditFilter - typed body parameters (#31)' { } It 'rejects -Attributes combined with a typed parameter at bind time' { - { Update-PfbBucketAuditFilter -MemberName 'mybucket' -Actions @('s3:GetObject') ` + { Update-PfbBucketAuditFilter -BucketName 'mybucket' -Actions @('s3:GetObject') ` -Attributes @{ actions = @('s3:PutObject') } -Confirm:$false -Array $fakeArray -ErrorAction Stop } | Should -Throw -ExpectedMessage '*Parameter set cannot be resolved*' } It 'rejects an unresolved selector plus typed parameter plus -Attributes' { - { Update-PfbBucketAuditFilter -MemberId 'bucket-1' -S3Prefixes @('p1') ` + { Update-PfbBucketAuditFilter -BucketId 'bucket-1' -S3Prefixes @('p1') ` -Attributes @{ s3_prefixes = @('p2') } -Confirm:$false -Array $fakeArray -ErrorAction Stop } | Should -Throw -ExpectedMessage '*Parameter set cannot be resolved*' } diff --git a/tools/Build-PfbPipelineSelectorMap.ps1 b/tools/Build-PfbPipelineSelectorMap.ps1 index 3f619e8e..1441cb62 100644 --- a/tools/Build-PfbPipelineSelectorMap.ps1 +++ b/tools/Build-PfbPipelineSelectorMap.ps1 @@ -4,10 +4,10 @@ Builds Reports/PfbPipelineSelectorMap.json and .md -- "can a piped object bind this cmdlet's selector, or does it stringify into the filter?" (issue #90). .DESCRIPTION - PowerShell resolves pipeline binding in three passes: ByValue, ByPropertyName, then ByValue - WITH COERCION. If a piped object has no property matching any pipeline-bound parameter, pass 3 - fires and ToString()s the whole object into a [string[]] selector, producing a query filter - like + PowerShell resolves pipeline binding in FOUR passes: ByValue, ByPropertyName, ByValue WITH + COERCION, then ByPropertyName WITH COERCION. If a piped object has no property matching any + pipeline-bound parameter, pass 3 fires and ToString()s the whole object into a [string[]] + selector, producing a query filter like remote_names=@{id=10314f42-aaaa; status=connected; remote=} @@ -15,6 +15,12 @@ unfiltered. On a Remove-* cmdlet that is a wider blast radius than the caller intended. See #64 for the specific instance and the guard that fixed it. + Do NOT assume that removing ValueFromPipeline makes coercion impossible. Pass 4 is + ByPropertyName WITH COERCION, so a ValueFromPipelineByPropertyName-only parameter whose ALIAS + matches an object-valued property still binds that object stringified. Measured on pwsh 7.6.4. + Detection is unaffected -- a pass-4 coercion still contains '@{' and still reads Coerced -- but + the remedy differs: such a parameter needs a guard, not an attribute removal. + Every verdict here is OBSERVED, never inferred. The generator imports the shipped module, shadows Invoke-PfbApiRequest inside module scope with a capture shim, pipes a schema-derived probe object into the real cmdlet, and records what reached the wire. Nothing is a finding @@ -215,9 +221,9 @@ $meaning = @{ 'Bound' = 'no -- the selector bound as intended' 'Coerced' = '**yes** -- a stringified object reached the wire' 'WrongScalar' = '**yes** -- a value from the wrong property reached the wire' - 'Unbindable' = 'no -- PowerShell declined to bind; pass 3 is ByValue so this cannot coerce' + 'Unbindable' = 'no -- PowerShell declined to bind this probe object at all. Note that pass 4 is ByPropertyName WITH coercion, so a ByPropertyName-only parameter whose alias matches an object-valued property CAN still coerce; this outcome is not a structural immunity' 'NoSelector' = 'no -- reported observation' - 'Guarded' = 'no -- the #64 guard fired' + 'Guarded' = 'no -- a #64/#90 coercion guard fired' 'CmdletError' = 'no -- the cmdlet threw before any request was built' 'BindError' = 'triage -- the harness never invoked, the only unmeasured outcome' } diff --git a/tools/lib/PfbPipelineSelectorTools.ps1 b/tools/lib/PfbPipelineSelectorTools.ps1 index 4c973d07..0233bd08 100644 --- a/tools/lib/PfbPipelineSelectorTools.ps1 +++ b/tools/lib/PfbPipelineSelectorTools.ps1 @@ -224,6 +224,13 @@ function Get-PfbHelpExampleChain { currently matches the pattern, and widening the producer set is the conservative direction of error for an audit -- a spurious producer costs a probe, a missed one costs a finding. Read the OUTPUTS as "written literally in the file", not "documented". + + HAZARD: "every line" includes ordinary maintainer comments, not just help blocks. A + prose note that names two cmdlets either side of a pipe character -- even one saying + the chain does NOT work -- registers as a producer edge and changes the generated + selector map, which reddens the Rail B regeneration gate. Issue #90 hit this exactly: + documentation-only edits under `Public/` flipped eight `FromExample` fields. When + writing such a note, avoid putting a pipe between two cmdlet names. .OUTPUTS [PSCustomObject]@{ File; Producer; Consumer; Line } #> @@ -514,7 +521,7 @@ function Get-PfbSelectorOutcome { .DESCRIPTION Findings are Coerced and WrongScalar ONLY. - Guarded is #64's fix working, not a defect. NoSelector is a reported observation, not a + Guarded is a #64/#90 coercion guard working, not a defect. NoSelector is a reported observation, not a finding: if any selector is pipeline-bound then a non-matching object falls through to pass 3 and coerces, so NoSelector can only occur where nothing is pipeline-bound -- in which case the cmdlet never claimed to accept a chain and PowerShell simply runs it once @@ -547,11 +554,14 @@ function Get-PfbSelectorOutcome { } else { # Only a harness refusal is genuinely unmeasured. The other kinds are verdicts. - # Unbindable means PowerShell declined to bind the object at all, which for a - # ValueFromPipelineByPropertyName-only parameter is structural: pass 3 coerces - # ByValue, so that parameter can never receive a stringified object. CmdletError - # means the cmdlet's own logic stopped it before any request was built. Collapsing - # all three into BindError reported 8 already-measured pairs as blind spots. + # Unbindable means PowerShell declined to bind THIS probe object at all. It is a + # per-probe observation, NOT a structural immunity: binding has FOUR passes -- + # ByValue, ByPropertyName, ByValue WITH COERCION, ByPropertyName WITH COERCION -- + # so a ValueFromPipelineByPropertyName-only parameter whose ALIAS matches an + # object-valued property still binds that object stringified at pass 4 and reads + # Coerced. Removing ValueFromPipeline therefore does not guarantee Unbindable. + # CmdletError means the cmdlet's own logic stopped it before any request was built. + # Collapsing all three into BindError reported 8 already-measured pairs as blind spots. $kind = if ($ProbeResult.PSObject.Properties['ErrorKind']) { $ProbeResult.ErrorKind } else { $null } switch ($kind) { 'InputObjectNotBound' { 'Unbindable' } diff --git a/tools/lib/PfbSelectorProbeHarness.ps1 b/tools/lib/PfbSelectorProbeHarness.ps1 index fe271b7b..5588e42e 100644 --- a/tools/lib/PfbSelectorProbeHarness.ps1 +++ b/tools/lib/PfbSelectorProbeHarness.ps1 @@ -299,9 +299,10 @@ function Invoke-PfbSelectorProbe { and would classify differently on a CI host: - 'HarnessRefusal' -- never invoked; the only genuinely unmeasured outcome. - - 'InputObjectNotBound' -- PowerShell refused to bind the object to anything. A real - verdict: pass 3 is ByValue, so a ValueFromPipelineByPropertyName- - only parameter cannot coerce. + - 'InputObjectNotBound' -- PowerShell refused to bind THIS probe object at all. It is a + per-probe observation, NOT a structural immunity: binding has FOUR + passes, including ByPropertyName WITH coercion, so an alias matching + an object-valued property can coerce even when ValueFromPipeline is absent. - 'ParameterBindingError' -- some other binding failure, e.g. an ambiguous set. - 'CmdletError' -- the cmdlet itself threw before reaching the shim. .OUTPUTS