Examples/Example10.ps1
|
# ** This time, we'll demonstrate the use of the Add-DiaNodeImage to add a custom image to the diagram (Part of Diagrammer.Core module). ** <# This example demonstrates how to create a 3-tier web application diagram using the Diagrammer module. #> [CmdletBinding()] param ( [System.IO.FileInfo] $Path = '~\Desktop\', [array] $Format = @('png'), [bool] $DraftMode = $false ) <# Starting with PowerShell v3, modules do not need to be explicitly imported. It is included here for clarity. #> # Import-Module Diagrammer.Core -Force -Verbose:$false <# The diagram output is a file, so we need to specify the output folder path. In this example, $OutputFolderPath is used. #> $OutputFolderPath = Resolve-Path -Path $Path <# If the diagram uses custom icons, specify the path to the icons directory. This is a Graphviz requirement. #> $RootPath = $PSScriptRoot [System.IO.FileInfo]$IconPath = Join-Path -Path $RootPath -ChildPath 'Icons' <# The $Images variable is a hashtable containing the names of image files used in the diagram. The image files must be located in the directory specified by $IconPath. ** Image sizes should be around 100x100, 150x150 pixels for optimal display. ** #> $script:Images = @{ 'Main_Logo' = 'Diagrammer.png' 'Server' = 'Server.png' 'ServerRedhat' = 'Linux_Server_RedHat.png' 'ServerUbuntu' = 'Linux_Server_Ubuntu.png' 'Cloud' = 'Cloud.png' 'Router' = 'Router.png' } <# The $MainGraphLabel variable sets the main title of the diagram. #> $MainGraphLabel = 'Web Application Diagram' <# This section creates custom objects to hold server information, which are used to set node labels in the diagram. #> $AppServerInfo = [PSCustomObject][ordered]@{ 'OS' = 'Windows Server' 'Version' = '2019' 'Build' = '17763.3163' 'Edition' = 'Datacenter' } $DBServerInfo = [PSCustomObject][ordered]@{ 'OS' = 'Oracle Server' 'Version' = '8' 'Build' = '8.2' 'Edition' = 'Enterprise' } $example10 = & { <# A SubGraph allows you to group objects in a container, creating a graph within a graph. SubGraph, Node, and Edge have attributes for setting background color, label, border color, style, etc. (SubGraph is a reserved word in the PSGraph module) https://psgraph.readthedocs.io/en/latest/Command-SubGraph/ #> SubGraph 3tier -Attributes @{Label = '3 Tier Concept'; fontsize = 22; penwidth = 1.5; labelloc = 't'; style = 'dashed,rounded'; color = 'darkgray' } { <# The $WebServerFarm variable is an array of hashtables, each representing a web server node with its properties. Each hashtable contains: - Name: The name of the web server. - AdditionalInfo: A custom object with properties to display in the node label. - IconType: The type of icon to use for the node (must match a key in the $Images hashtable). #> $WebServerFarm = @( @{ Name = 'Web-Server-01'; AdditionalInfo = [PSCustomObject][ordered]@{ 'OS' = 'Redhat Linux' 'Version' = '10' 'Build' = '10.1' 'Edition' = 'Enterprise' } IconType = 'ServerRedhat' }, @{ Name = 'Web-Server-02'; AdditionalInfo = [PSCustomObject][ordered]@{ 'OS' = 'Redhat Linux' 'Version' = '10' 'Build' = '10.1' 'Edition' = 'Enterprise' } IconType = 'ServerRedhat' }, @{ Name = 'Web-Server-03'; AdditionalInfo = [PSCustomObject][ordered]@{ 'OS' = 'Ubuntu Linux' 'Version' = '24' 'Build' = '11' 'Edition' = 'Enterprise' } IconType = 'ServerUbuntu' } ) <# This time, we will simulate a Web Server Farm with multiple web server node. While the Add-DiaNodeIcon cmdlet is typically used to add icons/properties to nodes, it lack the ability to create multiple nodes with distinct properties. Add-DiaHTMLNodeTable has the capability to create a table layout for the nodes simulting a web server farm. It also allows the addition of icons and properties to each node in the table. ** The $Images object and IconType "Server" must be defined earlier in the script ** -MultiIcon parameter allows multiple icons to be displayed in the table. (IconType must be specified in the inputObject) -iconType parameter sets the type of icon to use for the nodes. In this case the $WebServerFarm.IconType hashtable value is used (must match a key in the $Images hashtable). #> Add-DiaHtmlNodeTable -Name 'Web-Server-Farm' -ImagesObj $Images -inputObject $WebServerFarm.Name -iconType $WebServerFarm.IconType -ColumnSize 3 -AditionalInfo $WebServerFarm.AdditionalInfo -Subgraph -SubgraphLabel 'Web Server Farm' -SubgraphLabelPos 'top' -SubgraphTableStyle 'dashed,rounded' -TableBorderColor 'gray' -TableBorder '1' -SubgraphLabelFontSize 20 -FontSize 18 -DraftMode:$DraftMode -FontBold -SubgraphFontBold -NodeObject -MultiIcon Add-DiaNodeIcon -Name 'App-Server-01' -AditionalInfo $AppServerInfo -ImagesObj $Images -IconType 'Server' -Align 'Center' -FontSize 18 -DraftMode:$DraftMode -NodeObject Add-DiaNodeIcon -Name 'Db-Server-01' -AditionalInfo $DBServerInfo -ImagesObj $Images -IconType 'Server' -Align 'Center' -FontSize 18 -DraftMode:$DraftMode -NodeObject <# This section creates connections between the nodes in a hierarchical layout. The Add-DiaNodeEdge cmdlet creates connections between the nodes. (Part of Diagrammer.Core module) https://github.com/rebelinux/Diagrammer.Core #> Add-DiaNodeEdge -From 'Web-Server-Farm' -To 'App-Server-01' -EdgeLabel 'gRPC' -EdgeColor 'black' -EdgeLabelFontSize 14 -EdgeLabelFontColor 'black' -EdgeLength 3 -EdgeThickness 3 -EdgeStyle 'dashed' Add-DiaNodeEdge -From 'App-Server-01' -To 'Db-Server-01' -EdgeLabel 'SQL' -EdgeColor 'black' -EdgeLabelFontSize 14 -EdgeLabelFontColor 'black' -EdgeLength 3 -EdgeThickness 3 -EdgeStyle 'dashed' <# The Rank cmdlet is used to place nodes at the same hierarchical level. In this example, App-Server-01 and Db-Server-01 are aligned horizontally. #> Rank -Nodes 'App-Server-01', 'Db-Server-01' <# In this section, we add a network router and a cloud icon to represent internet connectivity. #> $RouterInfo = [PSCustomObject][ordered]@{ 'OS' = 'Cisco IOS' 'Version' = '15.2' } Add-DiaNodeIcon -Name 'Core-Router' -AdditionalInfo $RouterInfo -ImagesObj $Images -IconType 'Router' -Align 'Center' -FontSize 18 -DraftMode:$DraftMode -NodeObject Add-DiaNodeEdge -From 'Core-Router' -To 'Web-Server-Farm' -EdgeLabel 'GE0/0' -EdgeColor 'black' -EdgeLabelFontSize 18 -EdgeLabelFontColor 'black' -EdgeLength 2 -EdgeThickness 3 -EdgeStyle 'dashed' <# This section demonstrates the use of the Add-DiaNodeImage to add a custom image to the diagram (Part of Diagrammer.Core module). -Name parameter sets the name of the node (WAN in this case). -ImageSizePercent parameter sets the size of the image as a percentage (30% in this case). #> Add-DiaNodeImage -Name 'WAN' -ImagesObj $Images -IconType 'Cloud' -IconPath $IconPath -ImageSizePercent 30 -NodeObject -DraftMode:$DraftMode Add-DiaNodeEdge -From 'WAN' -To 'Core-Router' -EdgeLabel 'Serial0/0' -EdgeColor 'black' -EdgeLabelFontSize 18 -EdgeLabelFontColor 'black' -EdgeLength 2 -EdgeThickness 3 -EdgeStyle 'dashed' } } <# This command generates the diagram using the New-Diagrammer cmdlet (part of Diagrammer.Core). #> New-Diagrammer -InputObject $example10 -OutputFolderPath $OutputFolderPath -Format $Format -MainDiagramLabel $MainGraphLabel -Filename Example10 -LogoName 'Main_Logo' -Direction top-to-bottom -IconPath $IconPath -ImagesObj $Images -DraftMode:$DraftMode |