framework/Resources/Scripts/get_cluster_health.ps1

Param(
    [Parameter(Mandatory)]
    [string]$EnvironmentName,
    [Parameter(Mandatory)]
    [string]$CacheName,
    [string]$Server,
    [switch]$NoLogo
)

function GetUploadedVmNames {
    param(
        [Parameter(Mandatory)][string]$ResourceGroup
    )
    return Get-AzVM -ResourceGroupName $ResourceGroup  -ErrorAction Stop | Where-Object { $_.Tags.ContainsKey("Caches") } | Select-Object -ExpandProperty Name 
}

function InvokeCommandOnServerWindows {
    param(
        [string]$ResourceGroupName,
        [string[]]$VmNames
    )

    $script = "Get-ClusterHealth -CacheName $CacheName"
    if (![string]::IsNullOrWhiteSpace($Server)) {
        $script += " -Server `"$Server`""
    }
    if ($NoLogo) {
        $script += " -NoLogo"
    }
    $jobs = @()
    foreach ($vm in $VmNames) {
        $jobs += Start-Job -ScriptBlock {
            param($ResourceGroupName, $vm, $script)
            $result = Invoke-AzVMRunCommand -ResourceGroupName $ResourceGroupName -VMName $vm -CommandId 'RunPowerShellScript' -ScriptString $script

            foreach ($val in $result.Value) {
                Write-Host $val.Message
            }
        } -ArgumentList $ResourceGroupName, $vm, $script

        # if server param is provided, exute on only one server
        if (![string]::IsNullOrWhiteSpace($Server)) {
            break
        }
    }

    $jobs | Wait-Job | Out-Null
    $jobs | Receive-Job
}

function InvokeCommandOnServerLinux {
    param(
        [string]$ResourceGroupName,
        [string[]]$VmNames
    )

    $script = "/opt/ncache/bin/tools/get-clusterhealth -cacheName $CacheName"
    if (![string]::IsNullOrWhiteSpace($Server)) {
        $script += " -server `"$Server`""
    }
    if ($NoLogo) {
        $script += " -nologo"
    }
    $jobs = @()
    foreach ($vm in $VmNames) {
        $jobs += Start-Job -ScriptBlock {
            param($ResourceGroupName, $vm, $script)
            $result = Invoke-AzVMRunCommand -ResourceGroupName $ResourceGroupName -VMName $vm -CommandId 'RunShellScript' -ScriptString $script

            foreach ($val in $result.Value) {
                Write-Host $val.Message
            }
        } -ArgumentList $ResourceGroupName, $vm, $script

        # if server param is provided, exute on only one server
        if (![string]::IsNullOrWhiteSpace($Server)) {
            break
        }
    }

    $jobs | Wait-Job | Out-Null
    $jobs | Receive-Job
}

function InvokeCommandOnVms {
    param(
        [object]$Resource,
        [string]$ResourceGroupName,
        [string[]]$VmNames
    )

    $os = $Resource.Tags['OsType']
    if ($os -eq "Windows") {
        InvokeCommandOnServerWindows -ResourceGroupName $ResourceGroupName -VmNames $VmNames
    }
    else {
        InvokeCommandOnServerLinux -ResourceGroupName $ResourceGroupName -VmNames $VmNames
    }
}

function ExecuteCommands {
    $resource = Get-AzResourceGroup  -ErrorAction Stop | Where-Object { $_.Tags -and $_.Tags.Contains("EnvironmentName") -and $_.Tags["EnvironmentName"] -eq $EnvironmentName }
    if (-not $resource) {
        throw "No such environment exists"
    }

    $resourceGroupName = $resource.ResourceGroupName
    $vmNames = GetUploadedVmNames -ResourceGroup $resourceGroupName

    InvokeCommandOnVms -Resource $resource -ResourceGroupName $resourceGroupName -VmNames $vmNames
}

try {
    if (-not (Get-AzContext)) {
        Connect-AzAccount
        if (Get-AzContext) {
            ExecuteCommands
        }
    }
    else {
        ExecuteCommands
    }
}
catch {
    Write-Error $($_.Exception.Message)
}