🎨

NW図 as Code(4) GraphvizのHTML-like labelを試す

2022/06/15に公開

前回のおさらい

Graphvizを使って物理ネットワーク構成図を書いてみました。

https://zenn.dev/takai404/articles/a4094628b9b5ff

一応それっぽい図は描けたのですが、ネットワークインターフェイスの並び順を完全には制御できないという結論でした。

今回試すこと

ネットワークインターフェイスの並びをe0, e1, e2 ...というように自分で指定した順番にしたいときはどうすればよいのかを試してみました。

前回の記事で特に触れずにbox型のノードを使っていました。
Graphvizのノードは大きく分けると以下の4種類あります。

  • Polygon-based
    • 四角形(box)、多角形(polygon)、楕円(ellipse)等の図形
  • Record-based
    • オブジェクトを複数のレコードに分割できる
    • 古い。後述のHTML-likeが推奨されている
  • HTML-like
    • HTMLのTableっぽい感じ
    • 今回これを試す
  • User-defined
    • すみません。何者か調べてないです…

HTML-like labelのオブジェクトを使うことでインターフェイスの並びを制御します。

結果

まず作成した図を貼ります。

図を編集してみたい方はこちら
なんとなく出オチ感というか、言葉に出来ない不安な気持ちが湧いてきます…

解説

せっかく作ったので解説していきます。大まかな流れは前回のPolygon-basedと同じです。

違いは以下の通り、Polygon-basedはネットワークインターフェイスがnodeだったのに対し、今回のHTML-likeではネットワーク機器がnodeなのでより自然な感じになりました。

ネットワーク機器の表現方法 ネットワークインターフェイスの表現方法
Polygon-based subgraph node
HTML-like node HTML-like label

「router0」ノードは以下のように定義しています。

router0 [
    shape="plaintext" label=<
        <table>
            <tr>
                <td border="0" colspan="2">\N</td>
            </tr>
            <tr>
                <td port="e0">e0</td>
                <td port="e2">e2</td>
            </tr>
        </table>
    >
]

「router0 [shape="plaintext" label=<~>]」という文法です。「~」のところにHTMLのTableタグ(と同じような文法のGraphviz独自言語)を書いています。ダブルクォートではなくて<>で囲むことでHTML-like labelという機能を有効にしています。
「\N」はノード名に置換されます。
<td>タグの属性のport="e0"の部分がGraphvizの独自拡張で、ポートネームというものを決めています。ポートネームは後で線を引くときに出てきます。

エッジは次のように定義します。「ノード名:ポートネーム」とすることでHTMLタグの中でポートネームで指定した箇所に線を引きます。

router0:e0 -- router1:e0

まとめ

冒頭でも書いたのですが、何となく変なんですよね。
l3sw1:e5とl2sw1:e2は何故こんな奇妙な折れ方の線で結ばれているのか?
router0:e0は<td>タグではなくてちょっと浮いているのは何故?

あとは、大昔にHTMLを手打ちしていた方は実感できると思うのですが、colspan="2"の数値を手打ちするのは面倒なんですよね。0とか65535とか-1とか100とか入れてみたのですが、そのテーブルの最大列数に合わせることはできず、きれいな図を書くためには正確な数値を書く必要がありました。

関連記事

Discussion