コンテンツにスキップ

cluster フィールド

概要

SONiC の CONFIG_DB には独立した CLUSTER テーブルは存在しない。「cluster」概念は以下の 2 テーブルのフィールドとして実装されている1

テーブル キー フィールド 意味
DEVICE_METADATA localhost cluster 自ノードの所属クラスタ名
DEVICE_NEIGHBOR_METADATA <device_hostname> cluster 隣接デバイスの所属クラスタ名

クラスタ名は minigraph XML の <ClusterName> 要素から派生し、sonic-cfggen / minigraph.py がデバイス起動時に CONFIG_DB へ書き込む。典型値は "AAA00PrdStr00" のようなデータセンター内の論理グループ識別子。

key 構造

DEVICE_METADATA|localhost
DEVICE_NEIGHBOR_METADATA|<device_hostname>

フィールド詳細

フィールド YANG default 実行時 fallback 説明
cluster string なし "" (空文字列) 所属クラスタ名。minigraph の <ClusterName> から派生

暗黙デフォルト・コード由来挙動

cluster フィールドの書き込み条件の非対称性

cluster フィールドには YANG default 文が存在しない (optional フィールド)。書き込み挙動はテーブルによって異なる。

DEVICE_METADATA|localhost.cluster

# minigraph.py:2170-2172
cluster = [devices[key] for key in devices if key.lower() == hostname.lower()][0].get('cluster', "")
if cluster:                                            # truthy check — 空文字列はスキップ
    results['DEVICE_METADATA']['localhost']['cluster'] = cluster
  • minigraph XML に <ClusterName>存在しない場合: get('cluster', "") により "" が得られ、if cluster: が False → フィールドを書き込まない
  • <ClusterName>存在し非空の場合のみ書き込まれる
  • DB にフィールドが存在しない場合の消費側 fallback: 空文字列 "" (.get('cluster', '') パターン)

DEVICE_NEIGHBOR_METADATA|.cluster

# minigraph.py:662-668
(_, _, _, _, name, hwsku, d_type, deployment_id, cluster, d_subtype, slice_type) = parse_device(device)
device_data = {}
if cluster != None:                                    # None check — 空文字列 "" は書き込まれる
    device_data['cluster'] = cluster
# minigraph.py (parse_device):493,514-515
cluster = None                                        # 初期値 None
elif node.tag == str(QName(ns, "ClusterName")):
    cluster = node.text                               # XML タグが存在すれば text を代入 (空文字列の場合も代入)
  • <ClusterName> タグが存在しない場合: cluster = None のまま → if cluster != None: が False → 書き込まない
  • <ClusterName> タグが存在し空文字列の場合: cluster = ""if cluster != None: が True → 空文字列 "" が書き込まれる (DEVICE_METADATA と挙動が異なる)
  • <ClusterName> タグが存在し非空の場合: 値を書き込む

非対称性のまとめ

テーブル 書き込み条件 空文字列の扱い
DEVICE_METADATA|localhost if cluster: (truthy) 書き込まない
DEVICE_NEIGHBOR_METADATA|<dev> if cluster != None: (None check) 書き込む ("")

YANG スキーマ

# sonic-device_metadata.yang:184-187
leaf cluster {
    type string;
    description "The switch is a member of this cluster.";
}

# sonic-device_neighbor_metadata.yang:39-42
leaf cluster {
    description "The switch is a member of this cluster";
    type string;
}

両 YANG モデルとも default 文なし、mandatory 文なし → optional フィールド。

書き込み入り口 (Direction A)

対象テーブル: DEVICE_METADATA / DEVICE_NEIGHBOR_METADATAcluster フィールド

minigraph / sonic-cfggen

  • sonic-cfggen -m /etc/sonic/minigraph.xml -d<ClusterName> タグが存在する場合に書き込み
  • ソース: sonic-buildimage/src/sonic-config-engine/minigraph.py

CLI

  • なし (CLI から cluster フィールドを直接書き込む手段は提供されていない)

REST / gNMI (sonic-mgmt-common)

  • なし

db_migrator

  • なし (migration 対象外)

ビルド時デフォルト

  • なし

ランタイム注入

  • なし

消費側 (Direction B)

消費元 参照箇所 使用目的
minigraph.py:2170 get('cluster', "") 自ノード cluster 名を DEVICE_METADATA に書き込む前処理
swss_vars.j2 Jinja2 変数参照 template 展開 (存在しない場合は空文字列)

関連 CONFIG_DB / YANG / CLI

関連リファレンス

引用元

運用ヒント

cluster 名の確認

# 自ノードの cluster 名確認
sonic-db-cli CONFIG_DB hget 'DEVICE_METADATA|localhost' cluster

# 隣接デバイスの cluster 名確認 (例: ARISTA01T1)
sonic-db-cli CONFIG_DB hget 'DEVICE_NEIGHBOR_METADATA|ARISTA01T1' cluster

cluster 名が設定されない場合

minigraph XML に <ClusterName> タグが存在しない構成では、フィールドが DB に存在しない。hget の結果が空になるが、これは正常。消費側コードは空文字列として処理する。

例外条件・特殊挙動

条件 テーブル 挙動
<ClusterName> タグなし DEVICE_METADATA フィールドを書き込まない (if cluster: False)
<ClusterName> タグなし DEVICE_NEIGHBOR_METADATA フィールドを書き込まない (cluster = None, if cluster != None: False)
<ClusterName> タグあり・空文字列 DEVICE_METADATA 書き込まない (truthy check で "" はスキップ)
<ClusterName> タグあり・空文字列 DEVICE_NEIGHBOR_METADATA 空文字列 "" を書き込む (None check のため通過)

Evidence: sonic-buildimage src/sonic-config-engine/minigraph.py:493,514-515,662-668,2170-2172