package org.opendaylight.netconf.topology;
+import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
import com.google.common.base.Strings;
import com.google.common.util.concurrent.FutureCallback;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import org.opendaylight.controller.config.threadpool.ScheduledThreadPool;
import org.opendaylight.controller.config.threadpool.ThreadPool;
import org.opendaylight.netconf.sal.connect.netconf.listener.NetconfDeviceCapabilities;
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.util.RemoteDeviceId;
import org.opendaylight.netconf.topology.pipeline.TopologyMountPointFacade.ConnectionStatusListenerRegistration;
final NetconfDevice device = new NetconfDevice(schemaResourcesDTO, remoteDeviceId, salFacade,
processingExecutor.getExecutor(), reconnectOnChangedSchema);
- return new NetconfConnectorDTO(new NetconfDeviceCommunicator(remoteDeviceId, device), salFacade);
+ final Optional<NetconfSessionPreferences> userCapabilities = getUserCapabilities(node);
+
+ return new NetconfConnectorDTO(
+ userCapabilities.isPresent() ?
+ new NetconfDeviceCommunicator(
+ remoteDeviceId, device, new UserPreferences(userCapabilities.get(), node.getYangModuleCapabilities().isOverride())):
+ new NetconfDeviceCommunicator(remoteDeviceId, device)
+ , salFacade);
}
protected NetconfDevice.SchemaResourcesDTO setupSchemaCacheDTO(final NodeId nodeId, final NetconfNode node) {
}
}
+ private Optional<NetconfSessionPreferences> getUserCapabilities(final NetconfNode node) {
+ if(node.getYangModuleCapabilities() == null) {
+ return Optional.absent();
+ }
+
+ final List<String> capabilities = node.getYangModuleCapabilities().getCapability();
+ if(capabilities == null || capabilities.isEmpty()) {
+ return Optional.absent();
+ }
+
+ final NetconfSessionPreferences parsedOverrideCapabilities = NetconfSessionPreferences.fromStrings(capabilities);
+ Preconditions.checkState(parsedOverrideCapabilities.getNonModuleCaps().isEmpty(), "Capabilities to override can " +
+ "only contain module based capabilities, non-module capabilities will be retrieved from the device," +
+ " configured non-module capabilities: " + parsedOverrideCapabilities.getNonModuleCaps());
+
+ return Optional.of(parsedOverrideCapabilities);
+ }
+
private static final class TimedReconnectStrategyFactory implements ReconnectStrategyFactory {
private final Long connectionAttempts;
private final EventExecutor executor;
import org.opendaylight.netconf.sal.connect.netconf.NetconfStateSchemas;
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.UserPrefenreces;
+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.util.RemoteDeviceId;
final NetconfDeviceCommunicator listener = userCapabilities.isPresent() ?
new NetconfDeviceCommunicator(id, device,
- new UserPrefenreces(userCapabilities.get(), getYangModuleCapabilities().getOverride())):
+ new UserPreferences(userCapabilities.get(), getYangModuleCapabilities().getOverride())):
new NetconfDeviceCommunicator(id, device);
if (shouldSendKeepalive()) {
private static final Logger LOG = LoggerFactory.getLogger(NetconfDeviceCommunicator.class);
protected final RemoteDevice<NetconfSessionPreferences, NetconfMessage, NetconfDeviceCommunicator> remoteDevice;
- private final Optional<UserPrefenreces> overrideNetconfCapabilities;
+ private final Optional<UserPreferences> overrideNetconfCapabilities;
protected final RemoteDeviceId id;
private final Lock sessionLock = new ReentrantLock();
private SettableFuture<NetconfDeviceCapabilities> firstConnectionFuture;
public NetconfDeviceCommunicator(final RemoteDeviceId id, final RemoteDevice<NetconfSessionPreferences, NetconfMessage, NetconfDeviceCommunicator> remoteDevice,
- final UserPrefenreces NetconfSessionPreferences) {
+ final UserPreferences NetconfSessionPreferences) {
this(id, remoteDevice, Optional.of(NetconfSessionPreferences));
}
public NetconfDeviceCommunicator(final RemoteDeviceId id,
final RemoteDevice<NetconfSessionPreferences, NetconfMessage, NetconfDeviceCommunicator> remoteDevice) {
- this(id, remoteDevice, Optional.<UserPrefenreces>absent());
+ this(id, remoteDevice, Optional.<UserPreferences>absent());
}
private NetconfDeviceCommunicator(final RemoteDeviceId id, final RemoteDevice<NetconfSessionPreferences, NetconfMessage, NetconfDeviceCommunicator> remoteDevice,
- final Optional<UserPrefenreces> overrideNetconfCapabilities) {
+ final Optional<UserPreferences> overrideNetconfCapabilities) {
this.id = id;
this.remoteDevice = remoteDevice;
this.overrideNetconfCapabilities = overrideNetconfCapabilities;
/**
* DTO with user capabilities to override or merge with device specific capabilities
*/
-public class UserPrefenreces {
+public class UserPreferences {
private final NetconfSessionPreferences sessionPreferences;
private final boolean override;
- public UserPrefenreces(@Nonnull final NetconfSessionPreferences sessionPreferences, boolean override) {
+ public UserPreferences(@Nonnull final NetconfSessionPreferences sessionPreferences, boolean override) {
this.sessionPreferences = sessionPreferences;
this.override = override;
}
@Override
public String toString() {
- final StringBuffer sb = new StringBuffer("UserPrefenreces{");
+ final StringBuffer sb = new StringBuffer("UserPreferences{");
sb.append("sessionPreferences=").append(sessionPreferences);
sb.append(", override=").append(override);
sb.append('}');
container yang-module-capabilities {
config true;
+ leaf override {
+ type boolean;
+ default false;
+ description "Whether to override or merge this list of capabilities with capabilities from device";
+ }
+
leaf-list capability {
type string;
description "Set a list of capabilities to override capabilities provided in device's hello message.