Private/Test-CandidateTag.ps1

function Test-CandidateTag {
    <#
    .SYNOPSIS
    Decide whether a VM's tags select it for processing

    .DESCRIPTION
    Pure filter used by Get-InPlaceUpgradeCandidate. A VM qualifies when it carries an
    UpgradeTarget tag and every filter that was given (target, state, ring) matches
    case-insensitively. An empty filter means "any". Without a state filter a VM in any state
    qualifies; the orchestrator always passes one, so that a VM is only ever picked up in the state
    a mode expects.
    #>

    [CmdletBinding()]
    [OutputType([bool])]
    param(
        [Parameter(Mandatory)]$VM,
        [Parameter()][string]$Target,
        [Parameter()][string]$State,
        [Parameter()][string]$Ring
    )

    $tagTarget = Get-VMTagValue -VM $VM -Name $script:Tag.Target
    if (-not $tagTarget) { return $false }
    if ($Target -and $tagTarget -ine $Target.Trim()) { return $false }

    if ($State) {
        $tagState = Get-VMTagValue -VM $VM -Name $script:Tag.State
        if (-not $tagState -or $tagState -ine $State.Trim()) { return $false }
    }

    if ($Ring) {
        $tagRing = Get-VMTagValue -VM $VM -Name $script:Tag.Ring
        if (-not $tagRing -or $tagRing -ine $Ring.Trim()) { return $false }
    }

    return $true
}