ここ数日間、これを調査しようとしましたが、私の調査は不十分でした。YANGモデルでのmust()句の使用に関する資料はあまりないようです。
バックグラウンド
I2RS YANG モデル ( IETF I2RS Data Model for Network Topologiesに基づく) の NETCONF モデルを顧客固有の情報で拡張しようとしています。したがって、私のモデルは、モデルの関連部分 (ここでは省略形で示されています) を補強します。私が立ち往生しているのは、特に特定のlink-usageを持つリンクの数について、入力データにいくつかのセマンティック制約を実装する適切な方法を策定することです。pyang は、次の説明のツールチェーンとして使用されます。
増強 YANG モジュール
省略されたモジュールは次のようになります。
module bsc-topology {
yang-version 1;
namespace "urn:TBD:params:xml:ns:yang:bsc:bsc-topology";
prefix "bsc";
import nodes {
prefix "nd";
revision-date 2015-03-09;
}
import network-topology {
prefix "nt";
revision-date 2015-03-09;
}
import ietf-inet-types {
prefix "inet";
}
organization "TBD";
contact "TBD";
revision "2015-03-11" {
description "Initial revision";
reference "TBD";
}
identity flag-identity {
description "Base type for flags";
}
identity undefined-flag {
base "flag-identity";
}
typedef bsc-link-service-type {
type enumeration {
enum "Ater" {
value 1;
description "This link describes the Ater topology";
}
enum "Gb" {
value 2;
description "This link describes the Gb topology";
}
}
}
typedef flag-type {
type identityref {
base "flag-identity";
}
}
grouping ater-attributes {
leaf prefix {
type inet:ip-prefix;
}
leaf metric {
type uint32;
}
leaf-list flag {
type flag-type;
}
}
grouping bsc-topology-type {
container bsc-topology {
presence "Indicates BSC Topology";
}
}
grouping bsc-link-attributes {
container bsc-link-attributes {
leaf name {
description "Link Name";
type string;
}
leaf link-usage {
type bsc-link-service-type;
description "Type of Service described through this link (Ater or Gb)";
must "boolean(count(../../../nd:link) = 1)";
}
}
}
augment "/nd:network/nd:network-types" {
uses bsc-topology-type;
}
augment "/nd:network/nt:link" {
when "/nd:network/nd:network-types/bsc-topology";
uses bsc:bsc-link-attributes;
}
}
入力ファイル
次の入力を検証しようとしています:
<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<nd:network xmlns:nd="urn:TBD:params:xml:ns:yang:nodes">
<nd:network-id>Test</nd:network-id>
<nd:network-types>
<bsc:bsc-topology xmlns:bsc="urn:TBD:params:xml:ns:yang:bsc:bsc-topology"/>
</nd:network-types>
<nd:node>
<nd:node-id>407201001A</nd:node-id>
<nt:termination-point xmlns:nt="urn:TBD:params:xml:ns:yang:links">
<nt:tp-id>SERVICE_TP</nt:tp-id>
</nt:termination-point>
</nd:node>
<nd:node>
<nd:node-id>407850001A</nd:node-id>
<nt:termination-point xmlns:nt="urn:TBD:params:xml:ns:yang:links">
<nt:tp-id>SERVICE_TP</nt:tp-id>
</nt:termination-point>
</nd:node>
<nt:link xmlns:nt="urn:TBD:params:xml:ns:yang:links">
<nt:link-id>407201001A-407850001A-Ater</nt:link-id>
<nt:source>
<nt:source-node>407201001A</nt:source-node>
<nt:source-tp>SERVICE_TP</nt:source-tp>
</nt:source>
<nt:destination>
<nt:dest-node>407850001A</nt:dest-node>
<nt:dest-tp>SERVICE_TP</nt:dest-tp>
</nt:destination>
<bsc:bsc-link-attributes xmlns:bsc="urn:TBD:params:xml:ns:yang:bsc:bsc-topology">
<bsc:link-usage>Ater</bsc:link-usage>
</bsc:bsc-link-attributes>
</nt:link>
</nd:network>
</config>
Pyang 検証出力
yang2dsdl -j -s -b nodes_network-topology_bsc-topology -t config -v foo3.xml
== Using pre-generated schemas
== Validating grammar and datatypes ...
foo3.xml validates.
== Adding default values... done.
== Validating semantic constraints ...
--- Failed assert at "/nc:config/nd:network/lnk:link/bsc:bsc-link-attributes/bsc:link-usage":
Condition "boolean(count(../../../nd:link) = 1)" must be true
質問: boolean(count(../../../nd:link) = 1) が true と評価されないのはなぜですか?
そこには明らかに1つのリンクがあります。ここで何が欠けていますか?
その他の検証済み
XPath Expression Testbedを使用して、不足しているポインターを見つけましたが、そのツールは期待どおりの結果をもたらしました。コンテキスト ノードなしで検証した場合と、上記の XML ファイルのリンク使用ノードにコンテキスト ノードを設定した場合の両方。
私が欠けているものへのポインタはありますか?