From: Robert Varga Date: Thu, 8 Dec 2022 19:52:27 +0000 (+0100) Subject: Create extractUserCapabilities() X-Git-Tag: v5.0.0~71 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=ad8c88351b1349f53eae21f75af4cfc14c818f9c;p=netconf.git Create extractUserCapabilities() 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 --- diff --git a/netconf/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/RemoteDeviceConnectorImpl.java b/netconf/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/RemoteDeviceConnectorImpl.java index 3ce67e804e..abe6221dd6 100644 --- a/netconf/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/RemoteDeviceConnectorImpl.java +++ b/netconf/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/RemoteDeviceConnectorImpl.java @@ -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(); - 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) { diff --git a/netconf/netconf-topology/src/main/java/org/opendaylight/netconf/topology/spi/AbstractNetconfTopology.java b/netconf/netconf-topology/src/main/java/org/opendaylight/netconf/topology/spi/AbstractNetconfTopology.java index d7bf00e8f6..53293c67db 100644 --- a/netconf/netconf-topology/src/main/java/org/opendaylight/netconf/topology/spi/AbstractNetconfTopology.java +++ b/netconf/netconf-topology/src/main/java/org/opendaylight/netconf/topology/spi/AbstractNetconfTopology.java @@ -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(); - 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); - } } diff --git a/netconf/netconf-topology/src/main/java/org/opendaylight/netconf/topology/spi/NetconfNodeUtils.java b/netconf/netconf-topology/src/main/java/org/opendaylight/netconf/topology/spi/NetconfNodeUtils.java index 085680fb6b..0e1a4de1d9 100644 --- a/netconf/netconf-topology/src/main/java/org/opendaylight/netconf/topology/spi/NetconfNodeUtils.java +++ b/netconf/netconf-topology/src/main/java/org/opendaylight/netconf/topology/spi/NetconfNodeUtils.java @@ -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(); + 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); + } } diff --git a/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/listener/NetconfDeviceCommunicator.java b/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/listener/NetconfDeviceCommunicator.java index 25518c54e9..790385c4cb 100644 --- a/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/listener/NetconfDeviceCommunicator.java +++ b/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/listener/NetconfDeviceCommunicator.java @@ -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 remoteDevice, - final UserPreferences netconfSessionPreferences, final int rpcMessageLimit) { - this(id, remoteDevice, rpcMessageLimit, requireNonNull(netconfSessionPreferences)); - } - public NetconfDeviceCommunicator(final RemoteDeviceId id, final RemoteDevice remoteDevice, final int rpcMessageLimit) { this(id, remoteDevice, rpcMessageLimit, null);