[YANGTOOLS-1436] Unexpected error while processing submodule references Created: 20/May/22  Updated: 17/Aug/22  Resolved: 17/Aug/22

Status: Resolved
Project: yangtools
Component/s: parser
Affects Version/s: 9.0.0, 8.0.5, 7.0.17
Fix Version/s: 10.0.0, 8.0.7, 9.0.1

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

Attachments: Text File openconfig-network-instance.yang.debug.log    
Issue Links:
Relates
relates to YANGTOOLS-1434 Building SchemaContext fails when aug... Resolved

 Description   

Building effective model fails for some OpenConfig models because of unresolved EFFECTIVE_MODEL modifiers cause by VerifyException.

For example, yang-model-validator generates the following errors for openconfig-network-instance.yang:

$ java -jar "$YANGTOOLS/tools/yang-model-validator/target/yang-model-validator-9.0.0-SNAPSHOT-jar-with-dependencies.jar" \
 --recursive --path "$OPENCONFIG/release/models:$YANG_MODELS/standard/iana:$YANG_MODELS/standard/ietf" \
"$OPENCONFIG/release/models/network-instance/openconfig-network-instance.yang"

22:36:43.765 [main] WARN org.opendaylight.yangtools.yang.parser.stmt.reactor.BuildGlobalContext - Unexpected error processing source SourceIdentifier [openconfig-network-instance@2022-04-20]. Please file an issue with this model attached.
com.google.common.base.VerifyException: expected a non-null reference
	at com.google.common.base.Verify.verifyNotNull(Verify.java:503)
	at com.google.common.base.Verify.verifyNotNull(Verify.java:479)
	at org.opendaylight.yangtools.yang.parser.stmt.reactor.AbstractResumedStatement.mutableDeclaredSubstatements(AbstractResumedStatement.java:65)
	at org.opendaylight.yangtools.yang.parser.stmt.reactor.RootStatementContext.mutableDeclaredSubstatements(RootStatementContext.java:49)
	at org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext$Mutable.declaredSubstatements(StmtContext.java:236)
	at org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils.getRootModuleQName(StmtContextUtils.java:560)
	at org.opendaylight.yangtools.yang.parser.stmt.reactor.ReactorStmtCtx.moduleName(ReactorStmtCtx.java:240)
	at org.opendaylight.yangtools.yang.parser.rfc7950.stmt.augment.AbstractAugmentStatementSupport.lambda$new$0(AbstractAugmentStatementSupport.java:57)
	at org.opendaylight.yangtools.yang.parser.spi.meta.StatementSupport$StatementPolicy$EqualSemantics.canReuseCurrent(StatementSupport.java:171)
	at org.opendaylight.yangtools.yang.parser.spi.meta.StatementSupport.canReuseCurrent(StatementSupport.java:276)
	at org.opendaylight.yangtools.yang.parser.stmt.reactor.InferredStatementContext.tryToReusePrototype(InferredStatementContext.java:239)
	at org.opendaylight.yangtools.yang.parser.stmt.reactor.InferredStatementContext.createEffective(InferredStatementContext.java:219)
	at org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementContextBase.createEffective(StatementContextBase.java:426)
	at org.opendaylight.yangtools.yang.parser.stmt.reactor.ReactorStmtCtx.loadEffective(ReactorStmtCtx.java:389)
	at org.opendaylight.yangtools.yang.parser.stmt.reactor.ReactorStmtCtx.buildEffective(ReactorStmtCtx.java:385)
	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.meta.AbstractStatementSupport.buildEffectiveSubstatements(AbstractStatementSupport.java:139)
	at org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport.createEffective(AbstractStatementSupport.java:83)
	at org.opendaylight.yangtools.yang.parser.stmt.reactor.AbstractResumedStatement.createEffective(AbstractResumedStatement.java:125)
	at org.opendaylight.yangtools.yang.parser.stmt.reactor.AbstractResumedStatement.createInferredEffective(AbstractResumedStatement.java:132)
	at org.opendaylight.yangtools.yang.parser.stmt.reactor.InferredStatementContext.createInferredEffective(InferredStatementContext.java:230)
	at org.opendaylight.yangtools.yang.parser.stmt.reactor.InferredStatementContext.createInferredEffective(InferredStatementContext.java:223)
	at org.opendaylight.yangtools.yang.parser.stmt.reactor.InferredStatementContext.tryToReuseSubstatements(InferredStatementContext.java:307)
	at org.opendaylight.yangtools.yang.parser.stmt.reactor.InferredStatementContext.tryToReusePrototype(InferredStatementContext.java:240)
	at org.opendaylight.yangtools.yang.parser.stmt.reactor.InferredStatementContext.createEffective(InferredStatementContext.java:219)
	at org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementContextBase.createEffective(StatementContextBase.java:426)
	at org.opendaylight.yangtools.yang.parser.stmt.reactor.ReactorStmtCtx.loadEffective(ReactorStmtCtx.java:389)
	at org.opendaylight.yangtools.yang.parser.stmt.reactor.ReactorStmtCtx.buildEffective(ReactorStmtCtx.java:385)
	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)
    ...

$YANGTOOLS: path for yangtools repository
$OPENCONFIG: path for OpenConfig public repository
$YANG_MODELS: path for YangModels yang repository

Attached is the DEBUG output of the command.

A couple observations:

  • This build issue depends on the environment. Even with the same container image with Maven & JDK pre-installed on top of RHEL8 UBI (Universal Base Image), validation result was not consistent across different container hosts. For example, openconfig-network-instance.yang was built successfully on Alpine Linux (Linux 5.15.32) VM on macOS but not on RHEL 7 (Linux 3.10.0) or RHEL 8 (Linux 4.18.0) VM.
  • This inconsistent behavior was found for master, 8.0.x & 7.0.x branches but not for 6.0.x.


 Comments   
Comment by Sangwook Ha [ 07/Jun/22 ]

It appears that yangtools fails to build effective model if a grouping defined in a submodule is augmented in another submodule.
This test case reproduces the issue.

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