SONiCの設定を戻す

# はじめに
SONiCの設定は`/etc/sonic/config_db.json` に保存されます。`config`コマンドで動作変更したものを`sudo config save`などで上書き保存することもできますし、直接エディタで編集して再起動させることで動作に反映させることもできます。

では、設定を元に戻すにはどうすればいいでしょう?

なお、下記は2021年11月30日の`master`ブランチをベースにして手元で一部不具合修正しビルドした仮想マシン版での挙動になります。`202106`ブランチなど過去の安定版では存在しないコマンドもありますことをご承知おきください。

# 保存されてる設定に戻す

`config load` あるいは `config reload` を使って、設定を起動時のものに戻せます。正確には　`/etc/sonic/config_db.json` の内容のとおりに内部DBを書き換えます。

`load`と`reload`の違いですが、前者は単にDBの内容を書き換えるだけ。後者は機能を一旦停止させ、新しいDB内容で各機能を再起動させるというものです。理屈としては、DBの書き換えはCLIの実行と同等なので、変更部分だけが動作に反映されるはずです。

どちらのコマンドも対話的に本当に実行するか尋ねられます。バッチ実行したい場合は `-y` をつけるといいでしょう。

```
admin@sonic:~$ sudo config load
Load config from the default config file(s) ? [y/N]: y
Running command: /usr/local/bin/sonic-cfggen -j /etc/sonic/config_db.json --write-to-db
admin@sonic:~$ 
```

なお当然ですが、`sudo config save`を実行すると、以降はその時点の設定に戻すことになります。

# チェックポイントに戻す

`config checkouint` と `config rollback` というコマンドが新設されました。

`config checkpoint` は、コマンド実行時点の設定に名前をつけて後で参照できるようにするコマンドになります。実行後、設定をいろいろ弄って、なんだかよくわからなくなってきたとき確実に動く設定に戻したいときは`config rollback`を実行すると戻ります。

なお、チェックポイントの一覧は `config list-checkpoints` で参照できます。

ではさっそくやってみましょう。

```
admin@sonic:~$ sudo config checkpoint ping-ok
Config Rollbacker: Config checkpoint starting.
Config Rollbacker: Checkpoint name: ping-ok.
Config Rollbacker: Getting current config db.
Config Rollbacker: Validating current config according to YANG models.
Note: Below table(s) have no YANG models:
KDUMP, SNMP, SNMP_COMMUNITY, 
sonic_yang(3):All Keys are not parsed in FEATURE
dict_keys(['dhcp_relay'])
sonic_yang(3):exceptionList:["'set_owner'"]
sonic_yang(3):Data Loading Failed:All Keys are not parsed in FEATURE
dict_keys(['dhcp_relay'])
Failed to create a config checkpoint
Usage: config checkpoint [OPTIONS] CHECKPOINT_NAME
Try "config checkpoint -h" for help.

Error: Running configs on the device are not valid.
admin@sonic:~$ 
```

**あれ?**

現在SONiCはYANG modelですべての設定を表現できるような拡充の作業が進行中で、その影響なのかも知れません。デプロイしたばかりのVMなのになあ。おかしいなあ。まあ動かないものはしかたありません。

# 指定したファイルの内容に設定を変更する

`config replace` コマンドが新設されました。これを用いると、指定したファイルのとおりに設定が書き換わります。なお、(下記のヘルプにも書かれていますが)動作の反映は差分のあったところだけ変更されるという挙動になります。

```
admin@sonic:~$ sudo config replace -h
Usage: config replace [OPTIONS] TARGET_FILE_PATH

  Replace the whole config with the specified config. The config is replaced
  with minimum disruption e.g. if ACL config is different between current
  and target config only ACL config is updated, and other config/services
  such as DHCP will not be affected.

  **WARNING** The target config file should be the whole config, not just
  the part intended to be updated.

  <target-file-path>: Path to the target file on the file-system.

Options:
  -f, --format [CONFIGDB|SONICYANG]
                                  format of target config is either
                                  ConfigDb(ABNF) or SonicYang
  -d, --dry-run                   test out the command without affecting
                                  config state
  -v, --verbose                   print additional details of what the
                                  operation is doing
  -h, -?, --help                  Show this message and exit.
admin@sonic:~$ 
```

