import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
+import javax.annotation.Nonnull;
import javax.management.InstanceAlreadyExistsException;
import javax.management.MBeanRegistrationException;
import javax.management.MBeanServer;
import org.opendaylight.controller.md.sal.binding.api.DataBroker;
import org.opendaylight.controller.md.sal.binding.api.NotificationPublishService;
import org.opendaylight.controller.md.sal.binding.api.NotificationService;
+import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipService;
import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
import org.opendaylight.openflowjava.protocol.spi.connection.SwitchConnectionProvider;
import org.opendaylight.openflowplugin.api.openflow.OpenFlowPluginProvider;
import org.opendaylight.openflowplugin.api.openflow.connection.ConnectionManager;
import org.opendaylight.openflowplugin.api.openflow.device.DeviceManager;
+import org.opendaylight.openflowplugin.api.openflow.lifecycle.LifecycleConductor;
+import org.opendaylight.openflowplugin.api.openflow.lifecycle.RoleChangeListener;
+import org.opendaylight.openflowplugin.api.openflow.role.RoleManager;
import org.opendaylight.openflowplugin.api.openflow.rpc.RpcManager;
import org.opendaylight.openflowplugin.api.openflow.statistics.StatisticsManager;
import org.opendaylight.openflowplugin.api.openflow.statistics.ofpspecific.MessageIntelligenceAgency;
+import org.opendaylight.openflowplugin.extension.api.ExtensionConverterProviderKeeper;
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.impl.connection.ConnectionManagerImpl;
import org.opendaylight.openflowplugin.impl.device.DeviceManagerImpl;
+import org.opendaylight.openflowplugin.impl.role.RoleManagerImpl;
import org.opendaylight.openflowplugin.impl.rpc.RpcManagerImpl;
import org.opendaylight.openflowplugin.impl.statistics.StatisticsManagerImpl;
import org.opendaylight.openflowplugin.impl.statistics.ofpspecific.MessageIntelligenceAgencyImpl;
import org.opendaylight.openflowplugin.impl.statistics.ofpspecific.MessageIntelligenceAgencyMXBean;
import org.opendaylight.openflowplugin.impl.util.TranslatorLibraryUtil;
-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.OFSessionUtil;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflowplugin.api.types.rev150327.OfpRole;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-/**
- * Created by Martin Bobak <mbobak@cisco.com> on 27.3.2015.
- */
public class OpenFlowPluginProviderImpl implements OpenFlowPluginProvider, OpenFlowPluginExtensionRegistratorProvider {
private static final Logger LOG = LoggerFactory.getLogger(OpenFlowPluginProviderImpl.class);
private final int rpcRequestsQuota;
private final long globalNotificationQuota;
+ private long barrierInterval;
+ private int barrierCountLimit;
+ private long echoReplyTimeout;
private DeviceManager deviceManager;
+ private RoleManager roleManager;
private RpcManager rpcManager;
private RpcProviderRegistry rpcProviderRegistry;
private StatisticsManager statisticsManager;
private ConnectionManager connectionManager;
private NotificationService notificationProviderService;
private NotificationPublishService notificationPublishService;
+ private EntityOwnershipService entityOwnershipService;
private ExtensionConverterManager extensionConverterManager;
private DataBroker dataBroker;
- private OfpRole role;
private Collection<SwitchConnectionProvider> switchConnectionProviders;
private boolean switchFeaturesMandatory = false;
private boolean isStatisticsPollingOff = false;
+ private boolean isStatisticsRpcEnabled;
+
+ private final LifecycleConductor conductor;
public OpenFlowPluginProviderImpl(final long rpcRequestsQuota, final Long globalNotificationQuota) {
Preconditions.checkArgument(rpcRequestsQuota > 0 && rpcRequestsQuota <= Integer.MAX_VALUE, "rpcRequestQuota has to be in range <1,%s>", Integer.MAX_VALUE);
this.rpcRequestsQuota = (int) rpcRequestsQuota;
this.globalNotificationQuota = Preconditions.checkNotNull(globalNotificationQuota);
+ conductor = new LifecycleConductorImpl(messageIntelligenceAgency);
}
@Override
}
@Override
- public void onFailure(final Throwable t) {
+ public void onFailure(@Nonnull final Throwable t) {
LOG.warn("Some switchConnectionProviders failed to start.", t);
}
});
}
+ @Override
public boolean isSwitchFeaturesMandatory() {
return switchFeaturesMandatory;
}
+ @Override
+ public void setEntityOwnershipService(final EntityOwnershipService entityOwnershipService) {
+ this.entityOwnershipService = entityOwnershipService;
+ }
+
+ @Override
+ public void setBarrierCountLimit(final int barrierCountLimit) {
+ this.barrierCountLimit = barrierCountLimit;
+ }
+
+ @Override
+ public void setBarrierInterval(final long barrierTimeoutLimit) {
+ this.barrierInterval = barrierTimeoutLimit;
+ }
+
+ @Override
+ public void setEchoReplyTimeout(final long echoReplyTimeout) {
+ this.echoReplyTimeout = echoReplyTimeout;
+ }
+
+
+ @Override
public void setSwitchFeaturesMandatory(final boolean switchFeaturesMandatory) {
this.switchFeaturesMandatory = switchFeaturesMandatory;
}
this.rpcProviderRegistry = rpcProviderRegistry;
}
- @Override
- public void setRole(final OfpRole role) {
- this.role = role;
- }
-
-
@Override
public void initialize() {
// TODO: rewrite later!
OFSessionUtil.getSessionManager().setExtensionConverterProvider(extensionConverterManager);
- connectionManager = new ConnectionManagerImpl();
+ connectionManager = new ConnectionManagerImpl(echoReplyTimeout);
registerMXBean(messageIntelligenceAgency);
- deviceManager = new DeviceManagerImpl(dataBroker, messageIntelligenceAgency, switchFeaturesMandatory, globalNotificationQuota);
- statisticsManager = new StatisticsManagerImpl(rpcProviderRegistry, isStatisticsPollingOff);
- rpcManager = new RpcManagerImpl(rpcProviderRegistry, rpcRequestsQuota);
+ deviceManager = new DeviceManagerImpl(dataBroker,
+ globalNotificationQuota,
+ switchFeaturesMandatory,
+ barrierInterval,
+ barrierCountLimit,
+ conductor);
+ ((ExtensionConverterProviderKeeper) conductor).setExtensionConverterProvider(extensionConverterManager);
+ ((ExtensionConverterProviderKeeper) deviceManager).setExtensionConverterProvider(extensionConverterManager);
+
+ conductor.setSafelyManager(deviceManager);
+ conductor.setNotificationPublishService(notificationPublishService);
+
+ roleManager = new RoleManagerImpl(entityOwnershipService, dataBroker, conductor);
+ statisticsManager = new StatisticsManagerImpl(rpcProviderRegistry, isStatisticsPollingOff, conductor);
+ conductor.setSafelyManager(statisticsManager);
+ rpcManager = new RpcManagerImpl(rpcProviderRegistry, rpcRequestsQuota, conductor);
+ conductor.setSafelyManager(rpcManager);
+
+ roleManager.addRoleChangeListener((RoleChangeListener) conductor);
+
+ /* Initialization Phase ordering - OFP Device Context suite */
+ // CM -> DM -> SM -> RPC -> Role -> DM
connectionManager.setDeviceConnectedHandler(deviceManager);
deviceManager.setDeviceInitializationPhaseHandler(statisticsManager);
- deviceManager.setNotificationService(this.notificationProviderService);
- deviceManager.setNotificationPublishService(this.notificationPublishService);
statisticsManager.setDeviceInitializationPhaseHandler(rpcManager);
- rpcManager.setDeviceInitializationPhaseHandler(deviceManager);
+ rpcManager.setDeviceInitializationPhaseHandler(roleManager);
+ roleManager.setDeviceInitializationPhaseHandler(deviceManager);
+
+ /* Termination Phase ordering - OFP Device Context suite */
+ deviceManager.setDeviceTerminationPhaseHandler(rpcManager);
+ rpcManager.setDeviceTerminationPhaseHandler(statisticsManager);
+ statisticsManager.setDeviceTerminationPhaseHandler(roleManager);
+ roleManager.setDeviceTerminationPhaseHandler(deviceManager);
+
+ rpcManager.setStatisticsRpcEnabled(isStatisticsRpcEnabled);
TranslatorLibraryUtil.setBasicTranslatorLibrary(deviceManager);
deviceManager.initialize();
}
private static void registerMXBean(final MessageIntelligenceAgency messageIntelligenceAgency) {
- MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
+ final MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
try {
- String pathToMxBean = String.format("%s:type=%s",
+ final String pathToMxBean = String.format("%s:type=%s",
MessageIntelligenceAgencyMXBean.class.getPackage().getName(),
MessageIntelligenceAgencyMXBean.class.getSimpleName());
- ObjectName name = new ObjectName(pathToMxBean);
+ final ObjectName name = new ObjectName(pathToMxBean);
mbs.registerMBean(messageIntelligenceAgency, name);
} catch (MalformedObjectNameException
| NotCompliantMBeanException
return extensionConverterManager;
}
+ @Override
+ public void setIsStatisticsRpcEnabled(final boolean isStatisticsRpcEnabled) {
+ this.isStatisticsRpcEnabled = isStatisticsRpcEnabled;
+ }
+
@Override
public void close() throws Exception {
- //TODO: close all contexts, switchConnections (, managers)
+ //TODO: consider wrapping each manager into try-catch
+ deviceManager.close();
+ rpcManager.close();
+ statisticsManager.close();
+
+ // TODO: needs to close org.opendaylight.openflowplugin.impl.role.OpenflowOwnershipListener after RoleContexts are down
+ // TODO: must not be executed prior to all living RoleContexts have been closed (via closing living DeviceContexts)
+ roleManager.close();
}
}