SONiCで自分が知らなかったCLI

# はじめに

著者は割と以前、2019年あたりからSONiCに触れていたため、当時のCLIについてはだいたい把握していたつもりだったのですが、気づくといつのまにかCLIやコマンドが増えていたりして、それ知らんかったわー！となったりします。

そこで、網羅はできませんが、そういうものについていくつか紹介したいと思います。過去に言及したことがあるものも含まれるかもしれませんがご容赦ください。

なお、2022年12月現在のコミュニティ版SONiC、`master`ブランチのイメージで確認しています。

# configのサブコマンド

`config`コマンドはCONFIG_DBを操作するためのものです。設定を追加するだけであれば`/etc/sonic/config_db.json`に書き加えて`config load -y`などとするのと同等です。昔はCLIの実装が不足していて、CONFIG_DBを編集して再起動するのが普通だったりしましたが、現在では改善されていてふつうにCLIで設定することができる項目が大半です。

## config loopback

たぶん昔からあったのを気づいてなかっただけだと思います。(あるいはすっかり忘れたか)
ループバックインタフェースの追加・削除を実行します。

```shell-session
sudo config loopback add Loopback0
```

CONFIG_DBを変更して再起動、としなくてもその場で追加・削除ができます。
CONFIG_DBとしては下記のような設定が加わります。

```json
{
  "LOOPBACK_INTERFACE": {
    "Loopback0": {}
  }
}
```

## config subinterface

こちらもたぶん昔からあったのを(VLANサブインタフェース自体が手元の実機で動いてなかったので)気づいてなかっただけだと思います。

VLANサブインタフェース (Linuxでいうeth0.200みたいなやつ) の追加・削除を実行します。

```shell-session
sudo config subinterface add Ethernet0.400 400
```

なにもないところから`sudo config interface ip add Ethetnet0.100 10.0.0.1/24` なととすれば勝手にサブインタフェースが生えてたのですが、正規には`config subinteface add` で作成した後にIPアドレスを設定するものののようでした。

CONFIG_DBには下記の設定が加わります。

```json
{
  "VLAN_SUB_INTERFACE": {
    "Ethernet0.400": {
      "admin_status": "up",
      "Vlan": "400"
    }
  }
}
```

サブインタフェースの名前は「親インタフェース.VLANID」になります。

## config checkpoint/delete-checkpoint/...

コンフィグの履歴管理ができるものです。`config checkpoint`で履歴に残すことができ、`rollback`でそこに戻ることができたりするようです。イメージを更新したらどうなるかは未確認です。

- `checkpoint` 記録
- `list-checkpoints` 記録したコンフィグのリスト表示
- `delete-checkpoint` 記録を指定して削除
- `rollback` 指定した記録に戻す
- `replace` 指定した記録を現在のコンフィグと入れ替える

使ったことないので細かいところはわかりませんすみません。。

## config nvgre-tunnel

NVGREの設定コマンドですが、CONFIG_DBの内容がYANG modelに適合していることを前提としているようで、想定外の設定(不足していたり)だとエラーが出て設定できません。

```shell-session
admin@sonic:~$ sudo config nvgre-tunnel add nvgre0 --src-ip 1.1.1.1
sonic_yang(6):Note: Below table(s) have no YANG models: XCVRD_LOG
libyang[0]: Leafref "/sonic-mgmt_port:sonic-mgmt_port/sonic-mgmt_port:MGMT_PORT/sonic-mgmt_port:MGMT_PORT_LIST/sonic-mgmt_port:name" of value "eth0" points to a non-existing leaf. (path: /sonic-mgmt_interface:sonic-mgmt_interface/MGMT_INTERFACE/MGMT_INTERFACE_LIST[name='eth0'][ip_prefix='10.207.9.133/24']/name)
sonic_yang(3):Data Loading Failed:Leafref "/sonic-mgmt_port:sonic-mgmt_port/sonic-mgmt_port:MGMT_PORT/sonic-mgmt_port:MGMT_PORT_LIST/sonic-mgmt_port:name" of value "eth0" points to a non-existing leaf.
Data Loading Failed
Leafref "/sonic-mgmt_port:sonic-mgmt_port/sonic-mgmt_port:MGMT_PORT/sonic-mgmt_port:MGMT_PORT_LIST/sonic-mgmt_port:name" of value "eth0" points to a non-existing leaf.
Error: Failed to validate configuration: ConfigMgmt Class creation failed
```

上記はCONFIG_DBに`MGMT_PORT`テーブルが用意されてないことがエラーの原因です。下記を加えてみます。

```json
{
  "MGMT_PORT": {
    "eth0": {
      "admin_status": "up"
    }
  }
}
```

すると

```shell-session
admin@sonic:~$ sudo config nvgre-tunnel add nvgre0 --src-ip 1.1.1.1
sonic_yang(6):Note: Below table(s) have no YANG models: XCVRD_LOG
sonic_yang(6):Note: Below table(s) have no YANG models: XCVRD_LOG
admin@sonic:~$ 
```

