Improve monitoring access to revision-less schemas 55/110355/1
authorRobert Varga <robert.varga@pantheon.tech>
Mon, 26 Feb 2024 13:57:20 +0000 (14:57 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Mon, 26 Feb 2024 14:10:25 +0000 (15:10 +0100)
The server may support multiple versions of YANG schema, which one of
which may not actually have a revision. In this case we really want to
specify an empty version, as that is the entry are after -- rather than
any version, which would incur data-not-unique error.

JIRA: NETCONF-840
Change-Id: I5b705971369cbffa81c0c0464569f8caac2f8e6d
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
plugins/netconf-client-mdsal/src/main/java/org/opendaylight/netconf/client/mdsal/impl/MonitoringSchemaSourceProvider.java
plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/impl/MonitoringSchemaSourceProviderTest.java
plugins/netconf-client-mdsal/src/test/java/org/opendaylight/netconf/client/mdsal/impl/NetconfMessageTransformerTest.java

index a6e42046f925cacae02ea9966b13e32711070eba..391ada98776f7625654e0ea9a2c94a60a3356044 100644 (file)
@@ -14,8 +14,8 @@ import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.MoreExecutors;
 import java.util.Optional;
-import javax.xml.transform.dom.DOMSource;
 import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jdt.annotation.Nullable;
 import org.opendaylight.netconf.client.mdsal.api.NetconfRpcService;
 import org.opendaylight.netconf.client.mdsal.api.RemoteDeviceId;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.GetSchema;
@@ -26,7 +26,6 @@ import org.opendaylight.yangtools.yang.common.Revision;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
 import org.opendaylight.yangtools.yang.data.api.schema.DOMSourceAnyxmlNode;
-import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
 import org.opendaylight.yangtools.yang.data.api.schema.LeafNode;
 import org.opendaylight.yangtools.yang.data.spi.node.ImmutableNodes;
 import org.opendaylight.yangtools.yang.model.api.source.SourceIdentifier;
@@ -64,10 +63,9 @@ final class MonitoringSchemaSourceProvider implements SchemaSourceProvider<YangT
 
     @Override
     public ListenableFuture<YangTextSource> getSource(final SourceIdentifier sourceIdentifier) {
-        final String moduleName = sourceIdentifier.name().getLocalName();
-        final Revision revision = sourceIdentifier.revision();
-        final ContainerNode getSchemaRequest = createGetSchemaRequest(moduleName,
-            revision == null ? Optional.empty() : Optional.of(revision.toString()));
+        final var moduleName = sourceIdentifier.name().getLocalName();
+        final var revision = sourceIdentifier.revision();
+        final var getSchemaRequest = createGetSchemaRequest(moduleName, revision);
 
         LOG.trace("{}: Loading YANG schema source for {}:{}", id, moduleName, revision);
         return Futures.transform(rpc.invokeNetconf(GetSchema.QNAME, getSchemaRequest),
@@ -90,13 +88,13 @@ final class MonitoringSchemaSourceProvider implements SchemaSourceProvider<YangT
             }, MoreExecutors.directExecutor());
     }
 
-    static @NonNull ContainerNode createGetSchemaRequest(final String moduleName, final Optional<String> revision) {
-        final var builder = ImmutableNodes.newContainerBuilder()
+    static @NonNull ContainerNode createGetSchemaRequest(final String moduleName, final @Nullable Revision revision) {
+        return ImmutableNodes.newContainerBuilder()
             .withNodeIdentifier(GET_SCHEMA_PATHARG)
             .withChild(ImmutableNodes.leafNode(IDENTIFIER_PATHARG, moduleName))
-            .withChild(FORMAT_LEAF);
-        revision.ifPresent(rev -> builder.withChild(ImmutableNodes.leafNode(VERSION_PATHARG, rev)));
-        return builder.build();
+            .withChild(ImmutableNodes.leafNode(VERSION_PATHARG, revision == null ? "" : revision.toString()))
+            .withChild(FORMAT_LEAF)
+            .build();
     }
 
     private static Optional<String> getSchemaFromRpc(final RemoteDeviceId id, final ContainerNode result) {
@@ -104,13 +102,13 @@ final class MonitoringSchemaSourceProvider implements SchemaSourceProvider<YangT
             return Optional.empty();
         }
 
-        final DataContainerChild child = result.childByArg(NETCONF_DATA_PATHARG);
+        final var child = result.childByArg(NETCONF_DATA_PATHARG);
         checkState(child instanceof DOMSourceAnyxmlNode,
                 "%s Unexpected response to get-schema, expected response with one child %s, but was %s", id,
                 Data.QNAME, result);
 
-        final DOMSource wrappedNode = ((DOMSourceAnyxmlNode) child).body();
-        final Element dataNode = (Element) requireNonNull(wrappedNode.getNode());
+        final var wrappedNode = ((DOMSourceAnyxmlNode) child).body();
+        final var dataNode = (Element) requireNonNull(wrappedNode.getNode());
 
         return Optional.of(dataNode.getTextContent().trim());
     }
