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