From 2b36163a294c86777acaa84712e98dd163438fa4 Mon Sep 17 00:00:00 2001 From: Tomas Cere Date: Thu, 18 Feb 2016 15:05:26 +0100 Subject: [PATCH] Make mdsal datastore persist through different sessions 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 --- ...NetconfServerSessionNegotiatorFactory.java | 16 +++++-- .../test/tool/MdsalOperationProvider.java | 20 +++++---- .../test/tool/NetconfDeviceSimulator.java | 2 +- .../test/tool/TesttoolNegotiationFactory.java | 42 +++++++++++++++++++ 4 files changed, 66 insertions(+), 14 deletions(-) create mode 100644 opendaylight/netconf/netconf-testtool/src/main/java/org/opendaylight/controller/netconf/test/tool/TesttoolNegotiationFactory.java diff --git a/opendaylight/netconf/netconf-impl/src/main/java/org/opendaylight/controller/netconf/impl/NetconfServerSessionNegotiatorFactory.java b/opendaylight/netconf/netconf-impl/src/main/java/org/opendaylight/controller/netconf/impl/NetconfServerSessionNegotiatorFactory.java index d010b5cefc..7b1bf02785 100644 --- a/opendaylight/netconf/netconf-impl/src/main/java/org/opendaylight/controller/netconf/impl/NetconfServerSessionNegotiatorFactory.java +++ b/opendaylight/netconf/netconf-impl/src/main/java/org/opendaylight/controller/netconf/impl/NetconfServerSessionNegotiatorFactory.java @@ -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); } diff --git a/opendaylight/netconf/netconf-testtool/src/main/java/org/opendaylight/controller/netconf/test/tool/MdsalOperationProvider.java b/opendaylight/netconf/netconf-testtool/src/main/java/org/opendaylight/controller/netconf/test/tool/MdsalOperationProvider.java index b487495ee6..408b04e21b 100644 --- a/opendaylight/netconf/netconf-testtool/src/main/java/org/opendaylight/controller/netconf/test/tool/MdsalOperationProvider.java +++ b/opendaylight/netconf/netconf-testtool/src/main/java/org/opendaylight/controller/netconf/test/tool/MdsalOperationProvider.java @@ -65,14 +65,13 @@ class MdsalOperationProvider implements NetconfOperationServiceFactory { .getLogger(MdsalOperationProvider.class); private final Set caps; - private final MdsalOperationService mdsalOperationService; + private final SchemaContext schemaContext; public MdsalOperationProvider(final SessionIdProvider idProvider, final Set 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 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 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 { diff --git a/opendaylight/netconf/netconf-testtool/src/main/java/org/opendaylight/controller/netconf/test/tool/NetconfDeviceSimulator.java b/opendaylight/netconf/netconf-testtool/src/main/java/org/opendaylight/controller/netconf/test/tool/NetconfDeviceSimulator.java index a833aab9c6..df886ecc5e 100644 --- a/opendaylight/netconf/netconf-testtool/src/main/java/org/opendaylight/controller/netconf/test/tool/NetconfDeviceSimulator.java +++ b/opendaylight/netconf/netconf-testtool/src/main/java/org/opendaylight/controller/netconf/test/tool/NetconfDeviceSimulator.java @@ -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 index 0000000000..7fb1cd36e0 --- /dev/null +++ b/opendaylight/netconf/netconf-testtool/src/main/java/org/opendaylight/controller/netconf/test/tool/TesttoolNegotiationFactory.java @@ -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 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 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; + } + } +} -- 2.36.6