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;
+ }
+ }
+ }
}