[YANGTOOLS-1445] Node name collision for unique argument Created: 12/Jul/22 Updated: 16/Nov/22 Resolved: 16/Nov/22 |
|
| Status: | Resolved |
| Project: | yangtools |
| Component/s: | parser |
| Affects Version/s: | 8.0.6 |
| Fix Version/s: | 10.0.1, 9.0.3, 8.0.9 |
| Type: | Bug | Priority: | High |
| Reporter: | Sangwook Ha | Assignee: | Robert Varga |
| Resolution: | Done | Votes: | 0 |
| Labels: | None | ||
| Remaining Estimate: | Not Specified | ||
| Time Spent: | Not Specified | ||
| Original Estimate: | Not Specified | ||
| Issue Links: |
|
||||||||
| Description |
|
When unique statement is used within a grouping used by another grouping, YANG parser fails to build effective model. For example, the following YANG model module foo {
namespace "urn:foo";
prefix "foo";
grouping bar-group {
list bar {
key bar;
unique baz;
leaf bar {
type string;
}
leaf baz {
type string;
}
}
}
grouping foo-group {
container foo {
uses bar-group;
}
}
uses foo-group;
}
causes this SourceException: Caused by: org.opendaylight.yangtools.yang.parser.spi.source.SourceException: Error in module 'foo': cannot add '(urn:foo)baz'. Node name collision: '(urn:foo)baz' already declared at foo.yang:14:7 [at foo.yang:14:7] |
| Comments |
| Comment by Robert Varga [ 12/Jul/22 ] |
|
Hmm, the reproducer is using three different namespaces, perhaps we are not rebasing the requirement correctly? |
| Comment by Sangwook Ha [ 13/Jul/22 ] |
|
I added two successful test cases with a single grouping for comparison and the third one is the reproducer. To keep them in the same directory I originally used different module names & namespaces. I pushed a new patch set which moved the YANG files in its own directory with the same module name & namespace. |
| Comment by Robert Varga [ 30/Sep/22 ] |
|
So the error trace is: java.lang.AssertionError: Failed to assemble effective model at org.opendaylight.yangtools.yang.parser.rfc7950/org.opendaylight.yangtools.yang.stmt.AbstractYangTest.assertEffectiveModel(AbstractYangTest.java:38) at org.opendaylight.yangtools.yang.parser.rfc7950/org.opendaylight.yangtools.yang.stmt.YT1445Test.testUniqueInGroupingUsedByGrouping(YT1445Test.java:25) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306) at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63) at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329) at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293) at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306) at org.junit.runners.ParentRunner.run(ParentRunner.java:413) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:93) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:40) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:529) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:756) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:452) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:210) 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.0-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.BuildGlobalContext.propagateException(BuildGlobalContext.java:233) at org.opendaylight.yangtools.yang.parser.reactor@10.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.BuildGlobalContext.transformEffective(BuildGlobalContext.java:263) at org.opendaylight.yangtools.yang.parser.reactor@10.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.BuildGlobalContext.buildEffective(BuildGlobalContext.java:208) at org.opendaylight.yangtools.yang.parser.reactor@10.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.CrossSourceStatementReactor$BuildAction.buildEffective(CrossSourceStatementReactor.java:232) at org.opendaylight.yangtools.yang.parser.rfc7950/org.opendaylight.yangtools.yang.stmt.TestUtils.parseYangSource(TestUtils.java:71) at org.opendaylight.yangtools.yang.parser.rfc7950/org.opendaylight.yangtools.yang.stmt.AbstractYangTest.assertEffectiveModel(AbstractYangTest.java:35) ... 27 more Caused by: org.opendaylight.yangtools.yang.parser.spi.source.SourceException: Error in module 'foo': cannot add '(urn:foo)baz'. Node name collision: '(urn:foo)baz' already declared at /home/nite/odl/yangtools/parser/yang-parser-rfc7950/target-ide/test-classes/bugs/YT1445/nested-grouping/foo.yang:14:7 [at /home/nite/odl/yangtools/parser/yang-parser-rfc7950/target-ide/test-classes/bugs/YT1445/nested-grouping/foo.yang:14:7] at org.opendaylight.yangtools.yang.parser.spi@10.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.parser.spi.SchemaTreeNamespaceBehaviour.addTo(SchemaTreeNamespaceBehaviour.java:64) at org.opendaylight.yangtools.yang.parser.spi@10.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.parser.spi.SchemaTreeNamespaceBehaviour.addTo(SchemaTreeNamespaceBehaviour.java:27) at org.opendaylight.yangtools.yang.parser.reactor@10.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.SimpleNamespaceContext.addTo(SimpleNamespaceContext.java:44) at org.opendaylight.yangtools.yang.parser.reactor@10.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.NamespaceStorageSupport.addToNamespace(NamespaceStorageSupport.java:83) at org.opendaylight.yangtools.yang.parser.reactor@10.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementContextBase.addToNs(StatementContextBase.java:268) at org.opendaylight.yangtools.yang.parser.spi@10.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.parser.spi.meta.AbstractSchemaTreeStatementSupport.onStatementAdded(AbstractSchemaTreeStatementSupport.java:116) at org.opendaylight.yangtools.yang.parser.reactor@10.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementDefinitionContext.onStatementAdded(StatementDefinitionContext.java:66) at org.opendaylight.yangtools.yang.parser.reactor@10.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementContextBase.childCopyOf(StatementContextBase.java:812) at org.opendaylight.yangtools.yang.parser.reactor@10.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementContextBase.childCopyOf(StatementContextBase.java:782) at org.opendaylight.yangtools.yang.parser.reactor@10.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementContextBase.copyAsChildOfImpl(StatementContextBase.java:747) at org.opendaylight.yangtools.yang.parser.reactor@10.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementContextBase.asEffectiveChildOf(StatementContextBase.java:760) at org.opendaylight.yangtools.yang.parser.reactor@10.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.InferredStatementContext.effectiveCopy(InferredStatementContext.java:573) at org.opendaylight.yangtools.yang.parser.reactor@10.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.InferredStatementContext.lambda$tryToReusePrototype$1(InferredStatementContext.java:266) 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.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.reactor@10.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.InferredStatementContext.tryToReusePrototype(InferredStatementContext.java:268) at org.opendaylight.yangtools.yang.parser.reactor@10.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.InferredStatementContext.createEffective(InferredStatementContext.java:219) at org.opendaylight.yangtools.yang.parser.reactor@10.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementContextBase.createEffective(StatementContextBase.java:426) at org.opendaylight.yangtools.yang.parser.reactor@10.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.ReactorStmtCtx.loadEffective(ReactorStmtCtx.java:382) at org.opendaylight.yangtools.yang.parser.reactor@10.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.ReactorStmtCtx.buildEffective(ReactorStmtCtx.java:378) 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@10.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport.buildEffectiveSubstatements(AbstractStatementSupport.java:139) at org.opendaylight.yangtools.yang.parser.spi@10.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport.createEffective(AbstractStatementSupport.java:83) at org.opendaylight.yangtools.yang.parser.reactor@10.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.AbstractResumedStatement.createEffective(AbstractResumedStatement.java:125) at org.opendaylight.yangtools.yang.parser.reactor@10.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.AbstractResumedStatement.createInferredEffective(AbstractResumedStatement.java:132) at org.opendaylight.yangtools.yang.parser.reactor@10.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.InferredStatementContext.createInferredEffective(InferredStatementContext.java:230) at org.opendaylight.yangtools.yang.parser.reactor@10.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.InferredStatementContext.createInferredEffective(InferredStatementContext.java:223) at org.opendaylight.yangtools.yang.parser.reactor@10.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.InferredStatementContext.tryToReuseSubstatements(InferredStatementContext.java:307) at org.opendaylight.yangtools.yang.parser.reactor@10.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.InferredStatementContext.tryToReusePrototype(InferredStatementContext.java:240) at org.opendaylight.yangtools.yang.parser.reactor@10.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.InferredStatementContext.createEffective(InferredStatementContext.java:219) at org.opendaylight.yangtools.yang.parser.reactor@10.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementContextBase.createEffective(StatementContextBase.java:426) at org.opendaylight.yangtools.yang.parser.reactor@10.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.ReactorStmtCtx.loadEffective(ReactorStmtCtx.java:382) at org.opendaylight.yangtools.yang.parser.reactor@10.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.ReactorStmtCtx.buildEffective(ReactorStmtCtx.java:378) 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@10.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport.buildEffectiveSubstatements(AbstractStatementSupport.java:139) at org.opendaylight.yangtools.yang.parser.rfc7950/org.opendaylight.yangtools.yang.parser.rfc7950.stmt.module.ModuleStatementSupport.buildEffectiveSubstatements(ModuleStatementSupport.java:189) at org.opendaylight.yangtools.yang.parser.spi@10.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport.createEffective(AbstractStatementSupport.java:83) at org.opendaylight.yangtools.yang.parser.reactor@10.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.AbstractResumedStatement.createEffective(AbstractResumedStatement.java:125) at org.opendaylight.yangtools.yang.parser.reactor@10.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.AbstractResumedStatement.createEffective(AbstractResumedStatement.java:110) at org.opendaylight.yangtools.yang.parser.reactor@10.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementContextBase.createEffective(StatementContextBase.java:426) at org.opendaylight.yangtools.yang.parser.reactor@10.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.ReactorStmtCtx.loadEffective(ReactorStmtCtx.java:382) at org.opendaylight.yangtools.yang.parser.reactor@10.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.ReactorStmtCtx.buildEffective(ReactorStmtCtx.java:378) at org.opendaylight.yangtools.yang.parser.reactor@10.0.0-SNAPSHOT/org.opendaylight.yangtools.yang.parser.stmt.reactor.BuildGlobalContext.transformEffective(BuildGlobalContext.java:261) ... 31 more The node seems to be conflicting with itself. Removing 'unique baz' or moving it after 'leaf baz' hides the problem. |
| Comment by Xiao Jing [ 11/Oct/22 ] |
|
We will need a new 8.0.8 version to fix this issue. When can we expect it to release? Thanks |
| Comment by Robert Varga [ 12/Oct/22 ] |
|
Probably a couple of weeks, depends on resource allocation. |
| Comment by Xiao Jing [ 13/Oct/22 ] |
|
Thanks for the info. |
| Comment by mikael petterson [ 03/Nov/22 ] |
|
rovarga any reason it did not make it into 8.0.8 as planned? We are stuck for now to upgrade and solve important problem. |
| Comment by Robert Varga [ 05/Nov/22 ] |
|
sorry mikaelpetterson, I am doing the best I can. Please note that all ODL project releases are time-bound as opposed to issue-bound. Based on the release schedule, the facts are the following:
At the end of the day, we are an open-source project and things happen on best-effort basis. Better SLAs can be expected with a commercial engagement, just as is the case with any other open-source project. Since those engagements are providing the life-blood for the project, they always take precedence. In this particular case it is I am sorry this has slipped its target, but it is not the first time this has happened, nor is it last – such is the nature of FOSS development. I can show any number of issues we have filed with upstreams that have not seen any reply for 3+ years. |