Skip to content

Commit 8678ba8

Browse files
authored
Add '--title' parameter to 'netlab graph' command (#2840)
Also: update test graph topologies and graph generation scripts to use the new parameter instead of environment variable Closes #2803
1 parent dac9dc2 commit 8678ba8

File tree

6 files changed

+73
-67
lines changed

6 files changed

+73
-67
lines changed

docs/netlab/graph.md

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,9 @@ _netlab_ generates the graph description files. You will have to install [Graphv
1212
## Usage
1313

1414
```text
15-
usage: netlab graph [-h] [-t {topology,bgp,isis}] [-f G_FORMAT] [-e {graphviz,d2}]
16-
[-i INSTANCE] [--snapshot [SNAPSHOT]] [--topology TOPOLOGY]
15+
usage: netlab graph [-h] [-t {topology,bgp,isis}] [--title G_TITLE] [-f G_FORMAT]
16+
[-e {graphviz,d2}] [-q] [-i INSTANCE] [--snapshot [SNAPSHOT]]
17+
[--topology TOPOLOGY]
1718
[output]
1819
1920
Create a graph description in Graphviz or D2 format or draw a graph
@@ -25,10 +26,12 @@ options:
2526
-h, --help show this help message and exit
2627
-t, --type {topology,bgp,isis}
2728
Graph type
29+
--title G_TITLE Graph title
2830
-f, --format G_FORMAT
2931
Graph formatting parameters separated by commas
3032
-e, --engine {graphviz,d2}
3133
Graphing engine
34+
-q, --quiet Report only major errors
3235
-i, --instance INSTANCE
3336
Specify lab instance to create a graph from
3437
--snapshot [SNAPSHOT]
@@ -70,6 +73,8 @@ These formatting parameters can be applied to a **bgp** graph:
7073
* **ipv4**, **ipv6**, **vpnv4**, **vpnv6**, **6pe**, or **evpn** -- draw the BGP sessions with the specified address families
7174
* **novrf** -- do not include VRF BGP sessions in the graph
7275

76+
You can also specify/overwrite the graph title with the `--title` argument.
77+
7378
```{tip}
7479
* For more graph type- and graph formatting details, read the [GraphViz](outputs-graphviz) and [D2](outputs-d2) output module documentation.
7580
* When executed with the `--instance` option, **‌netlab graph** creates the graph description file in the lab directory.

netsim/cli/graph.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,10 @@ def graph_parse(args: typing.List[str]) -> argparse.Namespace:
3333
dest='g_type', action='store',
3434
choices=['topology','bgp','isis'],
3535
help='Graph type')
36+
parser.add_argument(
37+
'--title',
38+
dest='g_title', action='store',
39+
help='Graph title')
3640
parser.add_argument(
3741
'-f','--format',
3842
dest='g_format', action='store',
@@ -91,6 +95,9 @@ def run(cli_args: typing.List[str]) -> None:
9195
args = graph_parse(cli_args)
9296
topology = load_data_source(args,ghosts=False)
9397
_read.include_environment_defaults(topology)
98+
if args.g_title:
99+
topology.graph.title = args.g_title
100+
94101
o_module = 'graph' if args.engine == 'graphviz' else 'd2'
95102
o_param = f'{o_module}:{args.g_type or "topology"}'
96103
(o_type,o_name) = parse_output(args,topology)

tests/platform-integration/graph/bgp.yml

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
---
12
defaults.device: frr
23
defaults.provider: clab
34

@@ -48,15 +49,10 @@ links:
4849

4950
files:
5051
make_dot.sh: |
51-
graph() {
52-
echo -n "graph $3 from $1 into $2 "
53-
netlab graph -t bgp -f $1 $2
54-
}
55-
56-
NETLAB_GRAPH_TITLE="BGP route reflector sessions" graph rr dot-bgp-rr.svg
57-
NETLAB_GRAPH_TITLE="Dashed VRF BGP sessions" graph vrf dot-bgp-vrf.svg
58-
NETLAB_GRAPH_TITLE="Global BGP sessions (no VRF sessions)" graph novrf dot-bgp-novrf.svg
59-
NETLAB_GRAPH_TITLE="EVPN BGP sessions" graph evpn,rr dot-bgp-evpn.svg
52+
netlab graph -t bgp -f rr --title "BGP route reflector sessions" dot-bgp-rr.svg
53+
netlab graph -t bgp -f vrf --title "Dashed VRF BGP sessions" dot-bgp-vrf.svg
54+
netlab graph -t bgp -f novrf --title "Global BGP sessions (no VRF sessions)" dot-bgp-novrf.svg
55+
netlab graph -t bgp -f evpn,rr --title "EVPN BGP sessions" dot-bgp-evpn.svg
6056
make_d2.sh: |
6157
unset D2_LAYOUT
6258
unset D2_SKETCH
@@ -69,8 +65,8 @@ files:
6965
export D2_SKETCH=true
7066
fi
7167
72-
NETLAB_GRAPH_TITLE="Default BGP graph" netlab graph -e d2 -t bgp d2-bgp-default.svg
73-
NETLAB_GRAPH_TITLE="BGP graph with no arrows on sessions" \
74-
NETLAB_OUTPUTS_D2_BGP_RR=False netlab graph -e d2 -t bgp d2-bgp-no-rr.svg
75-
NETLAB_GRAPH_TITLE="VRF BGP sessions" netlab graph -e d2 -t bgp -f vrf d2-bgp-vrf.svg
76-
NETLAB_GRAPH_TITLE="BGP sessions with EVPN AF" netlab graph -e d2 -t bgp -f evpn d2-bgp-evpn.svg
68+
netlab graph -e d2 -t bgp --title "Default BGP graph" d2-bgp-default.svg
69+
NETLAB_OUTPUTS_D2_BGP_RR=False \
70+
netlab graph -e d2 -t bgp --title "BGP graph with no arrows on sessions" d2-bgp-no-rr.svg
71+
netlab graph -e d2 -t bgp --title "VRF BGP sessions" -f vrf d2-bgp-vrf.svg
72+
netlab graph -e d2 -t bgp --title "BGP sessions with EVPN AF" -f evpn d2-bgp-evpn.svg

tests/platform-integration/graph/create-d2.sh

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,26 @@ if [[ "$OPTS" == *"elk"* ]]; then
55
export D2_LAYOUT=elk
66
fi
77
if [[ "$OPTS" == *"topo"* ]]; then
8-
netlab graph --topology topo.yml d2-topo-default.svg
9-
NETLAB_OUTPUTS_D2_NODE__ADDRESS__LABEL=False netlab graph -e d2 --topology topo.yml d2-topo-no-labels.svg
10-
NETLAB_OUTPUTS_D2_AS__CLUSTERS=False netlab graph -e d2 --topology topo.yml d2-topo-no-clusters.svg
11-
NETLAB_OUTPUTS_D2_INTERFACE__LABELS=True netlab graph -e d2 --topology topo.yml d2-topo-intf-labels.svg
12-
NETLAB_OUTPUTS_D2_GROUPS=[fabric,host] netlab graph -e d2 --topology topo.yml d2-topo-groups.svg
8+
netlab graph --title "Default topology graph" -e d2 --topology topo.yml d2-topo-default.svg
9+
NETLAB_OUTPUTS_D2_NODE__ADDRESS__LABEL=False \
10+
netlab graph --title "No node loopback labels" -e d2 --topology topo.yml d2-topo-no-labels.svg
11+
NETLAB_OUTPUTS_D2_AS__CLUSTERS=False \
12+
netlab graph --title "No clusters" -e d2 --topology topo.yml d2-topo-no-clusters.svg
13+
NETLAB_OUTPUTS_D2_INTERFACE__LABELS=True \
14+
netlab graph --title "Interface labels" -e d2 --topology topo.yml d2-topo-intf-labels.svg
15+
NETLAB_OUTPUTS_D2_GROUPS=[fabric,host] \
16+
netlab graph --title "Custom groups" -e d2 --topology topo.yml d2-topo-groups.svg
1317
fi
1418
if [[ "$OPTS" == *"bgp"* ]]; then
15-
NETLAB_GRAPH_TITLE="Default BGP graph" netlab graph -e d2 --topology bgp.yml -t bgp d2-bgp-default.svg
16-
NETLAB_OUTPUTS_D2_BGP_RR=False netlab graph -e d2 --topology bgp.yml -t bgp d2-bgp-no-rr.svg
17-
NETLAB_GRAPH_TITLE="VRF BGP sessions" netlab graph -e d2 --topology bgp.yml -t bgp -f vrf d2-bgp-vrf.svg
18-
NETLAB_GRAPH_TITLE="BGP sessions with EVPN AF" netlab graph -e d2 --topology bgp.yml -t bgp -f evpn d2-bgp-evpn.svg
19+
netlab graph --title "Default BGP graph" -e d2 --topology bgp.yml -t bgp d2-bgp-default.svg
20+
NETLAB_OUTPUTS_D2_BGP_RR=False \
21+
netlab graph --title "No RR sessions" -e d2 --topology bgp.yml -t bgp d2-bgp-no-rr.svg
22+
netlab graph --title "VRF BGP sessions" -e d2 --topology bgp.yml -t bgp -f vrf d2-bgp-vrf.svg
23+
netlab graph --title "BGP sessions with EVPN AF" -e d2 --topology bgp.yml -t bgp -f evpn d2-bgp-evpn.svg
1924
fi
2025
if [[ "$OPTS" == *"isis"* ]]; then
21-
NETLAB_GRAPH_TITLE="IS-IS routing" netlab graph -e d2 --topology isis.yml -t isis d2-isis.svg
26+
netlab graph --title "IS-IS routing" -e d2 --topology isis.yml -t isis d2-isis.svg
2227
fi
2328
if [[ "$OPTS" == *"vlan"* ]]; then
24-
NETLAB_GRAPH_TITLE="VLAN Access and Trunk Links" netlab graph -e d2 -f vlan --topology vlan.yml d2-vlan.svg
29+
netlab graph --title "VLAN Access and Trunk Links" -e d2 -f vlan --topology vlan.yml d2-vlan.svg
2530
fi

tests/platform-integration/graph/create-graphviz.sh

Lines changed: 16 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2,34 +2,27 @@
22
OPTS=${*:-bgp topo isis}
33
rm *svg
44
if [[ "$OPTS" == *"topo"* ]]; then
5-
netlab graph --topology topo.yml dot-topo-default.svg
6-
NETLAB_GRAPH_TITLE="Topology graph, no labels" \
7-
NETLAB_OUTPUTS_GRAPH_NODE__ADDRESS__LABEL=False netlab graph --topology topo.yml dot-topo-no-labels.svg
8-
NETLAB_GRAPH_TITLE="Topology graph, no AS clusters" \
9-
NETLAB_OUTPUTS_GRAPH_AS__CLUSTERS=False netlab graph --topology topo.yml dot-topo-no-clusters.svg
10-
NETLAB_GRAPH_TITLE="Topology graph, interface labels" \
11-
NETLAB_OUTPUTS_GRAPH_INTERFACE__LABELS=True netlab graph --topology topo.yml dot-topo-intf-labels.svg
12-
NETLAB_GRAPH_TITLE="Topology graph, custom groups" \
13-
NETLAB_OUTPUTS_GRAPH_GROUPS=[fabric,host] netlab graph --topology topo.yml dot-topo-groups.svg
5+
netlab graph --title "Default topology graph" --topology topo.yml dot-topo-default.svg
6+
NETLAB_OUTPUTS_GRAPH_NODE__ADDRESS__LABEL=False \
7+
netlab graph --title "Topology graph, no labels" --topology topo.yml dot-topo-no-labels.svg
8+
NETLAB_OUTPUTS_GRAPH_AS__CLUSTERS=False \
9+
netlab graph --title "Topology graph, no AS clusters" --topology topo.yml dot-topo-no-clusters.svg
10+
NETLAB_OUTPUTS_GRAPH_INTERFACE__LABELS=True \
11+
netlab graph --title "Topology graph, interface labels" --topology topo.yml dot-topo-intf-labels.svg
12+
NETLAB_OUTPUTS_GRAPH_GROUPS=[fabric,host] \
13+
netlab graph --title "Topology graph, custom groups" --topology topo.yml dot-topo-groups.svg
1414
fi
1515
if [[ "$OPTS" == *"bgp"* ]]; then
16-
NETLAB_GRAPH_TITLE="Default BGP graph" \
1716
NETLAB_GROUPS_CORE_GRAPH_RANK=1 \
18-
netlab graph --topology bgp.yml -t bgp dot-bgp-default.svg
19-
NETLAB_GRAPH_TITLE="BGP graph with RR sessions" \
20-
netlab graph --topology bgp.yml -t bgp -f rr dot-bgp-rr.svg
21-
NETLAB_GRAPH_TITLE="BGP graph with VRF sessions" \
22-
netlab graph --topology bgp.yml -t bgp -f vrf dot-bgp-vrf.svg
23-
NETLAB_GRAPH_TITLE="No VRF sessions in the BGP graph" \
24-
netlab graph --topology bgp.yml -t bgp -f novrf dot-bgp-novrf.svg
25-
NETLAB_GRAPH_TITLE="EVPN BGP sessions" \
26-
netlab graph --topology bgp.yml -t bgp -f evpn,rr dot-bgp-evpn.svg
17+
netlab graph --title "Default BGP graph" --topology bgp.yml -t bgp dot-bgp-default.svg
18+
netlab graph --title "BGP graph with RR sessions" --topology bgp.yml -t bgp -f rr dot-bgp-rr.svg
19+
netlab graph --title "BGP graph with VRF sessions" --topology bgp.yml -t bgp -f vrf dot-bgp-vrf.svg
20+
netlab graph --title "No VRF sessions in the BGP graph" --topology bgp.yml -t bgp -f novrf dot-bgp-novrf.svg
21+
netlab graph --title "EVPN BGP sessions" --topology bgp.yml -t bgp -f evpn,rr dot-bgp-evpn.svg
2722
fi
2823
if [[ "$OPTS" == *"isis"* ]]; then
29-
NETLAB_GRAPH_TITLE="IS-IS routing" \
30-
netlab graph --topology isis.yml -t isis dot-isis.svg
24+
netlab graph --title "IS-IS routing" --topology isis.yml -t isis dot-isis.svg
3125
fi
3226
if [[ "$OPTS" == *"vlan"* ]]; then
33-
NETLAB_GRAPH_TITLE="VLAN Access and Trunk Links" \
34-
netlab graph --topology vlan.yml -f vlan dot-vlan.svg
27+
netlab graph --title "VLAN Access and Trunk Links" --topology vlan.yml -f vlan dot-vlan.svg
3528
fi

tests/platform-integration/graph/topo.yml

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
---
12
provider: clab
23
plugin: [ files ]
34

@@ -55,20 +56,15 @@ links:
5556

5657
files:
5758
make_dot.sh: |
58-
graph() {
59-
echo -n "graph into $1 "
60-
NETLAB_GRAPH_TITLE="$2" netlab graph $1
61-
}
62-
63-
NETLAB_OUTPUTS_GRAPH_NODE__ADDRESS__LABEL=False graph dot-topo-no-labels.svg "Topology graph, no labels"
64-
NETLAB_OUTPUTS_GRAPH_AS__CLUSTERS=False graph dot-topo-no-clusters.svg "Topology graph, no AS clusters"
65-
NETLAB_OUTPUTS_GRAPH_INTERFACE__LABELS=True graph dot-topo-intf-labels.svg "Topology graph, interface labels"
66-
NETLAB_OUTPUTS_GRAPH_GROUPS=[fabric,host] graph dot-topo-groups.svg "Topology graph, custom groups"
59+
NETLAB_OUTPUTS_GRAPH_NODE__ADDRESS__LABEL=False \
60+
netlab graph --title "Topology graph, no labels" dot-topo-no-labels.svg
61+
NETLAB_OUTPUTS_GRAPH_AS__CLUSTERS=False \
62+
netlab graph --title "Topology graph, no AS clusters" dot-topo-no-clusters.svg
63+
NETLAB_OUTPUTS_GRAPH_INTERFACE__LABELS=True \
64+
netlab graph --title "Topology graph, interface labels" dot-topo-intf-labels.svg
65+
NETLAB_OUTPUTS_GRAPH_GROUPS=[fabric,host] \
66+
netlab graph --title "Topology graph, custom groups" dot-topo-groups.svg
6767
make_d2.sh: |
68-
graph() {
69-
NETLAB_GRAPH_TITLE="$2" netlab graph -e d2 $1
70-
}
71-
7268
unset D2_LAYOUT
7369
unset D2_SKETCH
7470
if [[ "$*" == *"elk"* ]]; then
@@ -79,7 +75,11 @@ files:
7975
echo "Using sketch mode"
8076
export D2_SKETCH=true
8177
fi
82-
NETLAB_OUTPUTS_D2_NODE__ADDRESS__LABEL=False graph d2-topo-no-labels.svg "Topology graph, no labels"
83-
NETLAB_OUTPUTS_D2_AS__CLUSTERS=False graph d2-topo-no-clusters.svg "Topology graph, no AS clusters"
84-
NETLAB_OUTPUTS_D2_INTERFACE__LABELS=True graph d2-topo-intf-labels.svg "Topology graph, interface labels"
85-
NETLAB_OUTPUTS_D2_GROUPS=[fabric,host] graph d2-topo-groups.svg "Topology graph, custom groups"
78+
NETLAB_OUTPUTS_D2_NODE__ADDRESS__LABEL=False \
79+
netlab graph -e d2 --title "Topology graph, no labels" d2-topo-no-labels.svg
80+
NETLAB_OUTPUTS_D2_AS__CLUSTERS=False \
81+
netlab graph -e d2 --title "Topology graph, no AS clusters" d2-topo-no-clusters.svg
82+
NETLAB_OUTPUTS_D2_INTERFACE__LABELS=True \
83+
netlab graph -e d2 --title "Topology graph, interface labels" d2-topo-intf-labels.svg
84+
NETLAB_OUTPUTS_D2_GROUPS=[fabric,host] \
85+
netlab graph -e d2 --title "Topology graph, custom groups" d2-topo-groups.svg

0 commit comments

Comments
 (0)