2

現在、私は (レガシー) Python プロジェクトの一部として YANG を使用しています。

Python 辞書として編成されたデータを検証するために使用されるスキーマを定義する作業に行き詰まっています。多くのコードベースがこのデータを使用しているため、可能であれば、現在の構造を維持したいと考えています。

「変更されていない」データ:

"namespace": {                      # Mandatory
    "management": {                 # Optional
        "interfaces": {             # Mandatory
            "m0": {                 # Optional
                "leaf1": "..."
            }
        }
    },
    "benchmark": {                  # Optional
        "interfaces": {             # Mandatory
            "b0": {                 # Optional
                "leaf1": "...",
                "leaf2": "..."
            },
            "b1": {                 # Optional
                "leaf1": "...",
                "leaf2": "..."
            }
        }
    }
}

私の問題は、「オプション」(例で) としてマークされているものはすべてコンテナーとしてモデル化されますが、 RFC6020に従ってオプション (つまり、必須の false;) として定義できないようです。

したがって、リストを使用するモデルを定義しました。つまり、Python Dict の一部のノード (management、benchmark、m0、b0、b1) はリスト要素になり、現在の方法ではアクセスできません。data['namespace']['management']...

変更された例は次のようになります。

"namespace": [
    {
        "desc": "management",
        "interfaces": [
            {
                "leaf1": "..."
            }
        ]
    },
    {
        "desc": "benchmark",
        "interfaces": [
            {
                "leaf1": "...",
                "leaf2": "..."
            },
            {
                "leaf1": "...",
                "leaf2": "..."
            }
        ]
    }
]

記述 (私の現在のスニペット) YANG モデル:

list namespace {
    description "Namespace definitions.";
    key desc;

    leaf desc { type string; }

    uses leaf-definitions;

    list interfaces {
        key leaf1;
        uses leaf-definitions;
    }
}

検証は成功し、データの変換 (それ自体) は問題ありませんが、壊れたコードが山積みになっています。

これは私の質問につながります:

  1. 私は正しいですか - YANG のコンテナは常に必須ですか?
  2. このシナリオをモデル化する別の方法はありますか? (「あまり」を壊さずに)

私は YANG を始めたばかりなので、ご意見をお寄せいただきありがとうございます。

4

1 に答える 1