[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:
Duplicate
is duplicated by YANGTOOLS-1454 Node name collision already declared ... Resolved

 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:

  • we need to ship Sulfur SR3 by 2022-10-28 – we are past the deadline and yangtools-8.0.8 just had to be shipped with whatever is ready and integrated
  • we need to ship Chlorine SR1 by 2022-10-24, we are late on that
  • we need are late on integrating Argon by 2022-10-21

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 NETCONF-827 and NETCONF-905, which took precedence for ~2 weeks of resources over this issue.

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.

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