Modules/Public/PublicFunctions/Diagram/Build-ARIDiagramSubnet.ps1
<#
.Synopsis Subnet Module for Draw.io Diagram .DESCRIPTION This module is used for building subnet components in the Draw.io Diagram. .Link https://github.com/microsoft/ARI/Modules/Public/PublicFunctions/Diagram/Build-ARIDiagramSubnet.ps1 .COMPONENT This PowerShell Module is part of Azure Resource Inventory (ARI) .NOTES Version: 3.6.0 First Release Date: 15th Oct, 2024 Authors: Claudio Merola #> Function Build-ARIDiagramSubnet { Param($SubnetLocation,$VNET,$IDNum,$DiagramCache,$ContainerID,$LogFile) try { $etag = -join ((65..90) + (97..122) | Get-Random -Count 20 | ForEach-Object {[char]$_}) $DiagID = -join ((65..90) + (97..122) | Get-Random -Count 20 | ForEach-Object {[char]$_}) $CellID2 = -join ((65..90) + (97..122) | Get-Random -Count 20 | ForEach-Object {[char]$_}) $IDNum++ $SubFileName = ($CellID2 + '.xml') $SubFile = Join-Path $DiagramCache $SubFileName ('DrawIONetwork - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+" - Adding Subnet File: " + $SubFile) | Out-File -FilePath $LogFile -Append ###################################################### STENCILS #################################################### Function Publish-ARIDiagramStensils { $Script:Ret = "rounded=0;whiteSpace=wrap;fontSize=16;html=1;sketch=0;fontFamily=Helvetica;" $Script:IconConnections = "aspect=fixed;html=1;points=[];align=center;image;fontSize=18;image=img/lib/azure2/networking/Connections.svg;" #width="68" height="68" $Script:IconExpressRoute = "aspect=fixed;html=1;points=[];align=center;image;fontSize=18;image=img/lib/azure2/networking/ExpressRoute_Circuits.svg;" #width="70" height="64" $Script:IconVGW = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/networking/Virtual_Network_Gateways.svg;" #width="52" height="69" $Script:IconVGW2 = "aspect=fixed;html=1;points=[];align=center;image;fontSize=18;image=img/lib/azure2/networking/Virtual_Network_Gateways.svg;" #width="52" height="69" $Script:IconVNET = "aspect=fixed;html=1;points=[];align=center;image;fontSize=18;image=img/lib/azure2/networking/Virtual_Networks.svg;" #width="67" height="40" $Script:IconTraffic = "aspect=fixed;html=1;points=[];align=center;image;fontSize=18;image=img/lib/azure2/networking/Local_Network_Gateways.svg;" #width="68" height="68" $Script:IconNIC = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/networking/Network_Interfaces.svg;" #width="68" height="60" $Script:IconLBs = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/networking/Load_Balancers.svg;" #width="72" height="72" $Script:IconPVTs = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/networking/Private_Endpoint.svg;" #width="72" height="66" $Script:IconNSG = "aspect=fixed;html=1;points=[];align=center;image;fontSize=12;image=img/lib/azure2/networking/Network_Security_Groups.svg;" # width="26.35" height="32" $Script:IconUDR = "aspect=fixed;html=1;points=[];align=center;image;fontSize=12;image=img/lib/azure2/networking/Route_Tables.svg;" #width="30.97" height="30" $Script:IconDDOS = "aspect=fixed;html=1;points=[];align=center;image;fontSize=12;image=img/lib/azure2/networking/DDoS_Protection_Plans.svg;" # width="23" height="28" $Script:IconPIP = "aspect=fixed;html=1;points=[];align=center;image;fontSize=12;image=img/lib/azure2/networking/Public_IP_Addresses.svg;" # width="65" height="52" $Script:IconNAT = "aspect=fixed;html=1;points=[];align=center;image;fontSize=18;image=img/lib/azure2/networking/NAT.svg;" # width="65" height="52" <########################## Azure Generic Stencils #############################> $Script:SymError = "sketch=0;aspect=fixed;pointerEvents=1;shadow=0;dashed=0;html=1;strokeColor=none;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;align=center;shape=mxgraph.mscae.enterprise.not_allowed;fillColor=#EA1C24;" #width="50" height="50" $Script:SymInfo = "aspect=fixed;html=1;points=[];align=center;image;fontSize=12;image=img/lib/azure2/general/Information.svg;" #width="64" height="64" $Script:IconSubscription = "aspect=fixed;html=1;points=[];align=center;image;fontSize=20;image=img/lib/azure2/general/Subscriptions.svg;" #width="44" height="71" $Script:IconRG = "image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=12;image=img/lib/mscae/ResourceGroup.svg;" # width="37.5" height="30" $Script:IconBastions = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/general/Launch_Portal.svg;" #width="68" height="67" $Script:IconContain = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/compute/Container_Instances.svg;" #width="64" height="68" $Script:IconVWAN = "aspect=fixed;html=1;points=[];align=center;image;fontSize=18;image=img/lib/azure2/networking/Virtual_WANs.svg;" #width="65" height="64" $Script:IconCostMGMT = "aspect=fixed;html=1;points=[];align=center;image;fontSize=12;image=img/lib/azure2/general/Cost_Analysis.svg;" #width="60" height="70" <########################## Azure Computing Stencils #############################> $Script:IconVMs = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/compute/Virtual_Machine.svg;" #width="69" height="64" $Script:IconAKS = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/containers/Kubernetes_Services.svg;" #width="68" height="60" $Script:IconVMSS = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/compute/VM_Scale_Sets.svg;" # width="68" height="68" $Script:IconARO = "sketch=0;aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/mscae/OpenShift.svg;" #width="50" height="46" $Script:IconFunApps = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/compute/Function_Apps.svg;" # width="68" height="60" <########################## Azure Service Stencils #############################> $Script:IconAPIMs = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/app_services/API_Management_Services.svg;" #width="65" height="60" $Script:IconAPPs = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/containers/App_Services.svg;" #width="64" height="64" <########################## Azure Storage Stencils #############################> $Script:IconNetApp = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/storage/Azure_NetApp_Files.svg;" #width="65" height="52" <########################## Azure Storage Stencils #############################> $Script:IconDataExplorer = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/databases/Azure_Data_Explorer_Clusters.svg;" #width="68" height="68" <########################## Other Stencils #############################> $Script:IconFWs = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/networking/Firewalls.svg;" #width="71" height="60" $Script:IconDet = "aspect=fixed;html=1;points=[];align=center;image;fontSize=12;image=img/lib/azure2/other/Detonation.svg;" #width="42.63" height="44" $Script:IconAppGWs = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/networking/Application_Gateways.svg;" #width="64" height="64" $Script:IconBricks = "aspect=fixed;html=1;points=[];align=center;image;fontSize=14;image=img/lib/azure2/analytics/Azure_Databricks.svg;" #width="60" height="68" $Script:IconError = "sketch=0;aspect=fixed;pointerEvents=1;shadow=0;dashed=0;html=1;strokeColor=none;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;align=center;shape=mxgraph.mscae.enterprise.not_allowed;fillColor=#EA1C24;" #width="30" height="30" $Script:OnPrem = "sketch=0;aspect=fixed;html=1;points=[];align=center;image;fontSize=56;image=img/lib/mscae/Exchange_On_premises_Access.svg;" #width="168.2" height="290" $Script:Signature = "aspect=fixed;html=1;points=[];align=left;image;fontSize=22;image=img/lib/azure2/general/Dev_Console.svg;" #width="27.5" height="22" $Script:CloudOnly = "aspect=fixed;html=1;points=[];align=center;image;fontSize=56;image=img/lib/azure2/compute/Cloud_Services_Classic.svg;" #width="380.77" height="275" } ####################################################### Subnet Components #################################################### Function Set-ARIDiagramSubnetComponent { Param($sub,$SubnetLocation,$Alt0,$ContainerID,$LogFile) $CellID3 = -join ((65..90) + (97..122) | Get-Random -Count 20 | ForEach-Object {[char]$_}) $temp = '' remove-variable TrueTemp -ErrorAction SilentlyContinue remove-variable RESNames -ErrorAction SilentlyContinue <####################################################### FIND THE RESOURCES IN THE SUBNET ###################################################################> $LoggingSubName = $Sub.id ('DrawIONetwork - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+" - Validating ProcType: " + $LoggingSubName) | Out-File -FilePath $LogFile -Append if($sub.properties.resourceNavigationLinks.properties.linkedResourceType -eq 'Microsoft.ApiManagement/service') { $TrueTemp = 'APIM' } if($sub.properties.serviceAssociationLinks.properties.link -and $null -eq $TrueTemp) { if($sub.properties.serviceAssociationLinks.properties.link.split("/")[6] -eq 'Microsoft.Web') { $TrueTemp = 'App Service' } } if($sub.properties.applicationGatewayIPConfigurations.id -and $null -eq $TrueTemp) { if($sub.properties.applicationGatewayIPConfigurations.id.split("/")[7] -eq 'applicationGateways') { $TrueTemp = 'applicationGateways' } } if($sub.properties.ipconfigurations.id.count -eq 1 -and $null -eq $TrueTemp) { if($sub.properties.ipconfigurations.id.Split("/")[7] -eq 'virtualNetworkGateways') { $TrueTemp = 'virtualNetworkGateways' } elseif($sub.properties.ipconfigurations.id.Split("/")[7] -eq 'loadBalancers') { $TrueTemp = 'loadBalancers' } elseif($sub.properties.ipconfigurations.id.Split("/")[7] -eq 'applicationGateways') { $TrueTemp = 'applicationGateways' } elseif($sub.properties.ipconfigurations.id.Split("/")[7] -eq 'bastionHosts') { $TrueTemp = 'bastionHosts' } elseif($sub.properties.ipconfigurations.id.Split("/")[7] -eq 'azureFirewalls') { $TrueTemp = 'azureFirewalls' } } if($sub.properties.delegations.properties.serviceName -eq 'Microsoft.Databricks/workspaces' -and $null -eq $TrueTemp) { $TrueTemp = 'DataBricks' } if($sub.properties.delegations.properties.serviceName -eq 'Microsoft.Web/serverfarms' -and $null -eq $TrueTemp) { $TrueTemp = 'App Service' } if($sub.properties.delegations.properties.serviceName -eq 'Microsoft.ContainerInstance/containerGroups' -and $null -eq $TrueTemp) { $TrueTemp = 'Container Instance' } if($sub.properties.delegations.properties.serviceName -eq 'Microsoft.Netapp/volumes' -and $null -eq $TrueTemp) { $TrueTemp = 'NetApp' } if($sub.properties.delegations.properties.serviceName -eq 'Microsoft.Kusto/clusters' -and $null -eq $TrueTemp) { $TrueTemp = 'Data Explorer Clusters' } if([string]::IsNullOrEmpty($TrueTemp)) { $AKS = $Script:AKS if($sub.id -in $AKS.properties.agentPoolProfiles.vnetSubnetID) { $TrueTemp = 'AKS' } } if([string]::IsNullOrEmpty($TrueTemp)) { $Types = @() Foreach($type in $sub.properties.ipconfigurations.id) { if($type.Split("/")[8] -like 'aks-*') { $Types += 'AKS' } if($type.Split("/")[8] -like 'gwhost*') { $Types += 'APIM' } else { $Types += $type.Split("/")[7] } } $temp = $Types | Group-Object | Sort-Object -Property Count -Descending if($temp) { $TrueTemp = $temp[0].name } } if([string]::IsNullOrEmpty($TrueTemp)) { if ($sub.id -in ($Script:VMSS).properties.virtualMachineProfile.networkprofile.networkInterfaceConfigurations.properties.ipconfigurations.properties.subnet.id) { $TrueTemp = 'virtualMachineScaleSets' } } <#################################################### FIND RESOURCE NAME AND DETAILS #################################################################> if($TrueTemp -eq 'networkInterfaces') { $NIcNames = $Script:NIC | Where-Object {$_.properties.ipConfigurations.properties.subnet.id -eq $sub.id} if($sub.properties.privateEndpoints.id) { $PrivEndNames = $Script:PrivEnd | Where-Object {$_.properties.networkInterfaces.id -in $NIcNames.id} $TrueTemp = 'privateLinkServices' $RESNames = $PrivEndNames } else { $VMNamesAro = $Script:VM | Where-Object {$_.properties.networkprofile.networkInterfaces.id -in $NIcNames.id} if($VMNamesAro.properties.storageprofile.imageReference.offer -like 'aro*') { $ARONames = $Script:ARO | Where-Object {$_.properties.masterprofile.subnetId -eq $sub.id -or $_.properties.workerProfiles.subnetId -eq $sub.id} $TrueTemp = 'Open Shift' $RESNames = $ARONames } if($TrueTemp -ne 'Open Shift') { $VMs = @() $VMNames = ($Script:VM).properties.networkprofile.networkInterfaces.id | Where-Object {$_ -in $NIcNames.id} $VMs = foreach($NIC in $VMNames) { $Script:VM| Where-Object {$NIC -in $_.properties.networkprofile.networkInterfaces.id} } if($VMs) { $TrueTemp = 'Virtual Machine' $RESNames = $VMs } } if($TrueTemp -eq 'networkInterfaces') { $TrueTemp = 'Network Interface' $RESNames = $NIcNames } } } if($TrueTemp -eq 'AKS') { $AKSNames = $Script:AKS | Where-Object {$_.properties.agentPoolProfiles.vnetSubnetID -eq $sub.id} $RESNames = $AKSNames } if($TrueTemp -eq 'Data Explorer Clusters') { $KustoNames = $Script:Kusto | Where-Object {$_.properties.virtualNetworkConfiguration.subnetid -eq $sub.id} $RESNames = $KustoNames } if($TrueTemp -eq 'applicationGateways') { $AppGTWNames = $Script:AppGtw| Where-Object {$_.properties.gatewayIPConfigurations.id -in $sub.properties.applicationGatewayIPConfigurations.id} $RESNames = $AppGTWNames } if($TrueTemp -eq 'DataBricks') { $DatabriksNames = @() $Databricks = $Script:Databricks $DatabriksNames = Foreach($Data in $Databricks) { if($Data.properties.parameters.customVirtualNetworkId.value+'/subnets/'+$Data.properties.parameters.customPrivateSubnetName.value -eq $sub.id -or $Data.properties.parameters.customVirtualNetworkId.value+'/subnets/'+$Data.properties.parameters.custompublicSubnetName.value -eq $sub.id) { $Data } } $RESNames = $DatabriksNames } if($TrueTemp -eq 'App Service') { $Apps = $Script:AppWeb | Where-Object {$_.properties.virtualNetworkSubnetId -eq $Sub.id} if($Apps.kind -like 'functionapp*') { $FuntionAppNames = $Apps $TrueTemp = 'Function App' $RESNames = $FuntionAppNames } else { $ServiceAppNames = $Apps $RESNames = $Apps } } if($TrueTemp -eq 'APIM') { $APIMNames = $Script:APIM | Where-Object {$_.properties.virtualNetworkConfiguration.subnetResourceId -eq $sub.id} $RESNames = $APIMNames } if($TrueTemp -eq 'loadBalancers') { $LBNames = $Script:LB | Where-Object {$_.properties.frontendIPConfigurations.id -in $sub.properties.ipconfigurations.id} $RESNames = $LBNames } if($TrueTemp -eq 'virtualMachineScaleSets') { $VMSSNames = $Script:VMSS | Where-Object {$_.properties.virtualMachineProfile.networkProfile.networkInterfaceConfigurations.properties.ipconfigurations.properties.subnet.id -eq $sub.id } $RESNames = $VMSSNames } if($TrueTemp -eq 'virtualNetworkGateways') { $VPNGTWNames = $Script:AZVGWs | Where-Object {$_.properties.ipconfigurations.properties.subnet.id -eq $sub.id } $RESNames = $VPNGTWNames } if($TrueTemp -eq 'bastionHosts') { $BastionNames = $Script:Bastion | Where-Object {$_.properties.ipConfigurations.properties.subnet.id -eq $sub.id } $RESNames = $BastionNames } if($TrueTemp -eq 'azureFirewalls') { $AzFWNames = $Script:FW | Where-Object {$_.properties.ipConfigurations.properties.subnet.id -eq $sub.id } $RESNames = $AzFWNames } if($TrueTemp -eq 'Container Instance') { $ContainerNames = '' $ContNICs = $Script:NetProf | Where-Object {$_.properties.containerNetworkInterfaceConfigurations.properties.ipconfigurations.properties.subnet.id -eq $sub.id} $ContainerNames = $Script:Container | Where-Object {$_.properties.networkprofile.id -in $ContNICs.id} $RESNames = $ContainerNames if([string]::IsNullOrEmpty($ContainerNames)) { $ARONames = $Script:ARO | Where-Object {$_.properties.masterprofile.subnetId -eq $sub.id -or $_.properties.workerProfiles.subnetId -eq $sub.id} $TrueTemp = 'Open Shift' $RESNames = $ARONames } } if($TrueTemp -eq 'NetApp') { $NetAppNames = $Script:ANF | Where-Object {$_.properties.subnetId -eq $sub.id } $RESNames = $NetAppNames } <###################################################### DROP THE ICONS ######################################################> switch ($TrueTemp) { 'Virtual Machine' { ('DrawIONetwork - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+" - Adding VM: " + $CellID3+'-1') | Out-File -FilePath $LogFile -Append if($RESNames.count -gt 1) { $XmlTempWriter.WriteStartElement('object') $XmlTempWriter.WriteAttributeString('label', ([string]$RESNames.Count + ' VMs')) $Count = 1 foreach ($VMName in $RESNames.Name) { $Attr1 = ('VirtualMachine-'+[string]("{0:d3}" -f $Count)) $XmlTempWriter.WriteAttributeString($Attr1, [string]$VMName) $Count ++ } $XmlTempWriter.WriteAttributeString('id', ($Script:CellID+'-'+($Script:IDNum++))) New-ARIDiagramSubnetIcon $IconVMs ($SubnetLocation+64) ($Alt0+40) "69" "64" $ContainerID $XmlTempWriter.WriteEndElement() } else { $XmlTempWriter.WriteStartElement('object') $XmlTempWriter.WriteAttributeString('label', [string]$RESNames.Name) $XmlTempWriter.WriteAttributeString('VM_Size', [string]$RESNames.properties.hardwareProfile.vmSize) $XmlTempWriter.WriteAttributeString('OS', [string]$RESNames.properties.storageProfile.osDisk.osType) $XmlTempWriter.WriteAttributeString('OS_Disk_Size_GB', [string]$RESNames.properties.storageProfile.osDisk.diskSizeGB) $XmlTempWriter.WriteAttributeString('Image_Publisher', [string]$RESNames.properties.storageProfile.imageReference.publisher) $XmlTempWriter.WriteAttributeString('Image_SKU', [string]$RESNames.properties.storageProfile.imageReference.sku) $XmlTempWriter.WriteAttributeString('id', ($CellID3+'-1')) New-ARIDiagramSubnetIcon $IconVMs ($SubnetLocation+64) ($Alt0+40) "69" "64" $ContainerID $XmlTempWriter.WriteEndElement() } } 'AKS' { ('DrawIONetwork - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+" - Adding AKS: " + $CellID3+'-1') | Out-File -FilePath $LogFile -Append if($RESNames.count -gt 1) { $XmlTempWriter.WriteStartElement('object') $XmlTempWriter.WriteAttributeString('label', ([string]$RESNames.Count + ' AKS Clusters')) $Count = 1 foreach ($AKSName in $RESNames.Name) { $Attr1 = ('Kubernetes_Cluster-'+[string]("{0:d3}" -f $Count)) $XmlTempWriter.WriteAttributeString($Attr1, [string]$AKSName) $Count ++ } $XmlTempWriter.WriteAttributeString('id', ($CellID3+'-1')) New-ARIDiagramSubnetIcon $IconAKS ($SubnetLocation+65) ($Alt0+40) "68" "64" $ContainerID $XmlTempWriter.WriteEndElement() } else { $XmlTempWriter.WriteStartElement('object') $XmlTempWriter.WriteAttributeString('label', [string]$RESNames.name) $Count = 1 foreach($Pool in $RESNames.properties.agentPoolProfiles) { $Attr1 = ('Node_Pool-'+[string]("{0:d3}" -f $Count)+'-Name') $Attr2 = ('Node_Pool-'+[string]("{0:d3}" -f $Count)+'-Count') $Attr3 = ('Node_Pool-'+[string]("{0:d3}" -f $Count)+'-Size') $Attr4 = ('Node_Pool-'+[string]("{0:d3}" -f $Count)+'-Version') $Attr5 = ('Node_Pool-'+[string]("{0:d3}" -f $Count)+'-Mode') $Attr6 = ('Node_Pool-'+[string]("{0:d3}" -f $Count)+'-Max_Pods') $XmlTempWriter.WriteAttributeString($Attr1, [string]$Pool.name) $XmlTempWriter.WriteAttributeString($Attr2, [string]($Pool | Select-Object -Property 'count').count) $XmlTempWriter.WriteAttributeString($Attr3, [string]$Pool.vmSize) $XmlTempWriter.WriteAttributeString($Attr4, [string]$Pool.orchestratorVersion) $XmlTempWriter.WriteAttributeString($Attr5, [string]$Pool.mode) $XmlTempWriter.WriteAttributeString($Attr6, [string]$Pool.maxPods) $Count ++ } $XmlTempWriter.WriteAttributeString('id', ($CellID3+'-1')) New-ARIDiagramSubnetIcon $IconAKS ($SubnetLocation+65) ($Alt0+40) "68" "64" $ContainerID $XmlTempWriter.WriteEndElement() } } 'virtualMachineScaleSets' { ('DrawIONetwork - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+" - Adding VMSS: " + $CellID3+'-1') | Out-File -FilePath $LogFile -Append if($RESNames.count -gt 1) { $XmlTempWriter.WriteStartElement('object') $XmlTempWriter.WriteAttributeString('label', ([string]$RESNames.Count + ' Virtual Machine Scale Sets')) $Count = 1 foreach ($ResName in $RESNames.Name) { $Attr1 = ('VMSS-'+[string]("{0:d3}" -f $Count)) $XmlTempWriter.WriteAttributeString($Attr1, [string]$ResName) $Count ++ } $XmlTempWriter.WriteAttributeString('id', ($CellID3+'-1')) New-ARIDiagramSubnetIcon $IconVMSS ($SubnetLocation+65) ($Alt0+40) "68" "68" $ContainerID $XmlTempWriter.WriteEndElement() } else { $XmlTempWriter.WriteStartElement('object') $XmlTempWriter.WriteAttributeString('label', [string]$RESNames.name) $XmlTempWriter.WriteAttributeString('VMSS_Name', [string]$RESNames.name) $XmlTempWriter.WriteAttributeString('Instances', [string]$temp[0].Count) $XmlTempWriter.WriteAttributeString('VMSS_SKU_Tier', [string]$RESNames.sku.tier) $XmlTempWriter.WriteAttributeString('VMSS_Upgrade_Policy', [string]$RESNames.Properties.upgradePolicy.mode) $XmlTempWriter.WriteAttributeString('id', ($CellID3+'-1')) New-ARIDiagramSubnetIcon $IconVMSS ($SubnetLocation+65) ($Alt0+40) "68" "68" $ContainerID $XmlTempWriter.WriteEndElement() } } 'loadBalancers' { ('DrawIONetwork - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+" - Adding Load Balancer: " + $CellID3+'-1') | Out-File -FilePath $LogFile -Append if($RESNames.count -gt 1) { $XmlTempWriter.WriteStartElement('object') $XmlTempWriter.WriteAttributeString('label', ([string]$RESNames.Count + ' Load Balancers')) $Count = 1 foreach ($ResName in $RESNames) { $Attr1 = ('LB-'+[string]("{0:d3}" -f $Count)+'-Name') $Attr2 = ('LB-'+[string]("{0:d3}" -f $Count)+'-SKU') $Attr3 = ('LB-'+[string]("{0:d3}" -f $Count)+'-Backends') $Attr4 = ('LB-'+[string]("{0:d3}" -f $Count)+'-Frontends') $Attr5 = ('LB-'+[string]("{0:d3}" -f $Count)+'-LB_Rules') $Attr6 = ('LB-'+[string]("{0:d3}" -f $Count)+'-Probes') $XmlTempWriter.WriteAttributeString($Attr1, [string]$ResName.name) $XmlTempWriter.WriteAttributeString($Attr2, [string]$ResName.sku.name) $XmlTempWriter.WriteAttributeString($Attr3, [string]$ResName.properties.backendAddressPools.properties.backendIPConfigurations.id.count) $XmlTempWriter.WriteAttributeString($Attr4, [string]$ResName.properties.frontendIPConfigurations.properties.count) $XmlTempWriter.WriteAttributeString($Attr5, [string]$ResName.properties.loadBalancingRules.count) $XmlTempWriter.WriteAttributeString($Attr6, [string]$ResName.properties.probes.count) $Count ++ } $XmlTempWriter.WriteAttributeString('id', ($CellID3+'-1')) New-ARIDiagramSubnetIcon $IconLBs ($SubnetLocation+65) ($Alt0+40) "72" "72" $ContainerID $XmlTempWriter.WriteEndElement() } else { $XmlTempWriter.WriteStartElement('object') $XmlTempWriter.WriteAttributeString('label', [string]$RESNames.Name) $XmlTempWriter.WriteAttributeString('Load_Balancer_Name', [string]$ResNames.name) $XmlTempWriter.WriteAttributeString('Load_Balancer_SKU', [string]$ResNames.sku.name) $XmlTempWriter.WriteAttributeString('Backends', [string]$ResNames.properties.backendAddressPools.properties.backendIPConfigurations.id.count) $XmlTempWriter.WriteAttributeString('Frontends', [string]$ResNames.properties.frontendIPConfigurations.properties.count) $XmlTempWriter.WriteAttributeString('LB_Rules', [string]$ResNames.properties.loadBalancingRules.count) $XmlTempWriter.WriteAttributeString('Probes', [string]$ResNames.properties.probes.count) $XmlTempWriter.WriteAttributeString('id', ($CellID3+'-1')) New-ARIDiagramSubnetIcon $IconLBs ($SubnetLocation+65) ($Alt0+40) "72" "72" $ContainerID $XmlTempWriter.WriteEndElement() } } 'virtualNetworkGateways' { ('DrawIONetwork - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+" - Adding VPN Gateway: " + $CellID3+'-1') | Out-File -FilePath $LogFile -Append if($RESNames.count -gt 1) { $XmlTempWriter.WriteStartElement('object') $XmlTempWriter.WriteAttributeString('label', ([string]$RESNames.Count + ' Virtual Network Gateways')) $Count = 1 foreach ($ResName in $RESNames) { $Attr1 = ('Network_Gateway-'+[string]("{0:d3}" -f $Count)+'-Name') $XmlTempWriter.WriteAttributeString($Attr1, [string]$ResName.name) $Count ++ } $XmlTempWriter.WriteAttributeString('id', ($CellID3+'-1')) New-ARIDiagramSubnetIcon $IconVGW ($SubnetLocation+80) ($Alt0+40) "52" "69" $ContainerID $XmlTempWriter.WriteEndElement() } else { $XmlTempWriter.WriteStartElement('object') $XmlTempWriter.WriteAttributeString('label', [string]$RESNames.Name) $XmlTempWriter.WriteAttributeString('id', ($CellID3+'-1')) New-ARIDiagramSubnetIcon $IconVGW ($SubnetLocation+80) ($Alt0+40) "52" "69" $ContainerID $XmlTempWriter.WriteEndElement() } } 'azureFirewalls' { ('DrawIONetwork - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+" - Adding Azure Firewall: " + $CellID3+'-1') | Out-File -FilePath $LogFile -Append if($RESNames.count -gt 1) { $XmlTempWriter.WriteStartElement('object') $XmlTempWriter.WriteAttributeString('label', ([string]$RESNames.Count + ' Firewalls')) $Count = 1 foreach ($ResName in $RESNames) { $Attr1 = ('Firewall-'+[string]("{0:d3}" -f $Count)+'-Name') $Attr2 = ('Firewall-'+[string]("{0:d3}" -f $Count)+'-SKU') $Attr3 = ('Firewall-'+[string]("{0:d3}" -f $Count)+'-Threat_Intel_Mode') $XmlTempWriter.WriteAttributeString($Attr1, [string]$ResName.name) $XmlTempWriter.WriteAttributeString($Attr2, [string]$ResName.properties.sku.tier) $XmlTempWriter.WriteAttributeString($Attr3, [string]$ResName.properties.threatIntelMode) $Count ++ } $XmlTempWriter.WriteAttributeString('id', ($CellID3+'-1')) New-ARIDiagramSubnetIcon $IconFWs ($SubnetLocation+65) ($Alt0+40) "71" "60" $ContainerID $XmlTempWriter.WriteEndElement() } else { $XmlTempWriter.WriteStartElement('object') $XmlTempWriter.WriteAttributeString('label', [string]$RESNames.name) $XmlTempWriter.WriteAttributeString('Firewall_Name', [string]$ResNames.name) $XmlTempWriter.WriteAttributeString('SKU_Tier', [string]$ResNames.properties.sku.tier) $XmlTempWriter.WriteAttributeString('Threat_Intel_Mode', [string]$ResNames.properties.threatIntelMode) $XmlTempWriter.WriteAttributeString('id', ($CellID3+'-1')) New-ARIDiagramSubnetIcon $IconFWs ($SubnetLocation+65) ($Alt0+40) "71" "60" $ContainerID $XmlTempWriter.WriteEndElement() } } 'privateLinkServices' { ('DrawIONetwork - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+" - Adding PrivateLink: " + $CellID3+'-1') | Out-File -FilePath $LogFile -Append if($RESNames.count -gt 1) { $XmlTempWriter.WriteStartElement('object') $XmlTempWriter.WriteAttributeString('label', ([string]$RESNames.Count + ' Private Endpoints')) $Count = 1 foreach ($ResName in $RESNames) { $Attr1 = ('PVE-'+[string]("{0:d3}" -f $Count)+'-Name') $XmlTempWriter.WriteAttributeString($Attr1, [string]$ResName.name) $Count ++ } $XmlTempWriter.WriteAttributeString('id', ($CellID3+'-1')) New-ARIDiagramSubnetIcon $IconPVTs ($SubnetLocation+65) ($Alt0+40) "72" "66" $ContainerID $XmlTempWriter.WriteEndElement() } else { $XmlTempWriter.WriteStartElement('object') $XmlTempWriter.WriteAttributeString('label', [string]$RESNames.Name) $XmlTempWriter.WriteAttributeString('id', ($CellID3+'-1')) New-ARIDiagramSubnetIcon $IconPVTs ($SubnetLocation+65) ($Alt0+40) "72" "66" $ContainerID $XmlTempWriter.WriteEndElement() } } 'applicationGateways' { ('DrawIONetwork - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+" - Adding AppGateway: " + $CellID3+'-1') | Out-File -FilePath $LogFile -Append if($RESNames.count -gt 1) { $XmlTempWriter.WriteStartElement('object') $XmlTempWriter.WriteAttributeString('label', ([string]$RESNames.Count + ' Application Gateways')) $Count = 1 foreach ($ResName in $RESNames) { $Attr1 = ('App_Gateway-'+[string]("{0:d3}" -f $Count)+'-Name') $Attr2 = ('App_Gateway-'+[string]("{0:d3}" -f $Count)+'-SKU') $Attr3 = ('App_Gateway-'+[string]("{0:d3}" -f $Count)+'-Min_Capacity') $Attr4 = ('App_Gateway-'+[string]("{0:d3}" -f $Count)+'-Max_Capacity') $XmlTempWriter.WriteAttributeString($Attr1, [string]$ResName.name) $XmlTempWriter.WriteAttributeString($Attr2, [string]$RESName.Properties.sku.tier) $XmlTempWriter.WriteAttributeString($Attr3, [string]$RESName.Properties.autoscaleConfiguration.minCapacity) $XmlTempWriter.WriteAttributeString($Attr4, [string]$RESName.Properties.autoscaleConfiguration.maxCapacity) $Count ++ } $XmlTempWriter.WriteAttributeString('id', ($CellID3+'-1')) New-ARIDiagramSubnetIcon $IconAppGWs ($SubnetLocation+65) ($Alt0+40) "64" "64" $ContainerID $XmlTempWriter.WriteEndElement() } else { $XmlTempWriter.WriteStartElement('object') $XmlTempWriter.WriteAttributeString('label', [string]$RESNames.Name) $XmlTempWriter.WriteAttributeString('App_Gateway_Name', [string]$ResNames.name) $XmlTempWriter.WriteAttributeString('App_Gateway_SKU', [string]$RESNames.Properties.sku.tier) $XmlTempWriter.WriteAttributeString('Autoscale_Min_Capacity', [string]$RESNames.Properties.autoscaleConfiguration.minCapacity) $XmlTempWriter.WriteAttributeString('Autoscale_Max_Capacity', [string]$RESNames.Properties.autoscaleConfiguration.maxCapacity) $XmlTempWriter.WriteAttributeString('id', ($CellID3+'-1')) New-ARIDiagramSubnetIcon $IconAppGWs ($SubnetLocation+65) ($Alt0+40) "64" "64" $ContainerID $XmlTempWriter.WriteEndElement() } } 'bastionHosts' { ('DrawIONetwork - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+" - Adding BastionHost: " + $CellID3+'-1') | Out-File -FilePath $LogFile -Append if($RESNames.count -gt 1) { $XmlTempWriter.WriteStartElement('object') $XmlTempWriter.WriteAttributeString('label', ([string]$RESNames.Count + ' Bastion Hosts')) $Count = 1 foreach ($ResName in $RESNames) { $Attr1 = ('Bastion-'+[string]("{0:d3}" -f $Count)+'-Name') $XmlTempWriter.WriteAttributeString($Attr1, [string]$ResName.name) $Count ++ } $XmlTempWriter.WriteAttributeString('id', ($CellID3+'-1')) New-ARIDiagramSubnetIcon $IconBastions ($SubnetLocation+65) ($Alt0+40) "68" "67" $ContainerID $XmlTempWriter.WriteEndElement() } else { $XmlTempWriter.WriteStartElement('object') $XmlTempWriter.WriteAttributeString('label', [string]$RESNames.name) $XmlTempWriter.WriteAttributeString('id', ($CellID3+'-1')) New-ARIDiagramSubnetIcon $IconBastions ($SubnetLocation+65) ($Alt0+40) "68" "67" $ContainerID $XmlTempWriter.WriteEndElement() } } 'APIM' { ('DrawIONetwork - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+" - Adding APIM: " + $CellID3+'-1') | Out-File -FilePath $LogFile -Append $XmlTempWriter.WriteStartElement('object') $XmlTempWriter.WriteAttributeString('label', [string]$RESNames.Name) $APIMHost = [string]($RESNames.properties.hostnameConfigurations | Where-Object {$_.defaultSslBinding -eq $true}).hostname $XmlTempWriter.WriteAttributeString('APIM_Name', [string]$ResNames.name) $XmlTempWriter.WriteAttributeString('SKU', [string]$RESNames.sku.name) $XmlTempWriter.WriteAttributeString('VNET_Type', [string]$RESNames.properties.virtualNetworkType) $XmlTempWriter.WriteAttributeString('Default_Hostname', $APIMHost) $XmlTempWriter.WriteAttributeString('id', ($CellID3+'-1')) New-ARIDiagramSubnetIcon $IconAPIMs ($SubnetLocation+65) ($Alt0+40) "65" "60" $ContainerID $XmlTempWriter.WriteEndElement() } 'App Service' { ('DrawIONetwork - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+" - Adding App Service: " + $CellID3+'-1') | Out-File -FilePath $LogFile -Append if($ServiceAppNames) { if($RESNames.count -gt 1) { $XmlTempWriter.WriteStartElement('object') $XmlTempWriter.WriteAttributeString('label', ([string]$RESNames.Count + ' App Services')) $Count = 1 foreach ($ResName in $RESNames) { $Attr1 = ('AppService-'+[string]("{0:d3}" -f $Count)+'-Name') $XmlTempWriter.WriteAttributeString($Attr1, [string]$ResName.name) $Count ++ } $XmlTempWriter.WriteAttributeString('id', ($CellID3+'-1')) New-ARIDiagramSubnetIcon $IconAPPs ($SubnetLocation+65) ($Alt0+40) "64" "64" $ContainerID $XmlTempWriter.WriteEndElement() } else { $XmlTempWriter.WriteStartElement('object') $XmlTempWriter.WriteAttributeString('label', [string]$ResNames.name) $XmlTempWriter.WriteAttributeString('App_Name', [string]$ResNames.name) $XmlTempWriter.WriteAttributeString('Default_Hostname', [string]$RESNames.properties.defaultHostName) $XmlTempWriter.WriteAttributeString('Enabled', [string]$RESNames.properties.enabled) $XmlTempWriter.WriteAttributeString('State', [string]$RESNames.properties.state) $XmlTempWriter.WriteAttributeString('Inbound_IP_Address', [string]$RESNames.properties.inboundIpAddress) $XmlTempWriter.WriteAttributeString('Kind', [string]$RESNames.properties.kind) $XmlTempWriter.WriteAttributeString('SKU', [string]$RESNames.properties.sku) $XmlTempWriter.WriteAttributeString('Workers', [string]$RESNames.properties.siteConfig.numberOfWorkers) $XmlTempWriter.WriteAttributeString('Min_Workers', [string]$RESNames.properties.siteConfig.minimumElasticInstanceCount) $XmlTempWriter.WriteAttributeString('Site_Properties', [string]$RESNames.properties.siteProperties.properties.value) $XmlTempWriter.WriteAttributeString('id', ($CellID3+'-1')) New-ARIDiagramSubnetIcon $IconAPPs ($SubnetLocation+65) ($Alt0+40) "64" "64" $ContainerID $XmlTempWriter.WriteEndElement() } } } 'Function App' { ('DrawIONetwork - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+" - Adding Function App: " + $CellID3+'-1') | Out-File -FilePath $LogFile -Append if($FuntionAppNames) { if($RESNames.count -gt 1) { $XmlTempWriter.WriteStartElement('object') $XmlTempWriter.WriteAttributeString('label', ([string]$RESNames.Count + ' Function Apps')) $Count = 1 foreach ($ResName in $RESNames) { $Attr1 = ('FunctionApp-'+[string]("{0:d3}" -f $Count)+'-Name') $XmlTempWriter.WriteAttributeString($Attr1, [string]$ResName.name) $Count ++ } $XmlTempWriter.WriteAttributeString('id', ($CellID3+'-1')) New-ARIDiagramSubnetIcon $IconFunApps ($SubnetLocation+65) ($Alt0+40) "68" "60" $ContainerID $XmlTempWriter.WriteEndElement() } else { $XmlTempWriter.WriteStartElement('object') $XmlTempWriter.WriteAttributeString('label', [string]$ResNames.name) $XmlTempWriter.WriteAttributeString('App_Name', [string]$ResNames.name) $XmlTempWriter.WriteAttributeString('Default_Hostname', [string]$RESNames.properties.defaultHostName) $XmlTempWriter.WriteAttributeString('Enabled', [string]$RESNames.properties.enabled) $XmlTempWriter.WriteAttributeString('State', [string]$RESNames.properties.state) $XmlTempWriter.WriteAttributeString('Inbound_IP_Address', [string]$RESNames.properties.inboundIpAddress) $XmlTempWriter.WriteAttributeString('Kind', [string]$RESNames.properties.kind) $XmlTempWriter.WriteAttributeString('SKU', [string]$RESNames.properties.sku) $XmlTempWriter.WriteAttributeString('Workers', [string]$RESNames.properties.siteConfig.numberOfWorkers) $XmlTempWriter.WriteAttributeString('Min_Workers', [string]$RESNames.properties.siteConfig.minimumElasticInstanceCount) $XmlTempWriter.WriteAttributeString('Site_Properties', [string]$RESNames.properties.siteProperties.properties.value) $XmlTempWriter.WriteAttributeString('id', ($CellID3+'-1')) New-ARIDiagramSubnetIcon $IconFunApps ($SubnetLocation+65) ($Alt0+40) "68" "60" $ContainerID $XmlTempWriter.WriteEndElement() } } } 'DataBricks' { ('DrawIONetwork - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+" - Adding Databricks: " + $CellID3+'-1') | Out-File -FilePath $LogFile -Append if($DatabriksNames) { if($RESNames.count -gt 1) { $XmlTempWriter.WriteStartElement('object') $XmlTempWriter.WriteAttributeString('label', ([string]$RESNames.Count + ' Databricks')) $Count = 1 foreach ($ResName in $RESNames) { $Attr1 = ('Databrick-'+[string]("{0:d3}" -f $Count)+'-Name') $XmlTempWriter.WriteAttributeString($Attr1, [string]$ResName.name) $Count ++ } $XmlTempWriter.WriteAttributeString('id', ($CellID3+'-1')) New-ARIDiagramSubnetIcon $IconBricks ($SubnetLocation+65) ($Alt0+40) "60" "68" $ContainerID $XmlTempWriter.WriteEndElement() } else { $XmlTempWriter.WriteStartElement('object') $XmlTempWriter.WriteAttributeString('label', [string]$RESNames.Name) $XmlTempWriter.WriteAttributeString('Databrick_Name', [string]$ResNames.name) $XmlTempWriter.WriteAttributeString('Workspace_URL', [string]$RESNames.properties.workspaceUrl ) $XmlTempWriter.WriteAttributeString('Pricing_Tier', [string]$RESNames.sku.name) $XmlTempWriter.WriteAttributeString('Storage_Account', [string]$RESNames.properties.parameters.storageAccountName.value) $XmlTempWriter.WriteAttributeString('Storage_Account_SKU', [string]$RESNames.properties.parameters.storageAccountSkuName.value) $XmlTempWriter.WriteAttributeString('Relay_Namespace', [string]$RESNames.properties.parameters.relayNamespaceName.value) $XmlTempWriter.WriteAttributeString('Require_Infrastructure_Encryption', [string]$RESNames.properties.parameters.requireInfrastructureEncryption.value) $XmlTempWriter.WriteAttributeString('Enable_Public_IP', [string]$RESNames.properties.parameters.enableNoPublicIp.value) $XmlTempWriter.WriteAttributeString('id', ($CellID3+'-1')) New-ARIDiagramSubnetIcon $IconBricks ($SubnetLocation+65) ($Alt0+40) "60" "68" $ContainerID $XmlTempWriter.WriteEndElement() } } } 'Open Shift' { ('DrawIONetwork - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+" - Adding OpenShift: " + $CellID3+'-1') | Out-File -FilePath $LogFile -Append if($ARONames) { if($RESNames.count -gt 1) { $XmlTempWriter.WriteStartElement('object') $XmlTempWriter.WriteAttributeString('label', ([string]$RESNames.Count + ' OpenShift Clusters')) $Count = 1 foreach ($ResName in $RESNames) { $Attr1 = ('OpenShift_Cluster-'+[string]("{0:d3}" -f $Count)+'-Name') $XmlTempWriter.WriteAttributeString($Attr1, [string]$ResName.name) $Count ++ } $XmlTempWriter.WriteAttributeString('id', ($CellID3+'-1')) New-ARIDiagramSubnetIcon $IconARO ($SubnetLocation+65) ($Alt0+40) "68" "60" $ContainerID $XmlTempWriter.WriteEndElement() } else { $XmlTempWriter.WriteStartElement('object') $XmlTempWriter.WriteAttributeString('label', [string]$RESNames.Name) $XmlTempWriter.WriteAttributeString('ARO_Name', [string]$ResNames.name) $XmlTempWriter.WriteAttributeString('OpenShift_Version', [string]$RESNames.properties.clusterProfile.version) $XmlTempWriter.WriteAttributeString('OpenShift_Console', [string]$RESNames.properties.consoleProfile.url) $XmlTempWriter.WriteAttributeString('Worker_VM_Count', [string]$RESNames.properties.workerprofiles.Count) $XmlTempWriter.WriteAttributeString('Worker_VM_Size', [string]$RESNames.properties.workerprofiles.vmSize[0]) $XmlTempWriter.WriteAttributeString('id', ($CellID3+'-1')) New-ARIDiagramSubnetIcon $IconARO ($SubnetLocation+65) ($Alt0+40) "68" "60" $ContainerID $XmlTempWriter.WriteEndElement() } } } 'Container Instance' { ('DrawIONetwork - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+" - Adding Container Instance: " + $CellID3+'-1') | Out-File -FilePath $LogFile -Append if($ContainerNames) { if($RESNames.count -gt 1) { $XmlTempWriter.WriteStartElement('object') $XmlTempWriter.WriteAttributeString('label', ([string]$RESNames.Count + ' Container Intances')) $Count = 1 foreach ($ResName in $RESNames) { $Attr1 = ('Container_Intance-'+[string]("{0:d3}" -f $Count)+'-Name') $XmlTempWriter.WriteAttributeString($Attr1, [string]$ResName.name) $Count ++ } $XmlTempWriter.WriteAttributeString('id', ($CellID3+'-1')) New-ARIDiagramSubnetIcon $IconContain ($SubnetLocation+65) ($Alt0+40) "64" "68" $ContainerID $XmlTempWriter.WriteEndElement() } else { $XmlTempWriter.WriteStartElement('object') $XmlTempWriter.WriteAttributeString('label', [string]$RESNames.Name) $XmlTempWriter.WriteAttributeString('id', ($CellID3+'-1')) New-ARIDiagramSubnetIcon $IconContain ($SubnetLocation+65) ($Alt0+40) "64" "68" $ContainerID $XmlTempWriter.WriteEndElement() } } } 'NetApp' { ('DrawIONetwork - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+" - Adding ANF: " + $CellID3+'-1') | Out-File -FilePath $LogFile -Append if($NetAppNames) { if($RESNames.count -gt 1) { $XmlTempWriter.WriteStartElement('object') $XmlTempWriter.WriteAttributeString('label', ([string]$RESNames.Count + ' NetApp Volumes')) $Count = 1 foreach ($ResName in $RESNames) { $Attr1 = ('NetApp_Volume-'+[string]("{0:d3}" -f $Count)) $XmlTempWriter.WriteAttributeString($Attr1, [string]$ResName.name) $Count ++ } $XmlTempWriter.WriteAttributeString('id', ($CellID3+'-1')) New-ARIDiagramSubnetIcon $IconNetApp ($SubnetLocation+65) ($Alt0+40) "65" "52" $ContainerID $XmlTempWriter.WriteEndElement() } else { $XmlTempWriter.WriteStartElement('object') $XmlTempWriter.WriteAttributeString('label', ([string]1+' NetApp Volume')) $XmlTempWriter.WriteAttributeString('NetApp_Volume_Name', [string]$ResName.name) $XmlTempWriter.WriteAttributeString('id', ($CellID3+'-1')) New-ARIDiagramSubnetIcon $IconNetApp ($SubnetLocation+65) ($Alt0+40) "65" "52" $ContainerID $XmlTempWriter.WriteEndElement() } } } 'Data Explorer Clusters' { ('DrawIONetwork - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+" - Adding Data Explorer Cluster: " + $CellID3+'-1') | Out-File -FilePath $LogFile -Append if($RESNames.count -gt 1) { $XmlTempWriter.WriteStartElement('object') $XmlTempWriter.WriteAttributeString('label', ([string]$RESNames.Count + ' Data Explorer Clusters')) $Count = 1 foreach ($ResName in $RESNames) { $Attr1 = ('Data_Cluster-'+[string]("{0:d3}" -f $Count)+'-Name') $XmlTempWriter.WriteAttributeString($Attr1, [string]$ResName.name) $Count ++ } $XmlTempWriter.WriteAttributeString('id', ($CellID3+'-1')) New-ARIDiagramSubnetIcon $IconDataExplorer ($SubnetLocation+65) ($Alt0+40) "68" "68" $ContainerID $XmlTempWriter.WriteEndElement() } else { $XmlTempWriter.WriteStartElement('object') $XmlTempWriter.WriteAttributeString('label', [string]$RESNames.Name) $XmlTempWriter.WriteAttributeString('Data_Explorer_Cluster_Name', [string]$ResNames.name) $XmlTempWriter.WriteAttributeString('Data_Explorer_Cluster_URI', [string]$ResNames.name) $XmlTempWriter.WriteAttributeString('Data_Explorer_Cluster_State', [string]$ResNames.name) $XmlTempWriter.WriteAttributeString('SKU_Tier', [string]$ResNames.name) $XmlTempWriter.WriteAttributeString('Computer_Specifications', [string]$ResNames.name) $XmlTempWriter.WriteAttributeString('AutoScale_Enabled', [string]$ResNames.name) $XmlTempWriter.WriteAttributeString('id', ($CellID3+'-1')) New-ARIDiagramSubnetIcon $IconDataExplorer ($SubnetLocation+65) ($Alt0+40) "68" "68" $ContainerID $XmlTempWriter.WriteEndElement() } } 'Network Interface' { ('DrawIONetwork - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+" - Adding NIC: " + $CellID3+'-1') | Out-File -FilePath $LogFile -Append if($RESNames.count -gt 1) { $XmlTempWriter.WriteStartElement('object') $XmlTempWriter.WriteAttributeString('label', ([string]$RESNames.Count + ' Network Interfaces')) $Count = 1 foreach ($ResName in $RESNames) { $Attr1 = ('NIC-'+[string]("{0:d3}" -f $Count)+'-Name') $XmlTempWriter.WriteAttributeString($Attr1, [string]$ResName.name) $Count ++ } $XmlTempWriter.WriteAttributeString('id', ($CellID3+'-1')) New-ARIDiagramSubnetIcon $IconNIC ($SubnetLocation+65) ($Alt0+40) "68" "60" $ContainerID $XmlTempWriter.WriteEndElement() } else { $XmlTempWriter.WriteStartElement('object') $XmlTempWriter.WriteAttributeString('label', ([string]1+' Network Interface')) $Attr1 = ('NIC-Name') $XmlTempWriter.WriteAttributeString($Attr1, [string]$ResName.name) $XmlTempWriter.WriteAttributeString('id', ($CellID3+'-1')) New-ARIDiagramSubnetIcon $IconNIC ($SubnetLocation+65) ($Alt0+40) "68" "60" $ContainerID $XmlTempWriter.WriteEndElement() } } '' {('DrawIONetwork - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+" - Not Adding ProcType: " + 'Blank Resource Type Name') | Out-File -FilePath $LogFile -Append} default {('DrawIONetwork - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+" - Not Adding ProcType: $TrueTemp - " + 'Missing ResourceType in the list') | Out-File -FilePath $LogFile -Append} } if($sub.properties.networkSecurityGroup.id) { $NSG = $sub.properties.networkSecurityGroup.id.split('/')[8] $XmlTempWriter.WriteStartElement('object') $XmlTempWriter.WriteAttributeString('label', '') $XmlTempWriter.WriteAttributeString('Network_Security_Group', [string]$NSG) $XmlTempWriter.WriteAttributeString('id', ($CellID3+'-2')) ('DrawIONetwork - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+" - Adding NSG: " + $CellID3+'-2') | Out-File -FilePath $LogFile -Append New-ARIDiagramSubnetIcon $IconNSG ($SubnetLocation+160) ($Alt0+15) "26.35" "32" $ContainerID $XmlTempWriter.WriteEndElement() } if($sub.properties.routeTable.id) { $UDR = $sub.properties.routeTable.id.split('/')[8] $XmlTempWriter.WriteStartElement('object') $XmlTempWriter.WriteAttributeString('label', '') $XmlTempWriter.WriteAttributeString('Route_Table', [string]$UDR) $XmlTempWriter.WriteAttributeString('id', ($CellID3+'-3')) ('DrawIONetwork - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+" - Adding UDR: " + $CellID3+'-3') | Out-File -FilePath $LogFile -Append New-ARIDiagramSubnetIcon $IconUDR ($SubnetLocation+15) ($Alt0+15) "30.97" "30" $ContainerID $XmlTempWriter.WriteEndElement() } if($sub.properties.ipconfigurations.id) { Foreach($SubIPs in $sub.properties.ipconfigurations) { $Script:VNETPIP += $Script:CleanPIPs | Where-Object {$_.properties.ipConfiguration.id -eq $SubIPs.id} } } } ######################################################### ICON ####################################################### Function New-ARIDiagramSubnetIcon { Param($Style,$x,$y,$w,$h,$p) $XmlTempWriter.WriteStartElement('mxCell') $XmlTempWriter.WriteAttributeString('style', $Style) $XmlTempWriter.WriteAttributeString('vertex', "1") $XmlTempWriter.WriteAttributeString('parent', $p) $XmlTempWriter.WriteStartElement('mxGeometry') $XmlTempWriter.WriteAttributeString('x', $x) $XmlTempWriter.WriteAttributeString('y', $y) $XmlTempWriter.WriteAttributeString('width', $w) $XmlTempWriter.WriteAttributeString('height', $h) $XmlTempWriter.WriteAttributeString('as', "geometry") $XmlTempWriter.WriteEndElement() $XmlTempWriter.WriteEndElement() } ######################################################## SUBNET ####################################################### Publish-ARIDiagramStensils $XmlTempWriter = New-Object System.XMl.XmlTextWriter($SubFile,$Null) $XmlTempWriter.Formatting = 'Indented' $XmlTempWriter.Indentation = 2 $XmlTempWriter.WriteStartDocument() $XmlTempWriter.WriteStartElement('mxfile') $XmlTempWriter.WriteAttributeString('host', 'Electron') $XmlTempWriter.WriteAttributeString('modified', '2021-10-01T21:45:40.561Z') $XmlTempWriter.WriteAttributeString('agent', '5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/15.4.0 Chrome/91.0.4472.164 Electron/13.5.0 Safari/537.36') $XmlTempWriter.WriteAttributeString('etag', $etag) $XmlTempWriter.WriteAttributeString('version', '15.4.0') $XmlTempWriter.WriteAttributeString('type', 'device') $XmlTempWriter.WriteStartElement('diagram') $XmlTempWriter.WriteAttributeString('id', $DiagID) $XmlTempWriter.WriteAttributeString('name', 'Network Topology') $XmlTempWriter.WriteStartElement('mxGraphModel') $XmlTempWriter.WriteAttributeString('dx', "1326") $XmlTempWriter.WriteAttributeString('dy', "798") $XmlTempWriter.WriteAttributeString('grid', "1") $XmlTempWriter.WriteAttributeString('gridSize', "10") $XmlTempWriter.WriteAttributeString('guides', "1") $XmlTempWriter.WriteAttributeString('tooltips', "1") $XmlTempWriter.WriteAttributeString('connect', "1") $XmlTempWriter.WriteAttributeString('arrows', "1") $XmlTempWriter.WriteAttributeString('fold', "1") $XmlTempWriter.WriteAttributeString('page', "1") $XmlTempWriter.WriteAttributeString('pageScale', "1") $XmlTempWriter.WriteAttributeString('pageWidth', "850") $XmlTempWriter.WriteAttributeString('pageHeight', "1100") $XmlTempWriter.WriteAttributeString('math', "0") $XmlTempWriter.WriteAttributeString('shadow', "0") $XmlTempWriter.WriteStartElement('root') $XmlTempWriter.WriteStartElement('mxCell') $XmlTempWriter.WriteAttributeString('id', "0") $XmlTempWriter.WriteEndElement() $XmlTempWriter.WriteStartElement('mxCell') $XmlTempWriter.WriteAttributeString('id', "1") $XmlTempWriter.WriteAttributeString('parent', "0") $XmlTempWriter.WriteEndElement() $sizeL = $VNET.properties.subnets.properties.addressPrefix.count if ($sizeL -gt 5) { $sizeL = $sizeL / 2 $sizeL = [math]::ceiling($sizeL) $sizeC = $sizeL $sizeL = (($sizeL * 210) + 30) $SubnetLocation0 = 20 $SubC = 0 $alt1 = 40 $Script:VNETPIP = @() foreach($Sub in $VNET.properties.subnets) { $IDNum++ if ($SubC -eq $sizeC) { $Alt1 = $Alt1 + 230 $SubnetLocation0 = 20 $SubC = 0 } $LoggingSubnetName = $sub.Name ('DrawIONetwork - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+" - Adding Subnet ($LoggingSubnetName): " + $CellID2+'-'+$IDNum) | Out-File -FilePath $LogFile -Append $XmlTempWriter.WriteStartElement('object') $XmlTempWriter.WriteAttributeString('label', ("`n" + "`n" + "`n" + "`n" + "`n" + "`n" +[string]$sub.Name + "`n" + [string]$sub.properties.addressPrefix)) $XmlTempWriter.WriteAttributeString('id', ($CellID2+'-'+$IDNum)) New-ARIDiagramSubnetIcon "rounded=0;whiteSpace=wrap;fontSize=16;html=1;sketch=0;fontFamily=Helvetica;" $SubnetLocation0 $Alt1 "200" "200" $ContainerID $XmlTempWriter.WriteEndElement() Set-ARIDiagramSubnetComponent $sub $SubnetLocation0 $Alt1 $ContainerID $LogFile $SubnetLocation = $SubnetLocation + 210 $SubnetLocation0 = $SubnetLocation0 + 210 $SubC ++ } } Else { $sizeL = (($sizeL * 210) + 30) $SubnetLocation0 = 20 $Script:VNETPIP = @() foreach($Sub in $VNET.properties.subnets) { $IDNum++ $LoggingSubnetName = $sub.Name ('DrawIONetwork - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+" - Adding Subnet ($LoggingSubnetName): " + $CellID2+'-'+$IDNum) | Out-File -FilePath $LogFile -Append $XmlTempWriter.WriteStartElement('object') $XmlTempWriter.WriteAttributeString('label', ("`n" + "`n" + "`n" + "`n" + "`n" + "`n" +[string]$sub.Name + "`n" + [string]$sub.properties.addressPrefix)) $XmlTempWriter.WriteAttributeString('id', ($CellID2+'-'+$IDNum)) New-ARIDiagramSubnetIcon "rounded=0;whiteSpace=wrap;fontSize=16;html=1;sketch=0;fontFamily=Helvetica;" $SubnetLocation0 40 "200" "200" $ContainerID $XmlTempWriter.WriteEndElement() Set-ARIDiagramSubnetComponent $sub $SubnetLocation0 40 $ContainerID $LogFile $SubnetLocation = $SubnetLocation + 210 $SubnetLocation0 = $SubnetLocation0 + 210 } } $XmlTempWriter.WriteEndElement() $XmlTempWriter.WriteEndElement() $XmlTempWriter.WriteEndElement() $XmlTempWriter.WriteEndElement() $XmlTempWriter.WriteEndDocument() $XmlTempWriter.Flush() $XmlTempWriter.Close() } catch { ('DrawIONetwork - '+(get-date -Format 'yyyy-MM-dd_HH_mm_ss')+' - Error: ' + $_.Exception.Message) | Out-File -FilePath $LogFile -Append } } |