BUG 5269: Allow capability override in topology 67/34667/1
authorTomas Cere <tcere@cisco.com>
Mon, 15 Feb 2016 13:06:29 +0000 (14:06 +0100)
committerTomas Cere <tcere@cisco.com>
Mon, 15 Feb 2016 13:06:29 +0000 (14:06 +0100)
Previous patch was for cfg subsystem configuration only,
this adds the ability to override devices capabilites
to netconf connectors configured through topology.

Also fix typo in UserPreferences.

Change-Id: Icea2ab162424e4490c7c33be16f4ab14cc4ae1ab
Signed-off-by: Tomas Cere <tcere@cisco.com>
opendaylight/netconf/netconf-topology/src/main/java/org/opendaylight/netconf/topology/AbstractNetconfTopology.java
opendaylight/netconf/sal-netconf-connector/src/main/java/org/opendaylight/controller/config/yang/md/sal/connector/netconf/NetconfConnectorModule.java
opendaylight/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/listener/NetconfDeviceCommunicator.java
opendaylight/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/listener/UserPreferences.java [moved from opendaylight/netconf/sal-netconf-connector/src/main/java/org/opendaylight/netconf/sal/connect/netconf/listener/UserPrefenreces.java with 87% similarity]
opendaylight/netconf/sal-netconf-connector/src/main/yang/netconf-node-topology.yang

index a72a702c3a3fa7b948cacb22e09faf15ee9e3506..488b680ab53f048959fa82bed67e5967295cf04c 100644 (file)
@@ -8,6 +8,7 @@
 
 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;
@@ -20,6 +21,7 @@ import java.net.InetSocketAddress;
 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;
@@ -44,6 +46,7 @@ import org.opendaylight.netconf.sal.connect.netconf.NetconfStateSchemas;
 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;
@@ -284,7 +287,14 @@ public abstract class AbstractNetconfTopology implements NetconfTopology, Bindin
         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) {
@@ -444,6 +454,24 @@ public abstract class AbstractNetconfTopology implements NetconfTopology, Bindin
         }
     }
 
+    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;
index bf834c3d8ecfca1cee6ccef5e221f2538151e13e..785be9954d3e038b3f2cb7655180584a2b88c564 100644 (file)
@@ -38,7 +38,7 @@ import org.opendaylight.netconf.sal.connect.netconf.NetconfDevice;
 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;
@@ -245,7 +245,7 @@ public final class NetconfConnectorModule extends org.opendaylight.controller.co
 
         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()) {
index 3b82aa6d8e95fee8ed007e8ac2d56b5fa0840aa8..276ccd6b2b6ad97fa4ba1b26e919d047c524a2f6 100644 (file)
@@ -49,7 +49,7 @@ public class NetconfDeviceCommunicator implements NetconfClientSessionListener,
     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();
 
@@ -61,17 +61,17 @@ public class NetconfDeviceCommunicator implements NetconfClientSessionListener,
     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;
@@ -12,12 +12,12 @@ import javax.annotation.Nonnull;
 /**
  * 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;
     }
@@ -32,7 +32,7 @@ public class UserPrefenreces {
 
     @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('}');
index bc0983dea1b9a862bc4965f19ddc9fc585c82d8b..141ff813b9446d995c0e4ee9ee03257dde9cf4cc 100644 (file)
@@ -48,6 +48,12 @@ module netconf-node-topology {
 
         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.