Create extractUserCapabilities() 34/103634/3
authorRobert Varga <robert.varga@pantheon.tech>
Thu, 8 Dec 2022 19:52:27 +0000 (20:52 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Fri, 9 Dec 2022 17:57:32 +0000 (18:57 +0100)
We have a masked code duplication. Make sure we remove it, so that
we allocate UserPreferences in a unified way.

Change-Id: I0fd938ca4c54898c0c899fc92d114199c00bfa42
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
netconf/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/RemoteDeviceConnectorImpl.java
netconf/netconf-topology/src/main/java/org/opendaylight/netconf/topology/spi/AbstractNetconfTopology.java
netconf/netconf-topology/src/main/java/org/opendaylight/netconf/topology/spi/NetconfNodeUtils.java
netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/listener/NetconfDeviceCommunicator.java

index 3ce67e804e490ad1c5be925df98413c78966d1dc..abe6221dd67aa8060f10f6759cb6f7de8dae509e 100644 (file)
@@ -7,7 +7,6 @@
  */
 package org.opendaylight.netconf.topology.singleton.impl;
 
-import static com.google.common.base.Preconditions.checkState;
 import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.VisibleForTesting;
@@ -21,7 +20,6 @@ import java.net.URL;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
-import org.eclipse.jdt.annotation.Nullable;
 import org.opendaylight.aaa.encrypt.AAAEncryptionService;
 import org.opendaylight.netconf.client.NetconfClientSessionListener;
 import org.opendaylight.netconf.client.conf.NetconfClientConfiguration;
@@ -40,8 +38,6 @@ import org.opendaylight.netconf.sal.connect.netconf.NetconfDeviceBuilder;
 import org.opendaylight.netconf.sal.connect.netconf.SchemalessNetconfDevice;
 import org.opendaylight.netconf.sal.connect.netconf.auth.DatastoreBackedPublicKeyAuth;
 import org.opendaylight.netconf.sal.connect.netconf.listener.NetconfDeviceCommunicator;
-import org.opendaylight.netconf.sal.connect.netconf.listener.NetconfSessionPreferences;
-import org.opendaylight.netconf.sal.connect.netconf.listener.UserPreferences;
 import org.opendaylight.netconf.sal.connect.netconf.sal.KeepaliveSalFacade;
 import org.opendaylight.netconf.sal.connect.netconf.sal.NetconfKeystoreAdapter;
 import org.opendaylight.netconf.sal.connect.netconf.schema.YangLibrarySchemaYangSourceProvider;
@@ -56,7 +52,6 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNode;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.parameters.OdlHelloMessageCapabilities;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.parameters.Protocol;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.status.available.capabilities.AvailableCapability.CapabilityOrigin;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.credentials.Credentials;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.credentials.credentials.KeyAuth;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.credentials.credentials.LoginPw;
@@ -216,13 +211,8 @@ public class RemoteDeviceConnectorImpl implements RemoteDeviceConnector {
             LOG.info("{}: Concurrent rpc limit is smaller than 1, no limit will be enforced.", remoteDeviceId);
         }
 
-        final var userCapabilities = extractUserCapabilities(node);
-        final var netconfDeviceCommunicator = userCapabilities != null
-            ? new NetconfDeviceCommunicator(remoteDeviceId, device, new UserPreferences(userCapabilities,
-                node.getYangModuleCapabilities() == null ? false : node.getYangModuleCapabilities().getOverride(),
-                    node.getNonModuleCapabilities() == null ? false : node.getNonModuleCapabilities().getOverride()),
-                rpcMessageLimit)
-            : new NetconfDeviceCommunicator(remoteDeviceId, device, rpcMessageLimit);
+        final var netconfDeviceCommunicator = new NetconfDeviceCommunicator(remoteDeviceId, device, rpcMessageLimit,
+            NetconfNodeUtils.extractUserCapabilities(node));
 
         if (salFacade instanceof KeepaliveSalFacade) {
             ((KeepaliveSalFacade)salFacade).setListener(netconfDeviceCommunicator);
@@ -230,33 +220,6 @@ public class RemoteDeviceConnectorImpl implements RemoteDeviceConnector {
         return new NetconfConnectorDTO(netconfDeviceCommunicator, salFacade, registeredYangLibSources);
     }
 
-    // FIXME: reconcile with AbstractNetconfTopology
-    private static @Nullable NetconfSessionPreferences extractUserCapabilities(final NetconfNode node) {
-        final var moduleCaps = node.getYangModuleCapabilities();
-        final var nonModuleCaps = node.getNonModuleCapabilities();
-
-        if (moduleCaps == null && node.getNonModuleCapabilities() == null) {
-            return null;
-        }
-
-        final var capabilities = new ArrayList<String>();
-        if (moduleCaps != null) {
-            capabilities.addAll(moduleCaps.getCapability());
-        }
-
-        //non-module capabilities should not exist in yang module capabilities
-        final var netconfSessionPreferences = NetconfSessionPreferences.fromStrings(capabilities);
-        checkState(netconfSessionPreferences.getNonModuleCaps().isEmpty(),
-                "List yang-module-capabilities/capability should contain only module based capabilities. "
-                        + "Non-module capabilities used: " + netconfSessionPreferences.getNonModuleCaps());
-
-        if (nonModuleCaps != null) {
-            capabilities.addAll(nonModuleCaps.getCapability());
-        }
-
-        return NetconfSessionPreferences.fromStrings(capabilities, CapabilityOrigin.UserDefined);
-    }
-
     @VisibleForTesting
     NetconfReconnectingClientConfiguration getClientConfig(final NetconfClientSessionListener listener,
                                                            final NetconfNode node) {
index d7bf00e8f6f88d64ecdbf07c498137cd9bfabf33..53293c67db6931e5e3075bffd66099b145273e4a 100644 (file)
@@ -10,7 +10,6 @@ package org.opendaylight.netconf.topology.spi;
 import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Preconditions;
 import com.google.common.collect.Lists;
 import com.google.common.util.concurrent.FutureCallback;
 import com.google.common.util.concurrent.Futures;
@@ -24,7 +23,6 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ExecutionException;
-import org.eclipse.jdt.annotation.Nullable;
 import org.opendaylight.aaa.encrypt.AAAEncryptionService;
 import org.opendaylight.controller.config.threadpool.ScheduledThreadPool;
 import org.opendaylight.controller.config.threadpool.ThreadPool;
@@ -50,8 +48,6 @@ import org.opendaylight.netconf.sal.connect.netconf.NetconfDeviceBuilder;
 import org.opendaylight.netconf.sal.connect.netconf.SchemalessNetconfDevice;
 import org.opendaylight.netconf.sal.connect.netconf.auth.DatastoreBackedPublicKeyAuth;
 import org.opendaylight.netconf.sal.connect.netconf.listener.NetconfDeviceCommunicator;
-import org.opendaylight.netconf.sal.connect.netconf.listener.NetconfSessionPreferences;
-import org.opendaylight.netconf.sal.connect.netconf.listener.UserPreferences;
 import org.opendaylight.netconf.sal.connect.netconf.sal.KeepaliveSalFacade;
 import org.opendaylight.netconf.sal.connect.netconf.sal.NetconfDeviceSalFacade;
 import org.opendaylight.netconf.sal.connect.netconf.sal.NetconfKeystoreAdapter;
@@ -65,7 +61,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.optional.rev19
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNode;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.parameters.Protocol;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.parameters.Protocol.Name;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.status.available.capabilities.AvailableCapability.CapabilityOrigin;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.credentials.Credentials;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.credentials.credentials.KeyAuth;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.credentials.credentials.LoginPw;
@@ -269,7 +264,7 @@ public abstract class AbstractNetconfTopology implements NetconfTopology {
         }
 
         final var netconfDeviceCommunicator = new NetconfDeviceCommunicator(deviceId, device, rpcMessageLimit,
-            extractUserCapabilities(node));
+            NetconfNodeUtils.extractUserCapabilities(node));
 
         if (keepAliveFacade != null) {
             keepAliveFacade.setListener(netconfDeviceCommunicator);
@@ -386,40 +381,4 @@ public abstract class AbstractNetconfTopology implements NetconfTopology {
         }
         throw new IllegalStateException("Unsupported credential type: " + credentials.getClass());
     }
-
-    private static @Nullable UserPreferences extractUserCapabilities(final NetconfNode node) {
-        final var moduleCaps = node.getYangModuleCapabilities();
-        final var nonModuleCaps = node.getNonModuleCapabilities();
-
-        if (moduleCaps == null && nonModuleCaps == null) {
-            // if none of yang-module-capabilities or non-module-capabilities is specified
-            return null;
-        }
-
-        final var capabilities = new ArrayList<String>();
-        final boolean overrideYangModuleCaps;
-        if (moduleCaps != null) {
-            capabilities.addAll(moduleCaps.getCapability());
-            overrideYangModuleCaps = moduleCaps.getOverride();
-        } else {
-            overrideYangModuleCaps = false;
-        }
-
-        //non-module capabilities should not exist in yang module capabilities
-        final var netconfSessionPreferences = NetconfSessionPreferences.fromStrings(capabilities);
-        Preconditions.checkState(netconfSessionPreferences.getNonModuleCaps().isEmpty(),
-                "List yang-module-capabilities/capability should contain only module based capabilities. "
-                        + "Non-module capabilities used: " + netconfSessionPreferences.getNonModuleCaps());
-
-        final boolean overrideNonModuleCaps;
-        if (nonModuleCaps != null) {
-            capabilities.addAll(nonModuleCaps.getCapability());
-            overrideNonModuleCaps = nonModuleCaps.getOverride();
-        } else {
-            overrideNonModuleCaps = false;
-        }
-
-        return new UserPreferences(NetconfSessionPreferences.fromStrings(capabilities, CapabilityOrigin.UserDefined),
-            overrideYangModuleCaps, overrideNonModuleCaps);
-    }
 }
index 085680fb6b3b72b54d1a228109c081a1cdd5ce99..0e1a4de1d93c9df7b87fba2c38328b76825e3bc3 100644 (file)
@@ -8,12 +8,15 @@
 package org.opendaylight.netconf.topology.spi;
 
 import java.net.InetSocketAddress;
+import java.util.ArrayList;
 import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jdt.annotation.Nullable;
+import org.opendaylight.netconf.sal.connect.netconf.listener.NetconfSessionPreferences;
+import org.opendaylight.netconf.sal.connect.netconf.listener.UserPreferences;
 import org.opendaylight.netconf.sal.connect.util.RemoteDeviceId;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Host;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IetfInetUtil;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNode;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.status.available.capabilities.AvailableCapability.CapabilityOrigin;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
 
 /**
@@ -24,10 +27,17 @@ public final class NetconfNodeUtils {
         // Hidden on purpose
     }
 
+    /**
+     * Create an {@link InetSocketAddress} targeting a particular {@link NetconfNode}.
+     *
+     * @param node A {@link NetconfNode}
+     * @return A {@link InetSocketAddress}
+     * @throws NullPointerException if {@code node} is {@code null}
+     */
     public static @NonNull InetSocketAddress toInetSocketAddress(final NetconfNode node) {
-        final Host host = node.requireHost();
+        final var host = node.requireHost();
         final int port = node.requirePort().getValue().toJava();
-        final IpAddress ipAddress = host.getIpAddress();
+        final var ipAddress = host.getIpAddress();
         return ipAddress != null ? new InetSocketAddress(IetfInetUtil.INSTANCE.inetAddressFor(ipAddress), port)
             : new InetSocketAddress(host.getDomainName().getValue(), port);
     }
@@ -35,4 +45,50 @@ public final class NetconfNodeUtils {
     public static @NonNull RemoteDeviceId toRemoteDeviceId(final NodeId nodeId, final NetconfNode node) {
         return new RemoteDeviceId(nodeId.getValue(), toInetSocketAddress(node));
     }
+
+    /**
+     * Extract {@link UserPreferences} from na {@link NetconfNode}.
+     *
+     * @param node A {@link NetconfNode}
+     * @return {@link UserPreferences}, potentially {@code null}
+     * @throws NullPointerException if {@code node} is {@code null}
+     * @throws IllegalArgumentException there are any non-module capabilities
+     */
+    public static @Nullable UserPreferences extractUserCapabilities(final NetconfNode node) {
+        final var moduleCaps = node.getYangModuleCapabilities();
+        final var nonModuleCaps = node.getNonModuleCapabilities();
+
+        if (moduleCaps == null && nonModuleCaps == null) {
+            // if none of yang-module-capabilities or non-module-capabilities is specified
+            return null;
+        }
+
+        final var capabilities = new ArrayList<String>();
+        final boolean overrideYangModuleCaps;
+        if (moduleCaps != null) {
+            capabilities.addAll(moduleCaps.getCapability());
+            overrideYangModuleCaps = moduleCaps.getOverride();
+        } else {
+            overrideYangModuleCaps = false;
+        }
+
+        //non-module capabilities should not exist in yang module capabilities
+        final var sessionPreferences = NetconfSessionPreferences.fromStrings(capabilities);
+        final var nonModulePrefs = sessionPreferences.getNonModuleCaps();
+        if (!nonModulePrefs.isEmpty()) {
+            throw new IllegalArgumentException("List yang-module-capabilities/capability should contain only module "
+                + "based capabilities. Non-module capabilities used: " + nonModulePrefs);
+        }
+
+        final boolean overrideNonModuleCaps;
+        if (nonModuleCaps != null) {
+            capabilities.addAll(nonModuleCaps.getCapability());
+            overrideNonModuleCaps = nonModuleCaps.getOverride();
+        } else {
+            overrideNonModuleCaps = false;
+        }
+
+        return new UserPreferences(NetconfSessionPreferences.fromStrings(capabilities, CapabilityOrigin.UserDefined),
+            overrideYangModuleCaps, overrideNonModuleCaps);
+    }
 }
index 25518c54e98aa2a2b763b9da79fa8c09bcaa800b..790385c4cb7795bd932503d41cde9ce5bb1dca5f 100644 (file)
@@ -7,8 +7,6 @@
  */
 package org.opendaylight.netconf.sal.connect.netconf.listener;
 
-import static java.util.Objects.requireNonNull;
-
 import com.google.common.base.Strings;
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.SettableFuture;
@@ -80,12 +78,6 @@ public class NetconfDeviceCommunicator implements NetconfClientSessionListener,
         return closing != 0;
     }
 
-    public NetconfDeviceCommunicator(final RemoteDeviceId id,
-            final RemoteDevice<NetconfDeviceCommunicator> remoteDevice,
-            final UserPreferences netconfSessionPreferences, final int rpcMessageLimit) {
-        this(id, remoteDevice, rpcMessageLimit, requireNonNull(netconfSessionPreferences));
-    }
-
     public NetconfDeviceCommunicator(final RemoteDeviceId id,
             final RemoteDevice<NetconfDeviceCommunicator> remoteDevice, final int rpcMessageLimit) {
         this(id, remoteDevice, rpcMessageLimit, null);