Network diagram (nwdiag)
nwdiag has been created by Takeshi Komiya and allows to quickly draw network diagrams. So we thank him for his creation!
Since the syntax is clear and simple, this has been integrated within PlantUML. We reuse here the examples that Takeshi has documented.
Define multiple addresses
@startuml
nwdiag {
network dmz {
address = "210.x.x.x/24"
// set multiple addresses (using comma)
web01 [address = "210.x.x.1, 210.x.x.20"];
web02 [address = "210.x.x.2"];
}
network internal {
address = "172.x.x.x/24";
web01 [address = "172.x.x.1"];
web02 [address = "172.x.x.2"];
db01;
db02;
}
}
@enduml
Grouping nodes
Define group inside network definitions
@startuml
nwdiag {
network Sample_front {
address = "192.168.10.0/24";
// define group
group web {
web01 [address = ".1"];
web02 [address = ".2"];
}
}
network Sample_back {
address = "192.168.20.0/24";
web01 [address = ".1"];
web02 [address = ".2"];
db01 [address = ".101"];
db02 [address = ".102"];
// define network using defined nodes
group db {
db01;
db02;
}
}
}
@enduml
Define several groups on same network
Example with 2 group
@startuml
nwdiag {
group {
color = "#FFaaaa";
web01;
db01;
}
group {
color = "#aaaaFF";
web02;
db02;
}
network dmz {
address = "210.x.x.x/24"
web01 [address = "210.x.x.1"];
web02 [address = "210.x.x.2"];
}
network internal {
address = "172.x.x.x/24";
web01 [address = "172.x.x.1"];
web02 [address = "172.x.x.2"];
db01 ;
db02 ;
}
}
@enduml
[Ref. QA-12663]
Example with 3 groups
@startuml
nwdiag {
group {
color = "#FFaaaa";
web01;
db01;
}
group {
color = "#aaFFaa";
web02;
db02;
}
group {
color = "#aaaaFF";
web03;
db03;
}
network dmz {
web01;
web02;
web03;
}
network internal {
web01;
db01 ;
web02;
db02 ;
web03;
db03;
}
}
@enduml
[Ref. QA-13138]
Extended Syntax (for network or group)
Network
For network or network’s component, you can add or change:
* addresses (separated by comma ,
);
* link::color[color];
* description;
* link::deployment-diagram#5k3cq00k8n5ek362kjdn[shape].
@startuml
nwdiag {
network Sample_front {
address = "192.168.10.0/24"
color = "red"
// define group
group web {
web01 [address = ".1, .2", shape = "node"]
web02 [address = ".2, .3"]
}
}
network Sample_back {
address = "192.168.20.0/24"
color = "palegreen"
web01 [address = ".1"]
web02 [address = ".2"]
db01 [address = ".101", shape = database ]
db02 [address = ".102"]
// define network using defined nodes
group db {
db01;
db02;
}
}
}
@enduml
Group
For a group, you can add or change: * link::color[color]; * description.
@startuml
nwdiag {
group {
color = "#CCFFCC";
description = "Long group description";
web01;
web02;
db01;
}
network dmz {
web01;
web02;
}
network internal {
web01;
web02;
db01 [address = ".101", shape = database];
}
}
@enduml
[Ref. QA-12056]
Using Sprites
You can use all link::sprite[sprites] (icons) from the link::stdlib[Standard Library] or any other library.
Use the notation <$sprite>
to use a sprite, \n
to make a new line, or any other link::creole[Creole] syntax.
@startuml
!include
!include
nwdiag {
network dmz {
address = "210.x.x.x/24"
// set multiple addresses (using comma)
web01 [address = "210.x.x.1, 210.x.x.20", description = "<$application_server>\n web01"]
web02 [address = "210.x.x.2", description = "<$application_server>\n web02"];
}
network internal {
address = "172.x.x.x/24";
web01 [address = "172.x.x.1"];
web02 [address = "172.x.x.2"];
db01 [address = "172.x.x.100", description = "<$database_server>\n db01"];
db02 [address = "172.x.x.101", description = "<$database_server>\n db02"];
}
}
@enduml
[Ref. QA-11862]
Using OpenIconic
You can also use the icons from link::openiconic[OpenIconic] in network or node descriptions.
Use the notation <&icon>
to make an icon, <&icon*n>
to multiply the size by a factor n
, and \n
to make a newline:
@startuml
nwdiag {
group nightly {
color = "#FFAAAA";
description = "<&clock> Restarted nightly <&clock>";
web02;
db01;
}
network dmz {
address = "210.x.x.x/24"
user [description = "<&person*4.5>\n user1"];
// set multiple addresses (using comma)
web01 [address = "210.x.x.1, 210.x.x.20", description = "<&cog*4>\nweb01"]
web02 [address = "210.x.x.2", description = "<&cog*4>\nweb02"];
}
network internal {
address = "172.x.x.x/24";
web01 [address = "172.x.x.1"];
web02 [address = "172.x.x.2"];
db01 [address = "172.x.x.100", description = "<&spreadsheet*4>\n db01"];
db02 [address = "172.x.x.101", description = "<&spreadsheet*4>\n db02"];
ptr [address = "172.x.x.110", description = "<&print*4>\n ptr01"];
}
}
@enduml
Same nodes on more than two networks
You can use same nodes on different networks (more than two networks); nwdiag use in this case 'jump line' over networks.
Add title, caption, header, footer or legend on network diagram
@startuml
header some header
footer some footer
title My title
nwdiag {
network inet {
web01 [shape = cloud]
}
}
legend
The legend
end legend
caption This is caption
@enduml
[Ref. QA-11303 and link::commons[Common commands]]
With or without shadow
Without shadow
[Ref. QA-14516]
Change width of the networks
You can change the width of the networks, especially in order to have the same full width for only some or all networks.
Here are some examples, with all the possibilities: * without
@startuml
nwdiag {
network NETWORK_BASE {
dev_A [address = "dev_A" ]
dev_B [address = "dev_B" ]
}
network IntNET1 {
dev_B [address = "dev_B1" ]
dev_M [address = "dev_M1" ]
}
network IntNET2 {
dev_B [address = "dev_B2" ]
dev_M [address = "dev_M2" ]
}
}
@enduml
-
only the first
@startuml nwdiag { network NETWORK_BASE { width = full dev_A [address = "dev_A" ] dev_B [address = "dev_B" ] } network IntNET1 { dev_B [address = "dev_B1" ] dev_M [address = "dev_M1" ] } network IntNET2 { dev_B [address = "dev_B2" ] dev_M [address = "dev_M2" ] } } @enduml
-
the first and the second
@startuml nwdiag { network NETWORK_BASE { width = full dev_A [address = "dev_A" ] dev_B [address = "dev_B" ] } network IntNET1 { width = full dev_B [address = "dev_B1" ] dev_M [address = "dev_M1" ] } network IntNET2 { dev_B [address = "dev_B2" ] dev_M [address = "dev_M2" ] } } @enduml
-
all the network (with same full width)
@startuml nwdiag { network NETWORK_BASE { width = full dev_A [address = "dev_A" ] dev_B [address = "dev_B" ] } network IntNET1 { width = full dev_B [address = "dev_B1" ] dev_M [address = "dev_M1" ] } network IntNET2 { width = full dev_B [address = "dev_B2" ] dev_M [address = "dev_M2" ] } } @enduml
Other internal networks
You can define other internal networks (TCP/IP, USB, SERIAL,…).
-
Without address or type
@startuml nwdiag { network LAN1 { a [address = "a1"]; } network LAN2 { a [address = "a2"]; switch; } switch -- equip; equip -- printer; } @enduml
-
With address or type
@startuml nwdiag { network LAN1 { a [address = "a1"]; } network LAN2 { a [address = "a2"]; switch [address = "s2"]; } switch -- equip; equip [address = "e3"]; equip -- printer; printer [address = "USB"]; } @enduml
[Ref. QA-12824]
Using (global) style
With style
You can use link::style-evolution[style] to change rendering of elements.
@startuml
nwdiag {
network DMZ {
address = "y.x.x.x/24"
web01 [address = "y.x.x.1"];
web02 [address = "y.x.x.2"];
}
network Internal {
web01;
web02;
db01 [address = "w.w.w.z", shape = database];
}
group {
description = "long group label";
web01;
web02;
db01;
}
}
@enduml
[Ref. QA-14479]
Appendix: Test of all shapes on Network diagram (nwdiag)
@startuml
nwdiag {
network Network {
Actor [shape = actor]
Agent [shape = agent]
Artifact [shape = artifact]
Boundary [shape = boundary]
Card [shape = card]
Cloud [shape = cloud]
Collections [shape = collections]
Component [shape = component]
}
}
@enduml
@startuml
nwdiag {
network Network {
Control [shape = control]
Database [shape = database]
Entity [shape = entity]
File [shape = file]
Folder [shape = folder]
Frame [shape = frame]
Hexagon [shape = hexagon]
Interface [shape = interface]
}
}
@enduml
@startuml
nwdiag {
network Network {
Label [shape = label]
Node [shape = node]
Package [shape = package]
Person [shape = person]
Queue [shape = queue]
Stack [shape = stack]
Rectangle [shape = rectangle]
Storage [shape = storage]
Usecase [shape = usecase]
}
}
@enduml
[[#FFAAAA#FIXME]] . Overlap of label for folder . Hexagon shape is missing
@startuml
nwdiag {
network Network {
Folder [shape = folder, description = "Test, long long label\nTest, long long label"]
Hexagon [shape = hexagon, description = "Test, long long label\nTest, long long label"]
}
}
@enduml
[[#FFAAAA#FIXME]]