設定できたようですが、動作するかは未確認です。

## configコマンドでは設定できない項目

記憶に残ってるのは`interface`の`description`です。とくに動作に影響ないので、さくっと作ってしまえばいいのに、と思ったりします。商用SONiCではCLIがあるかもしれません。

# show コマンド

## show system-health

```shell-session
admin@sonic:~$ show system-health 
Usage: show system-health [OPTIONS] COMMAND [ARGS]...

  Show system-health information

Options:
  -?, -h, --help  Show this message and exit.

Commands:
  detail           Show system-health detail information
  monitor-list     Show system-health monitored services and devices name...
  summary          Show system-health summary information
  sysready-status  Show system-health system ready status
admin@sonic:~$ 
```

`sysready-status`はSONiCの起動が完了したかを確認するのに便利なはずです。うまく動いていないといつまで経ってもreadyにならないのですが。。(なお、`sysready-status`は202205にない、というくらい新しいようです)

このコマンドに関しては機種ごとに対応未対応がバラバラなので、動かないことのほうが多いかもしれません。

# sonic-* コマンド

## sonic-package-manager

dockerコンテナを管理するもののようです。

```shell-session
admin@sonic:~$ sonic-package-manager 
Usage: sonic-package-manager [OPTIONS] COMMAND [ARGS]...

  SONiC Package Manager

Options:
  --help  Show this message and exit.

Commands:
  install     Install/Upgrade package using [PACKAGE_EXPR] in format...
  list        List available packages.
  migrate     Migrate packages from the given database file.
  repository  Repository management commands.
  reset       Reset package to the default version.
  show        Package manager show commands.
  uninstall   Uninstall package.
$ sonic-package-manager list
Name             Repository                   Description                    Version    Status
---------------  ---------------------------  -----------------------------  ---------  ---------
database         docker-database              SONiC database package         1.0.0      Built-In
dhcp-relay       docker-dhcp-relay            N/A                            1.0.0      Installed
eventd           docker-eventd                SONiC eventd package           1.0.0      Built-In
fpm-frr          docker-fpm-frr               SONiC fpm-frr package          1.0.0      Built-In
gbsyncd          docker-gbsyncd-credo         SONiC gbsyncd package          1.0.0      Built-In
gbsyncd-broncos  docker-gbsyncd-broncos       SONiC gbsyncd-broncos package  1.0.0      Built-In
lldp             docker-lldp                  SONiC lldp package             1.0.0      Built-In
macsec           docker-macsec                N/A                            1.0.0      Installed
mgmt-framework   docker-sonic-mgmt-framework  SONiC mgmt-framework package   1.0.0      Built-In
mux              docker-mux                   SONiC mux package              1.0.0      Built-In
nat              docker-nat                   SONiC nat package              1.0.0      Built-In
p4rt             docker-sonic-p4rt            SONiC p4rt package             1.0.0      Built-In
pmon             docker-platform-monitor      SONiC pmon package             1.0.0      Built-In
radv             docker-router-advertiser     SONiC radv package             1.0.0      Built-In
restapi          docker-sonic-restapi         SONiC restapi package          1.0.0      Built-In
sflow            docker-sflow                 SONiC sflow package            1.0.0      Built-In
snmp             docker-snmp                  SONiC snmp package             1.0.0      Built-In
swss             docker-orchagent             SONiC swss package             1.0.0      Built-In
syncd            docker-syncd-brcm            SONiC syncd package            1.0.0      Built-In
teamd            docker-teamd                 SONiC teamd package            1.0.0      Built-In
telemetry        docker-sonic-telemetry       SONiC telemetry package        1.0.0      Built-In
```

なにをもってpackegeと言っているのか未確認なので、どういうイメージを用意すれば`sonic-package-manager install`できるのかよくわかっていません。

## sonic-clear

統計情報などの初期化を実行するコマンドになります。

```shell-session
admin@sonic:~$ sonic-clear 
Usage: sonic-clear [OPTIONS] COMMAND [ARGS]...

  SONiC command line - 'Clear' command

Options:
  -?, -h, --help  Show this message and exit.

Commands:
  arp                  Clear IP ARP table
  counters             Clear counters
  dhcp6relay_counters  Clear dhcp6relay message counts
  dropcounters         Clear drop counters
  fdb                  Clear FDB table
  flowcnt-route        Clear all route flow counters
  flowcnt-trap         Clear trap flow counters
  headroom-pool        Clear headroom pool WM
  ip                   Clear IP
  ipv6                 Clear IPv6 information
  line                 Clear preexisting connection to line
  macsec               Clear MACsec counts.
  nat                  Clear the nat info
  ndp                  Clear IPv6 NDP table
  pbh                  Clear the PBH info
  pfccounters          Clear pfc counters
  priority-group       Clear priority_group WM
  queue                Clear queue WM
  queuecounters        Clear queue counters
  rifcounters          Clear RIF counters
  tunnelcounters       Clear Tunnel counters
```

