/**
* Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
package org.opendaylight.openflowplugin.openflow.md.core.sal;
import com.google.common.annotations.VisibleForTesting;
import java.util.Collection;
import org.opendaylight.controller.md.sal.binding.api.DataBroker;
import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipService;
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.role.OfEntityManager;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager;
import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManagerFactory;
import org.opendaylight.openflowplugin.openflow.md.core.session.OFRoleManager;
import org.opendaylight.openflowplugin.openflow.md.core.session.OFSessionUtil;
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.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* OFPlugin provider implementation
*/
public class OpenflowPluginProvider implements AutoCloseable, OpenFlowPluginExtensionRegistratorProvider {
private static final Logger LOG = LoggerFactory.getLogger(OpenflowPluginProvider.class);
private static final boolean SKIP_TABLE_FEATURES = false;
private Collection<SwitchConnectionProvider> switchConnectionProviders;
private MDController mdController;
private MessageObservatory<DataContainer> messageCountProvider;
private SalRegistrationManager registrationManager;
private ExtensionConverterManager extensionConverterManager;
private OfpRole role;
private Boolean skipTableFeatures;
private OFRoleManager roleManager;
private OfEntityManager entManager;
private DataBroker dataBroker;
private NotificationProviderService notificationService;
private RpcProviderRegistry rpcRegistry;
private EntityOwnershipService entityOwnershipService;
private OpenflowPluginConfig openflowPluginConfig;
/**
* Initialization of services and msgSpy counter
*/
public void initialization() {
final ConvertorManager convertorManager = ConvertorManagerFactory.createDefaultManager();
messageCountProvider = new MessageSpyCounterImpl();
extensionConverterManager = new ExtensionConverterManagerImpl();
roleManager = new OFRoleManager(OFSessionUtil.getSessionManager());
openflowPluginConfig = readConfig(skipTableFeatures);
entManager = new OfEntityManager(entityOwnershipService,getOpenflowPluginConfig());
entManager.setDataBroker(dataBroker);
entManager.init();
LOG.debug("dependencies gathered..");
registrationManager = new SalRegistrationManager(convertorManager);
registrationManager.setDataService(dataBroker);
registrationManager.setPublishService(notificationService);
registrationManager.setRpcProviderRegistry(rpcRegistry);
registrationManager.setOfEntityManager(entManager);
registrationManager.init();
mdController = new MDController(convertorManager);
mdController.setSwitchConnectionProviders(switchConnectionProviders);
mdController.setMessageSpyCounter(messageCountProvider);
mdController.setExtensionConverterProvider(extensionConverterManager);
mdController.init();
mdController.start();
}
/**
* @param switchConnectionProvider switch connection provider
*/
public void setSwitchConnectionProviders(Collection<SwitchConnectionProvider> switchConnectionProvider) {
this.switchConnectionProviders = switchConnectionProvider;
}
@Override
public void close() {
LOG.debug("close");
if(mdController != null) {
mdController.stop();
mdController = null;
}
if(registrationManager != null) {
registrationManager.close();
registrationManager = null;
}
}
public MessageCountDumper getMessageCountDumper() {
return messageCountProvider;
}
/**
* @return the extensionConverterRegistry
*/
@Override
public ExtensionConverterRegistrator getExtensionConverterRegistrator() {
return extensionConverterManager;
}
/**
* @param role of instance
*/
public void setRole(OfpRole role) {
this.role = role;
}
/**
* @param newRole new controller role
*/
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;
}
}
}
private OpenflowPluginConfig readConfig(Boolean skipTableFeatures){
final OpenflowPluginConfig.OpenflowPluginConfigBuilder openflowCfgBuilder = OpenflowPluginConfig.builder();
if(skipTableFeatures !=null){
openflowCfgBuilder.setSkipTableFeatures(skipTableFeatures.booleanValue());
} else{
LOG.warn("Could not load XML configuration file via ConfigSubsystem! Fallback to default config value(s)");
openflowCfgBuilder.setSkipTableFeatures(SKIP_TABLE_FEATURES);
}
return openflowCfgBuilder.build();
}
public void setDataBroker(DataBroker dataBroker) {
this.dataBroker = dataBroker;
}
public void setNotificationService(NotificationProviderService notificationService) {
this.notificationService = notificationService;
}
public void setRpcRegistry(RpcProviderRegistry rpcRegistry) {
this.rpcRegistry = rpcRegistry;
}
public void setEntityOwnershipService(EntityOwnershipService entityOwnershipService) {
this.entityOwnershipService = entityOwnershipService;
}
public void setSkipTableFeatures(Boolean skipTableFeatures) {
this.skipTableFeatures = skipTableFeatures;
}
@VisibleForTesting
public OpenflowPluginConfig getOpenflowPluginConfig() {
return openflowPluginConfig;
}
@VisibleForTesting
protected RpcProviderRegistry getRpcRegistry() {
return rpcRegistry;
}
@VisibleForTesting
protected NotificationProviderService getNotificationService() {
return notificationService;
}
@VisibleForTesting
protected DataBroker getDataBroker() {
return dataBroker;
}
}