Make mdsal datastore persist through different sessions 05/34905/3
authorTomas Cere <tcere@cisco.com>
Thu, 18 Feb 2016 14:05:26 +0000 (15:05 +0100)
committerGerrit Code Review <gerrit@opendaylight.org>
Thu, 25 Feb 2016 10:01:07 +0000 (10:01 +0000)
Each device needs cached set of datastore operations.

Port of:
https://git.opendaylight.org/gerrit/#/c/31708/

Change-Id: I713a5d4bc406eebcaecadc90d219a439b9526385
Signed-off-by: Tomas Cere <tcere@cisco.com>
opendaylight/netconf/netconf-impl/src/main/java/org/opendaylight/controller/netconf/impl/NetconfServerSessionNegotiatorFactory.java
opendaylight/netconf/netconf-testtool/src/main/java/org/opendaylight/controller/netconf/test/tool/MdsalOperationProvider.java
opendaylight/netconf/netconf-testtool/src/main/java/org/opendaylight/controller/netconf/test/tool/NetconfDeviceSimulator.java
opendaylight/netconf/netconf-testtool/src/main/java/org/opendaylight/controller/netconf/test/tool/TesttoolNegotiationFactory.java [new file with mode: 0644]

index d010b5cefc0c20c364a5ad255c6aec0fbede7dce..7b1bf02785bc759685110eb7a6ea216a421a6847 100644 (file)
@@ -14,6 +14,7 @@ import com.google.common.collect.Sets;
 import io.netty.channel.Channel;
 import io.netty.util.Timer;
 import io.netty.util.concurrent.Promise;
+import java.net.SocketAddress;
 import java.util.Set;
 import org.opendaylight.controller.netconf.api.NetconfDocumentedException;
 import org.opendaylight.controller.netconf.api.NetconfServerSessionPreferences;
@@ -108,18 +109,25 @@ public class NetconfServerSessionNegotiatorFactory implements SessionNegotiatorF
         }
 
         return new NetconfServerSessionNegotiator(proposal, promise, channel, timer,
-                getListener(Long.toString(sessionId)), connectionTimeoutMillis);
+                getListener(Long.toString(sessionId), channel.localAddress()), connectionTimeoutMillis);
     }
 