こちらもやってみましょう。

```
admin@sonic:~$ echo 'kore ha dame config desu' > dame_config
admin@sonic:~$ sudo config replace -f CONFIGDB -d dame_config 
Failed to replace config
Usage: config replace [OPTIONS] TARGET_FILE_PATH
Try "config replace -h" for help.

Error: Expecting value: line 1 column 1 (char 0)
admin@sonic:~$ 
```

きちんとエラーが出ました。よしよし。
じゃあ次に、設定を追加したあと`/etc/sonic/config_db.json`の内容に戻してみます。

```
admin@sonic:~$ sudo config interface ip add Ethernet0 10.138.25.5/26
admin@sonic:~$ show runningconfiguration all | grep 138
        "Ethernet0|10.138.25.5/26": {}
admin@sonic:~$ sudo config replace -f CONFIGDB /etc/sonic/config_db.json 
Config Replacer: Config replacement starting.
Config Replacer: Target config length: 5155.
Config Replacer: Validating target config according to YANG models.
sonic_yang(3):All Keys are not parsed in FLEX_COUNTER_TABLE
dict_keys(['POLL_INTERVAL'])
sonic_yang(3):exceptionList:[]
sonic_yang(3):Data Loading Failed:All Keys are not parsed in FLEX_COUNTER_TABLE
dict_keys(['POLL_INTERVAL'])
Failed to replace config
Usage: config replace [OPTIONS] TARGET_FILE_PATH
Try "config replace -h" for help.

Error: The given target config is not valid
admin@sonic:~$ 
```

**あれ?**

# 工場出荷状態に戻す

`show` コマンドに `initialconfiguration` みたいのがあればよかったのですが、ありませんでした。ここでは、工場出荷状態の設定をどうやって出力させるかを書きます。

`sonic-cfggen` コマンドで工場出荷時設定を出力させることができます。使用するオプションは3つ。

- `-H`
- `-k`
- `--preset`



```
admin@sonic:~$ sonic-cfggen -H -k Force-S6000 --preset t1less
{
    "DEVICE_METADATA": {
        "localhost": {
            "hwsku": "Force-S6000",
            "platform": "x86_64-kvm_x86_64-r0",
            "mac": "52:54:00:12:04:00",
            "hostname": "sonic",
            "type": "LeafRouter",
            "bgp_asn": "65100"
        }
    },
    "PORT": {
        "Ethernet0": {
            "admin_status": "up",
            "alias": "fortyGigE0/0",
            "fec": "rs",
            "index": "0",
            "lanes": "25,26,27,28",
            "mtu": "9100",
            "speed": "40000"
        },
        "Ethernet100": {
            "admin_status": "up",
:
```

おおよそこんなふうです。`-k` にはHwSKUの値を書きます。`show platform summary`で出てきます。別のいいかげんな値を書くとコンソールアクセス以外できない設定が吐き出されたりしますのでご注意を。

`--preset` のところに指定可能なキーワードは `sonic-cfggen -h` で確認できます。通常は`default_sku`ファイルでほぼ`t1`が指定されていると思います。キーワードを変えるとそれなりに異なる設定が吐き出されますので、興味のある方は比較などしてみるといいかも知れません。

この出力内容をファイルに書き出して`config replace`するなり(できるのだろうか?)、 `/etc/sonic/config_db.json` に上書きして`config reload`するなり再起動するなり、お好きにやられるといいかと思います。

# おわりに

`config rollback` が生えたのは知っていましたが、起点を設定する`config checkpoint`が動かないとは思いませんでした。いずれ動くようになると思いますが……。がんばれYANG modelといったところでしょうか。