0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

SONiCAdvent Calendar 2022

Day 9

Dynamic Port Breakoutを試してみる[追記あり]

Last updated at Posted at 2022-12-09

はじめに

ある機能について、SONiC自体はサポートしていても、それぞれの機種がその機能をサポートしているとは限りません。そんな機能の一つ、Dynamic Port Breakout (DPB) について実機で試してみました。

確認したのは2022年12月8日にビルドしたmasterブランチのイメージになります。

DPB?

リンク速度100Gのポートを持つスイッチがあるとします。
このポートを25G×4に分割して使うのがPort Breakoutです。

もちろん物理的に分割できないと意味がないのですが、こんなかんじのケーブルを使います。

SONiCでは長らく、port_config.iniを編集して再起動することでこのPort Breakout設定することが可能でしたが、2019年に動的な変更実現する仕組みが検討され始め、2020年以降いくつかのハードウェアで利用可能になっています。これがDynamic Port Braekeout(DPB)です。

DPBのやりかた

CLIで config interface breakout を実行します。

admin@sonic:~$ sudo config interface breakout
Usage: config interface breakout [OPTIONS] <interface_name> MODE
Try "config interface breakout -h" for help.

Error: Missing argument "<interface_name>".

<interface_name>にはEthernet0などを指定します。MODEには1x100G[40G]とか4x25G[10G]とか書きます。ポート速度はconfig interface speedで設定します。

さわれる実機では対応していないんじゃが?

自分が触ることのできるSONiC対応スイッチに DELTA AG9032V2A というのがあります。Broadcom Trident3を搭載した100G×32ポートのスイッチなのですが、このスイッチ用のSONiCはどうもDPBに対応していないようです。

admin@sonic:~$ sudo config interface breakout Ethernet0 4x25G[10G]
Do you want to Breakout the port, continue? [y/N]: y
[ERROR] Breakout feature is not available without platform.json file
Aborted!

むう。エラーメッセージを見る限り、なんかJSONファイルを書けばいけそうな感じがしますが。

調べてみた

DPB対応機種

rg -i breakout_modes で出てきたうちスクリプトやテスト用ファイルを覗いたものを整形しました。

  • Accton
    • WEDGE100BF-32QS
    • AS7816-64X
  • Alphanetworks
    • SNJ60D0_320F
  • Arista
    • 7050-QX32
    • 7060PX4-32
    • 7170B-64C
    • 7060DX4-32
    • 720DT-48S
    • 7050CX3-32S
    • 7260CX3-64
    • 7050-QX32S
    • 7060-CX32S
    • 7060DX5-64S
  • DELL
    • Z9332F-D1508
  • Barefoot
    • AS9516-32D
    • WEDGE100BF-65X
    • WEDGE100BF-32X
  • Celestica
    • Seastone
  • Mellanox
    • MSN3700C
    • MSN4600C
    • MSN2740
    • MSN4410
    • MSN2010
    • SN2201
    • MSN2410
    • MSN4700
    • MSN2100
    • MSN3420
    • MSN4600
    • MSN3800
    • MSN3700
    • MSN2700
    • SN5600
  • Netberg
    • AURORA-610
  • Quanta
    • IX9-BWDE

platform.jsonのフォーマット

設計ドキュメントが見つかりました。それによると、ざっくり下記のように書けばよさそうです。

platform.json
{
  "interfaces": {
    "Ethernet0": {
      "index": "0,0,0,0",
      "lanes": "1,2,3,4",
      "breakout_modes": {
        "1x100G[40G]": ["Ethernet0"],
        "4x25G[10G]": ["Ethernet0", "Ethernet1", "Ethernet2", "Ethernet3"]
      }
    },
    "Ethernet4": {
      (以下略)
    }
  }
}

breakout_modesのところは書きを設定可能パターンに合わせて並べます。

"本数x速度[別の速度]: [本数分インタフェース名をカンマ区切りで並べる]"

indexlanesport_config.iniの値をそのまま書けばよさそうです。

書いてみた

これを実機のディレクトリ(/usr/share/sonic/device/x86_64-delta-ag9032v2a-r0/)に置けば完了かな?

よし設定してみよう!

admin@sonic:~$ sudo config interface breakout Ethernet0 4x25G
Do you want to Breakout the port, continue? [y/N]: y
[ERROR] Breakout feature is not available without platform.json file
Aborted!

あれ?

調査結果

コードを追いかけた結果わかったこと

  1. hwsku.jsonplatform.jsonの両方が必要
  2. platform.jsonの中は前述のものが必要
  3. hwsku.jsonの中にinterfacesキーが必要
  4. hwsku.jsoninterfacesの中にデフォルトのモードを書いておくこと

hwsku.jsonの中身は、デフォルトをどうするか記述するようです。

hwsku.json
{ 
   "interfaces": {
        "Ethernet0": {
            "default_brkout_mode": "1x100G[40G]"
        },

        "Ethernet4": {
            "default_brkout_mode": "1x100G[40G]"
        },
        (以下略)
}

/usr/share/sonic/device/x86_64-delta-ag9032v2a-r0/Delta-ag9932v2a/に置きます。

ではいざ実行!

admin@sonic:~$ sudo config interface breakout Ethernet0 4x25G[10G]
Do you want to Breakout the port, continue? [y/N]: y
[ERROR] BREAKOUT_CFG table is NOT present in CONFIG DB
Aborted!

ぐぬぬ。

CONFIG_DBのBREAKOUT_CFGを設定する

探したところ、SONiC Configuration Database Manualに記載がありました。

"BREAKOUT_CFG": {
    "Ethernet0": {
        "brkout_mode": "4x25G[10G]"
    },
    "Ethernet4": {
        "brkout_mode": "4x25G[10G]"
    },

というふうに書くとのこと。"1x100G[40G]"でずらっと/etc/sonic/config_db.jsonに書き加えて、sudo config load -y`します。

さあ、試してみましょう。

admin@sonic:~$ sudo config interface breakout Ethernet0 4x25G[10G]
Do you want to Breakout the port, continue? [y/N]: y

Running Breakout Mode : 1x100G[40G] 
Target Breakout Mode : 4x25G[10G]

Ports to be deleted : 
 {
    "Ethernet0": "100000"
}
Ports to be added : 
 {
    "Ethernet0": "25000",
    "Ethernet1": "25000",
    "Ethernet2": "25000",
    "Ethernet3": "25000"
}
sonic_yang(6):Note: Below table(s) have no YANG models: CONTAINER_FEATURE, XCVRD_LOG
sonic_yang(3):All Keys are not parsed in FEATURE
dict_keys(['sflow', 'telemetry'])
sonic_yang(3):exceptionList:["'status'", "'status'"]
sonic_yang(3):Data Loading Failed:All Keys are not parsed in FEATURE
dict_keys(['sflow', 'telemetry'])
exceptionList:["'status'", "'status'"]
Data Loading Failed
All Keys are not parsed in FEATURE
dict_keys(['sflow', 'telemetry'])
exceptionList:["'status'", "'status'"]
ConfigMgmt Class creation failed

YANG modelの罠!

CONFIG_DBの中身がYANG modelのお気に召さなかったようでうまくいきませんでしたが、DPB自体は動かせそうでした。本日はここまで。

おわりに

思ったよりも簡単に対応できそうでホッとしました。

YANG modelもう少しわかるようにエラーを出していただきたいです。。

[追記] 動きました!

YANG model的にはおそらくFEATUREテーブルの中の"status"がお気に召さないんだろうと思い、"status"キーのある部分を2箇所削除してみました。すると、

$ $ sudo config interface breakout Ethernet0 4x25G[10G]
Do you want to Breakout the port, continue? [y/N]: y

Running Breakout Mode : 1x100G[40G] 
Target Breakout Mode : 4x25G[10G]

Ports to be deleted : 
 {
    "Ethernet0": "100000"
}
Ports to be added : 
 {
    "Ethernet0": "25000",
    "Ethernet1": "25000",
    "Ethernet2": "25000",
    "Ethernet3": "25000"
}
sonic_yang(6):Note: Below table(s) have no YANG models: CONTAINER_FEATURE, 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.135/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.
ConfigMgmt Class creation failed

ああ、これはYANG modelで怒られるありがちなMGMT_PORT関連かな。追加してみます。

    "MGMT_PORT": {
        "eth0": {
          "admin_status": "up"
        }
    },

追記して、config load -yでCONFIG_DBに反映して、もう一度。

admin@sonic:~$ sudo config interface breakout Ethernet0 4x25G[10G]
Do you want to Breakout the port, continue? [y/N]: y

Running Breakout Mode : 1x100G[40G] 
Target Breakout Mode : 4x25G[10G]

Ports to be deleted : 
 {
    "Ethernet0": "100000"
}
Ports to be added : 
 {
    "Ethernet0": "25000",
    "Ethernet1": "25000",
    "Ethernet2": "25000",
    "Ethernet3": "25000"
}
sonic_yang(6):Note: Below table(s) have no YANG models: CONTAINER_FEATURE, XCVRD_LOG
Below Config can not be verified, It may cause harm to the system
 {}
Do you wish to Continue? [y/N]: y
Breakout process got successfully completed.
Please note loaded setting will be lost after system reboot. To preserve setting, run `config save`.

動きました!!

よかった。おしまい。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?