QuickSDN.psm1


$Global:uri = "https://" + (Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Services\NcHostAgent\Parameters\').PeerCertificateCName

 $signature=@'
[DllImport("hcihealthutils.dll", CharSet = CharSet.Unicode, SetLastError = false)]
public static extern int HciModifyFault(string entityType, string entityKey, string entityDescription, string entityLocation,
    string entityUniqueKey, uint action, string faultType, uint urgency, string title, string description, string actions, uint flag);

[DllImport("hcihealthutils.dll", CharSet = CharSet.Unicode, SetLastError = false)]
public static extern int HciModifyRelationship(string entityType, string entityKey, string entityDescription, string entityLocation,
    string entityUniqueKey, uint action, string parentEntityType, string parenetEntityKey, string parentEntityDescription,
    string parentEntityLocation, string parentEntityUniqueKey, string groupKey, uint urgency, uint relationshipType, uint flag);
'@


if (-not ("Microsoft.NetworkHud.FunctionalTests.Module.HciHealthUtils" -as [type]))
{
    Add-Type -MemberDefinition $signature -Name "HciHealthUtils" -Namespace "Microsoft.NetworkHud.FunctionalTests.Module" | Out-Null
}

function Clear-SDNHealthFault
{
    param([string] $faultUniqueID)
    
    if([string]::IsNullOrEmpty($faultUniqueID))
    {
        throw "Invalid faultID"
    }
    #[Microsoft.NetworkHud.FunctionalTests.Module.HciHealthUtils]::HciModifyFault("EntityType", $faultUniqueID, "E Desc", "E Loc", $faultUniqueID, 1, 1, 2, "TF Title", "TF Desc", "TFA", 0)
    $fault = Get-HealthFault | ? { $_.FaultId -eq $faultUniqueID }
    $subsystemId = (get-storagesubsystem Cluster*).UniqueId

    [Microsoft.NetworkHud.FunctionalTests.Module.HciHealthUtils]::HciModifyFault( `
        $fault.FaultingObjectType, `
        $fault.FaultingObjectUniqueId, `
        "", `
        $fault.FaultingObjectUniqueId, `
        $fault.FaultingObjectUniqueId, `
        1, `
        $fault.FaultType, `
        2, `
        "", `
        "", `
        "", `
        0)
}

function Get-SDNHealthFault
{
    param([string] $FaultingObjectUniqueId) 

    return Get-HealthFault | ? { $_.FaultingObjectUniqueId -eq $FaultingObjectUniqueId }
}

function Show-SDNHealthFaults 
{
    Get-HealthFault | select FaultId, FaultingObjectUniqueId, Reason
}



function Test-SdnUri
{
    if([string]::IsNullOrEmpty($uri)) {
        throw "Bad Nc uri"
    }
}

function Get-SDNLogs {
    param(
        [string] $NCName = $null,
        [int] $Tail = 100

    )

    if([string]::IsNullOrEmpty($NCName)) {
        $hh = (get-clusternode).Name
        $vm = Get-VM -Name *NC* -ComputerName $hh | select -First 1
        $NCName = $vm.Name
        Write-Host "Found NC VM Name : $NCName"
    } 

    Invoke-Command -ComputerName $NCName -ScriptBlock {
        cd C:\Windows\tracing\SDNDiagnostics\Logs
        $latest = dir *.etl | Sort-Object -Descending | select -First 1

        $latestText = $latest.Name.Split(".")[0]+".txt" 
        del $latestText -Force -ErrorAction SilentlyContinue
        netsh trace convert $latest.Name
        Get-Content $latestText -Tail $using:Tail
    }
}

function Show-ConfigState 
{
    param($objs)
    
    foreach($obj in $objs)
    {
        $configState = $obj.Properties.ConfigurationState
        if($configState -eq $null -or  $configState.DetailedInfo -eq $null -or $configState.DetailedInfo.Count -eq 0) 
        {
            continue
        }

        foreach($di in $configState.DetailedInfo) {
            Write-Host "$($obj.ResourceRef) Source:$($di.Source) ($($di.Code)): $($di.Message.SubString(0, [System.Math]::min($di.Message.Length, 20)))" 
        }
    }
}

function Get-ClusterHealthWMI
{
    $cl = gwmi -Namespace "root/MSCLUSTER" -Class "MSCluster_ClusterHealthService"
    $clusterName = (get-cluster).Name
    $fWmi = $cl.GetFault($clusterName,"Microsoft.Health.EntityType.Cluster")
    $fWmi.Faults
}

function Get-SDNServerHealthSummary {
    param(
        [switch] $Poll
    )

    Test-SdnUri
    $uri = $Global:uri

    do {
        # Collecting all the objects
        $restObjs = @()
        $restObjs += (Get-NetworkControllerServer -ConnectionUri $uri)
        $restObjs += (Get-NetworkControllerLogicalNetwork -ConnectionUri $uri)
        $restObjs += (Get-NetworkControllerVirtualNetwork -ConnectionUri $uri)
        $restObjs += (Get-NetworkControllerLoadBalancerMux -ConnectionUri $uri)
        $restObjs += (Get-NetworkControllerGateway -ConnectionUri $uri)
        $restObjs += (Get-NetworkControllerVirtualGateway -ConnectionUri $uri)
        $restObjs += (Get-NetworkControllerGatewayPool -ConnectionUri $uri)
        $restObjs += (Get-NetworkControllerVirtualServer -ConnectionUri $uri)
        $restObjs += (Get-NetworkControllerLoadBalancer -ConnectionUri $uri)
        $restObjs += (Get-NetworkControllerNetworkInterface -ConnectionUri $uri)

        Show-ConfigState -objs $restObjs

        if (-not $Poll) {
            return
        }

        # Write the polling message below the data
        Write-Host "`n(polling in 10 seconds.. press ctrl+c to break)" -NoNewline
        Start-Sleep -Seconds 10
    } until ($false)
}



Export-ModuleMember -Function Get-SDNLogs
Export-ModuleMember -Function Get-SDNServerHealthSummary
Export-ModuleMember -Function Clear-SDNHealthFault
Export-ModuleMember -Function Show-SDNHealthFaults 
Export-ModuleMember -Function Get-SDNHealthFault
Export-ModuleMember -Function Get-ClusterHealthWMI