index de658cf8ff6de9d12dbaac49861db4e07a28195b..a1132c66def8c3dca34b2ee7e7fc53a30407ecd8 100644 (file)
@@ -14,7 +14,6 @@ import static org.mockito.Mockito.verify;
 
 import com.google.common.util.concurrent.Futures;
 import java.net.InetSocketAddress;
-import java.util.Optional;
 import java.util.Set;
 import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.transform.dom.DOMSource;
@@ -29,6 +28,7 @@ import org.opendaylight.netconf.client.mdsal.api.RemoteDeviceId;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.GetSchema;
 import org.opendaylight.yangtools.util.xml.UntrustedXML;
 import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.common.Revision;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
 import org.opendaylight.yangtools.yang.data.spi.node.ImmutableNodes;
@@ -56,7 +56,7 @@ class MonitoringSchemaSourceProviderTest {
         final var source = provider.getSource(identifier).get();
         assertEquals(identifier, source.sourceId());
         verify(service).invokeNetconf(GetSchema.QNAME,
-                MonitoringSchemaSourceProvider.createGetSchemaRequest("test", Optional.of("2016-02-08")));
+            MonitoringSchemaSourceProvider.createGetSchemaRequest("test", Revision.of("2016-02-08")));
     }
 
     private static ContainerNode getNode() throws ParserConfigurationException {
index 4fe6cfb1921dd09448ab7b66db091ee600056a6e..6e4c6c402f62060fff55b7874bebbc5c0d02e04d 100644 (file)
@@ -67,6 +67,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.mon
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206.NetconfConfigChange;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206.netconf.config.change.Edit;
 import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.common.Revision;
 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
@@ -264,7 +265,7 @@ public class NetconfMessageTransformerTest extends AbstractBaseSchemasTest {
     @Test
     public void testGetSchemaRequest() throws Exception {
         final var netconfMessage = netconfMessageTransformer.toRpcRequest(GetSchema.QNAME,
-                MonitoringSchemaSourceProvider.createGetSchemaRequest("module", Optional.of("2012-12-12")));
+                MonitoringSchemaSourceProvider.createGetSchemaRequest("module", Revision.of("2012-12-12")));
         assertSimilarXml(netconfMessage, """
             <rpc message-id="m-0" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
               <get-schema xmlns="urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring">
@@ -320,8 +321,8 @@ public class NetconfMessageTransformerTest extends AbstractBaseSchemasTest {
         assertTrue(compositeNodeRpcResult.errors().isEmpty());
         assertNotNull(compositeNodeRpcResult.value());
 
-        final var values = MonitoringSchemaSourceProvider.createGetSchemaRequest(
-            "module", Optional.of("2012-12-12")).body();
+        final var values = MonitoringSchemaSourceProvider.createGetSchemaRequest("module", Revision.of("2012-12-12"))
+            .body();
 
         final var keys = new HashMap<QName, Object>();
         for (var value : values) {
@@ -405,8 +406,8 @@ public class NetconfMessageTransformerTest extends AbstractBaseSchemasTest {
 
     @Test
     public void testEditConfigRequest() throws Exception {
-        final var values = MonitoringSchemaSourceProvider.createGetSchemaRequest(
-            "module", Optional.of("2012-12-12")).body();
+        final var values = MonitoringSchemaSourceProvider.createGetSchemaRequest("module", Revision.of("2012-12-12"))
+            .body();
 
         final var keys = new HashMap<QName, Object>();
         for (var value : values) {