Bug-2827: role switch proposal
[openflowplugin.git] / openflowplugin / src / main / java / org / opendaylight / openflowplugin / openflow / md / core / sal / OpenflowPluginProvider.java
index 8e9cf612d958b0054759ce33b1a8c9312f1a5025..33b65a4bc26cb28f6ab156f627ac8c54119854c5 100644 (file)
 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.BindingAwareProvider;
-import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ConsumerContext;
 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext;
-import org.opendaylight.yangtools.yang.binding.RpcService;
+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.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;
 
 /**
  * OFPlugin provider implementation
  */
-public class OpenflowPluginProvider implements BindingAwareProvider {
+public class OpenflowPluginProvider implements BindingAwareProvider, AutoCloseable {
+
+    private static final Logger LOG = LoggerFactory.getLogger(OpenflowPluginProvider.class);
 
     private BindingAwareBroker broker;
 
     private BundleContext context;
 
-    public BundleContext getContext() {
-        return context;
-    }
+    private Collection<SwitchConnectionProvider> switchConnectionProviders;
 
-    public void setContext(BundleContext context) {
-        this.context = context;
-    }
+    private MDController mdController;
 
-    SalRegistrationManager registrationManager = new SalRegistrationManager();
+    private MessageObservatory<DataContainer> messageCountProvider;
 
-    @Override
-    public void onSessionInitiated(ProviderContext session) {
-        registrationManager.onSessionInitiated(session);
+    private SalRegistrationManager registrationManager;
+
+    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();
     }
 
-    @Override
-    public void onSessionInitialized(ConsumerContext session) {
-        // NOOP
+    /**
+     * @param switchConnectionProvider
+     */
+    public void setSwitchConnectionProviders(Collection<SwitchConnectionProvider> switchConnectionProvider) {
+        this.switchConnectionProviders = switchConnectionProvider;
+    }
+
+    /**
+     * @return osgi context
+     */
+    public BundleContext getContext() {
+        return context;
     }
 
     @Override
-    public Collection<? extends ProviderFunctionality> getFunctionality() {
-        return Collections.emptySet();
+    public void onSessionInitiated(ProviderContext session) {
+        LOG.debug("onSessionInitiated");
+        registrationManager = new SalRegistrationManager();
+        registrationManager.onSessionInitiated(session);
+        mdController = new MDController();
+        mdController.setSwitchConnectionProviders(switchConnectionProviders);
+        mdController.setMessageSpyCounter(messageCountProvider);
+        mdController.setExtensionConverterProvider(extensionConverterManager);
+        mdController.init();
+        mdController.start();
     }
 
     @Override
-    public java.util.Collection<? extends RpcService> getImplementations() {
-        return Collections.emptySet();
+    public void close() {
+        LOG.debug("close");
+        mdController.stop();
+        mdController = null;
+        registrationManager.close();
+        registrationManager = null;
     }
 
+    /**
+     * @return BA default broker
+     */
     public BindingAwareBroker getBroker() {
         return broker;
     }
 
+    /**
+     * dependencymanager requirement
+     *
+     * @param broker
+     */
     public void setBroker(BindingAwareBroker broker) {
         this.broker = broker;
-        broker.registerProvider(this, context);
-    };
+    }
 
-    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.switchConnectionProviders != null) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * register providers for md-sal
+     */
+    private void registerProvider() {
+        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;
+            }
+        }
+    }
 }