Parsing of YANG models may fail with the following conditions:
- YANG models include augmentation with an empty grouping
- Parsing is done with no supported features
For example, parsing of the following two YANG modules with no supported features - the augmentation effectively does nothing but there is a such data model actually used in the device, believe it or not:
foo.yang
module foo { namespace "urn:foo"; prefix "foo"; container foo { leaf foo-leaf { type string; } } }
bar.yang
module bar { namespace "urn:bar"; prefix "bar"; import foo { prefix foo; } grouping bar-group { } augment "/foo:foo" { uses bar-group; } }
may trigger the following exception:
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@10.0.3-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.BuildGlobalContext.propagateException(BuildGlobalContext.java:233) at org.opendaylight.yangtools.yang.parser.reactor@10.0.3-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.BuildGlobalContext.transformEffective(BuildGlobalContext.java:263) at org.opendaylight.yangtools.yang.parser.reactor@10.0.3-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.BuildGlobalContext.buildEffective(BuildGlobalContext.java:208) at org.opendaylight.yangtools.yang.parser.reactor@10.0.3-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.CrossSourceStatementReactor$BuildAction.buildEffective(CrossSourceStatementReactor.java:232) at org.opendaylight.yangtools.yang.parser.rfc7950@10.0.3-SNAPSHOT/org.opendaylight.yangtools.yang.stmt.TestUtils.parseYangSource(TestUtils.java:95) at org.opendaylight.yangtools.yang.parser.rfc7950@10.0.3-SNAPSHOT/org.opendaylight.yangtools.yang.stmt.AbstractYangTest.assertEffectiveModel(AbstractYangTest.java:44) ... 72 more Caused by: com.google.common.base.VerifyException: expected a non-null reference at com.google.common@31.1-jre/com.google.common.base.Verify.verifyNotNull(Verify.java:503) at com.google.common@31.1-jre/com.google.common.base.Verify.verifyNotNull(Verify.java:479) at org.opendaylight.yangtools.yang.parser.reactor@10.0.3-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.AbstractResumedStatement.mutableDeclaredSubstatements(AbstractResumedStatement.java:67) at org.opendaylight.yangtools.yang.parser.spi@10.0.3-SNAPSHOT/org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext$Mutable.declaredSubstatements(StmtContext.java:234) at org.opendaylight.yangtools.yang.parser.spi@10.0.3-SNAPSHOT/org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils.checkFeatureSupport(StmtContextUtils.java:221) at org.opendaylight.yangtools.yang.parser.reactor@10.0.3-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.ReactorStmtCtx.isSupportedByFeatures(ReactorStmtCtx.java:490) at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:178) 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.spi@10.0.3-SNAPSHOT/org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport.declaredSubstatements(AbstractStatementSupport.java:174) at org.opendaylight.yangtools.yang.parser.spi@10.0.3-SNAPSHOT/org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport.createEffective(AbstractStatementSupport.java:84) at org.opendaylight.yangtools.yang.parser.reactor@10.0.3-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.AbstractResumedStatement.createEffective(AbstractResumedStatement.java:131) at org.opendaylight.yangtools.yang.parser.reactor@10.0.3-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.AbstractResumedStatement.createEffective(AbstractResumedStatement.java:116) at org.opendaylight.yangtools.yang.parser.reactor@10.0.3-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementContextBase.createEffective(StatementContextBase.java:426) at org.opendaylight.yangtools.yang.parser.reactor@10.0.3-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.ReactorStmtCtx.loadEffective(ReactorStmtCtx.java:375) at org.opendaylight.yangtools.yang.parser.reactor@10.0.3-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.ReactorStmtCtx.buildEffective(ReactorStmtCtx.java:371) at org.opendaylight.yangtools.yang.parser.reactor@10.0.3-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.BuildGlobalContext.transformEffective(BuildGlobalContext.java:261) ... 76 more
One thing to note is that the two conditions listed above appear to be necessary but not sufficient because the error is not triggered predictably.
- relates to
-
YANGTOOLS-1475 Make BuildGlobalContext execution order predictable
- Confirmed