X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=openflowplugin-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fopenflowplugin%2Fimpl%2Fdevice%2FDeviceManagerImpl.java;h=3d076300a96f4046488acc0127dc0c6eb071156a;hb=d8cc382a8dbdcb7c89b68457b3ae0b6d576ee28f;hp=51b4b7c9ebf49de75b1ba9e10492527541e6b133;hpb=5b61d4acd91dd0c1c97964b3768ccbf2ee85c70f;p=openflowplugin.git 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..3d076300a9 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 @@ -27,6 +27,7 @@ import javax.annotation.Nonnull; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; +import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider; import org.opendaylight.openflowjava.protocol.api.connection.ConnectionAdapter; import org.opendaylight.openflowjava.protocol.api.connection.OutboundQueueHandlerRegistration; import org.opendaylight.openflowplugin.api.openflow.OFPContext; @@ -35,19 +36,21 @@ import org.opendaylight.openflowplugin.api.openflow.connection.OutboundQueueProv 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.device.DeviceState; 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.lifecycle.LifecycleService; 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.lifecycle.LifecycleServiceImpl; +import org.opendaylight.openflowplugin.impl.util.DeviceInitializationUtils; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor; 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; -import org.opendaylight.yang.gen.v1.urn.opendaylight.role.service.rev150727.OfpRole; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -61,30 +64,41 @@ public class DeviceManagerImpl implements DeviceManager, ExtensionConverterProvi private final long globalNotificationQuota; private final boolean switchFeaturesMandatory; + private boolean isNotificationFlowRemovedOff; - private final int spyRate = 10; + private static final int SPY_RATE = 10; private final DataBroker dataBroker; + private final ConvertorExecutor convertorExecutor; private TranslatorLibrary translatorLibrary; private DeviceInitializationPhaseHandler deviceInitPhaseHandler; private DeviceTerminationPhaseHandler deviceTerminPhaseHandler; private final ConcurrentMap deviceContexts = new ConcurrentHashMap<>(); + private final ConcurrentMap lifecycleServices = new ConcurrentHashMap<>(); private final long barrierIntervalNanos; private final int barrierCountLimit; private ExtensionConverterProvider extensionConverterProvider; private ScheduledThreadPoolExecutor spyPool; + private final ClusterSingletonServiceProvider singletonServiceProvider; private final LifecycleConductor conductor; public DeviceManagerImpl(@Nonnull final DataBroker dataBroker, - final long globalNotificationQuota, final boolean switchFeaturesMandatory, - final long barrierInterval, final int barrierCountLimit, - final LifecycleConductor lifecycleConductor) { + final long globalNotificationQuota, + final boolean switchFeaturesMandatory, + final long barrierInterval, + final int barrierCountLimit, + final LifecycleConductor lifecycleConductor, + boolean isNotificationFlowRemovedOff, + final ConvertorExecutor convertorExecutor, + final ClusterSingletonServiceProvider singletonServiceProvider) { this.switchFeaturesMandatory = switchFeaturesMandatory; this.globalNotificationQuota = globalNotificationQuota; + this.isNotificationFlowRemovedOff = isNotificationFlowRemovedOff; this.dataBroker = Preconditions.checkNotNull(dataBroker); + this.convertorExecutor = convertorExecutor; /* merge empty nodes to oper DS to predict any problems with missing parent for Node */ final WriteTransaction tx = dataBroker.newWriteOnlyTransaction(); @@ -103,6 +117,7 @@ public class DeviceManagerImpl implements DeviceManager, ExtensionConverterProvi this.conductor = lifecycleConductor; spyPool = new ScheduledThreadPoolExecutor(1); + this.singletonServiceProvider = singletonServiceProvider; } @@ -112,12 +127,12 @@ public class DeviceManagerImpl implements DeviceManager, ExtensionConverterProvi } @Override - public void onDeviceContextLevelUp(@CheckForNull DeviceInfo deviceInfo) throws Exception { + public void onDeviceContextLevelUp(@CheckForNull DeviceInfo deviceInfo, final LifecycleService lifecycleService) throws Exception { // final phase - we have to add new Device to MD-SAL DataStore LOG.debug("Final phase of DeviceContextLevelUp for Node: {} ", deviceInfo.getNodeId()); DeviceContext deviceContext = Preconditions.checkNotNull(deviceContexts.get(deviceInfo)); - ((DeviceContextImpl) deviceContext).initialSubmitTransaction(); deviceContext.onPublished(); + lifecycleService.registerService(this.singletonServiceProvider); } @Override @@ -125,7 +140,7 @@ public class DeviceManagerImpl implements DeviceManager, ExtensionConverterProvi Preconditions.checkArgument(connectionContext != null); DeviceInfo deviceInfo = connectionContext.getDeviceInfo(); - /** + /* * This part prevent destroy another device context. Throwing here an exception result to propagate close connection * in {@link org.opendaylight.openflowplugin.impl.connection.org.opendaylight.openflowplugin.impl.connection.HandshakeContextImpl} * If context already exist we are in state closing process (connection flapping) and we should not propagate connection close @@ -146,24 +161,28 @@ public class DeviceManagerImpl implements DeviceManager, ExtensionConverterProvi //FIXME: as soon as auxiliary connection are fully supported then this is needed only before device context published connectionAdapter.setPacketInFiltering(true); - final Short version = connectionContext.getFeatures().getVersion(); - final OutboundQueueProvider outboundQueueProvider = new OutboundQueueProviderImpl(version); + final OutboundQueueProvider outboundQueueProvider = new OutboundQueueProviderImpl(deviceInfo.getVersion()); connectionContext.setOutboundQueueProvider(outboundQueueProvider); final OutboundQueueHandlerRegistration outboundQueueHandlerRegistration = connectionAdapter.registerOutboundQueueHandler(outboundQueueProvider, barrierCountLimit, barrierIntervalNanos); connectionContext.setOutboundQueueHandleRegistration(outboundQueueHandlerRegistration); - final DeviceState deviceState = new DeviceStateImpl(); final DeviceContext deviceContext = new DeviceContextImpl(connectionContext, - deviceState, dataBroker, conductor, outboundQueueProvider, translatorLibrary, - switchFeaturesMandatory); + this, + convertorExecutor); + + final LifecycleService lifecycleService = new LifecycleServiceImpl(); + lifecycleService.setDeviceContext(deviceContext); Verify.verify(deviceContexts.putIfAbsent(deviceInfo, deviceContext) == null, "DeviceCtx still not closed."); + lifecycleServices.putIfAbsent(deviceInfo, lifecycleService); + + deviceContext.setSwitchFeaturesMandatory(switchFeaturesMandatory); ((ExtensionConverterProviderKeeper) deviceContext).setExtensionConverterProvider(extensionConverterProvider); deviceContext.setNotificationPublishService(conductor.getNotificationPublishService()); @@ -172,11 +191,9 @@ public class DeviceManagerImpl implements DeviceManager, ExtensionConverterProvi final OpenflowProtocolListenerFullImpl messageListener = new OpenflowProtocolListenerFullImpl( connectionAdapter, deviceContext); - connectionAdapter.setMessageListener(messageListener); - deviceState.setValid(true); - - deviceInitPhaseHandler.onDeviceContextLevelUp(connectionContext.getDeviceInfo()); + connectionAdapter.setMessageListener(messageListener); + deviceInitPhaseHandler.onDeviceContextLevelUp(connectionContext.getDeviceInfo(), lifecycleService); return true; } @@ -226,16 +243,17 @@ public class DeviceManagerImpl implements DeviceManager, ExtensionConverterProvi LOG.debug("onDeviceContextClosed for Node {}", deviceInfo.getNodeId()); deviceContexts.remove(deviceInfo); updatePacketInRateLimiters(); + LifecycleService lifecycleService = lifecycleServices.remove(deviceInfo); + try { + lifecycleService.close(); + } catch (Exception e) { + LOG.warn("Closing service for node {} was unsuccessful ", deviceInfo.getNodeId().getValue(), e); + } } @Override public void initialize() { - spyPool.scheduleAtFixedRate(conductor.getMessageIntelligenceAgency(), spyRate, spyRate, TimeUnit.SECONDS); - } - - @Override - public DeviceContext getDeviceContextFromNodeId(DeviceInfo deviceInfo) { - return deviceContexts.get(deviceInfo); + spyPool.scheduleAtFixedRate(conductor.getMessageIntelligenceAgency(), SPY_RATE, SPY_RATE, TimeUnit.SECONDS); } @Override @@ -306,13 +324,13 @@ public class DeviceManagerImpl implements DeviceManager, ExtensionConverterProvi } @Override - public ListenableFuture onClusterRoleChange(final DeviceInfo deviceInfo, final OfpRole role) { - DeviceContext deviceContext = conductor.getDeviceContext(deviceInfo); - LOG.trace("onClusterRoleChange {} for node:", role, deviceInfo.getNodeId()); - if (OfpRole.BECOMEMASTER.equals(role)) { - return deviceContext.onDeviceTakeClusterLeadership(); - } - return ((DeviceContextImpl)deviceContext).getTransactionChainManager().deactivateTransactionManager(); + public void setIsNotificationFlowRemovedOff(boolean isNotificationFlowRemovedOff) { + this.isNotificationFlowRemovedOff = isNotificationFlowRemovedOff; + } + + @Override + public boolean getIsNotificationFlowRemovedOff() { + return this.isNotificationFlowRemovedOff; } }