[ONOS-6692] Leafref linking fix for path predicate.
Change-Id: I4952e57f40104e81484e3ca4953381e0d0743d09
diff --git a/compiler/base/linker/src/main/java/org/onosproject/yang/compiler/linker/impl/YangLinkerUtils.java b/compiler/base/linker/src/main/java/org/onosproject/yang/compiler/linker/impl/YangLinkerUtils.java
index 3607eec..cc893db 100644
--- a/compiler/base/linker/src/main/java/org/onosproject/yang/compiler/linker/impl/YangLinkerUtils.java
+++ b/compiler/base/linker/src/main/java/org/onosproject/yang/compiler/linker/impl/YangLinkerUtils.java
@@ -873,15 +873,25 @@
throws DataModelException {
YangLeaf leaf = getLeaf(leftAxisName, (YangLeavesHolder) node);
- if (leaf != null) {
- return leaf;
- }
YangLeafList leafList = getLeafList(leftAxisName,
(YangLeavesHolder) node);
- if (leafList == null) {
+ if (leaf == null && leafList == null) {
+ if (node instanceof YangAugmentableNode) {
+ List<YangAugment> augList = ((YangAugmentableNode) node)
+ .getAugmentedInfoList();
+ for (YangAugment aug : augList) {
+ leaf = getLeaf(leftAxisName, aug);
+ leafList = getLeafList(leftAxisName, aug);
+ if (leaf != null || leafList != null) {
+ break;
+ }
+ }
+ }
+ }
+ if (leaf == null && leafList == null) {
throw getDataModelExc(TGT_LEAF_ERR, leafRef);
}
- return leafList;
+ return (leaf != null) ? leaf : leafList;
}
/**
diff --git a/compiler/plugin/maven/src/test/java/org/onosproject/yang/compiler/plugin/maven/AugmentTranslatorTest.java b/compiler/plugin/maven/src/test/java/org/onosproject/yang/compiler/plugin/maven/AugmentTranslatorTest.java
index 01a47f9..66dc468 100644
--- a/compiler/plugin/maven/src/test/java/org/onosproject/yang/compiler/plugin/maven/AugmentTranslatorTest.java
+++ b/compiler/plugin/maven/src/test/java/org/onosproject/yang/compiler/plugin/maven/AugmentTranslatorTest.java
@@ -530,4 +530,36 @@
YangPluginConfig.compileCode(COMP);
deleteDirectory(DIR);
}
+
+ /**
+ * Checks leaf-ref linking with augmented nodes in predicate for open
+ * config YANG files.
+ *
+ * @throws IOException if any error occurs during IO on files
+ * @throws ParserException if any error occurs during parsing
+ * @throws MojoExecutionException if any mojo operation fail
+ */
+ @Test
+ public void processLeafRefAugment() throws IOException,
+ ParserException, MojoExecutionException {
+
+ deleteDirectory(DIR);
+ String dir = "src/test/resources/leafreflinker/oc-leafref";
+
+ Set<Path> paths = new HashSet<>();
+ for (String file : getYangFiles(dir)) {
+ paths.add(Paths.get(file));
+ }
+
+ utilManager.createYangFileInfoSet(paths);
+ utilManager.parseYangFileInfoSet();
+ utilManager.createYangNodeSet();
+ utilManager.resolveDependenciesUsingLinker();
+
+ YangPluginConfig yangPluginConfig = new YangPluginConfig();
+ yangPluginConfig.setCodeGenDir(DIR);
+ utilManager.translateToJava(yangPluginConfig);
+ YangPluginConfig.compileCode(COMP);
+ deleteDirectory(DIR);
+ }
}
diff --git a/compiler/plugin/maven/src/test/java/org/onosproject/yang/compiler/plugin/maven/IntraFileLeafrefLinkingTest.java b/compiler/plugin/maven/src/test/java/org/onosproject/yang/compiler/plugin/maven/IntraFileLeafrefLinkingTest.java
index 946682d..b9938ba 100644
--- a/compiler/plugin/maven/src/test/java/org/onosproject/yang/compiler/plugin/maven/IntraFileLeafrefLinkingTest.java
+++ b/compiler/plugin/maven/src/test/java/org/onosproject/yang/compiler/plugin/maven/IntraFileLeafrefLinkingTest.java
@@ -36,11 +36,9 @@
import org.onosproject.yang.compiler.datamodel.YangPathOperator;
import org.onosproject.yang.compiler.datamodel.YangPathPredicate;
import org.onosproject.yang.compiler.datamodel.YangRelativePath;
-import org.onosproject.yang.compiler.datamodel.utils.ResolvableStatus;
-import org.onosproject.yang.compiler.datamodel.utils.builtindatatype.YangDataTypes;
+import org.onosproject.yang.compiler.datamodel.YangType;
import org.onosproject.yang.compiler.linker.exceptions.LinkerException;
import org.onosproject.yang.compiler.linker.impl.YangLinkerManager;
-import org.onosproject.yang.compiler.linker.impl.YangLinkerUtils;
import org.onosproject.yang.compiler.parser.exceptions.ParserException;
import org.onosproject.yang.compiler.tool.YangCompilerManager;
@@ -57,7 +55,14 @@
import static org.hamcrest.core.Is.is;
import static org.hamcrest.core.IsNull.nullValue;
import static org.onosproject.yang.compiler.datamodel.YangNodeType.MODULE_NODE;
+import static org.onosproject.yang.compiler.datamodel.utils.ResolvableStatus.RESOLVED;
+import static org.onosproject.yang.compiler.datamodel.utils.builtindatatype.YangDataTypes.DERIVED;
+import static org.onosproject.yang.compiler.datamodel.utils.builtindatatype.YangDataTypes.ENUMERATION;
import static org.onosproject.yang.compiler.datamodel.utils.builtindatatype.YangDataTypes.LEAFREF;
+import static org.onosproject.yang.compiler.datamodel.utils.builtindatatype.YangDataTypes.STRING;
+import static org.onosproject.yang.compiler.datamodel.utils.builtindatatype.YangDataTypes.UINT64;
+import static org.onosproject.yang.compiler.datamodel.utils.builtindatatype.YangDataTypes.UINT8;
+import static org.onosproject.yang.compiler.linker.impl.YangLinkerUtils.updateFilePriority;
import static org.onosproject.yang.compiler.utils.io.impl.YangFileScanner.getYangFiles;
/**
@@ -65,12 +70,11 @@
*/
public class IntraFileLeafrefLinkingTest {
- @Rule
- public ExpectedException thrown = ExpectedException.none();
-
private final YangCompilerManager utilManager =
new YangCompilerManager();
private final YangLinkerManager yangLinkerManager = new YangLinkerManager();
+ @Rule
+ public ExpectedException thrown = ExpectedException.none();
/**
* Checks self resolution when grouping and uses are siblings.
@@ -97,7 +101,7 @@
// Add references to import list.
yangLinkerManager.addRefToYangFilesImportList(utilManager.getYangNodeSet());
- YangLinkerUtils.updateFilePriority(utilManager.getYangNodeSet());
+ updateFilePriority(utilManager.getYangNodeSet());
// Carry out inter-file linking.
yangLinkerManager.processInterFileLinking(utilManager.getYangNodeSet());
@@ -129,14 +133,14 @@
// Check whether the information in the leaf is correct under grouping.
assertThat(leafInfo.getName(), is("network-ref"));
assertThat(leafInfo.getDataType().getDataTypeName(), is("leafref"));
- assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.LEAFREF));
+ assertThat(leafInfo.getDataType().getDataType(), is(LEAFREF));
YangLeafRef leafref = (YangLeafRef) (leafInfo.getDataType().getDataTypeExtendedInfo());
assertThat(leafref.getResolvableStatus(),
- is(ResolvableStatus.RESOLVED));
+ is(RESOLVED));
assertThat(leafref.getEffectiveDataType().getDataType(),
- is(YangDataTypes.DERIVED));
+ is(DERIVED));
}
/**
@@ -163,7 +167,7 @@
// Add references to import list.
yangLinkerManager.addRefToYangFilesImportList(utilManager.getYangNodeSet());
- YangLinkerUtils.updateFilePriority(utilManager.getYangNodeSet());
+ updateFilePriority(utilManager.getYangNodeSet());
// Carry out inter-file linking.
yangLinkerManager.processInterFileLinking(utilManager.getYangNodeSet());
@@ -197,14 +201,14 @@
// Check whether the information in the leaf is correct under grouping.
assertThat(leafInfo.getName(), is("remove"));
assertThat(leafInfo.getDataType().getDataTypeName(), is("leafref"));
- assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.LEAFREF));
+ assertThat(leafInfo.getDataType().getDataType(), is(LEAFREF));
YangLeafRef leafref = (YangLeafRef) (leafInfo.getDataType().getDataTypeExtendedInfo());
assertThat(leafref.getResolvableStatus(),
- is(ResolvableStatus.RESOLVED));
+ is(RESOLVED));
assertThat(leafref.getEffectiveDataType().getDataType(),
- is(YangDataTypes.DERIVED));
+ is(DERIVED));
}
/**
@@ -232,7 +236,7 @@
// Add references to import list.
yangLinkerManager.addRefToYangFilesImportList(utilManager.getYangNodeSet());
- YangLinkerUtils.updateFilePriority(utilManager.getYangNodeSet());
+ updateFilePriority(utilManager.getYangNodeSet());
// Carry out inter-file linking.
yangLinkerManager.processInterFileLinking(utilManager.getYangNodeSet());
@@ -266,14 +270,14 @@
// Check whether the information in the leaf is correct under grouping.
assertThat(leafInfo.getName(), is("remove"));
assertThat(leafInfo.getDataType().getDataTypeName(), is("leafref"));
- assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.LEAFREF));
+ assertThat(leafInfo.getDataType().getDataType(), is(LEAFREF));
YangLeafRef leafref = (YangLeafRef) leafInfo.getDataType().getDataTypeExtendedInfo();
assertThat(leafref.getResolvableStatus(),
- is(ResolvableStatus.RESOLVED));
+ is(RESOLVED));
assertThat(leafref.getEffectiveDataType().getDataType(),
- is(YangDataTypes.ENUMERATION));
+ is(ENUMERATION));
}
/**
@@ -300,7 +304,7 @@
// Add references to import list.
yangLinkerManager.addRefToYangFilesImportList(utilManager.getYangNodeSet());
- YangLinkerUtils.updateFilePriority(utilManager.getYangNodeSet());
+ updateFilePriority(utilManager.getYangNodeSet());
// Carry out inter-file linking.
yangLinkerManager.processInterFileLinking(utilManager.getYangNodeSet());
@@ -331,16 +335,16 @@
// Check whether the information in the leaf is correct.
assertThat(leafInfo.getName(), is("network-ref"));
assertThat(leafInfo.getDataType().getDataTypeName(), is("leafref"));
- assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.LEAFREF));
+ assertThat(leafInfo.getDataType().getDataType(), is(LEAFREF));
YangLeafRef leafref = (YangLeafRef) (leafInfo.getDataType().getDataTypeExtendedInfo());
// Check whether leafref type got resolved.
assertThat(leafref.getResolvableStatus(),
- is(ResolvableStatus.RESOLVED));
+ is(RESOLVED));
// Check the effective type for the leaf.
assertThat(leafref.getEffectiveDataType().getDataType(),
- is(YangDataTypes.UINT8));
+ is(UINT8));
}
/**
@@ -368,7 +372,7 @@
// Add references to import list.
yangLinkerManager.addRefToYangFilesImportList(utilManager.getYangNodeSet());
- YangLinkerUtils.updateFilePriority(utilManager.getYangNodeSet());
+ updateFilePriority(utilManager.getYangNodeSet());
// Carry out inter-file linking.
yangLinkerManager.processInterFileLinking(utilManager.getYangNodeSet());
@@ -399,16 +403,16 @@
// Check whether the information in the leaf is correct.
assertThat(leafInfo.getName(), is("network-ref"));
assertThat(leafInfo.getDataType().getDataTypeName(), is("leafref"));
- assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.LEAFREF));
+ assertThat(leafInfo.getDataType().getDataType(), is(LEAFREF));
YangLeafRef leafref = (YangLeafRef) (leafInfo.getDataType().getDataTypeExtendedInfo());
// Check whether leafref type got resolved.
assertThat(leafref.getResolvableStatus(),
- is(ResolvableStatus.RESOLVED));
+ is(RESOLVED));
// Check the effective type for the leaf.
assertThat(leafref.getEffectiveDataType().getDataType(),
- is(YangDataTypes.UINT8));
+ is(UINT8));
}
/**
@@ -438,7 +442,7 @@
// Add references to import list.
yangLinkerManager.addRefToYangFilesImportList(utilManager.getYangNodeSet());
- YangLinkerUtils.updateFilePriority(utilManager.getYangNodeSet());
+ updateFilePriority(utilManager.getYangNodeSet());
// Carry out inter-file linking.
yangLinkerManager.processInterFileLinking(utilManager.getYangNodeSet());
@@ -472,7 +476,7 @@
// Add references to import list.
yangLinkerManager.addRefToYangFilesImportList(utilManager.getYangNodeSet());
- YangLinkerUtils.updateFilePriority(utilManager.getYangNodeSet());
+ updateFilePriority(utilManager.getYangNodeSet());
//Carry out inter-file linking.
yangLinkerManager.processInterFileLinking(utilManager.getYangNodeSet());
@@ -502,7 +506,7 @@
// Add references to import list.
yangLinkerManager.addRefToYangFilesImportList(utilManager.getYangNodeSet());
- YangLinkerUtils.updateFilePriority(utilManager.getYangNodeSet());
+ updateFilePriority(utilManager.getYangNodeSet());
// Carry out inter-file linking.
yangLinkerManager.processInterFileLinking(utilManager.getYangNodeSet());
@@ -531,17 +535,17 @@
// Check whether the information in the leaf is correct under grouping.
assertThat(leafInfo.getName(), is("network-id"));
- assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.LEAFREF));
+ assertThat(leafInfo.getDataType().getDataType(), is(LEAFREF));
YangLeafRef leafref = (YangLeafRef) (leafInfo.getDataType().getDataTypeExtendedInfo());
// Check whether leafref type got resolved.
assertThat(leafref.getResolvableStatus(),
- is(ResolvableStatus.RESOLVED));
+ is(RESOLVED));
// Check the effective type for the leaf.
assertThat(leafref.getEffectiveDataType().getDataType(),
- is(YangDataTypes.UINT8));
+ is(UINT8));
}
/**
@@ -568,7 +572,7 @@
// Add references to import list.
yangLinkerManager.addRefToYangFilesImportList(utilManager.getYangNodeSet());
- YangLinkerUtils.updateFilePriority(utilManager.getYangNodeSet());
+ updateFilePriority(utilManager.getYangNodeSet());
// Carry out inter-file linking.
yangLinkerManager.processInterFileLinking(utilManager.getYangNodeSet());
@@ -602,14 +606,14 @@
// Check whether the information in the leaf is correct under grouping.
assertThat(leafInfo.getName(), is("remove"));
assertThat(leafInfo.getDataType().getDataTypeName(), is("leafref"));
- assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.LEAFREF));
+ assertThat(leafInfo.getDataType().getDataType(), is(LEAFREF));
YangLeafRef leafref = (YangLeafRef) (leafInfo.getDataType().getDataTypeExtendedInfo());
assertThat(leafref.getResolvableStatus(),
- is(ResolvableStatus.RESOLVED));
+ is(RESOLVED));
assertThat(leafref.getEffectiveDataType().getDataType(),
- is(YangDataTypes.ENUMERATION));
+ is(ENUMERATION));
}
/**
@@ -637,7 +641,7 @@
// Add references to import list.
yangLinkerManager.addRefToYangFilesImportList(utilManager.getYangNodeSet());
- YangLinkerUtils.updateFilePriority(utilManager.getYangNodeSet());
+ updateFilePriority(utilManager.getYangNodeSet());
// Carry out inter-file linking.
yangLinkerManager.processInterFileLinking(utilManager.getYangNodeSet());
@@ -671,14 +675,14 @@
// Check whether the information in the leaf is correct under grouping.
assertThat(leafInfo.getName(), is("remove"));
assertThat(leafInfo.getDataType().getDataTypeName(), is("leafref"));
- assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.LEAFREF));
+ assertThat(leafInfo.getDataType().getDataType(), is(LEAFREF));
YangLeafRef leafref = (YangLeafRef) leafInfo.getDataType().getDataTypeExtendedInfo();
assertThat(leafref.getResolvableStatus(),
- is(ResolvableStatus.RESOLVED));
+ is(RESOLVED));
assertThat(leafref.getEffectiveDataType().getDataType(),
- is(YangDataTypes.ENUMERATION));
+ is(ENUMERATION));
}
/**
@@ -705,7 +709,7 @@
// Add references to import list.
yangLinkerManager.addRefToYangFilesImportList(utilManager.getYangNodeSet());
- YangLinkerUtils.updateFilePriority(utilManager.getYangNodeSet());
+ updateFilePriority(utilManager.getYangNodeSet());
// Carry out inter-file linking.
yangLinkerManager.processInterFileLinking(utilManager.getYangNodeSet());
@@ -740,7 +744,7 @@
// Check whether the information in the leaf is correct under grouping.
assertThat(leafInfo.getName(), is("ifname"));
assertThat(leafInfo.getDataType().getDataTypeName(), is("leafref"));
- assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.LEAFREF));
+ assertThat(leafInfo.getDataType().getDataType(), is(LEAFREF));
YangLeafRef leafref = (YangLeafRef) leafInfo.getDataType().getDataTypeExtendedInfo();
assertThat(leafref.getPathType(), Is.is(YangPathArgType.ABSOLUTE_PATH));
@@ -759,7 +763,7 @@
// Check whether the information in the leaf is correct under grouping.
assertThat(leafInfo1.getName(), is("status"));
assertThat(leafInfo1.getDataType().getDataTypeName(), is("leafref"));
- assertThat(leafInfo1.getDataType().getDataType(), is(YangDataTypes.LEAFREF));
+ assertThat(leafInfo1.getDataType().getDataType(), is(LEAFREF));
YangLeafRef leafref1 = (YangLeafRef) leafInfo1.getDataType().getDataTypeExtendedInfo();
assertThat(leafref1.getPathType(), is(YangPathArgType.ABSOLUTE_PATH));
@@ -812,7 +816,7 @@
// Add references to import list.
yangLinkerManager.addRefToYangFilesImportList(utilManager.getYangNodeSet());
- YangLinkerUtils.updateFilePriority(utilManager.getYangNodeSet());
+ updateFilePriority(utilManager.getYangNodeSet());
// Carry out inter-file linking.
yangLinkerManager.processInterFileLinking(utilManager.getYangNodeSet());
@@ -848,10 +852,10 @@
YangLeaf leafInfo2 = (YangLeaf) leafref.getReferredLeafOrLeafList();
assertThat(leafref.getReferredLeafOrLeafList(), is(leafInfo2));
- assertThat(leafref.getResolvableStatus(), Is.is(ResolvableStatus.RESOLVED));
+ assertThat(leafref.getResolvableStatus(), Is.is(RESOLVED));
assertThat(leafref.getEffectiveDataType().getDataType(),
- is(YangDataTypes.STRING));
+ is(STRING));
}
@@ -879,7 +883,7 @@
// Add references to import list.
yangLinkerManager.addRefToYangFilesImportList(utilManager.getYangNodeSet());
- YangLinkerUtils.updateFilePriority(utilManager.getYangNodeSet());
+ updateFilePriority(utilManager.getYangNodeSet());
// Carry out inter-file linking.
yangLinkerManager.processInterFileLinking(utilManager.getYangNodeSet());
@@ -915,7 +919,7 @@
List<YangIfFeature> ifFeatureList = leaf.getIfFeatureList();
YangIfFeature ifFeature = ifFeatureList.iterator().next();
assertThat(ifFeature.getName().getName(), is("local-storage"));
- assertThat(ifFeature.getResolvableStatus(), is(ResolvableStatus.RESOLVED));
+ assertThat(ifFeature.getResolvableStatus(), is(RESOLVED));
ListIterator<YangLeaf> listOfLeafInModule = yangNode.getListOfLeaf().listIterator();
YangLeaf yangLeaf = listOfLeafInModule.next();
@@ -923,12 +927,12 @@
YangLeafRef leafRef = (YangLeafRef) yangLeaf.getDataType().getDataTypeExtendedInfo();
- assertThat(leafRef.getEffectiveDataType().getDataType(), is(YangDataTypes.UINT64));
+ assertThat(leafRef.getEffectiveDataType().getDataType(), is(UINT64));
List<YangIfFeature> ifFeatureListInLeafref = leafRef.getIfFeatureList();
YangIfFeature ifFeatureInLeafref = ifFeatureListInLeafref.iterator().next();
assertThat(ifFeatureInLeafref.getName().getName(), is("local-storage"));
- assertThat(ifFeatureInLeafref.getResolvableStatus(), is(ResolvableStatus.RESOLVED));
+ assertThat(ifFeatureInLeafref.getResolvableStatus(), is(RESOLVED));
}
/**
@@ -955,7 +959,7 @@
// Add references to import list.
yangLinkerManager.addRefToYangFilesImportList(utilManager.getYangNodeSet());
- YangLinkerUtils.updateFilePriority(utilManager.getYangNodeSet());
+ updateFilePriority(utilManager.getYangNodeSet());
// Carry out inter-file linking.
yangLinkerManager.processInterFileLinking(utilManager.getYangNodeSet());
@@ -991,7 +995,7 @@
List<YangIfFeature> ifFeatureList = leaf.getIfFeatureList();
YangIfFeature ifFeature = ifFeatureList.iterator().next();
assertThat(ifFeature.getName().getName(), is("local-storage"));
- assertThat(ifFeature.getResolvableStatus(), is(ResolvableStatus.RESOLVED));
+ assertThat(ifFeature.getResolvableStatus(), is(RESOLVED));
ListIterator<YangLeaf> listOfLeafInModule = yangNode.getListOfLeaf().listIterator();
YangLeaf yangLeaf = listOfLeafInModule.next();
@@ -999,18 +1003,18 @@
YangLeafRef leafRef = (YangLeafRef) yangLeaf.getDataType().getDataTypeExtendedInfo();
- assertThat(leafRef.getEffectiveDataType().getDataType(), is(YangDataTypes.UINT64));
+ assertThat(leafRef.getEffectiveDataType().getDataType(), is(UINT64));
List<YangIfFeature> ifFeatureListInLeafref = leafRef.getIfFeatureList();
YangIfFeature ifFeatureInLeafref = ifFeatureListInLeafref.iterator().next();
assertThat(ifFeatureInLeafref.getName().getName(), is("main-storage"));
- assertThat(ifFeatureInLeafref.getResolvableStatus(), is(ResolvableStatus.RESOLVED));
+ assertThat(ifFeatureInLeafref.getResolvableStatus(), is(RESOLVED));
YangIfFeature ifFeatureInLeafref1 = ifFeatureListInLeafref.iterator().next();
assertThat(ifFeatureInLeafref1.getName().getName(), is("main-storage"));
- assertThat(ifFeatureInLeafref1.getResolvableStatus(), is(ResolvableStatus.RESOLVED));
+ assertThat(ifFeatureInLeafref1.getResolvableStatus(), is(RESOLVED));
}
/**
@@ -1038,7 +1042,7 @@
// Add references to import list.
yangLinkerManager.addRefToYangFilesImportList(utilManager.getYangNodeSet());
- YangLinkerUtils.updateFilePriority(utilManager.getYangNodeSet());
+ updateFilePriority(utilManager.getYangNodeSet());
// Carry out inter-file linking.
yangLinkerManager.processInterFileLinking(utilManager.getYangNodeSet());
@@ -1074,16 +1078,16 @@
// Check whether the information in the leaf is correct.
assertThat(leafInfo.getName(), is("src-tp-ref"));
assertThat(leafInfo.getDataType().getDataTypeName(), is("leafref"));
- assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.LEAFREF));
+ assertThat(leafInfo.getDataType().getDataType(), is(LEAFREF));
YangLeafRef leafref = (YangLeafRef) (leafInfo.getDataType().getDataTypeExtendedInfo());
// Check whether leafref type got resolved.
assertThat(leafref.getResolvableStatus(),
- is(ResolvableStatus.RESOLVED));
+ is(RESOLVED));
// Check the effective type for the leaf.
assertThat(leafref.getEffectiveDataType().getDataType(),
- is(YangDataTypes.UINT8));
+ is(UINT8));
}
/**
@@ -1112,7 +1116,7 @@
// Add references to import list.
yangLinkerManager.addRefToYangFilesImportList(utilManager.getYangNodeSet());
- YangLinkerUtils.updateFilePriority(utilManager.getYangNodeSet());
+ updateFilePriority(utilManager.getYangNodeSet());
// Carry out inter-file linking.
yangLinkerManager.processInterFileLinking(utilManager.getYangNodeSet());
@@ -1158,16 +1162,16 @@
// Check whether the information in the leaf is correct.
assertThat(leafInfo.getName(), is("network-id-ref"));
assertThat(leafInfo.getDataType().getDataTypeName(), is("leafref"));
- assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.LEAFREF));
+ assertThat(leafInfo.getDataType().getDataType(), is(LEAFREF));
YangLeafRef leafref = (YangLeafRef) (leafInfo.getDataType().getDataTypeExtendedInfo());
// Check whether leafref type got resolved.
assertThat(leafref.getResolvableStatus(),
- is(ResolvableStatus.RESOLVED));
+ is(RESOLVED));
// Check the effective type for the leaf.
assertThat(leafref.getEffectiveDataType().getDataType(),
- is(YangDataTypes.DERIVED));
+ is(DERIVED));
}
/**
@@ -1195,7 +1199,7 @@
// Add references to import list.
yangLinkerManager.addRefToYangFilesImportList(utilManager.getYangNodeSet());
- YangLinkerUtils.updateFilePriority(utilManager.getYangNodeSet());
+ updateFilePriority(utilManager.getYangNodeSet());
// Carry out inter-file linking.
yangLinkerManager.processInterFileLinking(utilManager.getYangNodeSet());
@@ -1229,15 +1233,148 @@
// Check whether the information in the leaf is correct.
assertThat(leafInfo.getName(), is("reference"));
assertThat(leafInfo.getDataType().getDataTypeName(), is("leafref"));
- assertThat(leafInfo.getDataType().getDataType(), is(YangDataTypes.LEAFREF));
+ assertThat(leafInfo.getDataType().getDataType(), is(LEAFREF));
YangLeafRef leafref = (YangLeafRef) (leafInfo.getDataType().getDataTypeExtendedInfo());
// Check whether leafref type got resolved.
assertThat(leafref.getResolvableStatus(),
- is(ResolvableStatus.RESOLVED));
+ is(RESOLVED));
// Check the effective type for the leaf.
assertThat(leafref.getEffectiveDataType().getDataType(),
- is(YangDataTypes.UINT8));
+ is(UINT8));
+ }
+
+ /**
+ * Checks leaf-ref resolution with path predicate having augmented nodes.
+ */
+ @Test
+ public void processLeafRefToAugment() throws IOException, ParserException {
+
+ String searchDir = "src/test/resources/leafreflinker/interfile" +
+ "/interfileaugment";
+
+ Set<Path> paths = new HashSet<>();
+ for (String file : getYangFiles(searchDir)) {
+ paths.add(Paths.get(file));
+ }
+
+ utilManager.createYangFileInfoSet(paths);
+ utilManager.parseYangFileInfoSet();
+ utilManager.createYangNodeSet();
+
+ yangLinkerManager.createYangNodeSet(utilManager.getYangNodeSet());
+ yangLinkerManager.addRefToYangFilesImportList(
+ utilManager.getYangNodeSet());
+ updateFilePriority(utilManager.getYangNodeSet());
+ yangLinkerManager.processInterFileLinking(utilManager.getYangNodeSet());
+
+ Iterator<YangNode> mIt = utilManager.getYangNodeSet().iterator();
+ YangNode node;
+ YangNode module2 = null;
+ YangNode module3 = null;
+ YangNode module4 = null;
+ while (mIt.hasNext()) {
+ node = mIt.next();
+ if (node.getName().equals("module2")) {
+ module2 = node;
+ } else if (node.getName().equals("module3")) {
+ module3 = node;
+ } else {
+ module4 = node;
+ }
+ }
+ assertThat((module4 instanceof YangModule), is(true));
+ YangModule mod4 = (YangModule) module4;
+ assertThat(mod4.getName(), is("module4"));
+
+ YangNode aug4 = mod4.getChild();
+ assertThat((aug4 instanceof YangAugment), is(true));
+ YangAugment augment4 = (YangAugment) aug4;
+
+ YangNode valid = augment4.getChild();
+ assertThat((valid instanceof YangContainer), is(true));
+ YangContainer valCont = (YangContainer) valid;
+
+ ListIterator<YangLeaf> it4 = valCont.getListOfLeaf().listIterator();
+ YangLeaf leaf4 = it4.next();
+
+ assertThat((module2 instanceof YangModule), is(true));
+ YangModule mod2 = (YangModule) module2;
+ assertThat(mod2.getName(), is("module2"));
+
+ YangNode cont1 = mod2.getChild();
+ assertThat((cont1 instanceof YangContainer), is(true));
+ YangContainer c1 = (YangContainer) cont1;
+
+ YangNode cont2 = c1.getChild();
+ assertThat((cont2 instanceof YangList), is(true));
+ YangList c2 = (YangList) cont2;
+
+ ListIterator<YangLeaf> it3 = c2.getListOfLeaf().listIterator();
+ YangLeaf leaf3 = it3.next();
+
+ List<YangAugment> augList = c2.getAugmentedInfoList();
+ YangAugment nameAug = augList.iterator().next();
+ ListIterator<YangLeaf> it1 = nameAug.getListOfLeaf().listIterator();
+ YangLeaf leaf1 = it1.next();
+
+ YangNode aug2 = cont1.getNextSibling();
+ assertThat((aug2 instanceof YangAugment), is(true));
+ YangAugment augment2 = (YangAugment) aug2;
+ ListIterator<YangLeaf> it2 = augment2.getListOfLeaf().listIterator();
+ YangLeaf leaf2 = it2.next();
+
+ assertThat((module3 instanceof YangModule), is(true));
+ YangModule mod3 = (YangModule) module3;
+ assertThat(mod3.getName(), is("module3"));
+
+ YangNode aug = mod3.getChild();
+ assertThat((aug instanceof YangAugment), is(true));
+ YangAugment aug1 = (YangAugment) aug;
+
+ ListIterator<YangLeaf> it = aug1.getListOfLeaf().listIterator();
+ YangLeaf leafInfo = it.next();
+ YangType<?> type = leafInfo.getDataType();
+
+ assertThat(leafInfo.getName(), is("per"));
+ assertThat(type.getDataTypeName(), is("leafref"));
+ assertThat(type.getDataType(), is(LEAFREF));
+
+ YangLeafRef leafRef = (YangLeafRef) (type.getDataTypeExtendedInfo());
+ assertThat(leafRef.getResolvableStatus(), is(RESOLVED));
+ assertThat(leafRef.getEffectiveDataType().getDataType(), is(STRING));
+
+ List<YangAtomicPath> atom = leafRef.getAtomicPath();
+ Iterator<YangAtomicPath> atIt = atom.iterator();
+ YangAtomicPath a = atIt.next();
+ assertThat(a.getResolvedNode(), is(c1));
+ a = atIt.next();
+ assertThat(a.getResolvedNode(), is(c2));
+
+ List<YangPathPredicate> pathPre = a.getPathPredicatesList();
+ YangPathPredicate path = pathPre.iterator().next();
+ assertThat(path.getLeftAxisNode(), is(leaf1));
+ assertThat(path.getRightAxisNode(), is(leaf2));
+ assertThat(leafRef.getReferredLeafOrLeafList(), is(leaf3));
+
+ leafInfo = it.next();
+ type = leafInfo.getDataType();
+
+ assertThat(leafInfo.getName(), is("val"));
+ assertThat(type.getDataTypeName(), is("leafref"));
+ assertThat(type.getDataType(), is(LEAFREF));
+
+ leafRef = (YangLeafRef) (type.getDataTypeExtendedInfo());
+ assertThat(leafRef.getResolvableStatus(), is(RESOLVED));
+ assertThat(leafRef.getEffectiveDataType().getDataType(), is(UINT8));
+
+ atom = leafRef.getAtomicPath();
+ atIt = atom.iterator();
+ a = atIt.next();
+ assertThat(a.getResolvedNode(), is(c1));
+ a = atIt.next();
+ assertThat(a.getResolvedNode(), is(valCont));
+ assertThat(leafRef.getReferredLeafOrLeafList(), is(leaf4));
}
}
diff --git a/compiler/plugin/maven/src/test/resources/leafreflinker/interfile/interfileaugment/module1.yang b/compiler/plugin/maven/src/test/resources/leafreflinker/interfile/interfileaugment/module1.yang
new file mode 100644
index 0000000..fedf735
--- /dev/null
+++ b/compiler/plugin/maven/src/test/resources/leafreflinker/interfile/interfileaugment/module1.yang
@@ -0,0 +1,14 @@
+module module1 {
+
+ namespace "urn:ietf:params:xml:ns:aug:module:1";
+
+ prefix mod-a;
+
+ container cont{
+ container val {
+ leaf-list create {
+ type string;
+ }
+ }
+ }
+}
diff --git a/compiler/plugin/maven/src/test/resources/leafreflinker/interfile/interfileaugment/module2.yang b/compiler/plugin/maven/src/test/resources/leafreflinker/interfile/interfileaugment/module2.yang
new file mode 100644
index 0000000..6c970a7
--- /dev/null
+++ b/compiler/plugin/maven/src/test/resources/leafreflinker/interfile/interfileaugment/module2.yang
@@ -0,0 +1,25 @@
+module module2 {
+
+ namespace "urn:ietf:params:xml:ns:aug:module:2";
+
+ prefix mod-b;
+
+ import module1 {
+ prefix mod-a;
+ }
+
+ container cont1 {
+ list cont2 {
+ key "ll";
+ leaf ll {
+ type string;
+ }
+ }
+ }
+
+ augment "/mod-a:cont/mod-a:val" {
+ leaf arg {
+ type string;
+ }
+ }
+}
diff --git a/compiler/plugin/maven/src/test/resources/leafreflinker/interfile/interfileaugment/module3.yang b/compiler/plugin/maven/src/test/resources/leafreflinker/interfile/interfileaugment/module3.yang
new file mode 100644
index 0000000..a8a1188
--- /dev/null
+++ b/compiler/plugin/maven/src/test/resources/leafreflinker/interfile/interfileaugment/module3.yang
@@ -0,0 +1,39 @@
+module module3 {
+
+ namespace "urn:ietf:params:xml:ns:aug:module:3";
+
+ prefix mod-c;
+
+ import module1 {
+ prefix mod-a;
+ }
+
+ import module2 {
+ prefix mod-b;
+ }
+
+ import module4 {
+ prefix mod-d;
+ }
+
+ augment "/mod-a:cont/mod-a:val" {
+ leaf per {
+ type leafref {
+ path "/mod-b:cont1/mod-b:cont2[mod-b:name=current()/"+
+ "../mod-b:arg]/mod-b:ll";
+ }
+ }
+
+ leaf val {
+ type leafref {
+ path "/mod-b:cont1/mod-d:validate/mod-d:referred";
+ }
+ }
+ }
+
+ augment "/mod-b:cont1/mod-b:cont2" {
+ leaf name {
+ type string;
+ }
+ }
+}
diff --git a/compiler/plugin/maven/src/test/resources/leafreflinker/interfile/interfileaugment/module4.yang b/compiler/plugin/maven/src/test/resources/leafreflinker/interfile/interfileaugment/module4.yang
new file mode 100644
index 0000000..1053bb3
--- /dev/null
+++ b/compiler/plugin/maven/src/test/resources/leafreflinker/interfile/interfileaugment/module4.yang
@@ -0,0 +1,18 @@
+module module4 {
+
+ namespace "urn:ietf:params:xml:ns:aug:module:4";
+
+ prefix mod-d;
+
+ import module2 {
+ prefix mod-b;
+ }
+
+ augment "/mod-b:cont1" {
+ container validate {
+ leaf referred {
+ type uint8;
+ }
+ }
+ }
+}
diff --git a/compiler/plugin/maven/src/test/resources/leafreflinker/oc-leafref/openconfig-interfaces.yang b/compiler/plugin/maven/src/test/resources/leafreflinker/oc-leafref/openconfig-interfaces.yang
new file mode 100644
index 0000000..d556342
--- /dev/null
+++ b/compiler/plugin/maven/src/test/resources/leafreflinker/oc-leafref/openconfig-interfaces.yang
@@ -0,0 +1,23 @@
+module openconfig-interfaces {
+
+ yang-version "1";
+
+ namespace "http://openconfig.net/yang/interfaces";
+
+ prefix "oc-if";
+
+ grouping interfaces-top {
+ container interfaces {
+ list interface {
+ key "name";
+ leaf name {
+ type string;
+ }
+ container state {
+ }
+ }
+ }
+ }
+
+ uses interfaces-top;
+}
diff --git a/compiler/plugin/maven/src/test/resources/leafreflinker/oc-leafref/openconfig-platform-transceiver.yang b/compiler/plugin/maven/src/test/resources/leafreflinker/oc-leafref/openconfig-platform-transceiver.yang
new file mode 100644
index 0000000..9da9e32
--- /dev/null
+++ b/compiler/plugin/maven/src/test/resources/leafreflinker/oc-leafref/openconfig-platform-transceiver.yang
@@ -0,0 +1,48 @@
+module openconfig-platform-transceiver {
+
+ yang-version "1";
+
+ namespace "http://openconfig.net/yang/platform/transceiver";
+
+ prefix "oc-transceiver";
+
+ import openconfig-platform { prefix oc-platform; }
+ import openconfig-interfaces { prefix oc-if; }
+
+ revision 2016-12-22;
+
+
+ grouping physical-channel-top {
+ container physical-channels {
+ list channel {
+ key "index";
+
+ leaf index {
+ type string;
+ }
+ }
+ }
+ }
+
+ grouping port-transceiver-top {
+ container transceiver {
+ uses physical-channel-top;
+ }
+ }
+
+ augment "/oc-platform:components/oc-platform:component" {
+ uses port-transceiver-top;
+ }
+
+ augment "/oc-if:interfaces/oc-if:interface/oc-if:state" {
+ leaf-list physical-channel {
+ type leafref {
+ path "/oc-platform:components/" +
+ "oc-platform:component[oc-platform:name=current()/../oc-platform:hardware-port]/" +
+ "oc-transceiver:transceiver/" +
+ "oc-transceiver:physical-channels/oc-transceiver:channel/" +
+ "oc-transceiver:index";
+ }
+ }
+ }
+}
diff --git a/compiler/plugin/maven/src/test/resources/leafreflinker/oc-leafref/openconfig-platform.yang b/compiler/plugin/maven/src/test/resources/leafreflinker/oc-leafref/openconfig-platform.yang
new file mode 100644
index 0000000..e46369b
--- /dev/null
+++ b/compiler/plugin/maven/src/test/resources/leafreflinker/oc-leafref/openconfig-platform.yang
@@ -0,0 +1,35 @@
+module openconfig-platform {
+
+ yang-version "1";
+
+ namespace "http://openconfig.net/yang/platform";
+
+ prefix "oc-platform";
+import openconfig-interfaces { prefix oc-if; }
+
+ revision 2016-12-22;
+
+
+
+ grouping platform-component-top {
+ container components {
+ list component {
+ key "name";
+ leaf name {
+ type string;
+ }
+ }
+ }
+ }
+
+ uses platform-component-top;
+
+ augment "/oc-if:interfaces/oc-if:interface/oc-if:state" {
+ leaf hardware-port {
+ type leafref {
+ path "/oc-platform:components/oc-platform:component/" +
+ "oc-platform:name";
+ }
+ }
+ }
+}