[YANGTOOLS-749] Unable to create LeafRefContext for leafref from different model imported with different than default prefix Created: 23/Feb/17  Updated: 10/Apr/22  Resolved: 29/May/17

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

Type: Bug
Reporter: Jan Srnicek Assignee: Peter Kajsa
Resolution: Done Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified
Environment:

Operating System: All
Platform: All


External issue ID: 7844

 Description   

Situation

module ioam-sb-trace {

import ietf-interfaces

{ prefix "ietf-if"; }

...

leaf intf-name {
type ietf-if:interface-ref;
mandatory true;
description
"Instance of ietf-interfaces:interface-ref";
}

-------------------------
module ietf-interfaces {

yang-version 1;

namespace
"urn:ietf:params:xml:ns:yang:ietf-interfaces";

prefix if;

...
typedef interface-ref {
type leafref

{ path "/if:interfaces/if:interface/if:name"; }

description
"This type is used by data models that need to reference
configured interfaces.";
}

In this situation, SchemaContext is created fine, but when trying to construct LeafRefContext, following error is showed

org.opendaylight.yangtools.yang.data.impl.leafref.LeafRefPathParseException: No module import for prefix: if in module: ioam-sb-trace

at org.opendaylight.yangtools.yang.data.impl.leafref.LeafRefPathParserListenerImpl.getQNameModuleForImportPrefix(LeafRefPathParserListenerImpl.java:191)
at org.opendaylight.yangtools.yang.data.impl.leafref.LeafRefPathParserListenerImpl.enterPrefix(LeafRefPathParserListenerImpl.java:133)
at org.opendaylight.yangtools.yang.data.impl.leafref.LeafRefPathParser$PrefixContext.enterRule(LeafRefPathParser.java:997)
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.antlr.v4.runtime.tree.ParseTreeWalker.walk(ParseTreeWalker.java:52)
at org.antlr.v4.runtime.tree.ParseTreeWalker.walk(ParseTreeWalker.java:52)
at org.opendaylight.yangtools.yang.data.impl.leafref.LeafRefPathParserImpl.parseLeafRefPathSourceToSchemaPath(LeafRefPathParserImpl.java:37)
at org.opendaylight.yangtools.yang.data.impl.leafref.LeafRefContextTreeBuilder.buildLeafRefContextReferencingTree(LeafRefContextTreeBuilder.java:141)
at org.opendaylight.yangtools.yang.data.impl.leafref.LeafRefContextTreeBuilder.buildLeafRefContextReferencingTree(LeafRefContextTreeBuilder.java:91)
at org.opendaylight.yangtools.yang.data.impl.leafref.LeafRefContextTreeBuilder.buildLeafRefContextReferencingTree(LeafRefContextTreeBuilder.java:91)
at org.opendaylight.yangtools.yang.data.impl.leafref.LeafRefContextTreeBuilder.buildLeafRefContextReferencingTree(LeafRefContextTreeBuilder.java:91)
at org.opendaylight.yangtools.yang.data.impl.leafref.LeafRefContextTreeBuilder.buildLeafRefContextTree(LeafRefContextTreeBuilder.java:47)
at org.opendaylight.yangtools.yang.data.impl.leafref.LeafRefContext.create(LeafRefContext.java:53)
at io.fd.hc2vpp.model.test.LeafRefContextTest.testLeafRefContextCreation(LeafRefContextTest.java:65)
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.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.junit.runner.JUnitCore.run(JUnitCore.java:160)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:51)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:237)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
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 com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

-----------------------
If changed like so, LeafRefContext is created fine

...
import ietf-interfaces

{ prefix "if"; }

<-- default prefix for model ietf-interfaces
...

leaf intf-name {
type if:interface-ref;
mandatory true;
description
"Instance of ietf-interfaces:interface-ref";
}



 Comments   
Comment by Robert Varga [ 14/Apr/17 ]

This is a problem with RevisionAwareXPath, as it does not offer enough information to make sense of that it actually is. The only method we provide is 'toString()', which is insufficient, as our users need at least the equivalent of javax.namespace.NamespaceContext to be able to do anything with that string.

Prefix mapping needs to be derived from the prefix mapping of the module which first defined the type.

Comment by Peter Kajsa [ 15/May/17 ]

fix of current implementation: https://git.opendaylight.org/gerrit/#/c/56946/

Comment by Robert Varga [ 16/May/17 ]

Since this affect FD.io, we need to backport this to Carbon SR1 and Boron SR4:
https://git.opendaylight.org/gerrit/57225
https://git.opendaylight.org/gerrit/57224

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