X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=openflowplugin-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fopenflowplugin%2Fimpl%2FOpenFlowPluginProviderImpl.java;h=8ae404a4727e1659f99f0a7442d47d6a26dc1388;hb=e44519382364e5c57a679aad31756376b624a4e0;hp=7ddde034304d32e96a097f6d4db5a728021a2798;hpb=9684de318d522d418fc5f8501f6a64da9033a873;p=openflowplugin.git diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/OpenFlowPluginProviderImpl.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/OpenFlowPluginProviderImpl.java index 7ddde03430..8ae404a472 100644 --- a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/OpenFlowPluginProviderImpl.java +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/OpenFlowPluginProviderImpl.java @@ -17,6 +17,7 @@ import java.lang.management.ManagementFactory; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import javax.annotation.Nonnull; import javax.management.InstanceAlreadyExistsException; import javax.management.MBeanRegistrationException; import javax.management.MBeanServer; @@ -32,6 +33,8 @@ import org.opendaylight.openflowjava.protocol.spi.connection.SwitchConnectionPro import org.opendaylight.openflowplugin.api.openflow.OpenFlowPluginProvider; import org.opendaylight.openflowplugin.api.openflow.connection.ConnectionManager; import org.opendaylight.openflowplugin.api.openflow.device.DeviceManager; +import org.opendaylight.openflowplugin.api.openflow.lifecycle.LifecycleConductor; +import org.opendaylight.openflowplugin.api.openflow.lifecycle.RoleChangeListener; import org.opendaylight.openflowplugin.api.openflow.role.RoleManager; import org.opendaylight.openflowplugin.api.openflow.rpc.RpcManager; import org.opendaylight.openflowplugin.api.openflow.statistics.StatisticsManager; @@ -53,9 +56,6 @@ import org.opendaylight.openflowplugin.openflow.md.core.session.OFSessionUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -/** - * Created by Martin Bobak <mbobak@cisco.com> on 27.3.2015. - */ public class OpenFlowPluginProviderImpl implements OpenFlowPluginProvider, OpenFlowPluginExtensionRegistratorProvider { private static final Logger LOG = LoggerFactory.getLogger(OpenFlowPluginProviderImpl.class); @@ -63,6 +63,9 @@ public class OpenFlowPluginProviderImpl implements OpenFlowPluginProvider, OpenF private final int rpcRequestsQuota; private final long globalNotificationQuota; + private long barrierInterval; + private int barrierCountLimit; + private long echoReplyTimeout; private DeviceManager deviceManager; private RoleManager roleManager; private RpcManager rpcManager; @@ -81,10 +84,13 @@ public class OpenFlowPluginProviderImpl implements OpenFlowPluginProvider, OpenF private boolean isStatisticsPollingOff = false; private boolean isStatisticsRpcEnabled; + private final LifecycleConductor conductor; + public OpenFlowPluginProviderImpl(final long rpcRequestsQuota, final Long globalNotificationQuota) { Preconditions.checkArgument(rpcRequestsQuota > 0 && rpcRequestsQuota <= Integer.MAX_VALUE, "rpcRequestQuota has to be in range <1,%s>", Integer.MAX_VALUE); this.rpcRequestsQuota = (int) rpcRequestsQuota; this.globalNotificationQuota = Preconditions.checkNotNull(globalNotificationQuota); + conductor = new LifecycleConductorImpl(messageIntelligenceAgency); } @Override @@ -114,21 +120,39 @@ public class OpenFlowPluginProviderImpl implements OpenFlowPluginProvider, OpenF } @Override - public void onFailure(final Throwable t) { + public void onFailure(@Nonnull final Throwable t) { LOG.warn("Some switchConnectionProviders failed to start.", t); } }); } + @Override public boolean isSwitchFeaturesMandatory() { return switchFeaturesMandatory; } @Override - public void setEntityOwnershipService(EntityOwnershipService entityOwnershipService) { + public void setEntityOwnershipService(final EntityOwnershipService entityOwnershipService) { this.entityOwnershipService = entityOwnershipService; } + @Override + public void setBarrierCountLimit(final int barrierCountLimit) { + this.barrierCountLimit = barrierCountLimit; + } + + @Override + public void setBarrierInterval(final long barrierTimeoutLimit) { + this.barrierInterval = barrierTimeoutLimit; + } + + @Override + public void setEchoReplyTimeout(final long echoReplyTimeout) { + this.echoReplyTimeout = echoReplyTimeout; + } + + + @Override public void setSwitchFeaturesMandatory(final boolean switchFeaturesMandatory) { this.switchFeaturesMandatory = switchFeaturesMandatory; } @@ -164,28 +188,46 @@ public class OpenFlowPluginProviderImpl implements OpenFlowPluginProvider, OpenF // TODO: rewrite later! OFSessionUtil.getSessionManager().setExtensionConverterProvider(extensionConverterManager); - connectionManager = new ConnectionManagerImpl(); + connectionManager = new ConnectionManagerImpl(echoReplyTimeout); registerMXBean(messageIntelligenceAgency); - deviceManager = new DeviceManagerImpl(dataBroker, messageIntelligenceAgency, switchFeaturesMandatory, globalNotificationQuota); + deviceManager = new DeviceManagerImpl(dataBroker, + globalNotificationQuota, + switchFeaturesMandatory, + barrierInterval, + barrierCountLimit, + conductor); + ((ExtensionConverterProviderKeeper) conductor).setExtensionConverterProvider(extensionConverterManager); ((ExtensionConverterProviderKeeper) deviceManager).setExtensionConverterProvider(extensionConverterManager); - roleManager = new RoleManagerImpl(rpcProviderRegistry, entityOwnershipService); - statisticsManager = new StatisticsManagerImpl(rpcProviderRegistry, isStatisticsPollingOff); - rpcManager = new RpcManagerImpl(rpcProviderRegistry, rpcRequestsQuota); + conductor.setSafelyManager(deviceManager); + conductor.setNotificationPublishService(notificationPublishService); + + roleManager = new RoleManagerImpl(entityOwnershipService, dataBroker, conductor); + statisticsManager = new StatisticsManagerImpl(rpcProviderRegistry, isStatisticsPollingOff, conductor); + conductor.setSafelyManager(statisticsManager); + + rpcManager = new RpcManagerImpl(rpcProviderRegistry, rpcRequestsQuota, conductor); + conductor.setSafelyManager(rpcManager); - // CM -> DM -> Role -> SM -> RPC -> DM + roleManager.addRoleChangeListener((RoleChangeListener) conductor); + + /* Initialization Phase ordering - OFP Device Context suite */ + // CM -> DM -> SM -> RPC -> Role -> DM connectionManager.setDeviceConnectedHandler(deviceManager); - deviceManager.setDeviceInitializationPhaseHandler(roleManager); - roleManager.setDeviceInitializationPhaseHandler(statisticsManager); + deviceManager.setDeviceInitializationPhaseHandler(statisticsManager); statisticsManager.setDeviceInitializationPhaseHandler(rpcManager); - rpcManager.setDeviceInitializationPhaseHandler(deviceManager); - rpcManager.setStatisticsRpcEnabled(isStatisticsRpcEnabled); - rpcManager.setNotificationPublishService(notificationPublishService); + rpcManager.setDeviceInitializationPhaseHandler(roleManager); + roleManager.setDeviceInitializationPhaseHandler(deviceManager); - deviceManager.setNotificationService(this.notificationProviderService); - deviceManager.setNotificationPublishService(this.notificationPublishService); + /* Termination Phase ordering - OFP Device Context suite */ + deviceManager.setDeviceTerminationPhaseHandler(rpcManager); + rpcManager.setDeviceTerminationPhaseHandler(statisticsManager); + statisticsManager.setDeviceTerminationPhaseHandler(roleManager); + roleManager.setDeviceTerminationPhaseHandler(deviceManager); + + rpcManager.setStatisticsRpcEnabled(isStatisticsRpcEnabled); TranslatorLibraryUtil.setBasicTranslatorLibrary(deviceManager); deviceManager.initialize(); @@ -194,12 +236,12 @@ public class OpenFlowPluginProviderImpl implements OpenFlowPluginProvider, OpenF } private static void registerMXBean(final MessageIntelligenceAgency messageIntelligenceAgency) { - MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); + final MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); try { - String pathToMxBean = String.format("%s:type=%s", + final String pathToMxBean = String.format("%s:type=%s", MessageIntelligenceAgencyMXBean.class.getPackage().getName(), MessageIntelligenceAgencyMXBean.class.getSimpleName()); - ObjectName name = new ObjectName(pathToMxBean); + final ObjectName name = new ObjectName(pathToMxBean); mbs.registerMBean(messageIntelligenceAgency, name); } catch (MalformedObjectNameException | NotCompliantMBeanException @@ -231,9 +273,13 @@ public class OpenFlowPluginProviderImpl implements OpenFlowPluginProvider, OpenF @Override public void close() throws Exception { + //TODO: consider wrapping each manager into try-catch deviceManager.close(); rpcManager.close(); statisticsManager.close(); + + // TODO: needs to close org.opendaylight.openflowplugin.impl.role.OpenflowOwnershipListener after RoleContexts are down + // TODO: must not be executed prior to all living RoleContexts have been closed (via closing living DeviceContexts) roleManager.close(); } }