Merge "Bug 4957 RoleContext updated with initialization"
[openflowplugin.git] / openflowplugin / src / main / java / org / opendaylight / openflowplugin / openflow / md / core / sal / OpenflowPluginProvider.java
index 2ec7fb1458656a1d0d4bf3315371cd6a9d1f57cb..c151c04faa30ad41317fe1e2a9386d8145a56169 100644 (file)
@@ -7,57 +7,54 @@
  */
 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
@@ -65,55 +62,31 @@ public class OpenflowPluginProvider implements BindingAwareProvider, AutoCloseab
     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
@@ -123,72 +96,82 @@ public class OpenflowPluginProvider implements BindingAwareProvider, AutoCloseab
         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;
     }
- }
+}