Skip to content

Python で CML2 上のリンク情報を取得する (virl2-client 利用版)

以前に Cisco CML を python から制御する、以下のメモを書きました。

今回は「リンク情報の取得」を virl2-client を使って書き直したサンプルをメモしておきます。 検証は Ubuntu 22.04LTS 上の Python 3.10.4 で行いました。 また本題とは無関係ですが direnv を利用するものとします。

venv 環境の作成

venv 環境を作成し、tabulatevirl2-client をインストールしておきます。

1
2
3
4
5
6
7
mkdir links
cd links
python3 -m venv .venv
echo 'source .venv/bin/activate' > .envrc
direnv allow
python3 -m pip install --upgrade pip
python3 -m pip install tabulate virl2_client

サンプルスクリプト

サンプルスクリプトは以下の通りです。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#!/usr/bin/env python3

import argparse

from tabulate import tabulate
from virl2_client import ClientLibrary


def get_links(cml: ClientLibrary):
    data = []
    for lab in cml.all_labs():
        for link in lab.links():
            data.append(
                [
                    lab.title,
                    link.id,
                    link.node_a.label,
                    link.interface_a.label,
                    link.interface_a.state,
                    link.node_b.label,
                    link.interface_b.label,
                    link.interface_b.state,
                ]
            )
    print(
        tabulate(
            data,
            headers=[
                "Lab",
                "Link ID",
                "Node-A",
                "Interface",
                "State",
                "Node-B",
                "Interface",
                "State",
            ],
        )
    )


def main():
    parser = argparse.ArgumentParser(description="Lists the lab's link information.")
    parser.add_argument("-a", "--address", required=True, help="Address")
    parser.add_argument("-u", "--username", required=True, help="Username")
    parser.add_argument("-p", "--password", required=True, help="Password")
    args = parser.parse_args()
    cml = ClientLibrary(args.address, args.username, args.password, ssl_verify=False)
    cml.is_system_ready(wait=True)
    get_links(cml)


if __name__ == "__main__":
    main()

実行例

実行例は以下の通りです。

1
2
3
4
5
6
7
8
# ./links.py -a "10.0.0.1" -u "admin" -p "password"
SSL Verification disabled
Lab    Link ID                               Node-A    Interface    State    Node-B    Interface    State
-----  ------------------------------------  --------  -----------  -------  --------  -----------  -------
Lab1   27555725-70cb-4f8d-bd94-15b3e89b3a8f  external  port                  switch    port0
Lab1   ed678e70-9526-4c17-b209-87ba6908c606  ubuntu1   ens2                  switch    port1
Lab1   eec90dfb-579f-4a88-90d8-61a19f0c288e  ubuntu2   ens2                  switch    port2
Lab1   256093f5-be6f-4431-b508-10b3d717f2b3  ubuntu3   ens2                  switch    port3