*/
package org.opendaylight.openflowplugin.openflow.md.core.sal;
+import com.google.common.annotations.VisibleForTesting;
import java.util.Collection;
-import java.util.Collections;
-
-import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
-import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ConsumerContext;
-import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext;
-import org.opendaylight.controller.sal.binding.api.BindingAwareProvider;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.sal.binding.api.NotificationProviderService;
+import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
import org.opendaylight.openflowjava.protocol.spi.connection.SwitchConnectionProvider;
+import org.opendaylight.openflowplugin.api.openflow.statistics.MessageCountDumper;
+import org.opendaylight.openflowplugin.api.openflow.statistics.MessageObservatory;
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.openflow.md.core.MDController;
import org.opendaylight.openflowplugin.openflow.md.core.extension.ExtensionConverterManagerImpl;
-import org.opendaylight.openflowplugin.openflow.md.core.extension.ExtensionConverterManager;
-import org.opendaylight.openflowplugin.openflow.md.lldp.LLDPPAcketPuntEnforcer;
-import org.opendaylight.openflowplugin.statistics.MessageCountCommandProvider;
-import org.opendaylight.openflowplugin.statistics.MessageCountDumper;
-import org.opendaylight.openflowplugin.statistics.MessageObservatory;
+import org.opendaylight.openflowplugin.openflow.md.core.session.OFRoleManager;
+import org.opendaylight.openflowplugin.openflow.md.core.session.OFSessionUtil;
+import org.opendaylight.openflowplugin.openflow.md.core.role.OfEntityManager;
import org.opendaylight.openflowplugin.statistics.MessageSpyCounterImpl;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.SalFlowService;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflow.common.config.impl.rev140326.OfpRole;
import org.opendaylight.yangtools.yang.binding.DataContainer;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.opendaylight.yangtools.yang.binding.RpcService;
-import org.osgi.framework.BundleContext;
+import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* OFPlugin provider implementation
*/
-public class OpenflowPluginProvider implements BindingAwareProvider, AutoCloseable {
+public class OpenflowPluginProvider implements AutoCloseable, OpenFlowPluginExtensionRegistratorProvider {
- private static Logger LOG = LoggerFactory.getLogger(OpenflowPluginProvider.class);
-
- private BindingAwareBroker broker;
-
- private BundleContext context;
+ private static final Logger LOG = LoggerFactory.getLogger(OpenflowPluginProvider.class);
private Collection<SwitchConnectionProvider> switchConnectionProviders;
private MDController mdController;
- private MessageCountCommandProvider messageCountCommandProvider;
-
private MessageObservatory<DataContainer> messageCountProvider;
private SalRegistrationManager registrationManager;
-
- private ExtensionConverterManager extensionConverterManager;
+
+ private ExtensionConverterManager extensionConverterManager;
+
+ private OfpRole role;
+
+ private OFRoleManager roleManager;
+ private OfEntityManager entManager;
+ private DataBroker dataBroker;
+ private NotificationProviderService notificationService;
+ private RpcProviderRegistry rpcRegistry;
+ private EntityOwnershipService entityOwnershipService;
/**
* Initialization of services and msgSpy counter
public void initialization() {
messageCountProvider = new MessageSpyCounterImpl();
extensionConverterManager = new ExtensionConverterManagerImpl();
- this.registerProvider();
- }
-
- /**
- * @param switchConnectionProvider
- */
- public void setSwitchConnectionProviders(Collection<SwitchConnectionProvider> switchConnectionProvider) {
- this.switchConnectionProviders = switchConnectionProvider;
- }
-
- /**
- * @return osgi context
- */
- public BundleContext getContext() {
- return context;
- }
-
- /**
- * dependencymanager requirement
- * @param context
- *
- * @deprecated we should stop relying on osgi to provide cli interface for messageCounter
- */
- @Deprecated
- public void setContext(BundleContext context) {
- this.context = context;
- }
+ roleManager = new OFRoleManager(OFSessionUtil.getSessionManager());
+ entManager = new OfEntityManager(entityOwnershipService);
+ entManager.setDataBroker(dataBroker);
- @Override
- public void onSessionInitiated(ProviderContext session) {
- LOG.debug("onSessionInitiated");
+ LOG.debug("dependencies gathered..");
registrationManager = new SalRegistrationManager();
- registrationManager.onSessionInitiated(session);
- //TODO : LLDPPAcketPuntEnforcer should be instantiated and registered in separate module driven by config subsystem
- InstanceIdentifier path = InstanceIdentifier.create(Nodes.class).child(Node.class);
- registrationManager.getSessionManager().getDataBroker().registerDataChangeListener(
- LogicalDatastoreType.OPERATIONAL,
- path,
- new LLDPPAcketPuntEnforcer(
- session.<SalFlowService>getRpcService(SalFlowService.class)),
- AsyncDataBroker.DataChangeScope.BASE);
+ registrationManager.setDataService(dataBroker);
+ registrationManager.setPublishService(notificationService);
+ registrationManager.setRpcProviderRegistry(rpcRegistry);
+ registrationManager.setOfEntityManager(entManager);
+ registrationManager.init();
+
mdController = new MDController();
mdController.setSwitchConnectionProviders(switchConnectionProviders);
mdController.setMessageSpyCounter(messageCountProvider);
mdController.setExtensionConverterProvider(extensionConverterManager);
mdController.init();
mdController.start();
- messageCountCommandProvider = new MessageCountCommandProvider(context, messageCountProvider);
- messageCountCommandProvider.onSessionInitiated(session);
+ }
+
+ /**
+ * @param switchConnectionProvider switch connection provider
+ */
+ public void setSwitchConnectionProviders(Collection<SwitchConnectionProvider> switchConnectionProvider) {
+ this.switchConnectionProviders = switchConnectionProvider;
}
@Override
mdController = null;
registrationManager.close();
registrationManager = null;
- messageCountCommandProvider.close();
- messageCountCommandProvider = null;
}
- @Override
- public void onSessionInitialized(ConsumerContext session) {
- // NOOP
- }
-
- @Override
- public Collection<? extends ProviderFunctionality> getFunctionality() {
- return Collections.emptySet();
+ public MessageCountDumper getMessageCountDumper() {
+ return messageCountProvider;
}
+ /**
+ * @return the extensionConverterRegistry
+ */
@Override
- public java.util.Collection<? extends RpcService> getImplementations() {
- return Collections.emptySet();
+ public ExtensionConverterRegistrator getExtensionConverterRegistrator() {
+ return extensionConverterManager;
}
/**
- * @return BA default broker
+ * @param role of instance
*/
- public BindingAwareBroker getBroker() {
- return broker;
+ public void setRole(OfpRole role) {
+ this.role = role;
}
/**
- * dependencymanager requirement
- * @param broker
+ * @param newRole new controller role
*/
- public void setBroker(BindingAwareBroker broker) {
- this.broker = broker;
+ public void fireRoleChange(OfpRole newRole) {
+ if (!role.equals(newRole)) {
+ LOG.debug("Controller role was changed from {} to {}", role, newRole);
+ role = newRole;
+ switch (role) {
+ case BECOMEMASTER:
+ //TODO: implement appropriate action
+ roleManager.manageRoleChange(role);
+ break;
+ case BECOMESLAVE:
+ //TODO: implement appropriate action
+ roleManager.manageRoleChange(role);
+ break;
+ case NOCHANGE:
+ //TODO: implement appropriate action
+ roleManager.manageRoleChange(role);
+ break;
+ default:
+ LOG.warn("role not supported: {}", role);
+ break;
+ }
+ }
}
- /**
- * dependencymanager requirement
- * @param brokerArg
- */
- public void unsetBroker(BindingAwareBroker brokerArg) {
- this.broker = null;
+ public void setDataBroker(DataBroker dataBroker) {
+ this.dataBroker = dataBroker;
}
- private boolean hasAllDependencies(){
- if(this.broker != null && this.switchConnectionProviders != null) {
- return true;
- }
- return false;
+ public void setNotificationService(NotificationProviderService notificationService) {
+ this.notificationService = notificationService;
}
- /**
- * register providers for md-sal
- */
- private void registerProvider() {
- if(hasAllDependencies()) {
- this.broker.registerProvider(this,context);
- }
+ public void setRpcRegistry(RpcProviderRegistry rpcRegistry) {
+ this.rpcRegistry = rpcRegistry;
}
- public MessageCountDumper getMessageCountDumper() {
- return messageCountProvider;
+ public void setEntityOwnershipService(EntityOwnershipService entityOwnershipService) {
+ this.entityOwnershipService = entityOwnershipService;
}
-
- /**
- * @return the extensionConverterRegistry
- */
- public ExtensionConverterRegistrator getExtensionConverterRegistrator() {
- return extensionConverterManager;
+
+ @VisibleForTesting
+ protected RpcProviderRegistry getRpcRegistry() {
+ return rpcRegistry;
+ }
+
+ @VisibleForTesting
+ protected NotificationProviderService getNotificationService() {
+ return notificationService;
+ }
+
+ @VisibleForTesting
+ protected DataBroker getDataBroker() {
+ return dataBroker;
}
- }
+}