Src/Private/Get-AbrOntapNodeAggrDiagram.ps1

function Get-AbrOntapStorageAggrDiagram {
    <#
    .SYNOPSIS
        Used by As Built Report to built NetApp ONTAP storage aggregate diagram
    .DESCRIPTION

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

    .LINK

    #>

    [CmdletBinding()]
    param (
    )

    begin {
        Write-PScriboMessage "Generating Storage Aggregates 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

            SubGraph Cluster -Attributes @{Label = $ClusterInfo.ClusterName; fontsize = 22; penwidth = 1.5; labelloc = 't'; style = "dashed,rounded"; color = "gray" } {
                try {

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

                    $HAObject = @()

                    $NodeAdditionalInfo = @()
                    $AggrInfo = @()

                    foreach ($Node in $NodeSum) {
                        $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.NodeSerialNumber
                                "Mgmt" = switch ([string]::IsNullOrEmpty($NodeMgmtAddress)) {
                                    $true { "Unknown" }
                                    $false { $NodeMgmtAddress }
                                    Default { "Unknown" }
                                }
                            }
                        }

                        $NodeAggr = Get-NcAggr | Where-Object { $_.Nodes -eq $Node.Node }
                        foreach ($Aggr in $NodeAggr) {
                            $AggrInfo += [PSCustomObject][ordered]@{
                                "NodeName" = $Node.Node
                                "AggregateName" = $Aggr.Name
                                "AdditionalInfo" = [PSCustomObject][ordered]@{
                                    "Total Size" = $Aggr.TotalSize | ConvertTo-FormattedNumber -Type Datasize -ErrorAction SilentlyContinue
                                    "Used Space" = $Aggr.Used | ConvertTo-FormattedNumber -Type Datasize -ErrorAction SilentlyContinue
                                    "Assigned Disk" = $Aggr.Disks
                                    "Raid Type" = switch ([string]::IsNullOrEmpty($Aggr.RaidType)) {
                                        $true { "Unknown" }
                                        $false {
                                            & {
                                                switch ($Aggr.RaidType.Split(", ")[0]) {
                                                    "raid4" { "RAID 4" }
                                                    "raid_dp" { "RAID DP" }
                                                    "raid0" { "RAID 0" }
                                                    "raid1" { "RAID 1" }
                                                    "raid10" { "RAID 10" }
                                                    Default { "Unknown" }
                                                }
                                            }
                                        }
                                        Default { "Unknown" }
                                    }
                                    "Raid Size" = $Aggr.RaidSize
                                    "State" = $Aggr.State
                                }
                            }
                        }
                    }

                    $ClusterNodesObj = @()

                    foreach ($Node in $NodeAdditionalInfo) {
                        $ClusterNodeObj = @()
                        $ClusterNodeObj += Add-DiaHTMLNodeTable -ImagesObj $Images -inputObject $Node.NodeName -Align "Center" -iconType "Ontap_Node" -columnSize 1 -IconDebug $IconDebug -MultiIcon -AditionalInfo $Node.AdditionalInfo -Subgraph -SubgraphLabel $Node.NodeName -SubgraphLabelPos "top" -SubgraphTableStyle "dashed,rounded" -TableBorderColor "#71797E" -TableBorder 0 -SubgraphLabelFontsize 22 -fontSize 18

                        if ($ClusterNodeObj) {
                            if ($AggrInfo.Count -eq 1) {
                                $AggrInfoColumnSize = 1
                            } elseif ($ColumnSize) {
                                $AggrInfoColumnSize = $ColumnSize
                            } else {
                                $AggrInfoColumnSize = $AggrInfo.Count
                            }
                            $ClusterNodeObj += Add-DiaHTMLNodeTable -ImagesObj $Images -inputObject ($AggrInfo | Where-Object { $_.NodeName -eq $Node.Nodename }).AggregateName -Align "Center" -iconType "Ontap_Aggregate" -columnSize $AggrInfoColumnSize -IconDebug $IconDebug -MultiIcon -AditionalInfo ($AggrInfo | Where-Object { $_.NodeName -eq $Node.Nodename }).AdditionalInfo -Subgraph -SubgraphLabel "Aggregates" -SubgraphLabelPos "top" -SubgraphTableStyle "dashed,rounded" -TableBorderColor "#71797E" -TableBorder 1 -SubgraphLabelFontsize 22 -fontSize 18
                        }

                        if ($ClusterNodeObj) {
                            $ClusterNodeSubgraphObj = Add-DiaHTMLSubGraph -ImagesObj $Images -TableArray $ClusterNodeObj -Align 'Center' -IconDebug $IconDebug -Label " " -LabelPos 'top' -TableStyle "dashed,rounded" -TableBorderColor $Edgecolor -TableBorder 1 -columnSize 1 -fontSize 12
                        }

                        $ClusterNodesObj += $ClusterNodeSubgraphObj
                    }

                    if ($ClusterNodesObj) {
                        if ($ClusterNodesObj.Count -eq 1) {
                            $ClusterNodesObjColumnSize = 1
                        } elseif ($ColumnSize) {
                            $ClusterNodesObjColumnSize = $ColumnSize
                        } else {
                            $ClusterNodesObjColumnSize = $ClusterNodesObj.Count
                        }
                        $ClusterMgmtObj = Add-DiaHTMLSubGraph -ImagesObj $Images -TableArray $ClusterNodesObj -Align 'Right' -IconDebug $IconDebug -Label "Management: $($ClusterInfo.NcController)" -LabelPos 'down' -TableStyle "dashed,rounded" -TableBorderColor $Edgecolor -TableBorder 0 -columnSize $ClusterNodesObjColumnSize -fontSize 18

                        if ($ClusterMgmtObj) {
                            Node Cluster @{Label = $ClusterMgmtObj; shape = 'plain'; fillColor = 'transparent'; fontsize = 14 }

                        } else {
                            Write-PScriboMessage -IsWarning "Unable to create ClusterNodesObj. No Cluster Management Object found."
                        }
                    }
                } catch {
                    Write-PScriboMessage -IsWarning $_.Exception.Message
                }
            }
        } catch {
            Write-PScriboMessage -IsWarning $_.Exception.Message
        }
    }

    end {}

}