コンテンツにスキップ

Switchport モードと VLAN CLI 拡張 — HLD と実装の乖離

本ページは親 HLD Switchport モード(access / trunk / routed)と VLAN CLI 拡張HLD と実装の乖離 を切り出した派生ページ。概念や設定例は concepts / operations を参照。

1. ファイル + 行番号

  • 取り込み済み:
    • sonic-net/sonic-utilities config/switchport.py L17-L20(click サブコマンド switchport mode <type> <port>
    • config/switchport.py L20-L101(access / trunk / routed 切替時の VLAN 整合チェック)
    • sonic-buildimage/src/sonic-yang-models/yang-models/sonic-port.yang L88(switchport_mode leaf)
    • sonic-buildimage/src/sonic-yang-models/yang-templates/sonic-types.yang.j2switchport_mode 型定義)
  • HLD と差分あり: config/switchport.py L17-L20 の引数は <mode_type> <port> の 2 つだけ。HLD が要求する第 3 引数の <vlan-list>未実装

2. 差分の中身

HLD は config switchport mode access <port> <vlan>config switchport mode trunk <port> [<native-vlan>] [<vlan-list>] のようにモード切替と VLAN メンバ割当を 1 コマンドで行う仕様を提示している。現行実装は @click.argument("type", ..., type=click.Choice(["access", "trunk", "routed"]))@click.argument("port", ...) の 2 引数のみで、VLAN メンバ割当は 依然として別コマンド config vlan member add <vlan> <port> を呼ぶ必要がある。

実コード(sonic-utilities/config/switchport.py L17-L22):

@switchport.command("mode")
@click.argument("type", metavar="<mode_type>", required=True,
                type=click.Choice(["access", "trunk", "routed"]))
@click.argument("port", metavar="port", required=True)
@clicommon.pass_db
def switchport_mode(db, type, port):
    """switchport mode help commands.Mode_type can be access or trunk or routed"""

引数は <mode_type> + <port> の 2 個のみ。HLD の config switchport mode access <port> <vlan> / config switchport mode trunk <port> [<native-vlan>] [<vlan-list>] のような第 3 引数(VLAN リスト)は 無い。VLAN メンバ追加は別コマンド config vlan member add <vid> <port> [--untagged] (sonic-utilities/config/vlan.py)。

3. 読者への影響

  • sudo config switchport mode access Ethernet0 10 をそのまま打つと Error: Got unexpected extra argument (10) で失敗
  • HLD を読んで「モード切替 1 コマンドで VLAN メンバまで設定できる」と想定して runbook を作ると、本番投入時にすべて失敗する。特に大量ポートの自動化スクリプトで顕在化
  • HLD の trunk 例(native-vlan + vlan-list を 1 コマンド指定)も同様に成立せず、native と tagged を別々に --untagged 有無で書き分ける必要がある

4. 回避策

access ポート(VLAN 10 untagged):

sudo config switchport mode access Ethernet0
sudo config vlan member add 10 Ethernet0 --untagged

trunk ポート(native=10, tagged=20,21):

sudo config switchport mode trunk PortChannel1
sudo config vlan member add 10 PortChannel1 --untagged   # native (untagged)
sudo config vlan member add 20 PortChannel1              # tagged
sudo config vlan member add 21 PortChannel1

連続適用(同 VLAN を複数ポートに):

for p in Ethernet0 Ethernet4 Ethernet8; do
  sudo config switchport mode access $p
  sudo config vlan member add 100 $p --untagged
done

確認:

show vlan brief
show interfaces status  # PR #3788 取込後は switchport mode 列が出る

config vlan member add--untagged フラグで native VLAN を、無印で tagged VLAN を表現する。VLAN range の一括指定(20-22)は config vlan add/del 側でサポート(config/vlan.py)。

関連 GitHub Issue / PR

関連ページ

実装フェーズ境界

Phase 別の実装済 / 未実装 サマリ

本ページは monitor: partially_implemented で、HLD で示された一連の機能 が 段階的に取り込まれている 状態を扱う。フェーズ毎の実装境界を 1 枚の表に集約する (詳細は本ページ上部の diff admonition および discrepancy-index を参照)。

Phase 範囲 (機能 / 段階) 実装済 (master 取り込み済) 未実装 (HLD 提案のみ)
Phase 1 — 基本機能 HLD §概要 / §設計の中核ユースケース 取り込み済 — 本ページの「実装の概観」「実装詳細」節および diff admonition の現状側を参照 — (Phase 1 は実装済)
Phase 2 — 拡張機能 HLD §拡張 / §追加要件 / §周辺統合 一部のみ取り込み済 — 本ページ「実装詳細」の補足参照 未実装 / 未マージ — HLD §未対応箇所、本ページ「制限事項」および diff admonition の差分側に列挙
Phase 3 — 将来拡張 HLD §Future Work / §将来課題 未実装 — HLD 提案段階。対応 PR は確認されていない (last_verified 時点)

凡例: 「実装済」=現行 master で動作確認できる範囲 / 「未実装」=HLD には記載があるが対応 PR が未マージまたは設計のみで code が存在しない範囲。