[YANGTOOLS-1532] Fail to parse YANG module with a node with if-feature augmented within grouping Created: 10/Aug/23  Updated: 17/Oct/23  Resolved: 17/Oct/23

Status: Resolved
Project: yangtools
Component/s: parser
Affects Version/s: 11.0.0, 9.0.8, 10.0.9
Fix Version/s: 12.0.0, 9.0.9, 11.0.4, 10.0.11

Type: Bug Priority: Medium
Reporter: Sangwook Ha Assignee: Robert Varga
Resolution: Done Votes: 0
Labels: pt
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified


 Description   

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


Generated at Wed Feb 07 20:56:25 UTC 2024 using Jira 8.20.10#820010-sha1:ace47f9899e9ee25d7157d59aa17ab06aee30d3d.