Topics で読み物として読む
この HLD は実装詳細を含みます。機能の概念・設定・運用を読み物として読みたい場合は Topics 14 章: Platform / Port / Optics を参照。
裏取りステータス: code-verified
sonic-buildimage/src/sonic-config-engine/portconfig.py に get_port_config / parse_port_config_file / get_child_ports / get_breakout_mode / get_fabric_port_config / get_fabric_monitor_config が一本化されている。これを sonic-cfggen (:35 from portconfig import get_port_config)、minigraph.py (:18)、sonic-platform-common/sonic_platform_base/sonic_sfp/sfputilhelper.py (from portconfig import get_port_config)、sonic-utilities/show/interfaces/__init__.py (from portconfig import get_child_ports) が呼び出しており、import 経路の一元化は達成。device 側 platform.json も既に多数の vendor で配布済 (Supermicro / Ragile / Arista 等)。
port_config.ini パーサ統合(portconfig.py 一元化)¶
概要¶
SONiC のポート定義は伝統的に port_config.ini(プラットフォーム配下のテキストファイル)に書かれており、ポート名・index・lane・speed 等を保持する1。共通パーサ sonic-buildimage/src/sonic-config-engine/portconfig.py がいる一方で、他のリポジトリ・モジュールにも独自に同じファイルをパースするコード が散在しており、メンテ性が悪化している。
本 HLD は すべての port_config.ini 関連ロジックを portconfig.py に寄せる リファクタを定義する。さらに当時並行で進んでいた port_config.ini → platform.json 移行を踏まえ、パース層を 1 箇所に集約しておけば後段の差し替えコストが下がる ことを動機にしている1。
動作仕様¶
portconfig モジュールの変更¶
portconfig.parse_port_config_file の戻り値は 常に index を含むよう統一 する。port_config.ini 側で index が定義されていない場合でも、1-based の auto-increment をデフォルト値として埋める1。
歴史的経緯として port_config.ini を 0-based で書いている SKU が一部残っていた。これらは すべて 1-based に揃える ことが本リファクタの前提条件として示されている1:
"For now, there are still a few SKUs provided port_config.ini file with 0-based port index, all those port_config.ini files should be changed to 1-based." 1
ポート index は他モジュールでも使われるため、抜けがあると下流に伝播する。共通パーサが必ず index を返すことで、呼び出し側は「無いケース」を考えなくて済む構造になる。
散在パーサの集約対象¶
5 ファイルが対象として列挙されている1:
| 場所 | 旧コード | 置き換え先 |
|---|---|---|
sonic-buildimage/src/sonic-daemon-base/sonic_daemon_base/daemon_base.py |
port_config.ini のパス取得 |
portconfig.get_port_config_file_name |
sonic-platform-common/sonic_platform_base/sonic_sfp/sfputilbase.py |
パース全般 | portconfig.get_port_config |
sonic-platform-common/sonic_platform_base/sonic_sfp/sfputilhelper.py |
パース全般 | portconfig.get_port_config |
sonic-utilities/sfputil/main.py |
パス取得 | portconfig.get_port_config_file_name |
sonic-utilities/utilities_common/util_base.py |
パス取得 | portconfig.get_port_config_file_name |
sfputilbase.py は内部で 3 つの dict と 1 つの list に整形して保持しており、後続コードがそのデータ構造に依存している。データ構造そのものは維持し、portconfig.py の出力を 既存構造に詰め替える adapter 的な変換 を入れる方針1。
sfputilhelper.py と sfputilbase.py のロジックは似ているため、さらに共通箇所に切り出して再利用 することも HLD で示唆されている1。
ベンダ固有コードにも同様のパース箇所がある。これらは 各ベンダ責任 でリファクタする1。
flowchart LR
PCI["port_config.ini\n(or platform.json)"] --> PC["sonic-config-engine/portconfig.py"]
PC -.-> A[daemon_base.py\nget_port_config_file_name]
PC -.-> B[sfputilbase.py\nget_port_config + adapter]
PC -.-> C[sfputilhelper.py\nget_port_config]
PC -.-> D["sfputil/main.py\nget_port_config_file_name"]
PC -.-> E["utilities_common/util_base.py\nget_port_config_file_name"]
PC -.-> V["vendor 固有モジュール\n(各ベンダ責任)"]
platform.json への移行を見据えた構造¶
port_config.ini から platform.json への置換は当時進行中の作業1。パース層を 1 箇所に集約 しておけば、ファイルフォーマットを切り替えるときも portconfig.py 内の実装を差し替えるだけで済み、呼び出し側 5 ファイル(および adapter)に手を入れずに後方互換が保てる、というのが副次的な狙い。
📋 検証エビデンス: sonic-net/SONiC/doc/port-config-refactor/port-config-refactor-design.md#L13-L15 (sha: 49bab5b5ff0e924f1ea52b3d9db0dfa4191a7c06)
出典:
sonic-net/SONiC/doc/port-config-refactor/port-config-refactor-design.md#L13-L15 (sha: 49bab5b5ff0e924f1ea52b3d9db0dfa4191a7c06)
抜粋:
There are also open PRs to begin transitioning from the "port_config.ini" file to a new "platform.json" file. So if we keep all parse logic in portconfig.py, it will be easy to keep backward compatible.
判断根拠: 一元化の動機が「platform.json への移行容易化」にあることの根拠。
依存関係¶
portconfig.py 自体は sonic-buildimage/src/sonic-config-engine パッケージに属する。これを他モジュールから再利用するために、HLD は次の 2 点を要求している1:
- build-time の unit test を持つモジュール は
sonic-config-engineを build-time dependency として宣言する。 - docker 内にインストールされるモジュール (例: pmon)は、その docker に
sonic-config-engineを同梱 する必要がある。HLD では pmon docker が既に同梱しているため再利用可能と注記している1。
つまり「parse 関数を呼ぶ側が portconfig 本体をリンクできる導線」を、テストとランタイム双方で確保するのが必須要件。
設定¶
関連する CONFIG_DB¶
該当エントリは無い。port_config.ini / platform.json は CONFIG_DB の上流 にあるビルド成果物であり、本リファクタは「パース実装の集約」だけを扱う。CONFIG_DB の PORT テーブル等の schema は変更しない1。
関連する CLI¶
該当 CLI は無い。show interfaces 系や sfputil 系の 出力は変わらない ことが test plan で明示されている1。
テスト方針¶
HLD が示すテスト計画1:
- t0 / t1-lag topology の regression を回し、既存テストが破壊されていないこと。
show interfaces全 sub-command をリファクタ前後で出力比較。sfputil全 sub-command を比較。特にsfputil lpmode/sfputil resetが 正しいインターフェース に効くことを確認。- システム起動後、xcrvrd(transceiver daemon)が Redis に正しいデータを push しているか。
- SFP モジュール挿抜で status が反映されるか。
- xcrvrd を kill した後、Redis 側の関連情報が削除されるか。
- DOM 情報が正しく更新されるか。
検証対象は Mellanox 全 SKU + 安定版 201911 image とされている1。当時の master を切る基準点としての記述で、現在の community master との対応関係は別途確認が必要。
制限事項¶
- 0-based index の SKU を 1-based に揃える必要がある。これを怠ると
parse_port_config_fileの auto-increment と既存記述が衝突するか、もしくは下流 index 参照と齟齬を起こす1。 - ベンダ固有コードはスコープ外。各ベンダリポジトリの port_config パース箇所は本 HLD では網羅しない1。
- リファクタの順序保証が無い。たとえば
sfputilbase.pyだけ移行・他は旧経路、という中間状態では、auto-increment の挙動と旧パーサの挙動が 微妙にずれる 可能性がある(旧パーサが index を返さないケースの扱い)。
干渉する機能¶
platform.jsonへの移行: 本リファクタが下地となる。パース層が 1 箇所ならport_config.iniかplatform.jsonかをportconfig.py内で吸収できる。- xcrvrd(transceiver daemon):
port_config.iniのパース経路に依存している。テスト計画でも DOM / 挿抜の挙動確認が必須項目になっている1。 sfputilCLI:lpmode/resetが正しい interface に効くかが重要なチェックポイント。ポート名 → index のマッピングが auto-increment 経路に切り替わる際の影響範囲1。- build dependency:
sonic-config-engineをビルド時依存に追加する変更が、他モジュールのビルド時間・コンテナサイズに微増の影響を与える可能性。
トラブルシューティング¶
- 移行後にポート番号がずれる:
port_config.ini側で 0-based のまま残っていないかを確認。auto-increment 経路と混ざると 1 ずれる。 sfputil lpmode <Ethernet0>が別 interface に効く:portconfig.get_port_configの戻りとsfputilbase.pyの dict / list 詰め替えの adapter にバグがある可能性。- pmon が起動失敗:
sonic-config-engineが docker 内に配置されていない。portconfig.pyを import できないため1。 - ベンダ固有 daemon で
port_config.iniが見つからない: vendor 側 のリファクタが追従していない可能性1。
コマンド例: Port config refactor 確認¶
下記コマンドで関連する CONFIG_DB / APP_DB / STATE_DB と CLI 出力・syslog を 突き合わせ、HLD 記載の挙動と現在の挙動が一致しているか確認できる。
# PORT エントリ反映と orchagent ログ
show interfaces status
redis-cli -n 4 keys 'PORT|Ethernet*' | sort | head
sudo grep -E 'portsorch' /var/log/syslog | tail -50
コマンド例: Port config refactor 確認¶
下記コマンドで関連する CONFIG_DB / APP_DB / STATE_DB と CLI 出力・syslog を 突き合わせ、HLD 記載の挙動と現在の挙動が一致しているか確認できる。
# PORT エントリ反映と orchagent ログ
show interfaces status
redis-cli -n 4 keys 'PORT|Ethernet*' | sort | head
sudo grep -E 'portsorch' /var/log/syslog | tail -50
参考リンク¶
- YANG: sonic-port
- CONFIG_DB: device-neighbor
- CLI: config interface
- Topics: Platform / Port / Optics
- Runbook: port admin up oper down
引用元¶
関連 Topics¶
参考リンク¶
本ページに関連する参照ドキュメント: