Src/Private/Get-AbrOntapClusterReplicationDiagram.ps1

function Get-AbrOntapClusterReplicationDiagram {
    <#
    .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 Replication 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

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

            $HAObject = @()

            $NodeAdditionalInfo = @()

            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]@{
                        "HAState" = $ClusterHa.State
                    }
                }

                $NodeAdditionalInfo += [PSCustomObject][ordered]@{
                    "Management" = switch ([string]::IsNullOrEmpty($NodeMgmtAddress)) {
                        $true { "Unknown" }
                        $false { $NodeMgmtAddress }
                        Default { "Unknown" }
                    }
                    "Intercluster" = switch ([string]::IsNullOrEmpty($NodeInterClusterAddress)) {
                        $true { "Unknown" }
                        $false { $NodeInterClusterAddress }
                        Default { "Unknown" }
                    }
                }
            }

            if ($ClusterInfo) {
                $ClusterNodeObj = Add-DiaHTMLNodeTable -ImagesObj $Images -inputObject $NodeSum.Node -Align "Center" -iconType "Ontap_Node" -columnSize $NodeSumColumnSize -IconDebug $IconDebug -MultiIcon -AditionalInfo $NodeAdditionalInfo -Subgraph -SubgraphIconType "Ontap_Node_Icon" -SubgraphLabel $ClusterInfo.ClusterName -SubgraphLabelPos "top" -SubgraphTableStyle "dashed,rounded" -TableBorderColor "#71797E" -TableBorder "0" -SubgraphLabelFontsize 22 -fontSize 18
            }

            if ($ClusterNodeObj) {
                $ClusterMgmtObj = Add-DiaHTMLSubGraph -ImagesObj $Images -TableArray $ClusterNodeObj -Align 'Right' -IconDebug $IconDebug -Label "Management: $($ClusterInfo.NcController)" -LabelPos 'down' -TableStyle "dashed,rounded" -TableBorderColor $Edgecolor -TableBorder "1" -columnSize 1 -fontSize 12

                if ($ClusterMgmtObj) {
                    Node SourceCluster @{Label = $ClusterMgmtObj; shape = 'plain'; fillColor = 'transparent'; fontsize = 14 }
                } else {
                    Write-PScriboMessage -IsWarning "Unable to create Cluster Node. No Cluster Management Object found."
                }
            }
        } catch {
            Write-PScriboMessage -IsWarning $_.Exception.Message
        }

        try {
            $VserverPeers = Get-NcVserverPeer -Controller $Array
            $VserversPeerInfo = @()
            if ($VserverPeers) {
                $Index = $VserverPeersColors.Count - 1
                foreach ($VserverPeer in $VserverPeers) {
                    $VserversPeerInfo += [PSCustomObject][ordered]@{
                        "SourceCluster" = $ClusterInfo.ClusterName
                        "SourceVserver" = $VserverPeer.Vserver
                        "RemoteCluster" = $VserverPeer.PeerCluster
                        "RemoteVserver" = $VserverPeer.PeerVserver
                        "Color" = Get-RandomPastelColorHex
                        "SourceAdditionalInfo" = [PSCustomObject][ordered]@{
                            "Peer Vserver" = $VserverPeer.PeerVserver
                            "Peer Cluster" = $VserverPeer.PeerCluster
                            "Applications" = $VserverPeer.Applications -join ", "
                        }
                        "DestinationAdditionalInfo" = [PSCustomObject][ordered]@{
                            "Peer Vserver" = $VserverPeer.Vserver
                            "Peer Cluster" = $ClusterInfo.ClusterName
                            "Applications" = $VserverPeer.Applications -join ", "
                        }
                    }
                }
            }

            $VserverPeerObj = @()

            $VserverPeerObj = foreach ($VserverPeer in $VserversPeerInfo) {
                Add-DiaHTMLNodeTable -ImagesObj $Images -inputObject $VserverPeer.SourceVserver -Align "Center" -iconType "Ontap_SVM" -columnSize 1 -IconDebug $IconDebug -MultiIcon -AditionalInfo  $VserverPeer.SourceAdditionalInfo -SubgraphTableStyle "dashed,rounded" -TableBorderColor "#71797E" -TableBorder 1 -fontSize 18 -CellBackgroundColor $VserverPeer.Color
            }

            if ($VserverPeerObj.Count -eq 1) {
                $VserverPeerObjColumnSize = 1
            } elseif ($ColumnSize) {
                $VserverPeerObjColumnSize = $ColumnSize
            } else {
                $VserverPeerObjColumnSize = $VserverPeerObj.Count
            }

            $VserverPeerSubGraphObj = Add-DiaHTMLSubGraph -ImagesObj $Images -TableArray $VserverPeerObj -Align 'Center' -IconDebug $IconDebug -Label "Source Storage VMs" -LabelPos 'top' -TableStyle "dashed,rounded" -TableBorderColor $Edgecolor -TableBorder "1" -columnSize $VserverPeerObjColumnSize -fontSize 18 -IconType "Ontap_SVM_Icon"

            if ($VserverPeerSubGraphObj) {
                Node SourceVservers @{Label = $VserverPeerSubGraphObj; shape = 'plain'; fillColor = 'transparent'; fontsize = 14 }
                Edge -From SourceVservers -To SourceCluster @{minlen = 2; color = '#71797E'; style = 'filled'; arrowhead = 'box'; arrowtail = 'box' }
                Rank SourceVservers, SourceCluster
            }
        } catch {
            Write-PScriboMessage -IsWarning $_.Exception.Message
        }

        try {
            $ClusterReplicaInfos = Get-NcClusterPeer -Controller $Array
            $Ranks = @()
            foreach ($ClusterReplicaInfo in $ClusterReplicaInfos) {
                $NodeReplicaSum = $ClusterReplicaInfo.RemoteClusterNodes

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

                $Num = 0

                $NodeAdditionalInfo = @()

                foreach ($Node in $NodeReplicaSum) {

                    $NodeName = $Node
                    $NodeMgmtAddress = $ClusterReplicaInfo.NcController

                    $NodeAdditionalInfo += [PSCustomObject][ordered]@{
                        "Intercluster" = switch ([string]::IsNullOrEmpty($ClusterReplicaInfo.ActiveAddresses)) {
                            $true { "Unknown" }
                            $false {
                                & {
                                    if ($ClusterReplicaInfo.ActiveAddresses.Count -gt 1) {
                                        ($ClusterReplicaInfo.ActiveAddresses | Sort-Object)[$Num]
                                    } else {
                                        $ClusterReplicaInfo.ActiveAddresses
                                    }
                                }
                            }
                            Default { "Unknown" }
                        }
                    }
                    $Num++
                }

                if ($ClusterReplicaInfo) {
                    try {
                        $ClusterReplicaNodeObj = Add-DiaHTMLNodeTable -ImagesObj $Images -inputObject $NodeReplicaSum -Align "Center" -iconType "Ontap_Node" -columnSize $NodeSumColumnSize -IconDebug $IconDebug -MultiIcon -AditionalInfo $NodeAdditionalInfo -Subgraph -SubgraphIconType "Ontap_Node_Icon" -SubgraphLabel $ClusterReplicaInfo.ClusterName -SubgraphLabelPos "top" -SubgraphTableStyle "dashed,rounded" -TableBorderColor "#71797E" -TableBorder "1" -SubgraphLabelFontsize 22 -fontSize 18
                    } catch {
                        Write-PScriboMessage -IsWarning $_.Exception.Message
                    }
                }

                if ($ClusterReplicaNodeObj) {
                    if ($ClusterReplicaNodeObj) {
                        $RemoteClusterName = Remove-SpecialChar -String $ClusterReplicaInfo.ClusterName -SpecialChars '\-_'
                        Node $RemoteClusterName @{Label = $ClusterReplicaNodeObj; shape = 'plain'; fillColor = 'transparent'; fontsize = 14 }
                        $Ranks += $RemoteClusterName
                    } else {
                        Write-PScriboMessage -IsWarning "Unable to create Cluster Replication Node. No Cluster Management Object found."
                    }
                }

                if ($ClusterReplicaNodeObj) {
                    Edge -From SourceCluster:e -To $RemoteClusterName @{minlen = 3; color = '#71797E'; style = 'filled'; arrowhead = 'box'; arrowtail = 'box' }
                }

                try {
                    $PeerVserverPeerObj = @()

                    $PeerVserverPeerObj = foreach ($VserversPeer in ($VserversPeerInfo | Where-Object { $_.RemoteCluster -eq $ClusterReplicaInfo.ClusterName })) {
                        Add-DiaHTMLNodeTable -ImagesObj $Images -inputObject $VserversPeer.RemoteVserver -Align "Center" -iconType "Ontap_SVM" -columnSize 1 -IconDebug $IconDebug -MultiIcon -AditionalInfo $VserversPeer.DestinationAdditionalInfo -SubgraphTableStyle "dashed,rounded" -TableBorderColor "#71797E" -TableBorder "1" -SubgraphLabelFontsize 22 -fontSize 18 -CellBackgroundColor $VserversPeer.Color
                    }

                    if ($PeerVserverPeerObj.Count -eq 1) {
                        $PeerVserverPeerObjColumnSize = 1
                    } elseif ($ColumnSize) {
                        $PeerVserverPeerObjColumnSize = $ColumnSize
                    } else {
                        $PeerVserverPeerObjColumnSize = $PeerVserverPeerObj.Count
                    }

                    $PeerVserverPeerSubGraphObj = Add-DiaHTMLSubGraph -ImagesObj $Images -TableArray $PeerVserverPeerObj -Align 'Center' -IconDebug $IconDebug -Label "Peer Storage VMs" -LabelPos 'top' -TableStyle "dashed,rounded" -TableBorderColor $Edgecolor -TableBorder "1" -columnSize $PeerVserverPeerObjColumnSize -fontSize 18 -IconType "Ontap_SVM_Icon"

                    if ($PeerVserverPeerSubGraphObj) {
                        Node "$($RemoteClusterName)PeerVservers" @{Label = $PeerVserverPeerSubGraphObj; shape = 'plain'; fillColor = 'transparent'; fontsize = 14 }
                        Edge -From $RemoteClusterName -To "$($RemoteClusterName)PeerVservers" @{minlen = 2; color = '#71797E'; style = 'filled'; arrowhead = 'box'; arrowtail = 'box' }
                    }
                } catch {
                    Write-PScriboMessage -IsWarning $_.Exception.Message
                }
            }
        } catch {
            Write-PScriboMessage -IsWarning $_.Exception.Message
        }
    }

    end {}

}