わざわざ`docker exec -it swss arp -d -a` とかやらずにすみます。

## sonic-cfg-help

YANGモデルで定義されたものに符合するSONiCの設定一覧が表示されます。CONFIG_DBに定義できるテーブルと中に書けるフィールド、その説明になります。`-a`を指定すると全部出力するので大量です。

```shell-session
admin@sonic:~$ sonic-cfg-help
Error: Table or all option is required
usage: sonic-cfg-help [-h] [-t TABLE] [-f FIELD] [-p PRINT_FORMAT] [-a]

Description of table name

optional arguments:
  -h, --help            show this help message and exit
  -t TABLE, --table TABLE
                        Table name
  -f FIELD, --field FIELD
                        Field
  -p PRINT_FORMAT, --print_format PRINT_FORMAT
                        Print format
  -a, --all             Print all tables
admin@sonic:~$ sonic-cfg-help -a
ACL_RULE
Description: ACL_RULE part of config_db.json

key - ACL_TABLE_NAME:RULE_NAME
+-----------------------+---------------------------------------------+-------------+-----------+--------------------------+
| Field                 | Description                                 | Mandatory   | Default   | Reference                |
+=======================+=============================================+=============+===========+==========================+
| ACL_TABLE_NAME        |                                             |             |           | ACL_TABLE:ACL_TABLE_NAME |
+-----------------------+---------------------------------------------+-------------+-----------+--------------------------+
| RULE_NAME             |                                             |             |           |                          |
+-----------------------+---------------------------------------------+-------------+-----------+--------------------------+
| PACKET_ACTION         |                                             |             |           |                          |
+-----------------------+---------------------------------------------+-------------+-----------+--------------------------+
| MIRROR_INGRESS_ACTION |                                             |             |           | MIRROR_SESSION:name      |
+-----------------------+---------------------------------------------+-------------+-----------+--------------------------+
| MIRROR_EGRESS_ACTION  |                                             |             |           | MIRROR_SESSION:name      |
+-----------------------+---------------------------------------------+-------------+-----------+--------------------------+
| IP_TYPE               |                                             |             |           |                          |
+-----------------------+---------------------------------------------+-------------+-----------+--------------------------+
| PRIORITY              |                                             | true        |           |                          |
```

上記例では空欄ですが、なかにはdescriptionに解説が入っていたりして、興味深く眺めています。

`-p` で指定するフォーマットはPythonのtabulateモジュールに準拠していて、下記のいずれかを指定できます。

- "plain"
- "simple"
- "grid"
- "pipe"
- "orgtbl"
- "rst"
- "mediawiki"
- "latex"

たとえば`pipe`を指定すると、下記のような出力になります。

```shell-session
admin@sonic:~$ sonic-cfg-help -p pipe -a
ACL_RULE
Description: ACL_RULE part of config_db.json

key - ACL_TABLE_NAME:RULE_NAME
| Field                 | Description                                 | Mandatory   | Default   | Reference                |
|:----------------------|:--------------------------------------------|:------------|:----------|:-------------------------|
| ACL_TABLE_NAME        |                                             |             |           | ACL_TABLE:ACL_TABLE_NAME |
| RULE_NAME             |                                             |             |           |                          |
| PACKET_ACTION         |                                             |             |           |                          |
| MIRROR_INGRESS_ACTION |                                             |             |           | MIRROR_SESSION:name      |
| MIRROR_EGRESS_ACTION  |                                             |             |           | MIRROR_SESSION:name      |
```

CONFIG_DBに項目を追加したり、あるいは構造を変えたりする場合、YANG modelとの整合性がおそらく? いずれ? 問われることになると思います。

## sonic-cli

`klish` によるCLIを提供する対話シェルです。mgmt-frameworkが動いているのが前提です。Cisco風味。CLIのsyntaxはYANG modelから生成されるもののようです。`sonic-cli-gen` にモデル定義を突っ込めが生成されるようですが、試したことはないので違うかもしれません。コミュニティ版SONiCではインタフェースにIPアドレスをつけるくらいしかできないようです。

```shell-session
admin@sonic:~$ sonic-cli
sonic# configure terminal
sonic(config)# 
  end        Exit to the exec Mode
  exit       Exit from current mode
  interface  Select an interface
  ip         Global IP configuration subcommands
  no         To delete / disable commands in config mode

sonic(config)# 
```

もしかすると、ベンダーサポートのある商用のSONiCだと設定項目が大幅に拡充されているかもしれません。

# おわりに

よくわからんと言いながら紹介したものが多数あります。知ってる方、使ったことのある方がいらっしゃたら、ご教示いただけると嬉しく思います。