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=55485fa2e032c9101ff3ea627ed0fcf3435bf892;hb=c8b9c6dfd421a3cf4a40295b21f59384924fd8c2;hp=48f9104aa2317f7b156b5e0a39174a8b7dddb359;hpb=fda121295f8a7533b5f9ba5643b86f5c3b218ea3;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 48f9104aa2..55485fa2e0 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 @@ -13,64 +13,87 @@ import com.google.common.base.Preconditions; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; +import java.lang.management.ManagementFactory; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import javax.management.InstanceAlreadyExistsException; +import javax.management.MBeanRegistrationException; +import javax.management.MBeanServer; +import javax.management.MalformedObjectNameException; +import javax.management.NotCompliantMBeanException; +import javax.management.ObjectName; import org.opendaylight.controller.md.sal.binding.api.DataBroker; -import org.opendaylight.controller.sal.binding.api.BindingAwareBroker; -import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext; +import org.opendaylight.controller.md.sal.binding.api.NotificationPublishService; +import org.opendaylight.controller.md.sal.binding.api.NotificationService; +import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipService; +import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry; import org.opendaylight.openflowjava.protocol.spi.connection.SwitchConnectionProvider; 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.role.RoleManager; import org.opendaylight.openflowplugin.api.openflow.rpc.RpcManager; import org.opendaylight.openflowplugin.api.openflow.statistics.StatisticsManager; +import org.opendaylight.openflowplugin.api.openflow.statistics.ofpspecific.MessageIntelligenceAgency; +import org.opendaylight.openflowplugin.extension.api.ExtensionConverterProviderKeeper; +import org.opendaylight.openflowplugin.extension.api.ExtensionConverterRegistrator; +import org.opendaylight.openflowplugin.extension.api.OpenFlowPluginExtensionRegistratorProvider; +import org.opendaylight.openflowplugin.extension.api.core.extension.ExtensionConverterManager; import org.opendaylight.openflowplugin.impl.connection.ConnectionManagerImpl; import org.opendaylight.openflowplugin.impl.device.DeviceManagerImpl; +import org.opendaylight.openflowplugin.impl.role.RoleManagerImpl; import org.opendaylight.openflowplugin.impl.rpc.RpcManagerImpl; import org.opendaylight.openflowplugin.impl.statistics.StatisticsManagerImpl; +import org.opendaylight.openflowplugin.impl.statistics.ofpspecific.MessageIntelligenceAgencyImpl; +import org.opendaylight.openflowplugin.impl.statistics.ofpspecific.MessageIntelligenceAgencyMXBean; import org.opendaylight.openflowplugin.impl.util.TranslatorLibraryUtil; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflowplugin.api.types.rev150327.OfpRole; +import org.opendaylight.openflowplugin.openflow.md.core.extension.ExtensionConverterManagerImpl; +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 { +public class OpenFlowPluginProviderImpl implements OpenFlowPluginProvider, OpenFlowPluginExtensionRegistratorProvider { - protected static final Logger LOG = LoggerFactory.getLogger(OpenFlowPluginProviderImpl.class); + private static final Logger LOG = LoggerFactory.getLogger(OpenFlowPluginProviderImpl.class); + private static final MessageIntelligenceAgency messageIntelligenceAgency = new MessageIntelligenceAgencyImpl(); + private final int rpcRequestsQuota; + private final long globalNotificationQuota; private DeviceManager deviceManager; + private RoleManager roleManager; private RpcManager rpcManager; + private RpcProviderRegistry rpcProviderRegistry; private StatisticsManager statisticsManager; private ConnectionManager connectionManager; - private BindingAwareBroker bindingAwareBroker; - private ProviderContext providerContext; - private OfpRole role; + private NotificationService notificationProviderService; + private NotificationPublishService notificationPublishService; + private EntityOwnershipService entityOwnershipService; + + private ExtensionConverterManager extensionConverterManager; + + private DataBroker dataBroker; private Collection switchConnectionProviders; - private Long rpcRequestsQuota; + private boolean switchFeaturesMandatory = false; + private boolean isStatisticsPollingOff = false; - public OpenFlowPluginProviderImpl(final Long rpcRequestsQuota) { - this.rpcRequestsQuota = rpcRequestsQuota; + 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); } @Override - public void onSessionInitiated(final ProviderContext providerContextArg) { - providerContext = providerContextArg; - - connectionManager = new ConnectionManagerImpl(); - deviceManager = new DeviceManagerImpl(providerContext.getSALService(DataBroker.class)); - statisticsManager = new StatisticsManagerImpl(); - rpcManager = new RpcManagerImpl(providerContext, rpcRequestsQuota); - - connectionManager.setDeviceConnectedHandler(deviceManager); - deviceManager.setDeviceInitializationPhaseHandler(statisticsManager); - statisticsManager.setDeviceInitializationPhaseHandler(rpcManager); - rpcManager.setDeviceInitializationPhaseHandler(deviceManager); + public boolean isStatisticsPollingOff() { + return isStatisticsPollingOff; + } - TranslatorLibraryUtil.setBasicTranslatorLibrary(deviceManager); - startSwitchConnections(); + @Override + public void setIsStatisticsPollingOff(final boolean isStatisticsPollingOff) { + this.isStatisticsPollingOff = isStatisticsPollingOff; } private void startSwitchConnections() { @@ -96,31 +119,113 @@ public class OpenFlowPluginProviderImpl implements OpenFlowPluginProvider { }); } + public boolean isSwitchFeaturesMandatory() { + return switchFeaturesMandatory; + } + + @Override + public void setEntityOwnershipService(EntityOwnershipService entityOwnershipService) { + this.entityOwnershipService = entityOwnershipService; + } + + public void setSwitchFeaturesMandatory(final boolean switchFeaturesMandatory) { + this.switchFeaturesMandatory = switchFeaturesMandatory; + } + + public static MessageIntelligenceAgency getMessageIntelligenceAgency() { + return OpenFlowPluginProviderImpl.messageIntelligenceAgency; + } + @Override public void setSwitchConnectionProviders(final Collection switchConnectionProviders) { this.switchConnectionProviders = switchConnectionProviders; } @Override - public void setRole(final OfpRole role) { - this.role = role; + public void setDataBroker(final DataBroker dataBroker) { + this.dataBroker = dataBroker; } + @Override + public void setRpcProviderRegistry(final RpcProviderRegistry rpcProviderRegistry) { + this.rpcProviderRegistry = rpcProviderRegistry; + } @Override - public void setBindingAwareBroker(final BindingAwareBroker bindingAwareBroker) { - this.bindingAwareBroker = bindingAwareBroker; + public void initialize() { + + Preconditions.checkNotNull(dataBroker, "missing data broker"); + Preconditions.checkNotNull(rpcProviderRegistry, "missing RPC provider registry"); + Preconditions.checkNotNull(notificationProviderService, "missing notification provider service"); + extensionConverterManager = new ExtensionConverterManagerImpl(); + // TODO: copied from OpenFlowPluginProvider (Helium) misusesing the old way of distributing extension converters + // TODO: rewrite later! + OFSessionUtil.getSessionManager().setExtensionConverterProvider(extensionConverterManager); + + connectionManager = new ConnectionManagerImpl(); + + registerMXBean(messageIntelligenceAgency); + + deviceManager = new DeviceManagerImpl(dataBroker, messageIntelligenceAgency, switchFeaturesMandatory, globalNotificationQuota); + ((ExtensionConverterProviderKeeper) deviceManager).setExtensionConverterProvider(extensionConverterManager); + + roleManager = new RoleManagerImpl(rpcProviderRegistry, entityOwnershipService); + statisticsManager = new StatisticsManagerImpl(rpcProviderRegistry, isStatisticsPollingOff); + rpcManager = new RpcManagerImpl(rpcProviderRegistry, rpcRequestsQuota); + + // CM -> DM -> Role -> SM -> RPC -> DM + connectionManager.setDeviceConnectedHandler(deviceManager); + deviceManager.setDeviceInitializationPhaseHandler(roleManager); + roleManager.setDeviceInitializationPhaseHandler(statisticsManager); + statisticsManager.setDeviceInitializationPhaseHandler(rpcManager); + rpcManager.setDeviceInitializationPhaseHandler(deviceManager); + + deviceManager.setNotificationService(this.notificationProviderService); + deviceManager.setNotificationPublishService(this.notificationPublishService); + + TranslatorLibraryUtil.setBasicTranslatorLibrary(deviceManager); + deviceManager.initialize(); + + startSwitchConnections(); + } + + private static void registerMXBean(final MessageIntelligenceAgency messageIntelligenceAgency) { + MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); + try { + String pathToMxBean = String.format("%s:type=%s", + MessageIntelligenceAgencyMXBean.class.getPackage().getName(), + MessageIntelligenceAgencyMXBean.class.getSimpleName()); + ObjectName name = new ObjectName(pathToMxBean); + mbs.registerMBean(messageIntelligenceAgency, name); + } catch (MalformedObjectNameException + | NotCompliantMBeanException + | MBeanRegistrationException + | InstanceAlreadyExistsException e) { + LOG.warn("Error registering MBean {}", e); + } } @Override - public void initialize() { - Preconditions.checkNotNull(bindingAwareBroker, "missing bindingAwareBroker"); - bindingAwareBroker.registerProvider(this); + public void setNotificationProviderService(final NotificationService notificationProviderService) { + this.notificationProviderService = notificationProviderService; + } + + @Override + public void setNotificationPublishService(final NotificationPublishService notificationPublishProviderService) { + this.notificationPublishService = notificationPublishProviderService; + } + + @Override + public ExtensionConverterRegistrator getExtensionConverterRegistrator() { + return extensionConverterManager; } @Override public void close() throws Exception { - //TODO: close all contexts, switchConnections (, managers) + deviceManager.close(); + rpcManager.close(); + statisticsManager.close(); + roleManager.close(); } }