[YANGTOOLS-756] Yang parser fails with cryptic message when same source is added multiple times Created: 11/Mar/17  Updated: 10/Apr/22  Resolved: 25/Apr/17

Status: Resolved
Project: yangtools
Component/s: None
Affects Version/s: None
Fix Version/s: None

Type: Bug
Reporter: Robert Varga Assignee: Igor Foltin
Resolution: Done Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified
Environment:

Operating System: All
Platform: All


Issue Links:
Duplicate
is duplicated by YANGTOOLS-772 Same namespaces alloved in build-time Resolved
External issue ID: 7954

 Description   

Our addressing of YANGTOOLS-728 ensures we do not allow duplicate children to exist. This has an unfortunate side-effect that if we add the same model from multiple sources, like done in sal-rest-connector tests, we fail with:

org.opendaylight.restconf.jersey.providers.JsonBodyReaderTest Time elapsed: 0.043 sec <<< ERROR!
org.opendaylight.yangtools.yang.parser.spi.meta.SomeModifiersUnresolvedException: Some of STATEMENT_DEFINITION modifiers for statements were not resolved.
at org.opendaylight.yangtools.yang.parser.stmt.reactor.BuildGlobalContext.propagateException(BuildGlobalContext.java:237)
at org.opendaylight.yangtools.yang.parser.stmt.reactor.BuildGlobalContext.loadPhaseStatementsFor(BuildGlobalContext.java:289)
at org.opendaylight.yangtools.yang.parser.stmt.reactor.BuildGlobalContext.loadPhaseStatements(BuildGlobalContext.java:280)
at org.opendaylight.yangtools.yang.parser.stmt.reactor.BuildGlobalContext.executePhases(BuildGlobalContext.java:199)
at org.opendaylight.yangtools.yang.parser.stmt.reactor.BuildGlobalContext.buildEffective(BuildGlobalContext.java:211)
at org.opendaylight.yangtools.yang.parser.stmt.reactor.CrossSourceStatementReactor$BuildAction.buildEffective(CrossSourceStatementReactor.java:189)
at org.opendaylight.yangtools.yang.test.util.YangParserTestUtils.parseYangSources(YangParserTestUtils.java:123)
at org.opendaylight.yangtools.yang.test.util.YangParserTestUtils.parseYangSources(YangParserTestUtils.java:196)
at org.opendaylight.yangtools.yang.test.util.YangParserTestUtils.parseYangSources(YangParserTestUtils.java:264)
at org.opendaylight.yangtools.yang.test.util.YangParserTestUtils.parseYangSources(YangParserTestUtils.java:246)
at org.opendaylight.yangtools.yang.test.util.YangParserTestUtils.parseYangSources(YangParserTestUtils.java:212)
at org.opendaylight.restconf.jersey.providers.JsonBodyReaderTest.initialization(JsonBodyReaderTest.java:75)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:283)
at org.apache.maven.surefire.junit4.JUnit4Provider.executeWithRerun(JUnit4Provider.java:173)
at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:153)
at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:128)
at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:203)
at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:155)
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103)
Caused by: org.opendaylight.yangtools.yang.parser.spi.source.SourceException: Error in module 'ietf-yang-library': cannot add '(urn:ietf:params:xml:ns:yang:ietf-yang-library?revision=2016-06-21)modules-state'. Node name collision: '(urn:ietf:params:xml:ns:yang:ietf-yang-library?revision=2016-06-21)modules-state' already declared at /home/user/odl/netconf/restconf/sal-rest-connector/target/test-classes/modules/ietf-yang-library@2016-06-21.yang:174:2 [at /home/user/odl/netconf/restconf/sal-rest-connector/target/test-classes/invoke-rpc/ietf-yang-library@2016-06-21.yang:174:2]
at org.opendaylight.yangtools.yang.parser.stmt.rfc6020.ChildSchemaNodes.addTo(ChildSchemaNodes.java:61)
at org.opendaylight.yangtools.yang.parser.stmt.rfc6020.ChildSchemaNodes.addTo(ChildSchemaNodes.java:26)
at org.opendaylight.yangtools.yang.parser.stmt.reactor.SimpleNamespaceContext.addTo(SimpleNamespaceContext.java:42)
at org.opendaylight.yangtools.yang.parser.stmt.reactor.NamespaceStorageSupport.addToNs(NamespaceStorageSupport.java:65)
at org.opendaylight.yangtools.yang.parser.stmt.rfc6020.ContainerStatementImpl$Definition.onStatementAdded(ContainerStatementImpl.java:76)
at org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementDefinitionContext.onStatementAdded(StatementDefinitionContext.java:48)
at org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementContextBase.createSubstatement(StatementContextBase.java:368)
at org.opendaylight.yangtools.yang.parser.stmt.reactor.SourceSpecificContext.createDeclaredChild(SourceSpecificContext.java:180)
at org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementContextWriter.startStatement(StatementContextWriter.java:32)
at org.opendaylight.yangtools.yang.parser.impl.YangStatementParserListenerImpl.enterStatement(YangStatementParserListenerImpl.java:100)
at org.opendaylight.yangtools.antlrv4.code.gen.YangStatementParser$StatementContext.enterRule(YangStatementParser.java:113)
at org.antlr.v4.runtime.tree.ParseTreeWalker.enterRule(ParseTreeWalker.java:66)
at org.antlr.v4.runtime.tree.ParseTreeWalker.walk(ParseTreeWalker.java:49)
at org.antlr.v4.runtime.tree.ParseTreeWalker.walk(ParseTreeWalker.java:52)
at org.opendaylight.yangtools.yang.parser.stmt.rfc6020.YangStatementSourceImpl.writeLinkageAndStatementDefinitions(YangStatementSourceImpl.java:98)
at org.opendaylight.yangtools.yang.parser.stmt.reactor.SourceSpecificContext.loadStatements(SourceSpecificContext.java:400)
at org.opendaylight.yangtools.yang.parser.stmt.reactor.BuildGlobalContext.loadPhaseStatementsFor(BuildGlobalContext.java:287)
... 26 more

This indicates some amount of disconnect between namespace handling and sources: each source is expected to have its own namespace (or be a submodule).

We need to check for these kinds of problems and either report a clear message pointing to those sources, or recover by ensuring they are unique (i.e. excluding some of them).



 Comments   
Comment by Robert Varga [ 11/Mar/17 ]

The fix in NETCONF: https://git.opendaylight.org/gerrit/53183

Comment by Igor Foltin [ 14/Mar/17 ]

fix in yangtools: https://git.opendaylight.org/gerrit/#/c/53184/

Comment by Igor Foltin [ 14/Mar/17 ]

yangtools fix for duplicate yang (sub)modules:

https://git.opendaylight.org/gerrit/#/c/53283/

Comment by Peter Kajsa [ 24/Apr/17 ]

Need to be back-ported to Boron due to YANGTOOLS-772 (https://git.opendaylight.org/gerrit/#/c/53283/)

Comment by Igor Foltin [ 25/Apr/17 ]

backport to stable/boron:

netconf: https://git.opendaylight.org/gerrit/#/c/55970/
yangtools: https://git.opendaylight.org/gerrit/#/c/55961/

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