Public/Get-FinOpsCommitmentDiscountEligibility.ps1

# Copyright (c) Microsoft Corporation.
# Licensed under the MIT License.

<#
    .SYNOPSIS
    Gets commitment discount eligibility for a meter.
 
    .PARAMETER MeterId
    Optional. The meter ID to look up. Accepts wildcards. Default = * (all).
 
    .PARAMETER SpendEligibility
    Optional. Filters to meters with the specified savings plan (spend commitment) eligibility. FOCUS classifies a savings plan as a spend commitment because you commit to an amount of money. Expected values: Eligible, Not Eligible. Default = * (all).
 
    .PARAMETER UsageEligibility
    Optional. Filters to meters with the specified reservation (usage commitment) eligibility. FOCUS classifies a reservation as a usage commitment because you commit to a quantity of usage. Expected values: Eligible, Not Eligible. Default = * (all).
 
    .DESCRIPTION
    The Get-FinOpsCommitmentDiscountEligibility command returns a pre-computed lookup of which meters are eligible for commitment-based discounts (reservations and savings plans), sourced from the Azure Retail Prices API.
 
    .EXAMPLE
    Get-FinOpsCommitmentDiscountEligibility -MeterId "00003b45-e996-5b04-b673-a2db710f9237"
 
    Returns commitment discount eligibility for the specified meter.
 
    .EXAMPLE
    Get-FinOpsCommitmentDiscountEligibility -UsageEligibility "Eligible"
 
    Returns all meters eligible for reservations.
 
    .LINK
    https://aka.ms/ftk/Get-FinOpsCommitmentDiscountEligibility
#>

function Get-FinOpsCommitmentDiscountEligibility()
{
    param(
        [Parameter(Position = 0)]
        [string]
        $MeterId = "*",

        [string]
        $SpendEligibility = "*",

        [string]
        $UsageEligibility = "*"
    )

    # An explicit $null argument is coerced to "" by the [string] parameter binding, so treat both
    # as "no filter" alongside "*" -- otherwise -like "" matches nothing and silently returns 0 rows.
    if ([string]::IsNullOrEmpty($SpendEligibility)) { $SpendEligibility = "*" }
    if ([string]::IsNullOrEmpty($UsageEligibility)) { $UsageEligibility = "*" }

    # MeterId is already unique per row in the source data, so no de-duplication is needed here.
    return Get-OpenDataCommitmentDiscountEligibility `
    | Where-Object {
        $_.MeterId -like $MeterId `
            -and $_.x_CommitmentDiscountSpendEligibility -like $SpendEligibility `
            -and $_.x_CommitmentDiscountUsageEligibility -like $UsageEligibility
    } `
    | ForEach-Object {
        [PSCustomObject]@{
            MeterId          = $_.MeterId
            SpendEligibility = $_.x_CommitmentDiscountSpendEligibility
            UsageEligibility = $_.x_CommitmentDiscountUsageEligibility
        }
    }
}