Bug-2827: role switch proposal
[openflowplugin.git] / openflowplugin / src / main / java / org / opendaylight / openflowplugin / openflow / md / core / sal / OpenflowPluginProvider.java
index 91fe5271ded349f6231d8fd8c095936cfc8f5a32..33b65a4bc26cb28f6ab156f627ac8c54119854c5 100644 (file)
@@ -8,20 +8,21 @@
 package org.opendaylight.openflowplugin.openflow.md.core.sal;
 
 import java.util.Collection;
-import java.util.Collections;
-
 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.openflowjava.protocol.spi.connection.SwitchConnectionProvider;
+import org.opendaylight.openflowplugin.extension.api.ExtensionConverterRegistrator;
 import org.opendaylight.openflowplugin.openflow.md.core.MDController;
-import org.opendaylight.openflowplugin.openflow.md.core.cmd.MessageCountCommandProvider;
-import org.opendaylight.openflowplugin.openflow.md.queue.MessageObservatory;
-import org.opendaylight.openflowplugin.openflow.md.queue.MessageSpyCounterImpl;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
-import org.opendaylight.yangtools.yang.binding.DataObject;
-import org.opendaylight.yangtools.yang.binding.RpcService;
+import org.opendaylight.openflowplugin.openflow.md.core.extension.ExtensionConverterManager;
+import org.opendaylight.openflowplugin.openflow.md.core.extension.ExtensionConverterManagerImpl;
+import org.opendaylight.openflowplugin.openflow.md.core.session.OFRoleManager;
+import org.opendaylight.openflowplugin.openflow.md.core.session.OFSessionUtil;
+import org.opendaylight.openflowplugin.api.statistics.MessageCountDumper;
+import org.opendaylight.openflowplugin.api.statistics.MessageObservatory;
+import org.opendaylight.openflowplugin.statistics.MessageSpyCounterImpl;
+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.osgi.framework.BundleContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -30,56 +31,64 @@ import org.slf4j.LoggerFactory;
  * OFPlugin provider implementation
  */
 public class OpenflowPluginProvider implements BindingAwareProvider, AutoCloseable {
-    
-    private static Logger LOG = LoggerFactory.getLogger(OpenflowPluginProvider.class);
-    
+
+    private static final Logger LOG = LoggerFactory.getLogger(OpenflowPluginProvider.class);
+
     private BindingAwareBroker broker;
 
     private BundleContext context;
 
-    private SwitchConnectionProvider switchConnectionProvider;
+    private Collection<SwitchConnectionProvider> switchConnectionProviders;
 
     private MDController mdController;
-    
-    private MessageCountCommandProvider messageCountCommandProvider;
 
-    private MessageObservatory<OfHeader, DataObject> messageCountProvider;
-    
+    private MessageObservatory<DataContainer> messageCountProvider;
+
     private SalRegistrationManager registrationManager;
-    
-    public void unsetSwitchConnectionProvider() {
-        switchConnectionProvider = null;
+
+    private ExtensionConverterManager extensionConverterManager;
+
+    private OfpRole role;
+
+    private OFRoleManager roleManager;
+
+    /**
+     * Initialization of services and msgSpy counter
+     */
+    public void initialization() {
+        messageCountProvider = new MessageSpyCounterImpl();
+        extensionConverterManager = new ExtensionConverterManagerImpl();
+        roleManager = new OFRoleManager(OFSessionUtil.getSessionManager());
+        this.registerProvider();
     }
 
-    public void setSwitchConnectionProvider(
-            SwitchConnectionProvider switchConnectionProvider) {
-        this.switchConnectionProvider = switchConnectionProvider;
-        registerProvider();
+    /**
+     * @param switchConnectionProvider
+     */
+    public void setSwitchConnectionProviders(Collection<SwitchConnectionProvider> switchConnectionProvider) {
+        this.switchConnectionProviders = switchConnectionProvider;
     }
 
+    /**
+     * @return osgi context
+     */
     public BundleContext getContext() {
         return context;
     }
 
-    public void setContext(BundleContext context) {
-        this.context = context;
-    }
-
     @Override
     public void onSessionInitiated(ProviderContext session) {
         LOG.debug("onSessionInitiated");
-        messageCountProvider = new MessageSpyCounterImpl();
         registrationManager = new SalRegistrationManager();
         registrationManager.onSessionInitiated(session);
         mdController = new MDController();
-        mdController.setSwitchConnectionProvider(switchConnectionProvider);
+        mdController.setSwitchConnectionProviders(switchConnectionProviders);
         mdController.setMessageSpyCounter(messageCountProvider);
+        mdController.setExtensionConverterProvider(extensionConverterManager);
         mdController.init();
         mdController.start();
-        messageCountCommandProvider = new MessageCountCommandProvider(context, messageCountProvider);
-        messageCountCommandProvider.onSessionInitiated(session);
     }
-    
+
     @Override
     public void close() {
         LOG.debug("close");
@@ -87,47 +96,91 @@ 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();
-    }
-
-    @Override
-    public java.util.Collection<? extends RpcService> getImplementations() {
-        return Collections.emptySet();
     }
 
+    /**
+     * @return BA default broker
+     */
     public BindingAwareBroker getBroker() {
         return broker;
     }
 
+    /**
+     * dependencymanager requirement
+     *
+     * @param broker
+     */
     public void setBroker(BindingAwareBroker broker) {
         this.broker = broker;
-        registerProvider();
     }
 
-    public void unsetBroker(BindingAwareBroker broker) {
+    /**
+     * dependencymanager requirement
+     *
+     * @param brokerArg
+     */
+    public void unsetBroker(BindingAwareBroker brokerArg) {
         this.broker = null;
     }
 
-    private boolean hasAllDependencies(){
-        if(this.broker != null && this.switchConnectionProvider != null) {
+    private boolean hasAllDependencies() {
+        if (this.broker != null && this.switchConnectionProviders != null) {
             return true;
         }
         return false;
     }
+
+    /**
+     * register providers for md-sal
+     */
     private void registerProvider() {
-        if(hasAllDependencies()) {
-            this.broker.registerProvider(this,context);
+        if (hasAllDependencies()) {
+            this.broker.registerProvider(this, context);
+        }
+    }
+
+    public MessageCountDumper getMessageCountDumper() {
+        return messageCountProvider;
+    }
+
+    /**
+     * @return the extensionConverterRegistry
+     */
+    public ExtensionConverterRegistrator getExtensionConverterRegistrator() {
+        return extensionConverterManager;
+    }
+
+    /**
+     * @param role of instance
+     */
+    public void setRole(OfpRole role) {
+        this.role = role;
+    }
+
+    /**
+     * @param newRole
+     */
+    public void fireRoleChange(OfpRole newRole) {
+        if (!role.equals(newRole)) {
+            LOG.debug("my role was chaged 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;
+            }
         }
     }
- }
+}