Src/Private/Get-DiagBackupToCloudConnectTenant.ps1

function Get-DiagBackupToCloudConnectTenant {
    <#
    .SYNOPSIS
        Function to build Backup Server to Cloud Connect tenant diagram.
    .DESCRIPTION
        Build a diagram of the configuration of Veeam VBR in PDF/PNG/SVG formats using Psgraph.
    .NOTES
        Version: 0.6.30
        Author: Jonathan Colon
        Twitter: @jcolonfzenpr
        Github: rebelinux
    .LINK
        https://github.com/rebelinux/Veeam.Diagrammer
    #>

    [CmdletBinding()]

    param
    (

    )

    begin {
    }

    process {

        if ($CCPerTenantInfo = Get-VbrBackupCCPerTenantInfo -TenantName $TenantName) {

            # Create Tenant Node

            try {
                $TenantInfo = Node -Name 'TenantInfo' -Attributes @{
                    Label = $CCPerTenantInfo.Label;
                    shape = 'plain';
                    fillColor = 'transparent';
                    fontsize = 14;
                    fontname = 'Segoe Ui'
                }
                if ($TenantInfo) {
                    $TenantInfo
                    Edge -From 'TenantInfo' -To 'TenantGateway' -Attributes @{
                        color = $Edgecolor;
                        style = 'dashed';
                        fontname = 'Segoe Ui';
                        fontsize = 14;
                        arrowtail = 'dot';
                        arrowhead = 'dot';
                        minlen = 5;
                    }
                }

            } catch {
                Write-Verbose 'Error: Unable to create TenantInfo Objects. Panic!'
                Write-Debug "Error Message: $($_.Exception.Message)"
                throw
            }

            # Create Tenant Gateway Server Node
            if (($CGServerInfo = $CCPerTenantInfo.CloudGatewayServers) -and $CCPerTenantInfo.CloudGatewaySelectionType -eq 'StandaloneGateway') {
                if ($CGServerInfo.Name.Count -eq 1) {
                    $CGServerNodeColumnSize = 1
                } elseif ($ColumnSize) {
                    $CGServerNodeColumnSize = $ColumnSize
                } else {
                    $CGServerNodeColumnSize = $CGServerInfo.Name.Count
                }
                try {
                    $CGServerNode = Add-DiaHTMLNodeTable -ImagesObj $Images -inputObject $CGServerInfo.Name -Align "Center" -iconType "VBR_Cloud_Connect_Gateway" -columnSize $CGServerNodeColumnSize -IconDebug $IconDebug -MultiIcon -AditionalInfo $CGServerInfo.AditionalInfo -Subgraph -SubgraphIconType "VBR_Service_Providers_Server" -SubgraphLabel "Gateway Servers" -SubgraphLabelPos "top" -SubgraphTableStyle "dashed,rounded" -TableBorderColor "#71797E" -TableBorder "1" -SubgraphLabelFontsize 22 -fontSize 18

                    if ($CGServerNode) {
                        Node 'TenantGateway' -Attributes @{
                            Label = $CGServerNode;
                            shape = 'plain';
                            fillColor = 'transparent';
                            fontsize = 14;
                            fontname = 'Segoe Ui'
                        }

                        Edge -From 'TenantGateway' -To 'TenantGatewayConnector' -Attributes @{
                            color = $Edgecolor;
                            style = 'dashed';
                            fontname = 'Segoe Ui';
                            fontsize = 14
                            arrowtail = 'dot';
                            arrowhead = 'none';
                        }
                    }
                } catch {
                    Write-Verbose "Error: Unable to create CloudGateway Server Objects. Disabling the section"
                    Write-Debug "Error Message: $($_.Exception.Message)"
                }
            }

            # Create Tenant Gateway Pool Node
            if (($CGPoolInfo = $CCPerTenantInfo.CloudGatewayPools) -and $CCPerTenantInfo.CloudGatewaySelectionType -eq 'GatewayPool') {
                try {
                    $CGPoolNode = foreach ($CGPool in $CGPoolInfo) {
                        if ($CGPoolInfo.CloudGateways) {
                            if ($CGPoolInfo.CloudGateways.count -le 5) {
                                $CGPoolInfocolumnSize = $CGPoolInfo.CloudGateways.count
                            } elseif ($ColumnSize) {
                                $CGPoolInfocolumnSize = $ColumnSize
                            } else {
                                $CGPoolInfocolumnSize = 5
                            }
                            Add-DiaHTMLTable -ImagesObj $Images -Rows $CGPool.CloudGateways.Name.split(".")[0] -Align 'Center' -ColumnSize $CGPoolInfocolumnSize -IconDebug $IconDebug -Subgraph -SubgraphIconType 'VBR_Cloud_Connect_Gateway' -SubgraphLabel $CGPool.Name -SubgraphLabelPos "top" -fontColor $Fontcolor -TableStyle 'dashed,rounded' -TableBorderColor $Edgecolor -TableBorder "1" -NoFontBold -FontSize 18
                        } else {
                            Add-DiaHTMLTable -ImagesObj $Images -Rows 'No Cloud Gateway Server' -Align 'Center' -ColumnSize 1 -IconDebug $IconDebug -Subgraph -SubgraphIconType 'VBR_Cloud_Connect_Gateway' -SubgraphLabel $CGPool.Name -SubgraphLabelPos "top" -fontColor $Fontcolor -TableStyle 'dashed,rounded' -TableBorderColor $Edgecolor -TableBorder "1" -NoFontBold -FontSize 18
                        }
                    }
                } catch {
                    Write-Verbose 'Error: Unable to create CGPoolInfo Objects. Disabling the section'
                    Write-Debug "Error Message: $($_.Exception.Message)"
                }
                try {
                    if ($CGPoolNode) {
                        if ($CGPoolNode.count -le 5) {
                            $CGPoolNodecolumnSize = $CGPoolNode.count
                        } elseif ($ColumnSize) {
                            $CGPoolNodecolumnSize = $ColumnSize
                        } else {
                            $CGPoolNodecolumnSize = 5
                        }
                        $CGPoolNodesSubGraph += Add-DiaHTMLSubGraph -ImagesObj $Images -TableArray $CGPoolNode -Align 'Center' -IconDebug $IconDebug -Label 'Gateway Pools' -LabelPos 'top' -fontColor $Fontcolor -TableStyle 'dashed,rounded' -TableBorderColor $Edgecolor -TableBorder '1' -columnSize $CGPoolNodecolumnSize -fontSize 22 -IconType 'VBR_Cloud_Connect_Gateway_Pools'

                        if ($CGPoolNodesSubGraph) {
                            Node 'TenantGateway' -Attributes @{
                                Label = $CGPoolNodesSubGraph;
                                shape = 'plain';
                                fillColor = 'transparent';
                                fontsize = 14;
                                fontname = 'Segoe Ui'
                            }

                            Edge -From 'TenantGateway' -To 'TenantGatewayConnector' -Attributes @{
                                color = $Edgecolor;
                                style = 'dashed';
                                fontname = 'Segoe Ui';
                                fontsize = 14
                                arrowtail = 'dot';
                                arrowhead = 'none';
                            }
                        }
                    }
                } catch {
                    Write-Verbose 'Error: Unable to create CGPoolInfo SubGraph Objects. Disabling the section'
                    Write-Debug "Error Message: $($_.Exception.Message)"
                }
            }

            # Create Tenant Backup Storage Node
            if ($CCBackupStorageObj = $CCPerTenantInfo.BackupResources) {
                $CloudRepoSubgraphNode = @()
                $CloudConnectTenantRRSubTenantArray = @()
                foreach ($CCBackupStorageInfo in $CCBackupStorageObj) {
                    $CloudConnectTenantBSArray = @()
                    $CloudConnectTenantBRArray = @()

                    $CloudRepoOBJNode = $CCBackupStorageInfo.Label

                    if ($CloudRepoOBJNode) {
                        $CloudConnectTenantBRArray += $CloudRepoOBJNode
                    }

                    if (($CCBackupStorageInfo.Repositories | Measure-Object).Count -le 5) {
                        $BackupRepositorycolumnSize = ($CCBackupStorageInfo.Repositories | Measure-Object).Count
                    } elseif ($ColumnSize) {
                        $BackupRepositorycolumnSize = $ColumnSize
                    } else {
                        $BackupRepositorycolumnSize = 5
                    }
                    try {
                        $CCBackupRepositoryNode = Add-DiaHTMLNodeTable -ImagesObj $Images -inputObject $CCBackupStorageInfo.Repositories.Name -Align "Center" -iconType $CCBackupStorageInfo.Repositories.IconType -columnSize $BackupRepositorycolumnSize -IconDebug $IconDebug -MultiIcon -AditionalInfo $CCBackupStorageInfo.Repositories.AditionalInfo -Subgraph -SubgraphIconType "VBR_Repository" -SubgraphLabel "Backup Repositories" -SubgraphLabelPos "top" -SubgraphTableStyle "dashed,rounded" -TableBorderColor "#71797E" -TableBorder "1" -SubgraphLabelFontsize 22 -fontSize 18

                        if ($CCBackupRepositoryNode) {
                            $CloudConnectTenantBSArray += $CCBackupRepositoryNode
                        }
                    } catch {
                        Write-Verbose 'Error: Unable to create CCBackupRepositoryNode Objects. Disabling the section'
                        Write-Debug "Error Message: $($_.Exception.Message)"
                    }
                    if ($CCBackupStorageInfo.WanAccelerationEnabled) {
                        if (($CCBackupStorageInfo.WanAccelerator | Measure-Object).Count -le 5) {
                            $CCBSWancolumnSize = ($CCBackupStorageInfo.WanAccelerator | Measure-Object).Count
                        } elseif ($ColumnSize) {
                            $CCBSWancolumnSize = $ColumnSize
                        } else {
                            $CCBSWancolumnSize = 5
                        }
                        try {
                            $CCCloudWanAcceleratorNode = Add-DiaHTMLNodeTable -ImagesObj $Images -inputObject $CCBackupStorageInfo.WanAccelerator.Name -Align "Center" -iconType $CCBackupStorageInfo.WanAccelerator.IconType -columnSize $CCBSWancolumnSize -IconDebug $IconDebug -MultiIcon -AditionalInfo $CCBackupStorageInfo.WanAccelerator.AditionalInfo -Subgraph -SubgraphIconType "VBR_Wan_Accel" -SubgraphLabel "Wan Accelerators" -SubgraphLabelPos "top" -SubgraphTableStyle "dashed,rounded" -TableBorderColor "#71797E" -TableBorder "1" -SubgraphLabelFontsize 22 -fontSize 18

                            if ($CCCloudWanAcceleratorNode) {
                                $CloudConnectTenantBSArray += $CCCloudWanAcceleratorNode
                            }
                        } catch {
                            Write-Verbose "Error: Unable to create CCCloudWanAcceleratorNode Objects. Disabling the section"
                            Write-Debug "Error Message: $($_.Exception.Message)"
                        }
                    }

                    try {
                        if ($CloudConnectTenantBSArray) {
                            if (($CloudConnectTenantBSArray | Measure-Object).Count -le 5) {
                                $CloudConnectTenantBSArraycolumnSize = ($CloudConnectTenantBSArray | Measure-Object).Count
                            } elseif ($ColumnSize) {
                                $CloudConnectTenantBSArraycolumnSize = $ColumnSize
                            } else {
                                $CloudConnectTenantBSArraycolumnSize = 5
                            }
                            $CloudConnectTenantBSSubGraph = Add-DiaHTMLSubGraph -ImagesObj $Images -TableArray $CloudConnectTenantBSArray -Align 'Center' -IconDebug $IconDebug -Label "Resources" -LabelPos "top" -fontColor $Fontcolor -TableStyle "dashed,rounded" -TableBorderColor $Edgecolor -TableBorder "1" -columnSize $CloudConnectTenantBSArraycolumnSize -fontSize 22

                            if ($CloudConnectTenantBSSubGraph) {
                                $CloudConnectTenantBRArray += $CloudConnectTenantBSSubGraph
                            }

                        }
                    } catch {
                        Write-Verbose "Error: Unable to create CloudConnectTenantBSSubGraph SubGraph Objects. Disabling the section"
                        Write-Debug "Error Message: $($_.Exception.Message)"
                    }

                    try {
                        $CloudRepoSubgraphNode += Add-DiaHTMLSubGraph -ImagesObj $Images -TableArray $CloudConnectTenantBRArray  -Align 'Center' -IconDebug $IconDebug -Label $CCBackupStorageInfo.Name -LabelPos "top" -fontColor $Fontcolor -TableStyle "dashed,rounded" -TableBorderColor $Edgecolor -TableBorder "1" -columnSize 1 -fontSize 20
                    } catch {
                        Write-Verbose "Error: Unable to create Cloud Resource SubGraph Nodes Objects. Disabling the section"
                        Write-Debug "Error Message: $($_.Exception.Message)"
                    }

                    if ($CCBackupStorageInfo.SubTenant) {
                        if (($CCBackupStorageInfo.SubTenant.Name | Measure-Object).Count -le 5) {
                            $CCRRNetExtcolumnSize = ($CCBackupStorageInfo.SubTenant.Name | Measure-Object).Count
                        } elseif ($ColumnSize) {
                            $CCRRNetExtcolumnSize = $ColumnSize
                        } else {
                            $CCRRNetExtcolumnSize = 5
                        }
                        try {
                            $CCCloudSubTenantNode = Add-DiaHTMLNodeTable -ImagesObj $Images -inputObject $CCBackupStorageInfo.SubTenant.Name -Align "Center" -iconType $CCBackupStorageInfo.SubTenant.IconType -columnSize $CCRRNetExtcolumnSize -IconDebug $IconDebug -MultiIcon -AditionalInfo $CCBackupStorageInfo.SubTenant.AditionalInfo -SubgraphTableStyle "dashed,rounded" -TableBorderColor "#71797E" -TableBorder "1" -SubgraphLabelFontsize 22 -fontSize 18

                            if ($CCCloudSubTenantNode) {
                                $CloudConnectTenantRRSubTenantArray += $CCCloudSubTenantNode
                            }
                        } catch {
                            Write-Verbose "Error: Unable to create CCCloudSubTenantNode Objects. Disabling the section"
                            Write-Debug "Error Message: $($_.Exception.Message)"
                        }
                    }
                }
                try {
                    $CloudRepoSubgraph = Add-DiaHTMLSubGraph -ImagesObj $Images -TableArray $CloudRepoSubgraphNode  -Align 'Center' -IconDebug $IconDebug -Label "Backup Resources" -LabelPos "top" -fontColor $Fontcolor -TableStyle "dashed,rounded" -TableBorderColor $Edgecolor -TableBorder "1" -columnSize 4 -fontSize 22 -IconType 'VBR_Cloud_Storage'
                } catch {
                    Write-Verbose "Error: Unable to create Cloud Resource SubGraph Nodes Objects. Disabling the section"
                    Write-Debug "Error Message: $($_.Exception.Message)"
                }

                if ($CloudConnectTenantRRSubTenantArray) {
                    try {
                        $CloudConnectTenantRRSubTenantSubgraphNode = Add-DiaHTMLSubGraph -ImagesObj $Images -TableArray $CloudConnectTenantRRSubTenantArray  -Align 'Center' -IconDebug $IconDebug -Label "SubTenants" -LabelPos "top" -fontColor $Fontcolor -TableStyle "dashed,rounded" -TableBorderColor $Edgecolor -TableBorder "1" -columnSize 4 -fontSize 22 -IconType 'VBR_Cloud_Storage'
                    } catch {
                        Write-Verbose "Error: Unable to create SubTenants SubGraph Nodes Objects. Disabling the section"
                        Write-Debug "Error Message: $($_.Exception.Message)"
                    }
                }

                if ($CloudRepoSubgraph) {
                    Node 'TenantBackupStorage' -Attributes @{
                        Label = $CloudRepoSubgraph;
                        shape = 'plain';
                        fillColor = 'transparent';
                        fontsize = 14;
                        fontname = 'Segoe Ui'
                    }
                }
                # Create SubTenant Node
                if ($CloudConnectTenantRRSubTenantSubgraphNode) {
                    Node 'TenantBackupStorageSubTenant' -Attributes @{
                        Label = $CloudConnectTenantRRSubTenantSubgraphNode;
                        shape = 'plain';
                        fillColor = 'transparent';
                        fontsize = 14;
                        fontname = 'Segoe Ui'
                    }

                    Edge -From 'TenantBackupStorage' -To 'TenantBackupStorageSubTenant' -Attributes @{
                        color = $Edgecolor;
                        style = 'dashed';
                        fontname = 'Segoe Ui';
                        fontsize = 14
                        arrowtail = 'dot';
                        arrowhead = 'dot';
                        minlen = 2;
                    }
                }

            }

            # Create Tenant Replica Resources Node
            if ($CCReplicaResourcesObj = $CCPerTenantInfo.ReplicationResources.HardwarePlanOptions) {
                $CloudResourcesSubgraphNode = @()
                $CloudConnectTenantRRArraySubgraph = @()

                $CloudConnectTenantRRNetworkExtensionArray = @()


                foreach ($CCReplicaResourcesInfo in $CCReplicaResourcesObj) {
                    $CloudConnectTenantReplicaResourceArray = @()
                    $CloudConnectTenantRRArray = @()

                    $CloudConnectTenantReplicaResourceArray += $CCReplicaResourcesInfo.Label

                    try {
                        if (($CCReplicaResourcesInfo.Host | Measure-Object).Count -le 5) {
                            $CCReplicaResourcesInfocolumnSize = ($CCReplicaResourcesInfo.Host | Measure-Object).Count
                        } elseif ($ColumnSize) {
                            $CCReplicaResourcesInfocolumnSize = $ColumnSize
                        } else {
                            $CCReplicaResourcesInfocolumnSize = 5
                        }

                        if ($CCReplicaResourcesInfo.Host) {
                            $CCRRHostNode = Add-DiaHTMLNodeTable -ImagesObj $Images -inputObject $CCReplicaResourcesInfo.Host.Name -Align "Center" -iconType $CCReplicaResourcesInfo.Host.IconType -columnSize $CCReplicaResourcesInfocolumnSize -IconDebug $IconDebug -MultiIcon -AditionalInfo $CCReplicaResourcesInfo.Host.AditionalInfo -Subgraph -SubgraphIconType "VBR_Cloud_Connect_VM" -SubgraphLabel "Host or Cluster" -SubgraphLabelPos "top" -SubgraphTableStyle "dashed,rounded" -TableBorderColor "#71797E" -TableBorder "1" -SubgraphLabelFontsize 22 -fontSize 18

                            $CloudConnectTenantRRArray += $CCRRHostNode
                        }
                    } catch {
                        Write-Verbose "Error: Unable to create CCRRHostNode Objects. Disabling the section"
                        Write-Debug "Error Message: $($_.Exception.Message)"
                    }

                    try {
                        if (($CCReplicaResourcesInfo.Storage | Measure-Object).Count -le 5) {
                            $CCReplicaResourcesInfocolumnSize = ($CCReplicaResourcesInfo.Storage | Measure-Object).Count
                        } elseif ($ColumnSize) {
                            $CCReplicaResourcesInfocolumnSize = $ColumnSize
                        } else {
                            $CCReplicaResourcesInfocolumnSize = 5
                        }

                        if ($CCReplicaResourcesInfo.Storage) {
                            $CCRRStorageNode = Add-DiaHTMLNodeTable -ImagesObj $Images -inputObject $CCReplicaResourcesInfo.Storage.Name -Align "Center" -iconType "VBR_Cloud_Repository" -columnSize $CCReplicaResourcesInfocolumnSize -IconDebug $IconDebug -MultiIcon -AditionalInfo $CCReplicaResourcesInfo.Storage.AditionalInfo -Subgraph -SubgraphIconType "VBR_Cloud_Repository" -SubgraphLabel "Storage" -SubgraphLabelPos "top" -SubgraphTableStyle "dashed,rounded" -TableBorderColor "#71797E" -TableBorder "1" -SubgraphLabelFontsize 22 -fontSize 18

                            $CloudConnectTenantRRArray += $CCRRStorageNode
                        }
                    } catch {
                        Write-Verbose "Error: Unable to create CCRRStorageNode Objects. Disabling the section"
                        Write-Debug "Error Message: $($_.Exception.Message)"
                    }

                    if ($CCReplicaResourcesInfo.WanAcceleration) {
                        if (($CCReplicaResourcesInfo.WanAcceleration | Measure-Object).Count -le 5) {
                            $CCRRWancolumnSize = ($CCReplicaResourcesInfo.WanAcceleration | Measure-Object).Count
                        } elseif ($ColumnSize) {
                            $CCRRWancolumnSize = $ColumnSize
                        } else {
                            $CCRRWancolumnSize = 5
                        }
                        try {
                            $CCCloudWanAcceleratorNode = Add-DiaHTMLNodeTable -ImagesObj $Images -inputObject $CCReplicaResourcesInfo.WanAcceleration.Name -Align "Center" -iconType $CCReplicaResourcesInfo.WanAcceleration.IconType -columnSize $CCRRWancolumnSize -IconDebug $IconDebug -MultiIcon -AditionalInfo $CCReplicaResourcesInfo.WanAcceleration.AditionalInfo -Subgraph -SubgraphIconType "VBR_Wan_Accel" -SubgraphLabel "Wan Accelerators" -SubgraphLabelPos "top" -SubgraphTableStyle "dashed,rounded" -TableBorderColor "#71797E" -TableBorder "1" -SubgraphLabelFontsize 22 -fontSize 18

                            if ($CCCloudWanAcceleratorNode) {
                                $CloudConnectTenantRRArray += $CCCloudWanAcceleratorNode
                            }
                        } catch {
                            Write-Verbose "Error: Unable to create CCCloudWanAcceleratorNode Objects. Disabling the section"
                            Write-Debug "Error Message: $($_.Exception.Message)"
                        }
                    }

                    try {
                        if ($CloudConnectTenantRRArray) {
                            if (($CloudConnectTenantRRArray | Measure-Object).Count -le 5) {
                                $CloudConnectTenantRRArraycolumnSize = ($CloudConnectTenantRRArray | Measure-Object).Count
                            } elseif ($ColumnSize) {
                                $CloudConnectTenantRRArraycolumnSize = $ColumnSize
                            } else {
                                $CloudConnectTenantRRArraycolumnSize = 5
                            }
                            $CloudConnectTenantRRSubGraph = Add-DiaHTMLSubGraph -ImagesObj $Images -TableArray $CloudConnectTenantRRArray -Align 'Center' -IconDebug $IconDebug -Label "Resources" -LabelPos "top" -fontColor $Fontcolor -TableStyle "dashed,rounded" -TableBorderColor $Edgecolor -TableBorder "1" -columnSize $CloudConnectTenantRRArraycolumnSize -fontSize 22

                            if ($CloudConnectTenantRRSubGraph) {
                                $CloudConnectTenantReplicaResourceArray += $CloudConnectTenantRRSubGraph
                            }

                        }
                    } catch {
                        Write-Verbose "Error: Unable to create CloudConnectTenantRRSubGraph SubGraph Objects. Disabling the section"
                        Write-Debug "Error Message: $($_.Exception.Message)"
                    }

                    try {
                        if ($CloudConnectTenantReplicaResourceArray) {
                            $CloudConnectTenantRRArraySubgraph += Add-DiaHTMLSubGraph -ImagesObj $Images -TableArray $CloudConnectTenantReplicaResourceArray  -Align 'Center' -IconDebug $IconDebug -Label $CCReplicaResourcesInfo.Name -LabelPos "top" -fontColor $Fontcolor -TableStyle "dashed,rounded" -TableBorderColor $Edgecolor -TableBorder "1" -columnSize 1 -fontSize 22

                        }
                    } catch {
                        Write-Verbose "Error: Unable to create CCRRNode Objects. Disabling the section"
                        Write-Debug "Error Message: $($_.Exception.Message)"
                    }

                    if ($CCReplicaResourcesInfo.NetworkExtensions) {
                        if (($CCReplicaResourcesInfo.NetworkExtensions.Name | Measure-Object).Count -le 5) {
                            $CCRRNetExtcolumnSize = ($CCReplicaResourcesInfo.NetworkExtensions.name | Measure-Object).Count
                        } elseif ($ColumnSize) {
                            $CCRRNetExtcolumnSize = $ColumnSize
                        } else {
                            $CCRRNetExtcolumnSize = 5
                        }
                        try {
                            $CCCloudNetworkExtensionsNode = Add-DiaHTMLNodeTable -ImagesObj $Images -inputObject $CCReplicaResourcesInfo.NetworkExtensions.Name -Align "Center" -iconType $CCReplicaResourcesInfo.NetworkExtensions.IconType -columnSize $CCRRNetExtcolumnSize -IconDebug $IconDebug -MultiIcon -AditionalInfo $CCReplicaResourcesInfo.NetworkExtensions.AditionalInfo -SubgraphTableStyle "dashed,rounded" -TableBorderColor "#71797E" -TableBorder "1" -SubgraphLabelFontsize 22 -fontSize 18

                            if ($CCCloudNetworkExtensionsNode) {
                                $CloudConnectTenantRRNetworkExtensionArray += $CCCloudNetworkExtensionsNode
                            }
                        } catch {
                            Write-Verbose "Error: Unable to create CCCloudNetworkExtensionsNode Objects. Disabling the section"
                            Write-Debug "Error Message: $($_.Exception.Message)"
                        }
                    }
                }

                if ($CloudConnectTenantRRNetworkExtensionArray) {
                    try {
                        $CloudConnectTenantRRNExtensionSubgraphNode = Add-DiaHTMLSubGraph -ImagesObj $Images -TableArray $CloudConnectTenantRRNetworkExtensionArray  -Align 'Center' -IconDebug $IconDebug -Label "Network Extension Appliances" -LabelPos "top" -fontColor $Fontcolor -TableStyle "dashed,rounded" -TableBorderColor $Edgecolor -TableBorder "1" -columnSize 4 -fontSize 22 -IconType 'VBR_Hardware_Resources'
                    } catch {
                        Write-Verbose "Error: Unable to create Cloud Resource SubGraph Nodes Objects. Disabling the section"
                        Write-Debug "Error Message: $($_.Exception.Message)"
                    }
                }

                try {
                    $CloudResourcesSubgraphNode = Add-DiaHTMLSubGraph -ImagesObj $Images -TableArray $CloudConnectTenantRRArraySubgraph  -Align 'Center' -IconDebug $IconDebug -Label "Replica Resources" -LabelPos "top" -fontColor $Fontcolor -TableStyle "dashed,rounded" -TableBorderColor $Edgecolor -TableBorder "1" -columnSize 4 -fontSize 22 -IconType 'VBR_Hardware_Resources'
                } catch {
                    Write-Verbose "Error: Unable to create Cloud Resource SubGraph Nodes Objects. Disabling the section"
                    Write-Debug "Error Message: $($_.Exception.Message)"
                }

                if ($CloudResourcesSubgraphNode) {
                    Node 'TenantReplicaResources' -Attributes @{
                        Label = $CloudResourcesSubgraphNode;
                        shape = 'plain';
                        fillColor = 'transparent';
                        fontsize = 14;
                        fontname = 'Segoe Ui'
                    }
                }

                if ($CloudConnectTenantRRNExtensionSubgraphNode) {
                    Node 'TenantReplicaResourcesNetworkExtension' -Attributes @{
                        Label = $CloudConnectTenantRRNExtensionSubgraphNode;
                        shape = 'plain';
                        fillColor = 'transparent';
                        fontsize = 14;
                        fontname = 'Segoe Ui'
                    }

                    Edge -From 'TenantReplicaResources' -To 'TenantReplicaResourcesNetworkExtension' -Attributes @{
                        color = $Edgecolor;
                        style = 'dashed';
                        fontname = 'Segoe Ui';
                        fontsize = 14
                        arrowtail = 'dot';
                        arrowhead = 'dot';
                        minlen = 3;
                    }
                }
            }


            # Create Tenant vCD Replica Resources Node
            if ($CCvCDReplicaResourcesObj = $CCPerTenantInfo.vCDReplicationResources.OrganizationvDCOptions) {
                $CloudvCDResourcesSubgraphNode = @()
                $CloudConnectTenantvCDRRArraySubgraph = @()

                $CloudConnectTenantvCDRRNetworkExtensionArray = @()


                foreach ($CCvCDReplicaResourcesInfo in $CCvCDReplicaResourcesObj) {
                    $CloudConnectTenantvCDReplicaResourceArray = @()
                    $CloudConnectTenantvCDRRArray = @()

                    $CloudConnectTenantvCDReplicaResourceArray += $CCvCDReplicaResourcesInfo.Label

                    if ($CCvCDReplicaResourcesInfo.WanAcceleration) {
                        if (($CCvCDReplicaResourcesInfo.WanAcceleration | Measure-Object).Count -le 5) {
                            $CCvCDRRWancolumnSize = ($CCvCDReplicaResourcesInfo.WanAcceleration | Measure-Object).Count
                        } elseif ($ColumnSize) {
                            $CCvCDRRWancolumnSize = $ColumnSize
                        } else {
                            $CCvCDRRWancolumnSize = 5
                        }
                        try {
                            $CCCloudvCDWanAcceleratorNode = Add-DiaHTMLNodeTable -ImagesObj $Images -inputObject $CCvCDReplicaResourcesInfo.WanAcceleration.Name -Align "Center" -iconType $CCvCDReplicaResourcesInfo.WanAcceleration.IconType -columnSize $CCvCDRRWancolumnSize -IconDebug $IconDebug -MultiIcon -AditionalInfo $CCvCDReplicaResourcesInfo.WanAcceleration.AditionalInfo -Subgraph -SubgraphIconType "VBR_Wan_Accel" -SubgraphLabel "Wan Accelerators" -SubgraphLabelPos "top" -SubgraphTableStyle "dashed,rounded" -TableBorderColor "#71797E" -TableBorder "1" -SubgraphLabelFontsize 22 -fontSize 18

                            if ($CCCloudvCDWanAcceleratorNode) {
                                $CloudConnectTenantvCDRRArray += $CCCloudvCDWanAcceleratorNode
                            }
                        } catch {
                            Write-Verbose "Error: Unable to create CCCloudvCDWanAcceleratorNode Objects. Disabling the section"
                            Write-Debug "Error Message: $($_.Exception.Message)"
                        }
                    }

                    try {
                        if ($CloudConnectTenantvCDRRArray) {
                            if (($CloudConnectTenantvCDRRArray | Measure-Object).Count -le 5) {
                                $CloudConnectTenantvCDRRArraycolumnSize = ($CloudConnectTenantvCDRRArray | Measure-Object).Count
                            } elseif ($ColumnSize) {
                                $CloudConnectTenantvCDRRArraycolumnSize = $ColumnSize
                            } else {
                                $CloudConnectTenantvCDRRArraycolumnSize = 5
                            }
                            $CloudConnectTenantvCDRRSubGraph = Add-DiaHTMLSubGraph -ImagesObj $Images -TableArray $CloudConnectTenantvCDRRArray -Align 'Center' -IconDebug $IconDebug -Label "Resources" -LabelPos "top" -fontColor $Fontcolor -TableStyle "dashed,rounded" -TableBorderColor $Edgecolor -TableBorder "1" -columnSize $CloudConnectTenantvCDRRArraycolumnSize -fontSize 22

                            if ($CloudConnectTenantvCDRRSubGraph) {
                                $CloudConnectTenantvCDReplicaResourceArray += $CloudConnectTenantvCDRRSubGraph
                            }

                        }
                    } catch {
                        Write-Verbose "Error: Unable to create CloudConnectTenantvCDRRSubGraph SubGraph Objects. Disabling the section"
                        Write-Debug "Error Message: $($_.Exception.Message)"
                    }

                    try {
                        if ($CloudConnectTenantvCDReplicaResourceArray) {
                            $CloudConnectTenantvCDRRArraySubgraph += Add-DiaHTMLSubGraph -ImagesObj $Images -TableArray $CloudConnectTenantvCDReplicaResourceArray  -Align 'Center' -IconDebug $IconDebug -Label $CCvCDReplicaResourcesInfo.Name -LabelPos "top" -fontColor $Fontcolor -TableStyle "dashed,rounded" -TableBorderColor $Edgecolor -TableBorder "1" -columnSize 1 -fontSize 22

                        }
                    } catch {
                        Write-Verbose "Error: Unable to create CloudConnectTenantvCDRRArraySubgraph Objects. Disabling the section"
                        Write-Debug "Error Message: $($_.Exception.Message)"
                    }

                    if ($CCvCDReplicaResourcesInfo.NetworkExtensions) {
                        if (($CCvCDReplicaResourcesInfo.NetworkExtensions.Name | Measure-Object).Count -le 5) {
                            $CCvCDRRNetExtcolumnSize = ($CCvCDReplicaResourcesInfo.NetworkExtensions.Name | Measure-Object).Count
                        } elseif ($ColumnSize) {
                            $CCvCDRRNetExtcolumnSize = $ColumnSize
                        } else {
                            $CCvCDRRNetExtcolumnSize = 5
                        }
                        try {
                            $CCCloudvCDNetworkExtensionsNode = Add-DiaHTMLNodeTable -ImagesObj $Images -inputObject $CCvCDReplicaResourcesInfo.NetworkExtensions.Name -Align "Center" -iconType $CCvCDReplicaResourcesInfo.NetworkExtensions.IconType -columnSize $CCvCDRRNetExtcolumnSize -IconDebug $IconDebug -MultiIcon -AditionalInfo $CCvCDReplicaResourcesInfo.NetworkExtensions.AditionalInfo -SubgraphTableStyle "dashed,rounded" -TableBorderColor "#71797E" -TableBorder "1" -SubgraphLabelFontsize 22 -fontSize 18

                            if ($CCCloudvCDNetworkExtensionsNode) {
                                $CloudConnectTenantvCDRRNetworkExtensionArray += $CCCloudvCDNetworkExtensionsNode
                            }
                        } catch {
                            Write-Verbose "Error: Unable to create CCCloudvCDNetworkExtensionsNode Objects. Disabling the section"
                            Write-Debug "Error Message: $($_.Exception.Message)"
                        }
                    }
                }

                if ($CloudConnectTenantvCDRRNetworkExtensionArray) {
                    try {
                        $CloudConnectTenantvCDRRNExtensionSubgraphNode = Add-DiaHTMLSubGraph -ImagesObj $Images -TableArray $CloudConnectTenantvCDRRNetworkExtensionArray  -Align 'Center' -IconDebug $IconDebug -Label "Network Extension Appliances" -LabelPos "top" -fontColor $Fontcolor -TableStyle "dashed,rounded" -TableBorderColor $Edgecolor -TableBorder "1" -columnSize 4 -fontSize 22 -IconType 'VBR_Hardware_Resources'
                    } catch {
                        Write-Verbose "Error: Unable to create CloudvCDRRNExtensionSubgraphNode Objects. Disabling the section"
                        Write-Debug "Error Message: $($_.Exception.Message)"
                    }
                }

                try {
                    $CloudvCDResourcesSubgraphNode = Add-DiaHTMLSubGraph -ImagesObj $Images -TableArray $CloudConnectTenantvCDRRArraySubgraph  -Align 'Center' -IconDebug $IconDebug -Label "vDC Replica Resources" -LabelPos "top" -fontColor $Fontcolor -TableStyle "dashed,rounded" -TableBorderColor $Edgecolor -TableBorder "1" -columnSize 4 -fontSize 22 -IconType 'VBR_Hardware_Resources'
                } catch {
                    Write-Verbose "Error: Unable to create CloudvCDResourcesSubgraphNode Objects. Disabling the section"
                    Write-Debug "Error Message: $($_.Exception.Message)"
                }

                if ($CloudvCDResourcesSubgraphNode) {
                    Node 'TenantReplicaResources' -Attributes @{
                        Label = $CloudvCDResourcesSubgraphNode;
                        shape = 'plain';
                        fillColor = 'transparent';
                        fontsize = 14;
                        fontname = 'Segoe Ui'
                    }
                }

                if ($CloudConnectTenantvCDRRNExtensionSubgraphNode) {
                    Node 'TenantReplicaResourcesNetworkExtension' -Attributes @{
                        Label = $CloudConnectTenantvCDRRNExtensionSubgraphNode;
                        shape = 'plain';
                        fillColor = 'transparent';
                        fontsize = 14;
                        fontname = 'Segoe Ui'
                    }

                    Edge -From 'TenantReplicaResources' -To 'TenantReplicaResourcesNetworkExtension' -Attributes @{
                        color = $Edgecolor;
                        style = 'dashed';
                        fontname = 'Segoe Ui';
                        fontsize = 14
                        arrowtail = 'dot';
                        arrowhead = 'dot';
                        minlen = 3;
                    }
                }
            }

            if (($CloudResourcesSubgraphNode -or $CloudvCDResourcesSubgraphNode) -and $CloudRepoSubgraph) {
                Rank 'TenantBackupStorage', 'TenantBackupStorageConnector'
                Rank 'TenantReplicaResources', 'TenantReplicaResourcesConnector'
                # Create Edge Connector Nodes
                Add-DiaInvertedTShapeLine -InvertedTStart 'TenantBackupStorageConnector' -InvertedTStartLineLength 5 -InvertedTMiddleTop 'TenantGatewayConnector' -InvertedTEndLineLength 5 -LineColor $Edgecolor -LineStyle 'dashed' -IconDebug $IconDebug -LineWidth $EdgeLineWidth -InvertedTEnd 'TenantReplicaResourcesConnector'

                Edge -From 'TenantReplicaResourcesConnector' -To 'TenantReplicaResources' -Attributes @{
                    color = $Edgecolor;
                    style = 'dashed';
                    fontname = 'Segoe Ui';
                    fontsize = 14
                    arrowtail = 'none';
                    arrowhead = 'dot';
                }
                Edge -From 'TenantBackupStorage' -To 'TenantBackupStorageConnector' -Attributes @{
                    color = $Edgecolor;
                    style = 'dashed';
                    fontname = 'Segoe Ui';
                    fontsize = 14
                    arrowtail = 'dot';
                    arrowhead = 'none';
                }
            } elseif ($CloudResourcesSubgraphNode -or $CloudvCDResourcesSubgraphNode) {
                # Create Edge Connector Nodes
                Add-DiaVerticalLine -VStart 'TenantGatewayConnector' -VEnd 'TenantReplicaResourcesConnector' -LineColor $Edgecolor -LineStyle 'dashed' -IconDebug $IconDebug -LineWidth $EdgeLineWidth

                Edge -From 'TenantReplicaResourcesConnector' -To 'TenantReplicaResources' -Attributes @{
                    color = $Edgecolor;
                    style = 'dashed';
                    fontname = 'Segoe Ui';
                    fontsize = 14
                    arrowtail = 'none';
                    arrowhead = 'dot';
                }
            } elseif ($CloudRepoSubgraph) {
                # Create Edge Connector Nodes
                Add-DiaVerticalLine -VStart 'TenantGatewayConnector' -VEnd 'TenantBackupStorageConnector' -LineColor $Edgecolor -LineStyle 'dashed' -IconDebug $IconDebug -LineWidth $EdgeLineWidth

                Edge -From 'TenantBackupStorageConnector' -To 'TenantBackupStorage' -Attributes @{
                    color = $Edgecolor;
                    style = 'dashed';
                    fontname = 'Segoe Ui';
                    fontsize = 14
                    arrowtail = 'none';
                    arrowhead = 'dot';
                }
            }
        }
    }
    end {}
}