Uploaded image for project: 'yangtools'
  1. yangtools
  2. YANGTOOLS-1532

Fail to parse YANG module with a node with if-feature augmented within grouping

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Done
    • Icon: Medium Medium
    • 12.0.0, 9.0.9, 11.0.4, 10.0.11
    • 11.0.0, 9.0.8, 10.0.9
    • parser

      Parsing of a YANG module fails when the module has the following schema:

      • A node with if-feature is augmented to a grouping within another grouping
      • The augmented node has a sibling node under the same augment statement but the sibling does not have if-feature
      • the augmentation target node is augmented again when the grouping is used.

      For example, the following YANG modules cannot be compiled if the feature (foo:alpha) is not supported:

      module foo {
        namespace "urn:foo";
        prefix "foo";
      
        feature alpha;
      
        grouping foo-group {
          container foo;
        }
      
        grouping bar-group {
          uses foo-group {
            augment foo {
              leaf bar1 {
                if-feature alpha;
                type string;
              }
              leaf bar2 {
                type string;
              }
            }
          }
        }    
      
        uses bar-group {
          augment foo {
            leaf baz {
              type string;
            }
          }
        }
      }
      

      This happens even when the sibling node is just description.

      module foo {
        namespace "urn:foo";
        prefix "foo";
      
        feature alpha;
      
        grouping foo-group {
          container foo;
        }
      
        grouping bar-group {
          uses foo-group {
            augment foo {
              description "augmentation to foo";
              leaf bar1 {
                if-feature alpha;
                type string;
              }
              leaf bar2 {
                if-feature alpha;
                type string;
              }
            }
          }
        }    
      
        uses bar-group {
          augment foo {
            leaf baz {
              type string;
            }
          }
        }
      }
      

      The issue goes away if description is removed.

      The following shows the backtrace when this error happens - it complains that "Leaf is missing a 'type' statement":

      Caused by: org.opendaylight.yangtools.yang.parser.spi.meta.SomeModifiersUnresolvedException: Some of EFFECTIVE_MODEL modifiers for statements were not resolved.
      	at org.opendaylight.yangtools.yang.parser.reactor@11.0.1-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.BuildGlobalContext.propagateException(BuildGlobalContext.java:199)
      	at org.opendaylight.yangtools.yang.parser.reactor@11.0.1-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.BuildGlobalContext.transformEffective(BuildGlobalContext.java:213)
      	at org.opendaylight.yangtools.yang.parser.reactor@11.0.1-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.BuildGlobalContext.buildEffective(BuildGlobalContext.java:174)
      	at org.opendaylight.yangtools.yang.parser.reactor@11.0.1-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.CrossSourceStatementReactor$BuildAction.buildEffective(CrossSourceStatementReactor.java:231)
      	at org.opendaylight.yangtools.yang.parser.rfc7950@11.0.1-SNAPSHOT/org.opendaylight.yangtools.yang.stmt.TestUtils.loadModules(TestUtils.java:79)
      	at org.opendaylight.yangtools.yang.parser.rfc7950@11.0.1-SNAPSHOT/org.opendaylight.yangtools.yang.stmt.TestUtils.loadModules(TestUtils.java:64)
      	at org.opendaylight.yangtools.yang.parser.rfc7950@11.0.1-SNAPSHOT/org.opendaylight.yangtools.yang.stmt.AbstractYangTest.assertEffectiveModelDir(AbstractYangTest.java:62)
      	... 129 more
      Caused by: org.opendaylight.yangtools.yang.parser.spi.source.SourceException: Leaf is missing a 'type' statement [at /Users/sangwook/Dev/Projects/OpenDaylight/yangtools/parser/yang-parser-rfc7950/target/test-classes/bugs/YT1532/augment-with-no-description-one-leaf-with-if-feature/foo.yang:14:9]
      	at org.opendaylight.yangtools.yang.parser.spi@11.0.1-SNAPSHOT/org.opendaylight.yangtools.yang.parser.spi.source.SourceException.throwIfNull(SourceException.java:205)
      	at org.opendaylight.yangtools.yang.parser.rfc7950@11.0.1-SNAPSHOT/org.opendaylight.yangtools.yang.parser.rfc7950.stmt.meta.LeafStatementSupport.validateEffective(LeafStatementSupport.java:107)
      	at org.opendaylight.yangtools.yang.parser.rfc7950@11.0.1-SNAPSHOT/org.opendaylight.yangtools.yang.parser.rfc7950.stmt.meta.LeafStatementSupport.createEffective(LeafStatementSupport.java:93)
      	at org.opendaylight.yangtools.yang.parser.rfc7950@11.0.1-SNAPSHOT/org.opendaylight.yangtools.yang.parser.rfc7950.stmt.meta.LeafStatementSupport.createEffective(LeafStatementSupport.java:45)
      	at org.opendaylight.yangtools.yang.parser.spi@11.0.1-SNAPSHOT/org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport.createEffective(AbstractStatementSupport.java:75)
      	at org.opendaylight.yangtools.yang.parser.reactor@11.0.1-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.AbstractResumedStatement.createEffective(AbstractResumedStatement.java:137)
      	at org.opendaylight.yangtools.yang.parser.reactor@11.0.1-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.AbstractResumedStatement.createEffective(AbstractResumedStatement.java:122)
      	at org.opendaylight.yangtools.yang.parser.reactor@11.0.1-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementContextBase.createEffective(StatementContextBase.java:419)
      	at org.opendaylight.yangtools.yang.parser.reactor@11.0.1-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.ReactorStmtCtx.loadEffective(ReactorStmtCtx.java:377)
      	at org.opendaylight.yangtools.yang.parser.reactor@11.0.1-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.ReactorStmtCtx.buildEffective(ReactorStmtCtx.java:373)
      	at org.opendaylight.yangtools.yang.parser.reactor@11.0.1-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementContextBase.canReuseCurrent(StatementContextBase.java:743)
      	at org.opendaylight.yangtools.yang.parser.reactor@11.0.1-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementContextBase.asEffectiveChildOf(StatementContextBase.java:737)
      	at org.opendaylight.yangtools.yang.parser.reactor@11.0.1-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.InferredStatementContext.effectiveCopy(InferredStatementContext.java:614)
      	at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
      	at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)
      	at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133)
      	at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1845)
      	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
      	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
      	at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
      	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
      	at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
      	at org.opendaylight.yangtools.yang.parser.reactor@11.0.1-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.InferredStatementContext.effectiveCopy(InferredStatementContext.java:591)
      	at org.opendaylight.yangtools.yang.parser.reactor@11.0.1-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.InferredStatementContext.tryToReusePrototype(InferredStatementContext.java:265)
      	at org.opendaylight.yangtools.yang.parser.reactor@11.0.1-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.InferredStatementContext.createEffective(InferredStatementContext.java:224)
      	at org.opendaylight.yangtools.yang.parser.reactor@11.0.1-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementContextBase.createEffective(StatementContextBase.java:419)
      	at org.opendaylight.yangtools.yang.parser.reactor@11.0.1-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.ReactorStmtCtx.loadEffective(ReactorStmtCtx.java:377)
      	at org.opendaylight.yangtools.yang.parser.reactor@11.0.1-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.ReactorStmtCtx.buildEffective(ReactorStmtCtx.java:373)
      	at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
      	at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625)
      	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
      	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
      	at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
      	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
      	at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
      	at org.opendaylight.yangtools.yang.parser.spi@11.0.1-SNAPSHOT/org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport.buildEffectiveSubstatements(AbstractStatementSupport.java:129)
      	at org.opendaylight.yangtools.yang.parser.spi@11.0.1-SNAPSHOT/org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport.createEffective(AbstractStatementSupport.java:75)
      	at org.opendaylight.yangtools.yang.parser.reactor@11.0.1-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.AbstractResumedStatement.createEffective(AbstractResumedStatement.java:137)
      	at org.opendaylight.yangtools.yang.parser.reactor@11.0.1-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.AbstractResumedStatement.createInferredEffective(AbstractResumedStatement.java:209)
      	at org.opendaylight.yangtools.yang.parser.reactor@11.0.1-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.InferredStatementContext.createInferredEffective(InferredStatementContext.java:235)
      	at org.opendaylight.yangtools.yang.parser.reactor@11.0.1-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.InferredStatementContext.createInferredEffective(InferredStatementContext.java:228)
      	at org.opendaylight.yangtools.yang.parser.reactor@11.0.1-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.InferredStatementContext.createEffective(InferredStatementContext.java:224)
      	at org.opendaylight.yangtools.yang.parser.reactor@11.0.1-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementContextBase.createEffective(StatementContextBase.java:419)
      	at org.opendaylight.yangtools.yang.parser.reactor@11.0.1-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.ReactorStmtCtx.loadEffective(ReactorStmtCtx.java:377)
      	at org.opendaylight.yangtools.yang.parser.reactor@11.0.1-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.ReactorStmtCtx.buildEffective(ReactorStmtCtx.java:373)
      	at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
      	at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625)
      	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
      	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
      	at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
      	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
      	at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
      	at org.opendaylight.yangtools.yang.parser.spi@11.0.1-SNAPSHOT/org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport.buildEffectiveSubstatements(AbstractStatementSupport.java:129)
      	at org.opendaylight.yangtools.yang.parser.rfc7950@11.0.1-SNAPSHOT/org.opendaylight.yangtools.yang.parser.rfc7950.stmt.module.ModuleStatementSupport.buildEffectiveSubstatements(ModuleStatementSupport.java:190)
      	at org.opendaylight.yangtools.yang.parser.spi@11.0.1-SNAPSHOT/org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport.createEffective(AbstractStatementSupport.java:75)
      	at org.opendaylight.yangtools.yang.parser.reactor@11.0.1-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.AbstractResumedStatement.createEffective(AbstractResumedStatement.java:137)
      	at org.opendaylight.yangtools.yang.parser.reactor@11.0.1-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.AbstractResumedStatement.createEffective(AbstractResumedStatement.java:122)
      	at org.opendaylight.yangtools.yang.parser.reactor@11.0.1-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementContextBase.createEffective(StatementContextBase.java:419)
      	at org.opendaylight.yangtools.yang.parser.reactor@11.0.1-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.ReactorStmtCtx.loadEffective(ReactorStmtCtx.java:377)
      	at org.opendaylight.yangtools.yang.parser.reactor@11.0.1-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.ReactorStmtCtx.buildEffective(ReactorStmtCtx.java:373)
      	at org.opendaylight.yangtools.yang.parser.reactor@11.0.1-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.SourceSpecificContext.effectiveRoot(SourceSpecificContext.java:227)
      	at org.opendaylight.yangtools.yang.parser.reactor@11.0.1-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.BuildGlobalContext.transformEffective(BuildGlobalContext.java:211)
      	... 134 more
      

      This issue affects parsing of ietf-subscribed-notifications@2019-09-09.yang

            rovarga Robert Varga
            sangwookha Sangwook Ha
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

              Created:
              Updated:
              Resolved: