*/
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;
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;
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;
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;
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);
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) {
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;
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;
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;
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;
}
final var netconfDeviceCommunicator = new NetconfDeviceCommunicator(deviceId, device, rpcMessageLimit,
- extractUserCapabilities(node));
+ NetconfNodeUtils.extractUserCapabilities(node));
if (keepAliveFacade != null) {
keepAliveFacade.setListener(netconfDeviceCommunicator);
}
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);
- }
}
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;
/**
// 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);
}
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);
+ }
}
*/
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;
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);