From a6801033d0b50dc8842f2d8b976ec858eca54887 Mon Sep 17 00:00:00 2001 From: Jozef Bacigal Date: Fri, 10 Jun 2016 13:38:22 +0200 Subject: [PATCH] DevManager functionality add - Moved mothods from context to manager Change-Id: Ie8abe3ec95756ff633b4b1d9a7242c251fbd93c3 Signed-off-by: Jozef Bacigal --- .../api/openflow/device/DeviceContext.java | 7 --- .../api/openflow/device/DeviceManager.java | 2 +- .../lifecycle/LifecycleConductor.java | 11 ++++ .../impl/LifecycleConductorImpl.java | 9 ++- .../impl/device/DeviceContextImpl.java | 52 ----------------- .../impl/device/DeviceManagerImpl.java | 58 ++++++++++++++++++- .../impl/device/TransactionChainManager.java | 4 +- 7 files changed, 79 insertions(+), 64 deletions(-) diff --git a/openflowplugin-api/src/main/java/org/opendaylight/openflowplugin/api/openflow/device/DeviceContext.java b/openflowplugin-api/src/main/java/org/opendaylight/openflowplugin/api/openflow/device/DeviceContext.java index 3c3454eeac..12f326d08f 100644 --- a/openflowplugin-api/src/main/java/org/opendaylight/openflowplugin/api/openflow/device/DeviceContext.java +++ b/openflowplugin-api/src/main/java/org/opendaylight/openflowplugin/api/openflow/device/DeviceContext.java @@ -106,13 +106,6 @@ public interface DeviceContext extends AutoCloseable, DeviceInfo getDeviceInfo(); - /** - * Method has to activate TransactionChainManager and prepare all Contexts from Device Contects suite - * to Taking ClusterLeadership role {@link OfpRole#BECOMEMASTER} (e.g. Routed RPC registration, StatPolling ...) - * @return DeviceInitialization furure - */ - ListenableFuture onDeviceTakeClusterLeadership(); - /** * Method has to close TxManager ASAP we are notified about Closed Connection * @return sync. future for Slave and MD-SAL completition for Master diff --git a/openflowplugin-api/src/main/java/org/opendaylight/openflowplugin/api/openflow/device/DeviceManager.java b/openflowplugin-api/src/main/java/org/opendaylight/openflowplugin/api/openflow/device/DeviceManager.java index 449ad81d2b..82ba8d6519 100644 --- a/openflowplugin-api/src/main/java/org/opendaylight/openflowplugin/api/openflow/device/DeviceManager.java +++ b/openflowplugin-api/src/main/java/org/opendaylight/openflowplugin/api/openflow/device/DeviceManager.java @@ -56,7 +56,7 @@ public interface DeviceManager extends DeviceConnectedHandler, DeviceDisconnecte * @return RoleChangeTxChainManager future for activation/deactivation */ ListenableFuture onClusterRoleChange(final DeviceInfo deviceInfo, final OfpRole role); - + } diff --git a/openflowplugin-api/src/main/java/org/opendaylight/openflowplugin/api/openflow/lifecycle/LifecycleConductor.java b/openflowplugin-api/src/main/java/org/opendaylight/openflowplugin/api/openflow/lifecycle/LifecycleConductor.java index d544c2c791..8ef3b02206 100644 --- a/openflowplugin-api/src/main/java/org/opendaylight/openflowplugin/api/openflow/lifecycle/LifecycleConductor.java +++ b/openflowplugin-api/src/main/java/org/opendaylight/openflowplugin/api/openflow/lifecycle/LifecycleConductor.java @@ -12,9 +12,11 @@ import io.netty.util.Timeout; import io.netty.util.TimerTask; import org.opendaylight.controller.md.sal.binding.api.NotificationPublishService; import org.opendaylight.openflowplugin.api.openflow.OFPManager; +import org.opendaylight.openflowplugin.api.openflow.connection.ConnectionContext; import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext; import org.opendaylight.openflowplugin.api.openflow.device.DeviceInfo; import org.opendaylight.openflowplugin.api.openflow.device.DeviceManager; +import org.opendaylight.openflowplugin.api.openflow.statistics.StatisticsContext; import org.opendaylight.openflowplugin.api.openflow.statistics.StatisticsManager; import org.opendaylight.openflowplugin.api.openflow.statistics.ofpspecific.MessageIntelligenceAgency; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId; @@ -49,6 +51,13 @@ public interface LifecycleConductor { */ void addOneTimeListenerWhenServicesChangesDone(final ServiceChangeListener manager, final DeviceInfo deviceInfo); + /** + * Returns statistics context from statistics managers contexts maps + * + * @param deviceInfo@return null if context doesn't exists + */ + StatisticsContext getStatisticsContext(DeviceInfo deviceInfo); + /** * Set new timeout for {@link io.netty.util.HashedWheelTimer} * @param task timer task @@ -70,6 +79,8 @@ public interface LifecycleConductor { */ void closeConnection(final DeviceInfo deviceInfo); + ConnectionContext.CONNECTION_STATE gainConnectionStateSafely(DeviceInfo deviceInfo); + /** * Xid from outboundqueue * @param deviceInfo diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/LifecycleConductorImpl.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/LifecycleConductorImpl.java index 87bc0e0a88..d2ffa852f5 100644 --- a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/LifecycleConductorImpl.java +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/LifecycleConductorImpl.java @@ -35,6 +35,7 @@ import org.opendaylight.openflowplugin.api.openflow.lifecycle.RoleChangeListener import org.opendaylight.openflowplugin.api.openflow.lifecycle.ServiceChangeListener; import org.opendaylight.openflowplugin.api.openflow.rpc.RpcContext; import org.opendaylight.openflowplugin.api.openflow.rpc.RpcManager; +import org.opendaylight.openflowplugin.api.openflow.statistics.StatisticsContext; import org.opendaylight.openflowplugin.api.openflow.statistics.StatisticsManager; import org.opendaylight.openflowplugin.api.openflow.statistics.ofpspecific.MessageIntelligenceAgency; import org.opendaylight.openflowplugin.impl.util.MdSalRegistrationUtils; @@ -190,11 +191,17 @@ final class LifecycleConductorImpl implements LifecycleConductor, RoleChangeList return deviceManager.gainContext(deviceInfo); } + @Override + public StatisticsContext getStatisticsContext(DeviceInfo deviceInfo){ + return statisticsManager.gainContext(deviceInfo); + } + public Timeout newTimeout(@Nonnull TimerTask task, long delay, @Nonnull TimeUnit unit) { return hashedWheelTimer.newTimeout(task, delay, unit); } - ConnectionContext.CONNECTION_STATE gainConnectionStateSafely(final DeviceInfo deviceInfo){ + @Override + public ConnectionContext.CONNECTION_STATE gainConnectionStateSafely(final DeviceInfo deviceInfo){ return (null != getDeviceContext(deviceInfo)) ? getDeviceContext(deviceInfo).getPrimaryConnectionContext().getConnectionState() : null; } diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/device/DeviceContextImpl.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/device/DeviceContextImpl.java index 9fed879080..e5691c0ff3 100644 --- a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/device/DeviceContextImpl.java +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/device/DeviceContextImpl.java @@ -237,58 +237,6 @@ public class DeviceContextImpl implements DeviceContext, ExtensionConverterProvi return dataBroker.newReadOnlyTransaction(); } - @Override - public ListenableFuture onDeviceTakeClusterLeadership() { - LOG.trace("onDeviceTakeClusterLeadership for node: {}", deviceInfo.getNodeId()); - /* validation */ - if (statisticsContext == null) { - final String errMsg = String.format("DeviceCtx %s is up but we are missing StatisticsContext", deviceInfo.getDatapathId()); - LOG.warn(errMsg); - return Futures.immediateFailedFuture(new IllegalStateException(errMsg)); - } - - /* Prepare init info collecting */ - getDeviceState().setDeviceSynchronized(false); - transactionChainManager.activateTransactionManager(); - /* Init Collecting NodeInfo */ - final ListenableFuture initCollectingDeviceInfo = DeviceInitializationUtils.initializeNodeInformation( - DeviceContextImpl.this, switchFeaturesMandatory); - /* Init Collecting StatInfo */ - final ListenableFuture statPollFuture = Futures.transform(initCollectingDeviceInfo, - new AsyncFunction() { - - @Override - public ListenableFuture apply(@Nonnull final Void input) throws Exception { - getStatisticsContext().statListForCollectingInitialization(); - return getStatisticsContext().gatherDynamicData(); - } - }); - - return Futures.transform(statPollFuture, new Function() { - - @Override - public Void apply(final Boolean input) { - if (ConnectionContext.CONNECTION_STATE.RIP.equals(getPrimaryConnectionContext().getConnectionState())) { - final String errMsg = String.format("We lost connection for Device %s, context has to be closed.", - getDeviceInfo().getNodeId()); - LOG.warn(errMsg); - throw new IllegalStateException(errMsg); - } - if (!input) { - final String errMsg = String.format("Get Initial Device %s information fails", - getDeviceInfo().getNodeId()); - LOG.warn(errMsg); - throw new IllegalStateException(errMsg); - } - LOG.debug("Get Initial Device {} information is successful", deviceInfo.getNodeId()); - getDeviceState().setDeviceSynchronized(true); - initialSubmitTransaction(); - getDeviceState().setStatisticsPollingEnabledProp(true); - return null; - } - }); - } - @Override public void writeToTransaction(final LogicalDatastoreType store, final InstanceIdentifier path, final T data) throws Exception { diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/device/DeviceManagerImpl.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/device/DeviceManagerImpl.java index 51b4b7c9eb..d9a970e23a 100644 --- a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/device/DeviceManagerImpl.java +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/device/DeviceManagerImpl.java @@ -8,9 +8,11 @@ package org.opendaylight.openflowplugin.impl.device; import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Function; import com.google.common.base.Preconditions; import com.google.common.base.Verify; import com.google.common.collect.Iterators; +import com.google.common.util.concurrent.AsyncFunction; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; @@ -40,10 +42,12 @@ import org.opendaylight.openflowplugin.api.openflow.device.TranslatorLibrary; import org.opendaylight.openflowplugin.api.openflow.device.handlers.DeviceInitializationPhaseHandler; import org.opendaylight.openflowplugin.api.openflow.device.handlers.DeviceTerminationPhaseHandler; import org.opendaylight.openflowplugin.api.openflow.lifecycle.LifecycleConductor; +import org.opendaylight.openflowplugin.api.openflow.statistics.StatisticsContext; import org.opendaylight.openflowplugin.extension.api.ExtensionConverterProviderKeeper; import org.opendaylight.openflowplugin.extension.api.core.extension.ExtensionConverterProvider; import org.opendaylight.openflowplugin.impl.connection.OutboundQueueProviderImpl; import org.opendaylight.openflowplugin.impl.device.listener.OpenflowProtocolListenerFullImpl; +import org.opendaylight.openflowplugin.impl.util.DeviceInitializationUtils; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodesBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node; @@ -310,9 +314,61 @@ public class DeviceManagerImpl implements DeviceManager, ExtensionConverterProvi DeviceContext deviceContext = conductor.getDeviceContext(deviceInfo); LOG.trace("onClusterRoleChange {} for node:", role, deviceInfo.getNodeId()); if (OfpRole.BECOMEMASTER.equals(role)) { - return deviceContext.onDeviceTakeClusterLeadership(); + return onDeviceTakeClusterLeadership(deviceInfo); } return ((DeviceContextImpl)deviceContext).getTransactionChainManager().deactivateTransactionManager(); } + private ListenableFuture onDeviceTakeClusterLeadership(final DeviceInfo deviceInfo) { + LOG.trace("onDeviceTakeClusterLeadership for node: {}", deviceInfo.getNodeId()); + /* validation */ + StatisticsContext statisticsContext = conductor.getStatisticsContext(deviceInfo); + if (statisticsContext == null) { + final String errMsg = String.format("DeviceCtx %s is up but we are missing StatisticsContext", deviceInfo.getDatapathId()); + LOG.warn(errMsg); + return Futures.immediateFailedFuture(new IllegalStateException(errMsg)); + } + DeviceContext deviceContext = conductor.getDeviceContext(deviceInfo); + /* Prepare init info collecting */ + deviceContext.getDeviceState().setDeviceSynchronized(false); + ((DeviceContextImpl)deviceContext).getTransactionChainManager().activateTransactionManager(); + /* Init Collecting NodeInfo */ + final ListenableFuture initCollectingDeviceInfo = DeviceInitializationUtils.initializeNodeInformation( + deviceContext, switchFeaturesMandatory); + /* Init Collecting StatInfo */ + final ListenableFuture statPollFuture = Futures.transform(initCollectingDeviceInfo, + new AsyncFunction() { + + @Override + public ListenableFuture apply(@Nonnull final Void input) throws Exception { + statisticsContext.statListForCollectingInitialization(); + return statisticsContext.gatherDynamicData(); + } + }); + + return Futures.transform(statPollFuture, new Function() { + + @Override + public Void apply(final Boolean input) { + if (ConnectionContext.CONNECTION_STATE.RIP.equals(conductor.gainConnectionStateSafely(deviceInfo))) { + final String errMsg = String.format("We lost connection for Device %s, context has to be closed.", + deviceInfo.getNodeId()); + LOG.warn(errMsg); + throw new IllegalStateException(errMsg); + } + if (!input) { + final String errMsg = String.format("Get Initial Device %s information fails", + deviceInfo.getNodeId()); + LOG.warn(errMsg); + throw new IllegalStateException(errMsg); + } + LOG.debug("Get Initial Device {} information is successful", deviceInfo.getNodeId()); + deviceContext.getDeviceState().setDeviceSynchronized(true); + ((DeviceContextImpl)deviceContext).getTransactionChainManager().initialSubmitWriteTransaction(); + deviceContext.getDeviceState().setStatisticsPollingEnabledProp(true); + return null; + } + }); + } + } diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/device/TransactionChainManager.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/device/TransactionChainManager.java index 99f7fd31de..b782688d02 100644 --- a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/device/TransactionChainManager.java +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/device/TransactionChainManager.java @@ -111,7 +111,7 @@ class TransactionChainManager implements TransactionChainListener, AutoCloseable * registration for this class instance as {@link TransactionChainListener} to provide possibility a make DS * transactions. Call this method for MASTER role only. */ - public void activateTransactionManager() { + void activateTransactionManager() { LOG.trace("activateTransactionManager for node {} transaction submit is set to {}", nodeId(), submitIsEnabled); synchronized (txLock) { if (TransactionChainManagerStatus.SLEEPING.equals(transactionChainManagerStatus)) { @@ -134,7 +134,7 @@ class TransactionChainManager implements TransactionChainListener, AutoCloseable * Call this method for SLAVE only. * @return Future */ - public ListenableFuture deactivateTransactionManager() { + ListenableFuture deactivateTransactionManager() { final ListenableFuture future; synchronized (txLock) { if (TransactionChainManagerStatus.WORKING.equals(transactionChainManagerStatus)) { -- 2.36.6