Customization studio¶
Annotations control how a topology looks in the viewer: node positions, icons and colors, groups, notes, shapes, and display settings such as the node style and link style. This page has two parts:
- The studio applies viewer settings to an example lab and exports the result for your own documentation.
- The example labs show what annotations can express. Each example links to its topology and annotations files.
Studio¶
Choose a lab and change its settings. The preview updates as you go. To reuse the result, copy the Markdown snippet and download the topology and annotations files.
# Wiring only. Configure addressing and routing as a separate exercise.
name: midnight-fabric
topology:
defaults:
kind: nokia_srlinux
image: ghcr.io/nokia/srlinux:latest
nodes:
spine1: {type: ixrd3}
spine2: {type: ixrd3}
leaf1: {type: ixrd2}
leaf2: {type: ixrd2}
leaf3: {type: ixrd2}
leaf4: {type: ixrd2}
compute1:
kind: linux
image: ghcr.io/srl-labs/network-multitool:latest
compute2:
kind: linux
image: ghcr.io/srl-labs/network-multitool:latest
compute3:
kind: linux
image: ghcr.io/srl-labs/network-multitool:latest
compute4:
kind: linux
image: ghcr.io/srl-labs/network-multitool:latest
links:
- endpoints: [spine1:e1-1, leaf1:e1-49]
- endpoints: [spine1:e1-2, leaf2:e1-49]
- endpoints: [spine1:e1-3, leaf3:e1-49]
- endpoints: [spine1:e1-4, leaf4:e1-49]
- endpoints: [spine2:e1-1, leaf1:e1-50]
- endpoints: [spine2:e1-2, leaf2:e1-50]
- endpoints: [spine2:e1-3, leaf3:e1-50]
- endpoints: [spine2:e1-4, leaf4:e1-50]
- endpoints: [leaf1:e1-1, compute1:eth1]
- endpoints: [leaf2:e1-1, compute2:eth1]
- endpoints: [leaf3:e1-1, compute3:eth1]
- endpoints: [leaf4:e1-1, compute4:eth1]
# Wiring only. Configure addressing and routing as a separate exercise.
name: midnight-fabric
topology:
defaults:
kind: nokia_srlinux
image: ghcr.io/nokia/srlinux:latest
nodes:
spine1: {type: ixrd3}
spine2: {type: ixrd3}
leaf1: {type: ixrd2}
leaf2: {type: ixrd2}
leaf3: {type: ixrd2}
leaf4: {type: ixrd2}
compute1:
kind: linux
image: ghcr.io/srl-labs/network-multitool:latest
compute2:
kind: linux
image: ghcr.io/srl-labs/network-multitool:latest
compute3:
kind: linux
image: ghcr.io/srl-labs/network-multitool:latest
compute4:
kind: linux
image: ghcr.io/srl-labs/network-multitool:latest
links:
- endpoints: [spine1:e1-1, leaf1:e1-49]
- endpoints: [spine1:e1-2, leaf2:e1-49]
- endpoints: [spine1:e1-3, leaf3:e1-49]
- endpoints: [spine1:e1-4, leaf4:e1-49]
- endpoints: [spine2:e1-1, leaf1:e1-50]
- endpoints: [spine2:e1-2, leaf2:e1-50]
- endpoints: [spine2:e1-3, leaf3:e1-50]
- endpoints: [spine2:e1-4, leaf4:e1-50]
- endpoints: [leaf1:e1-1, compute1:eth1]
- endpoints: [leaf2:e1-1, compute2:eth1]
- endpoints: [leaf3:e1-1, compute3:eth1]
- endpoints: [leaf4:e1-1, compute4:eth1]Show the Markdown and CSS
Save both downloads under docs/examples/ and paste the Markdown where the diagram should appear. The annotations file stores the colors, corners, node style, link style, and visible layers.
Example labs¶
Each example pairs a containerlab topology file with an annotations file. Use them as a starting point for your own diagrams. The packet walk lab also configures addresses and routes; the others only define nodes and links.
Leaf-spine fabric
10 nodes · 12 linksTwo spines and four racks with a leaf and a server each. Group annotations draw the racks, and icon colors separate spines, leaves, and servers.
# Wiring only. Configure addressing and routing as a separate exercise.
name: midnight-fabric
topology:
defaults:
kind: nokia_srlinux
image: ghcr.io/nokia/srlinux:latest
nodes:
spine1: {type: ixrd3}
spine2: {type: ixrd3}
leaf1: {type: ixrd2}
leaf2: {type: ixrd2}
leaf3: {type: ixrd2}
leaf4: {type: ixrd2}
compute1:
kind: linux
image: ghcr.io/srl-labs/network-multitool:latest
compute2:
kind: linux
image: ghcr.io/srl-labs/network-multitool:latest
compute3:
kind: linux
image: ghcr.io/srl-labs/network-multitool:latest
compute4:
kind: linux
image: ghcr.io/srl-labs/network-multitool:latest
links:
- endpoints: [spine1:e1-1, leaf1:e1-49]
- endpoints: [spine1:e1-2, leaf2:e1-49]
- endpoints: [spine1:e1-3, leaf3:e1-49]
- endpoints: [spine1:e1-4, leaf4:e1-49]
- endpoints: [spine2:e1-1, leaf1:e1-50]
- endpoints: [spine2:e1-2, leaf2:e1-50]
- endpoints: [spine2:e1-3, leaf3:e1-50]
- endpoints: [spine2:e1-4, leaf4:e1-50]
- endpoints: [leaf1:e1-1, compute1:eth1]
- endpoints: [leaf2:e1-1, compute2:eth1]
- endpoints: [leaf3:e1-1, compute3:eth1]
- endpoints: [leaf4:e1-1, compute4:eth1]
# Wiring only. Configure addressing and routing as a separate exercise.
name: midnight-fabric
topology:
defaults:
kind: nokia_srlinux
image: ghcr.io/nokia/srlinux:latest
nodes:
spine1: {type: ixrd3}
spine2: {type: ixrd3}
leaf1: {type: ixrd2}
leaf2: {type: ixrd2}
leaf3: {type: ixrd2}
leaf4: {type: ixrd2}
compute1:
kind: linux
image: ghcr.io/srl-labs/network-multitool:latest
compute2:
kind: linux
image: ghcr.io/srl-labs/network-multitool:latest
compute3:
kind: linux
image: ghcr.io/srl-labs/network-multitool:latest
compute4:
kind: linux
image: ghcr.io/srl-labs/network-multitool:latest
links:
- endpoints: [spine1:e1-1, leaf1:e1-49]
- endpoints: [spine1:e1-2, leaf2:e1-49]
- endpoints: [spine1:e1-3, leaf3:e1-49]
- endpoints: [spine1:e1-4, leaf4:e1-49]
- endpoints: [spine2:e1-1, leaf1:e1-50]
- endpoints: [spine2:e1-2, leaf2:e1-50]
- endpoints: [spine2:e1-3, leaf3:e1-50]
- endpoints: [spine2:e1-4, leaf4:e1-50]
- endpoints: [leaf1:e1-1, compute1:eth1]
- endpoints: [leaf2:e1-1, compute2:eth1]
- endpoints: [leaf3:e1-1, compute3:eth1]
- endpoints: [leaf4:e1-1, compute4:eth1]Fabric 101 addressing
3 nodes · 2 linksA spine and two leaves based on the Fabric 101 example. Text annotations label each interface with a /31 address. The addresses are a proposed plan and are not configured on the nodes.
# Proposed /31 addressing is documented in annotations, not applied here.
name: fabric-101
topology:
defaults:
kind: nokia_srlinux
image: ghcr.io/nokia/srlinux:latest
nodes:
leaf1: {type: ixrd2}
spine1: {type: ixrd3}
leaf2: {type: ixrd2}
links:
- endpoints: [leaf1:e1-49, spine1:e1-1]
- endpoints: [spine1:e1-2, leaf2:e1-49]
# Proposed /31 addressing is documented in annotations, not applied here.
name: fabric-101
topology:
defaults:
kind: nokia_srlinux
image: ghcr.io/nokia/srlinux:latest
nodes:
leaf1: {type: ixrd2}
spine1: {type: ixrd3}
leaf2: {type: ixrd2}
links:
- endpoints: [leaf1:e1-49, spine1:e1-1]
- endpoints: [spine1:e1-2, leaf2:e1-49]Security zones
6 nodes · 5 linksAn outside client, public services, and a private application tier. Groups mark the three zones and a dashed shape marks the trust boundary. Forwarding and filtering are left for you to configure.
# Connectivity exercise. Zone labels describe intended policy, not installed rules.
name: security-zones
topology:
defaults:
kind: linux
image: ghcr.io/srl-labs/network-multitool:latest
nodes:
outside: {}
gateway: {}
frontend: {}
api: {}
database: {}
admin: {}
links:
- endpoints: [outside:eth1, gateway:eth1]
- endpoints: [gateway:eth2, frontend:eth1]
- endpoints: [gateway:eth3, api:eth1]
- endpoints: [api:eth2, database:eth1]
- endpoints: [admin:eth1, gateway:eth4]
# Connectivity exercise. Zone labels describe intended policy, not installed rules.
name: security-zones
topology:
defaults:
kind: linux
image: ghcr.io/srl-labs/network-multitool:latest
nodes:
outside: {}
gateway: {}
frontend: {}
api: {}
database: {}
admin: {}
links:
- endpoints: [outside:eth1, gateway:eth1]
- endpoints: [gateway:eth2, frontend:eth1]
- endpoints: [gateway:eth3, api:eth1]
- endpoints: [api:eth2, database:eth1]
- endpoints: [admin:eth1, gateway:eth4]WAN ring
6 nodes · 6 linksSix sites connected in a ring, laid out around a circle shape. Configure routing, disable a link, and check that traffic takes the other direction around the ring.
# Physical ring only. Add routing and failure-detection configuration for the exercise.
name: wan-ring
topology:
defaults:
kind: nokia_srlinux
image: ghcr.io/nokia/srlinux:latest
type: ixrd2
nodes:
ams: {}
fra: {}
ber: {}
waw: {}
vie: {}
par: {}
links:
- endpoints: [ams:e1-1, fra:e1-2]
- endpoints: [fra:e1-1, ber:e1-2]
- endpoints: [ber:e1-1, waw:e1-2]
- endpoints: [waw:e1-1, vie:e1-2]
- endpoints: [vie:e1-1, par:e1-2]
- endpoints: [par:e1-1, ams:e1-2]
# Physical ring only. Add routing and failure-detection configuration for the exercise.
name: wan-ring
topology:
defaults:
kind: nokia_srlinux
image: ghcr.io/nokia/srlinux:latest
type: ixrd2
nodes:
ams: {}
fra: {}
ber: {}
waw: {}
vie: {}
par: {}
links:
- endpoints: [ams:e1-1, fra:e1-2]
- endpoints: [fra:e1-1, ber:e1-2]
- endpoints: [ber:e1-1, waw:e1-2]
- endpoints: [waw:e1-1, vie:e1-2]
- endpoints: [vie:e1-1, par:e1-2]
- endpoints: [par:e1-1, ams:e1-2]Packet walk
3 nodes · 2 linksA Linux lab with two subnets and a router with IP forwarding. Address labels mark each hop, and solid and dashed arrows show the request and reply paths. After deploying, run docker exec clab-packet-walk-client ping -c 3 10.10.2.2 on the lab host.
# Ready to ping: client -> router -> server, across two IPv4 subnets.
name: packet-walk
topology:
defaults:
kind: linux
image: ghcr.io/srl-labs/network-multitool:latest
nodes:
client:
exec:
- ip address add 10.10.1.2/24 dev eth1
- ip route add 10.10.2.0/24 via 10.10.1.1
router:
sysctls:
net.ipv4.ip_forward: "1"
exec:
- ip address add 10.10.1.1/24 dev eth1
- ip address add 10.10.2.1/24 dev eth2
server:
exec:
- ip address add 10.10.2.2/24 dev eth1
- ip route add 10.10.1.0/24 via 10.10.2.1
links:
- endpoints: [client:eth1, router:eth1]
- endpoints: [router:eth2, server:eth1]
# Ready to ping: client -> router -> server, across two IPv4 subnets.
name: packet-walk
topology:
defaults:
kind: linux
image: ghcr.io/srl-labs/network-multitool:latest
nodes:
client:
exec:
- ip address add 10.10.1.2/24 dev eth1
- ip route add 10.10.2.0/24 via 10.10.1.1
router:
sysctls:
net.ipv4.ip_forward: "1"
exec:
- ip address add 10.10.1.1/24 dev eth1
- ip address add 10.10.2.1/24 dev eth2
server:
exec:
- ip address add 10.10.2.2/24 dev eth1
- ip route add 10.10.1.0/24 via 10.10.2.1
links:
- endpoints: [client:eth1, router:eth1]
- endpoints: [router:eth2, server:eth1]Dual-homed hosts
7 nodes · 10 linksTwo spines, three leaves, and two hosts, each host connected to two leaves. Links use the elbow style: they bend at right angles between the layers, and crossing links show a small gap. Hover over a link to highlight it and both of its nodes.
# Wiring only. Configure the fabric and host bonding as a separate exercise.
name: dual-homed
topology:
defaults:
kind: nokia_srlinux
image: ghcr.io/nokia/srlinux:latest
nodes:
spine1: {type: ixrd3}
spine2: {type: ixrd3}
leaf1: {type: ixrd2}
leaf2: {type: ixrd2}
leaf3: {type: ixrd2}
host1:
kind: linux
image: ghcr.io/srl-labs/network-multitool:latest
host2:
kind: linux
image: ghcr.io/srl-labs/network-multitool:latest
links:
- endpoints: [spine1:e1-1, leaf1:e1-49]
- endpoints: [spine1:e1-2, leaf2:e1-49]
- endpoints: [spine1:e1-3, leaf3:e1-49]
- endpoints: [spine2:e1-1, leaf1:e1-50]
- endpoints: [spine2:e1-2, leaf2:e1-50]
- endpoints: [spine2:e1-3, leaf3:e1-50]
- endpoints: [leaf1:e1-1, host1:eth1]
- endpoints: [leaf2:e1-1, host1:eth2]
- endpoints: [leaf2:e1-2, host2:eth1]
- endpoints: [leaf3:e1-1, host2:eth2]
# Wiring only. Configure the fabric and host bonding as a separate exercise.
name: dual-homed
topology:
defaults:
kind: nokia_srlinux
image: ghcr.io/nokia/srlinux:latest
nodes:
spine1: {type: ixrd3}
spine2: {type: ixrd3}
leaf1: {type: ixrd2}
leaf2: {type: ixrd2}
leaf3: {type: ixrd2}
host1:
kind: linux
image: ghcr.io/srl-labs/network-multitool:latest
host2:
kind: linux
image: ghcr.io/srl-labs/network-multitool:latest
links:
- endpoints: [spine1:e1-1, leaf1:e1-49]
- endpoints: [spine1:e1-2, leaf2:e1-49]
- endpoints: [spine1:e1-3, leaf3:e1-49]
- endpoints: [spine2:e1-1, leaf1:e1-50]
- endpoints: [spine2:e1-2, leaf2:e1-50]
- endpoints: [spine2:e1-3, leaf3:e1-50]
- endpoints: [leaf1:e1-1, host1:eth1]
- endpoints: [leaf2:e1-1, host1:eth2]
- endpoints: [leaf2:e1-2, host2:eth1]
- endpoints: [leaf3:e1-1, host2:eth2]Branch office
8 nodes · 9 linksTwo internet uplinks, an edge router, a redundant core, and three floor switches. With elbow links and all interface names shown, each name is placed along its own link next to the node.
# Wiring only. Configure addressing, NAT, and policy as a separate exercise.
name: branch-office
topology:
defaults:
kind: nokia_srlinux
image: ghcr.io/nokia/srlinux:latest
nodes:
isp-a:
kind: linux
image: ghcr.io/srl-labs/network-multitool:latest
isp-b:
kind: linux
image: ghcr.io/srl-labs/network-multitool:latest
edge: {type: ixrd2}
core1: {type: ixrd2}
core2: {type: ixrd2}
floor1: {type: ixrd2}
floor2: {type: ixrd2}
floor3: {type: ixrd2}
links:
- endpoints: [isp-a:eth1, edge:e1-1]
- endpoints: [isp-b:eth1, edge:e1-2]
- endpoints: [edge:e1-3, core1:e1-1]
- endpoints: [edge:e1-4, core2:e1-1]
- endpoints: [core1:e1-2, core2:e1-2]
- endpoints: [core1:e1-3, floor1:e1-49]
- endpoints: [core1:e1-4, floor2:e1-49]
- endpoints: [core2:e1-3, floor2:e1-50]
- endpoints: [core2:e1-4, floor3:e1-49]
# Wiring only. Configure addressing, NAT, and policy as a separate exercise.
name: branch-office
topology:
defaults:
kind: nokia_srlinux
image: ghcr.io/nokia/srlinux:latest
nodes:
isp-a:
kind: linux
image: ghcr.io/srl-labs/network-multitool:latest
isp-b:
kind: linux
image: ghcr.io/srl-labs/network-multitool:latest
edge: {type: ixrd2}
core1: {type: ixrd2}
core2: {type: ixrd2}
floor1: {type: ixrd2}
floor2: {type: ixrd2}
floor3: {type: ixrd2}
links:
- endpoints: [isp-a:eth1, edge:e1-1]
- endpoints: [isp-b:eth1, edge:e1-2]
- endpoints: [edge:e1-3, core1:e1-1]
- endpoints: [edge:e1-4, core2:e1-1]
- endpoints: [core1:e1-2, core2:e1-2]
- endpoints: [core1:e1-3, floor1:e1-49]
- endpoints: [core1:e1-4, floor2:e1-49]
- endpoints: [core2:e1-3, floor2:e1-50]
- endpoints: [core2:e1-4, floor3:e1-49]Frosted glass
6 nodes · 7 linksBoxed nodes with a low-opacity fill, a light border, and a background blur, placed over colored shape annotations. Links use the elbow style. Hover over a link to highlight it and both of its nodes.
# Wiring only. Configure routing and services as a separate exercise.
name: frosted-glass
topology:
defaults:
kind: nokia_srlinux
image: ghcr.io/nokia/srlinux:latest
nodes:
internet:
kind: linux
image: ghcr.io/srl-labs/network-multitool:latest
edge1: {type: ixrd2}
edge2: {type: ixrd2}
app1:
kind: linux
image: ghcr.io/srl-labs/network-multitool:latest
app2:
kind: linux
image: ghcr.io/srl-labs/network-multitool:latest
app3:
kind: linux
image: ghcr.io/srl-labs/network-multitool:latest
links:
- endpoints: [internet:eth1, edge1:e1-1]
- endpoints: [internet:eth2, edge2:e1-1]
- endpoints: [edge1:e1-2, edge2:e1-2]
- endpoints: [edge1:e1-3, app1:eth1]
- endpoints: [edge1:e1-4, app2:eth1]
- endpoints: [edge2:e1-3, app2:eth2]
- endpoints: [edge2:e1-4, app3:eth1]
# Wiring only. Configure routing and services as a separate exercise.
name: frosted-glass
topology:
defaults:
kind: nokia_srlinux
image: ghcr.io/nokia/srlinux:latest
nodes:
internet:
kind: linux
image: ghcr.io/srl-labs/network-multitool:latest
edge1: {type: ixrd2}
edge2: {type: ixrd2}
app1:
kind: linux
image: ghcr.io/srl-labs/network-multitool:latest
app2:
kind: linux
image: ghcr.io/srl-labs/network-multitool:latest
app3:
kind: linux
image: ghcr.io/srl-labs/network-multitool:latest
links:
- endpoints: [internet:eth1, edge1:e1-1]
- endpoints: [internet:eth2, edge2:e1-1]
- endpoints: [edge1:e1-2, edge2:e1-2]
- endpoints: [edge1:e1-3, app1:eth1]
- endpoints: [edge1:e1-4, app2:eth1]
- endpoints: [edge2:e1-3, app2:eth2]
- endpoints: [edge2:e1-4, app3:eth1]Annotations used in the examples¶
| Feature | Annotation or option | Example |
|---|---|---|
| Node positions and icons | nodeAnnotations with position, icon, and iconColor |
Leaf-spine fabric |
| Racks, subnets, and zones | groupStyleAnnotations with fill, border, label, and corner radius |
Security zones |
| Interface and address labels | freeTextAnnotations with Markdown, monospace text, and a background |
Fabric 101 addressing |
| Arrows, circles, and boundaries | freeShapeAnnotations with lines, arrowheads, circles, and dashed borders |
Packet walk |
| Boxed nodes | viewerSettings.nodeStyle: "boxed", with an optional per-node box for fill, opacity, blur, and border |
Frosted glass |
| Telemetry style | viewerSettings.style: "telemetry-style" |
Studio, Telemetry style |
| Elbow links | viewerSettings.linkStyle: "elbow", or link-style="elbow" on the code block |
Dual-homed hosts |
| Link highlighting | link-hover="true" highlights a hovered link and both of its nodes |
Dual-homed hosts |
| Interface names along links | Elbow links with link-labels="show-all" |
Branch office |
| Canvas colors | CSS color tokens, a fixed theme, and a grid | Studio, Colors |
| Presentation | Borderless figure, explorer, or split view with the YAML source | Studio, Frame |
| Interaction | Wheel zoom, panning, height, and fit padding | Studio, Interaction |
Annotations are stored in a separate JSON file next to the topology. You can edit them in the topology editor or start from the files above. The documentation viewer is read-only.
For all Markdown attributes, CSS tokens, and the HTML and React APIs, see the component reference.