2017-03-06 13 views
1

条件が存在しないノードを参照している場合は、次のようになります。私はなぜpyangがエラーをスローしないのだろうか?しかし、私は間違った接頭辞を使用しています。このシナリオでpyangがエラーをスローしない理由

いつの条件(モジュールに埋め込まれているか)を確認してください。

拡張子自体からスキーマを参照することは(式の場合)許可されていますか?そして、このような機能や接頭語の使用状況などの追加のチェック、のカップル - pyangは、すべてで唯一その構文をXPath式の意味を検証していないためである

module mod-w-1 { 
    namespace "http://example.org/tests/mod-w-1"; 
    prefix m1; 

    container m1 { 
    leaf b1 { 
     type string; 
    } 
    } 
} 

module when-tests { 
    namespace "http://example.org/tests/when-tests"; 
    prefix wt; 

    import mod-w-1 { 
    prefix m1; 
    } 

    augment "/m1:m1" { 
     // when "/m1:m1/b3 = 'abc'"; 
     // there is no b3, so, should be invalid. 

     // when "/m1:m1/b1 = 'abc'"; 
     // a payload or data situation that has m1/b1 != 'abc' will cause the 
     // data that fits this augment content will be invalid/rejected. 
     /* for ex; 
      <m1> 
      <b1>fff</b1> 
      <x>sfsf</x> 
      <conditional> 
       <foo>dddd</foo> 
      </conditional> 
      </m1> 
      is invalid, hence, the <x> and <conditional> parts will be 
      rejected. 
     */ 
     leaf x { 
     type string; 
     } 
     container conditional { 
      leaf foo { 
       type string; 
      } 
     } 
    } 
} 

答えて

1

。これらを正しく検証するには、別のYANGコンパイラが必要です。

def v_xpath(ctx, stmt): 
    try: 
     toks = xpath.tokens(stmt.arg) 
     for (tokname, s) in toks: 
      if tokname == 'name' or tokname == 'prefix-match': 
       i = s.find(':') 
       if i != -1: 
        prefix = s[:i] 
        prefix_to_module(stmt.i_module, prefix, stmt.pos, 
            ctx.errors) 
      elif tokname == 'literal': 
       # kind of hack to detect qnames, and mark the prefixes 
       # as being used in order to avoid warnings. 
       if s[0] == s[-1] and s[0] in ("'", '"'): 
        s = s[1:-1] 
        i = s.find(':') 
        # make sure there is just one : present 
        if i != -1 and s[i+1:].find(':') == -1: 
         prefix = s[:i] 
         # we don't want to report an error; just mark the 
         # prefix as being used. 
         my_errors = [] 
         prefix_to_module(stmt.i_module, prefix, stmt.pos, 
             my_errors) 
         for (pos, code, arg) in my_errors: 
          if code == 'PREFIX_NOT_DEFINED': 
           err_add(ctx.errors, pos, 
             'WPREFIX_NOT_DEFINED', arg) 
      elif ctx.lax_xpath_checks == True: 
       pass 
      elif tokname == 'variable': 
       err_add(ctx.errors, stmt.pos, 'XPATH_VARIABLE', s) 
      elif tokname == 'function': 
       if not (s in xpath.core_functions or 
         s in yang_xpath_functions or 
         (stmt.i_module.i_version != '1' and 
         s in yang_1_1_xpath_functions) or 
         s in extra_xpath_functions): 
        err_add(ctx.errors, stmt.pos, 'XPATH_FUNCTION', s) 
    except SyntaxError as e: 
     err_add(ctx.errors, stmt.pos, 'XPATH_SYNTAX_ERROR', e) 

ライン1993のstatements.py

存在しないノードを参照するXPath式は技術的に無効ではなく、XPath仕様の観点からは無効であることに注意してください。これは、空のノードセットがロケーションパスによって選択されることを意味します(条件はfalseになります)。

はい、補完の対象ノードの「上」にあるノードまたはその兄弟であるノードを参照できます。実際にはwhenステートメントが実行されているときは常にそうするべきです(条件付きのノードを参照しないでください) 。

また、接頭辞なしのノードテスト(たとえば、b3およびb1など)で「モジュールの閉じ込め」を中断しないようにしてください。 XPath式は、定義モジュールと定義モジュール自体のインポートで定義された名前しか見ることができません。たとえば、b3が未知の第3のモジュールによって後で拡張されたとしても、あなたの状態はまだfalseと評価されます。接頭辞のない名前が定義モジュールの名前空間に属していると仮定することが最善です。

+0

こんにちは、ありがとうございます。私があなたに直接連絡できる方法はありますか?私はおそらく相談の数時間(私は支払う必要があります)あなたは積極的にヤン関連の質問に役立つ唯一のようだ。 – user19937

+0

pyangが提供するものを越える他の陽ツールがありますか?私はlibyangについて知っていますが、私はyang 1.1に準拠し、信頼できるものであることが知られています。そこには何もありません(借用は、私が直接的に知っている人から聞きたいものではありません)? – user19937

+0

@ user19937、ああ、私は唯一の人ではありません - 私はちょうど答えた最初の人に起こり、私は私が答えることができる知っている質問に答えるだけです。 NETMOD WGは、いくつかのコンパイラを使ってモジュールを(コンパイルして)(コンパイルして)リストアしましたが、1.1に準拠しているかどうかはわかりません。 NETCONF/YANG関連の実装[here](https://trac.ietf.org/trac/netconf)のリストがあります。 MG-SOFTにはYANGツールチェーン(IDEを含む)があり、1.1のサポートが開始されXPath式が検証されています(免責事項:私は従業員です)。 – predi

関連する問題