Examples/Invoke-ProxmoxMonitor-AMP.ps1

#requires -Version 5.1
[CmdletBinding()]
param(
    [Parameter(Mandatory)][string]$Server,
    [Parameter(Mandatory)][string]$TokenID,
    [Parameter(Mandatory)][string]$TokenSecret,
    [string]$ClusterName = 'default',
    [string]$ExpectedRunningVMIDs = '',
    [string]$ExpectedBackupVMIDs = '',
    [bool]$Standalone = $false,
    [ValidateSet('Ignore', 'Validate', 'Pin')][string]$TlsMode = 'Ignore',
    [string]$CertificateSha256 = ''
)

$ErrorActionPreference = 'Stop'

function ConvertTo-VMIDArray {
    param([string]$Value)
    if ([string]::IsNullOrWhiteSpace($Value)) { return @() }
    return @($Value -split ',' | ForEach-Object {
        $number = 0
        if (-not [int]::TryParse($_.Trim(), [ref]$number) -or $number -lt 1) {
            throw [IO.InvalidDataException]::new("Invalid VMID '$($_.Trim())'.")
        }
        $number
    } | Select-Object -Unique)
}

try {
    Import-Module ProxmoxMonitor -Force -ErrorAction Stop
    $parameters = @{
        Server = $Server
        TokenID = $TokenID
        TokenSecret = $TokenSecret
        ClusterName = $ClusterName
        ExpectedRunningVMIDs = @(ConvertTo-VMIDArray $ExpectedRunningVMIDs)
        ExpectedBackupVMIDs = @(ConvertTo-VMIDArray $ExpectedBackupVMIDs)
        TlsMode = $TlsMode
        CertificateSha256 = $CertificateSha256
        OutputFormat = 'Json'
        Compress = $true
    }
    if ($Standalone) { $parameters.Standalone = $true }
    Invoke-ProxmoxMonitor @parameters
}
catch {
    $message = $_.Exception.Message
    $status = if ($_.Exception -is [IO.InvalidDataException]) { 'UNKNOWN' } else { 'CRITICAL' }
    $checks = @('Cluster', 'Node', 'Storage', 'Guest', 'Backup', 'Replication', 'HA', 'Ceph', 'Zfs' | ForEach-Object {
        [pscustomobject]@{
            Check = $_
            Status = $status
            Findings = @([pscustomobject]@{ Status = $status; Message = "AMP failed: $message" })
            Metrics = @()
        }
    })
    [pscustomobject][ordered]@{
        SchemaVersion = 1
        GeneratedAtUtc = [DateTime]::UtcNow.ToString('o')
        ModuleVersion = $null
        ClusterName = $ClusterName
        Server = $Server
        CollectedAtUtc = $null
        OverallStatus = $status
        Checks = $checks
        Inventory = [pscustomobject][ordered]@{
            Nodes = @(); Storage = @(); Disks = @(); Guests = @(); GuestNetworkRates = @()
            BackupTasks = @(); ReplicationJobs = @(); HAStatus = @()
            CephStatus = @(); CephMetadata = @(); ZfsPools = @()
        }
    } | ConvertTo-Json -Depth 10 -Compress
}