-    private NetconfServerSessionListener getListener(final String netconfSessionIdForReporting) {
-        final NetconfOperationService service =
-                this.aggregatedOpService.createService(netconfSessionIdForReporting);
+    private NetconfServerSessionListener getListener(final String netconfSessionIdForReporting, final SocketAddress socketAddress) {
+        final NetconfOperationService service = getOperationServiceForAddress(netconfSessionIdForReporting, socketAddress);
         final NetconfOperationRouter operationRouter =
                 new NetconfOperationRouterImpl(service, commitNotificationProducer, monitoringService, netconfSessionIdForReporting);
         return new NetconfServerSessionListener(operationRouter, monitoringService, service);
 
     }
 
+    protected NetconfOperationService getOperationServiceForAddress(final String netconfSessionIdForReporting, final SocketAddress socketAddress) {
+        return this.aggregatedOpService.createService(netconfSessionIdForReporting);
+    }
+
+    protected final NetconfOperationServiceFactory getOperationServiceFactory() {
+        return aggregatedOpService;
+    }
+
     private NetconfHelloMessage createHelloMessage(final long sessionId, final NetconfMonitoringService capabilityProvider) throws NetconfDocumentedException {
         return NetconfHelloMessage.createServerHello(Sets.union(DefaultCommit.transformCapabilities(capabilityProvider.getCapabilities()), baseCapabilities), sessionId);
     }
index b487495ee658e47ac0c4f1f1cbdd90fc7566678b..408b04e21bea49b5f02f2c2b7a0c53289884837c 100644 (file)
@@ -65,14 +65,13 @@ class MdsalOperationProvider implements NetconfOperationServiceFactory {
             .getLogger(MdsalOperationProvider.class);
 
     private final Set<Capability> caps;
-    private final MdsalOperationService mdsalOperationService;
+    private final SchemaContext schemaContext;
 
     public MdsalOperationProvider(final SessionIdProvider idProvider,
                                   final Set<Capability> caps,
                                   final SchemaContext schemaContext) {
         this.caps = caps;
-        mdsalOperationService = new MdsalOperationService(
-                idProvider.getCurrentSessionId(), schemaContext, caps);
+        this.schemaContext = schemaContext;
     }
 
     @Override
@@ -93,13 +92,15 @@ class MdsalOperationProvider implements NetconfOperationServiceFactory {
 
     @Override
     public NetconfOperationService createService(String netconfSessionIdForReporting) {
-        return mdsalOperationService;
+        return new MdsalOperationService(Long.parseLong(netconfSessionIdForReporting), schemaContext, caps);
     }
 
     static class MdsalOperationService implements NetconfOperationService {
         private final long currentSessionId;
         private final SchemaContext schemaContext;
         private final Set<Capability> caps;
+        private final SchemaService schemaService;
+        private final DOMDataBroker dataBroker;
 
         public MdsalOperationService(final long currentSessionId,
                                      final SchemaContext schemaContext,
@@ -107,14 +108,15 @@ class MdsalOperationProvider implements NetconfOperationServiceFactory {
             this.currentSessionId = currentSessionId;
             this.schemaContext = schemaContext;
             this.caps = caps;
+            this.schemaService = createSchemaService();
+
+            this.dataBroker = createDataStore(schemaService);
+
         }
 
         @Override
         public Set<NetconfOperation> getNetconfOperations() {
-            final SchemaService schemaService = createSchemaService();
-
-            final DOMDataBroker db = createDataStore(schemaService);
-            TransactionProvider transactionProvider = new TransactionProvider(db, String.valueOf(currentSessionId));
+            TransactionProvider transactionProvider = new TransactionProvider(dataBroker, String.valueOf(currentSessionId));
             CurrentSchemaContext currentSchemaContext = new CurrentSchemaContext(schemaService);
 
             ContainerNode netconf = createNetconfState();
@@ -122,7 +124,7 @@ class MdsalOperationProvider implements NetconfOperationServiceFactory {
             YangInstanceIdentifier yangInstanceIdentifier = YangInstanceIdentifier.builder().node(NetconfState.QNAME)
                     .build();
 
-            final DOMDataWriteTransaction tx = db.newWriteOnlyTransaction();
+            final DOMDataWriteTransaction tx = dataBroker.newWriteOnlyTransaction();
             tx.put(LogicalDatastoreType.OPERATIONAL, yangInstanceIdentifier, netconf);
 
             try {
index a833aab9c66ba29272ff8028d971fc0c42ada427..df886ecc5ea9477308ed34b3d2ea82b44f033047 100644 (file)
@@ -151,7 +151,7 @@ public class NetconfDeviceSimulator implements Closeable {
                 ? NetconfServerSessionNegotiatorFactory.DEFAULT_BASE_CAPABILITIES
                 : Sets.newHashSet(XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_BASE_1_0, XmlNetconfConstants.URN_IETF_PARAMS_NETCONF_BASE_1_1);
 
-        final NetconfServerSessionNegotiatorFactory serverNegotiatorFactory = new NetconfServerSessionNegotiatorFactory(
+        final NetconfServerSessionNegotiatorFactory serverNegotiatorFactory = new TesttoolNegotiationFactory(
                 hashedWheelTimer, aggregatedNetconfOperationServiceFactory, idProvider, generateConfigsTimeout, commitNotifier, monitoringService1, serverCapabilities);
 
         final NetconfServerDispatcherImpl.ServerChannelInitializer serverChannelInitializer = new NetconfServerDispatcherImpl.ServerChannelInitializer(
diff --git a/opendaylight/netconf/netconf-testtool/src/main/java/org/opendaylight/controller/netconf/test/tool/TesttoolNegotiationFactory.java b/opendaylight/netconf/netconf-testtool/src/main/java/org/opendaylight/controller/netconf/test/tool/TesttoolNegotiationFactory.java
new file mode 100644 (file)
index 0000000..7fb1cd3
--- /dev/null
@@ -0,0 +1,42 @@
+package org.opendaylight.controller.netconf.test.tool;
+
+import io.netty.util.Timer;
+import java.net.SocketAddress;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import org.opendaylight.controller.netconf.api.monitoring.NetconfMonitoringService;
+import org.opendaylight.controller.netconf.impl.CommitNotifier;
+import org.opendaylight.controller.netconf.impl.NetconfServerSessionNegotiatorFactory;
+import org.opendaylight.controller.netconf.impl.SessionIdProvider;
+import org.opendaylight.controller.netconf.mapping.api.NetconfOperationService;
+import org.opendaylight.controller.netconf.mapping.api.NetconfOperationServiceFactory;
+
+public class TesttoolNegotiationFactory extends NetconfServerSessionNegotiatorFactory {
+
+    private final Map<SocketAddress, NetconfOperationService> cachedOperationServices = new HashMap<>();
+
+    public TesttoolNegotiationFactory(final Timer timer, final NetconfOperationServiceFactory netconfOperationProvider,
+                                      final SessionIdProvider idProvider, final long connectionTimeoutMillis,
+                                      final CommitNotifier commitNotifier, final NetconfMonitoringService monitoringService) {
+        super(timer, netconfOperationProvider, idProvider, connectionTimeoutMillis, commitNotifier, monitoringService);
+    }
+
+    public TesttoolNegotiationFactory(final Timer timer, final NetconfOperationServiceFactory netconfOperationProvider,
+                                      final SessionIdProvider idProvider, final long connectionTimeoutMillis,
+                                      final CommitNotifier commitNotifier, final NetconfMonitoringService monitoringService,
+                                      final Set<String> baseCapabilities) {
+        super(timer, netconfOperationProvider, idProvider, connectionTimeoutMillis, commitNotifier, monitoringService, baseCapabilities);
+    }
+
+    @Override
+    protected NetconfOperationService getOperationServiceForAddress(final String netconfSessionIdForReporting, final SocketAddress socketAddress) {
+        if (cachedOperationServices.containsKey(socketAddress)) {
+            return cachedOperationServices.get(socketAddress);
+        } else {
+            final NetconfOperationService service = getOperationServiceFactory().createService(netconfSessionIdForReporting);
+            cachedOperationServices.put(socketAddress, service);
+            return service;
+        }
+    }
+}