QuickSDN.psm1


function Initialize-QuickSDN {

    $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-QuickSdnHealthFault
{
    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 Get-QuickSdnHealthFaults 
{
    Get-HealthFault | select FaultId, FaultingObjectUniqueId, Reason
}



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

function Get-QuickSdnLogs {
    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-QuickSdnClusterHealthWmi
{
    $cl = gwmi -Namespace "root/MSCLUSTER" -Class "MSCluster_ClusterHealthService"
    $clusterName = (get-cluster).Name
    $fWmi = $cl.GetFault($clusterName,"Microsoft.Health.EntityType.Cluster")
    $fWmi.Faults
}

function Get-QuickSdnHealthSummary {
    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-QuickSdnLogs
Export-ModuleMember -Function Get-QuickSdnHealthSummary
Export-ModuleMember -Function Get-QuickSdnHealthFaults
Export-ModuleMember -Function Get-QuickSdnClusterHealthWmi
Export-ModuleMember -Function Clear-QuickSdnHealthFault