Src/Private/Get-AbrOntapClusterDiagram.ps1

function Get-AbrOntapClusterDiagram {
    <#
    .SYNOPSIS
        Used by As Built Report to built NetApp ONTAP cluster diagram
    .DESCRIPTION

    .NOTES
        Version: 0.6.8
        Author: Jonathan Colon
        Twitter: @jcolonfzenpr
        Github: rebelinux
    .EXAMPLE

    .LINK

    #>

    [CmdletBinding()]
    param (
    )

    begin {
        Write-PScriboMessage "Generating Cluster Diagram for NetApp ONTAP."
        # Used for DiagramDebug
        if ($Options.EnableDiagramDebug) {
            $EdgeDebug = @{style = 'filled'; color = 'red' }
            $SubGraphDebug = @{style = 'dashed'; color = 'red' }
            $NodeDebug = @{color = 'black'; style = 'red'; shape = 'plain' }
            $NodeDebugEdge = @{color = 'black'; style = 'red'; shape = 'plain' }
            $IconDebug = $true
        } else {
            $EdgeDebug = @{style = 'invis'; color = 'red' }
            $SubGraphDebug = @{style = 'invis'; color = 'gray' }
            $NodeDebug = @{color = 'transparent'; style = 'transparent'; shape = 'point' }
            $NodeDebugEdge = @{color = 'transparent'; style = 'transparent'; shape = 'none' }
            $IconDebug = $false
        }

        if ($Options.DiagramTheme -eq 'Black') {
            $Edgecolor = 'White'
            $Fontcolor = 'White'
        } elseif ($Options.DiagramTheme -eq 'Neon') {
            $Edgecolor = 'gold2'
            $Fontcolor = 'gold2'
        } else {
            $Edgecolor = '#71797E'
            $Fontcolor = '#565656'
        }
    }

    process {
        try {
            $ClusterInfo = Get-NcCluster -Controller $Array
            $NodeSum = Get-NcNode -Controller $Array

            # $NodeSum = @(
            # [pscustomobject]@{
            # Node = "PHARMAX-HQ-01"
            # NodeModel = "A400"
            # NodeSystemId = "1234567890"
            # NodeSerialNumber = "SN1234567890"
            # },
            # [pscustomobject]@{
            # Node = "PHARMAX-HQ-02"
            # NodeModel = "A400"
            # NodeSystemId = "0987654321"
            # NodeSerialNumber = "SN0987654321"
            # },
            # [pscustomobject]@{
            # Node = "PHARMAX-HQ-03"
            # NodeModel = "FAS2720"
            # NodeSystemId = "0987654322"
            # NodeSerialNumber = "SN0987654322"
            # },
            # [pscustomobject]@{
            # Node = "PHARMAX-HQ-04"
            # NodeModel = "FAS2720"
            # NodeSystemId = "0987654323"
            # NodeSerialNumber = "SN0987654323"
            # }
            # )
            # $ClusterHaObj = @(
            # [pscustomobject]@{
            # Name = "PHARMAX-HQ-01"
            # Partner = "PHARMAX-HQ-02"
            # State = "connected"
            # },
            # [pscustomobject]@{
            # Name = "PHARMAX-HQ-02"
            # Partner = "PHARMAX-HQ-01"
            # State = "connected"
            # },
            # [pscustomobject]@{
            # Name = "PHARMAX-HQ-03"
            # Partner = "PHARMAX-HQ-04"
            # State = "connected"
            # },
            # [pscustomobject]@{
            # Name = "PHARMAX-HQ-04"
            # Partner = "PHARMAX-HQ-03"
            # State = "connected"
            # }
            # )

            SubGraph Cluster -Attributes @{Label = $ClusterInfo.ClusterName; fontsize = 22; penwidth = 1.5; labelloc = 't'; style = "dashed,rounded"; color = "gray" } {
                SubGraph ClusterInfo -Attributes @{Label = "Management: $($ClusterInfo.NcController)"; fontsize = 12; penwidth = 1.5; labelloc = 'b'; labeljust = 'r'; style = "dashed,rounded"; color = "transparent" } {
                    try {

                        if ($NodeSum.Count -eq 1) {
                            $NodeSumColumnSize = 1
                        } elseif ($ColumnSize) {
                            $NodeSumColumnSize = $ColumnSize
                        } else {
                            $NodeSumColumnSize = $NodeSum.Count
                        }

                        $HAObject = @()

                        $NodeAdditionalInfo = @()

                        foreach ($Node in $NodeSum) {
                            # $ClusterHa = $ClusterHaObj | Where-Object { $_.Name -eq $Node.Node }
                            $ClusterHa = Get-NcClusterHa -Node $Node.Node -Controller $Array

                            $NodeMgmtAddress = Get-NcNetInterface -Controller $Array | Where-Object { $_.Role -eq 'node_mgmt' -and $_.HomeNode -eq $Node.Node } | Select-Object -ExpandProperty Address
                            $NodeInterClusterAddress = Get-NcNetInterface -Controller $Array | Where-Object { $_.Role -eq 'intercluster' -and $_.HomeNode -eq $Node.Node } | Select-Object -ExpandProperty Address

                            if ($ClusterHa.Name -notin $HAObject.Partner) {
                                $HAObject += [PSCustomObject][ordered]@{
                                    "Name" = $ClusterHa.Name
                                    "Partner" = $ClusterHa.Partner
                                    "HAState" = $ClusterHa.State
                                }
                            }

                            $NodeAdditionalInfo += [PSCustomObject][ordered]@{
                                'NodeName' = $Node.Node
                                'AdditionalInfo' = [PSCustomObject][ordered]@{
                                    "System Id" = $Node.NodeSystemId
                                    "Serial" = $Node.NodeSerialNumber
                                    "Model" = $Node.NodeModel
                                    "Mgmt" = switch ([string]::IsNullOrEmpty($NodeMgmtAddress)) {
                                        $true { "Unknown" }
                                        $false { $NodeMgmtAddress }
                                        Default { "Unknown" }
                                    }
                                }
                            }
                        }

                        if ($HAObject.Name -and $HAObject.Partner) {
                            foreach ($HA in $HAObject) {
                                $HAClusterName = Remove-SpecialChar -String "HA$($HA.Name)$($HA.Partner)" -SpecialChars '\-_'
                                SubGraph $HAClusterName -Attributes @{Label = "HA Pair"; fontsize = 14; penwidth = 1.5; labelloc = 't'; style = "dashed,rounded"; color = "gray"; labeljust = 'c' } {

                                    $HAName = Remove-SpecialChar -String $HA.Name -SpecialChars '\-_'
                                    $HAPartner = Remove-SpecialChar -String $HA.Partner -SpecialChars '\-_'

                                    Node $HAName @{Label = Add-DiaNodeIcon -Name $HA.Name -AditionalInfo ($NodeAdditionalInfo | Where-Object { $_.NodeName -eq $HA.Name }).AdditionalInfo -ImagesObj $Images -IconType "Ontap_Node" -Align "Center" -IconDebug $IconDebug -FontSize 18; shape = 'plain'; fillColor = 'transparent'; fontsize = 14 }

                                    Node $HAPartner @{Label = Add-DiaNodeIcon -Name $HA.Partner -AditionalInfo ($NodeAdditionalInfo | Where-Object { $_.NodeName -eq $HA.Partner }).AdditionalInfo -ImagesObj $Images -IconType "Ontap_Node" -Align "Center" -IconDebug $IconDebug -FontSize 18; shape = 'plain'; fillColor = 'transparent'; fontsize = 14 }

                                    Rank $HAName, $HAPartner

                                    Edge -From $HAName -To $HAPartner -Attributes @{minlen = 2; label = "HA: $($HA.HAState)"; color = $Edgecolor; fontcolor = $Fontcolor; fontsize = 16; style = 'solid'; penwidth = 2; arrowhead = 'box'; arrowtail = 'box' }
                                }
                            }
                        } else {
                            foreach ($HA in $HAObject) {
                                $HAClusterName = Remove-SpecialChar -String "HA$($HA.Name)" -SpecialChars '\-_'
                                SubGraph $HAClusterName -Attributes @{Label = "Single Node Cluster"; fontsize = 12; penwidth = 1.5; labelloc = 't'; style = "dashed,rounded"; color = "gray"; labeljust = 'c' } {
                                    $HAName = Remove-SpecialChar -String $HA.Name -SpecialChars '\-_'
                                    Node $HAName @{Label = Add-DiaNodeIcon -Name $HA.Name -AditionalInfo ($NodeAdditionalInfo | Where-Object { $_.NodeName -eq $HA.Name }).AdditionalInfo -ImagesObj $Images -IconType "Ontap_Node" -Align "Center" -IconDebug $IconDebug -FontSize 18; shape = 'plain'; fillColor = 'transparent'; fontsize = 14 }
                                }
                            }
                        }
                    } catch {
                        Write-PScriboMessage -IsWarning $_.Exception.Message
                    }
                }
            }

        } catch {
            Write-PScriboMessage -IsWarning $_.Exception.Message
        }
    }

    end {}

}