From: Tibor Král Date: Tue, 11 Jun 2019 09:02:34 +0000 (+0200) Subject: Fix for deviation list mapping in Restconf X-Git-Tag: release/neon-sr2~10 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=netconf.git;a=commitdiff_plain;h=74264186696c70eb899da3e5869b1ff3ee01dcc6 Fix for deviation list mapping in Restconf RESTCONF NBP initialization fails with RestconfDocumentedException when global schema context contains yang models using deviations. JIRA: TRNSPRTPCE-126 Change-Id: I480ac6641006e3e82ffd6ac3aa4cf169fe8b665d Signed-off-by: Tibor Král --- diff --git a/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/utils/mapping/RestconfMappingNodeUtil.java b/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/utils/mapping/RestconfMappingNodeUtil.java index 68e03c4121..8361ace56e 100644 --- a/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/utils/mapping/RestconfMappingNodeUtil.java +++ b/restconf/restconf-nb-rfc8040/src/main/java/org/opendaylight/restconf/nb/rfc8040/utils/mapping/RestconfMappingNodeUtil.java @@ -197,11 +197,14 @@ public final class RestconfMappingNodeUtil { final DataContainerNodeBuilder deviationEntryNode = Builders.mapEntryBuilder((ListSchemaNode) deviationsSchema); final QName lastComponent = deviation.getTargetPath().getLastComponent(); - addChildOfModuleBySpecificModule(IetfYangLibrary.SPECIFIC_MODULE_NAME_LEAF_QNAME, deviationEntryNode, - context.findModule(lastComponent.getModule()).get().getName(), + addChildOfModuleBySpecificModuleInternal(IetfYangLibrary.SPECIFIC_MODULE_NAME_LEAF_QNAME, + deviationEntryNode, context.findModule(lastComponent.getModule()).get().getName(), ietfYangLibraryModule); - addChildOfModuleBySpecificModule(IetfYangLibrary.SPECIFIC_MODULE_REVISION_LEAF_QNAME, deviationEntryNode, - lastComponent.getRevision(), ietfYangLibraryModule); + if (lastComponent.getRevision().isPresent()) { + addChildOfModuleBySpecificModuleInternal(IetfYangLibrary.SPECIFIC_MODULE_REVISION_LEAF_QNAME, + deviationEntryNode, lastComponent.getRevision(), + ietfYangLibraryModule); + } deviations.withChild(deviationEntryNode.build()); } mapEntryBuilder.withChild(deviations.build()); @@ -336,25 +339,6 @@ public final class RestconfMappingNodeUtil { throw new RestconfDocumentedException(qnameOfSchema.getLocalName() + " doesn't exist."); } - /** - * Mapping childrens of list-module. - * - * @param specifiLeafQName - * qname of leaf - * @param mapEntryBuilder - * maptEntryBuilder of parent for mapping children - * @param value - * valeu of leaf - * @param ietfYangLibraryModule - * ietf-yang-library module - */ - private static void addChildOfModuleBySpecificModule(final QName specifiLeafQName, - final DataContainerNodeBuilder mapEntryBuilder, - final Object value, final Module ietfYangLibraryModule) { - final DataSchemaNode nameLeaf = findNodeInGroupings(specifiLeafQName, ietfYangLibraryModule); - mapEntryBuilder.withChild(Builders.leafBuilder((LeafSchemaNode) nameLeaf).withValue(value).build()); - } - /** * Find schema of specific leaf in list-module grouping. * diff --git a/restconf/restconf-nb-rfc8040/src/test/java/org/opendaylight/restconf/nb/rfc8040/utils/mapping/RestconfMappingNodeUtilTest.java b/restconf/restconf-nb-rfc8040/src/test/java/org/opendaylight/restconf/nb/rfc8040/utils/mapping/RestconfMappingNodeUtilTest.java index 116139dc3d..c08e40814c 100644 --- a/restconf/restconf-nb-rfc8040/src/test/java/org/opendaylight/restconf/nb/rfc8040/utils/mapping/RestconfMappingNodeUtilTest.java +++ b/restconf/restconf-nb-rfc8040/src/test/java/org/opendaylight/restconf/nb/rfc8040/utils/mapping/RestconfMappingNodeUtilTest.java @@ -116,6 +116,8 @@ public class RestconfMappingNodeUtilTest { // verify loaded modules verifyLoadedModules((ContainerNode) mods); + // verify deviations + verifyDeviations((ContainerNode) mods); } @Test @@ -204,6 +206,30 @@ public class RestconfMappingNodeUtilTest { } } + /** + * Verify whether the loaded modules contain any deviations. + * + * @param containerNode + * modules + */ + private static void verifyDeviations(final ContainerNode containerNode) { + int deviationsFound = 0; + for (final DataContainerChild child : containerNode.getValue()) { + if (child instanceof MapNode) { + for (final MapEntryNode mapEntryNode : ((MapNode) child).getValue()) { + for (final DataContainerChild dataContainerChild : mapEntryNode + .getValue()) { + if (dataContainerChild.getNodeType() + .equals(IetfYangLibrary.SPECIFIC_MODULE_DEVIATION_LIST_QNAME)) { + deviationsFound++; + } + } + } + } + } + Assert.assertTrue(deviationsFound > 0); + } + /** * Verify loaded modules. * diff --git a/restconf/restconf-nb-rfc8040/src/test/resources/modules/restconf-module-testing/deviatee-test@2019-06-11.yang b/restconf/restconf-nb-rfc8040/src/test/resources/modules/restconf-module-testing/deviatee-test@2019-06-11.yang new file mode 100644 index 0000000000..78182b480a --- /dev/null +++ b/restconf/restconf-nb-rfc8040/src/test/resources/modules/restconf-module-testing/deviatee-test@2019-06-11.yang @@ -0,0 +1,26 @@ +module deviatee-test { + yang-version 1.1; + namespace "http://tech/pantheon/deviatee-test"; + prefix dev; + + organization + "PANTHEON.tech s.r.o."; + + description + "Prepared to receive deviations"; + + revision 2019-06-11 { + description + "Deviation test"; + } + + container test-container { + leaf comment { + type string { + length "0 .. 60"; + } + description + "Just for Deviation testing"; + } + } +} diff --git a/restconf/restconf-nb-rfc8040/src/test/resources/modules/restconf-module-testing/deviator-test@2019-06-11.yang b/restconf/restconf-nb-rfc8040/src/test/resources/modules/restconf-module-testing/deviator-test@2019-06-11.yang new file mode 100644 index 0000000000..8133fd306d --- /dev/null +++ b/restconf/restconf-nb-rfc8040/src/test/resources/modules/restconf-module-testing/deviator-test@2019-06-11.yang @@ -0,0 +1,32 @@ +module deviator-test { + yang-version 1.1; + namespace "http://tech/pantheon/deviator-test"; + prefix dev; + + organization + "PANTHEON.tech s.r.o."; + + import deviatee-test { + prefix dv; + revision-date 2019-06-11; + } + + description + "Prepared to set deviations"; + + revision 2019-06-11 { + description + "Deviation test"; + } + + deviation "/dv:test-container/dv:comment" { + deviate add { + must + "(../dv:comment = 'TEST' or ../dv:comment = 'TEST2')" { + error-message "Invalid comment for Deviation test"; + description + "This is just a simple deviation test"; + } + } + } +}