X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=openflowplugin-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fopenflowplugin%2Fimpl%2Fdevice%2FDeviceManagerImpl.java;h=34142de5675b5d839e3641bc6cc5a0301f90fb49;hb=3077f0076078a7fff1c9a6539558a4448ad9ba17;hp=362dbe171418d6dec88ea25dd2fee6e1c96c355f;hpb=99946e4e9980bfaa7fa16e4a178919252b346d96;p=openflowplugin.git diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/device/DeviceManagerImpl.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/device/DeviceManagerImpl.java index 362dbe1714..34142de567 100644 --- a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/device/DeviceManagerImpl.java +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/device/DeviceManagerImpl.java @@ -52,6 +52,7 @@ import org.opendaylight.openflowplugin.extension.api.core.extension.ExtensionCon import org.opendaylight.openflowplugin.impl.connection.OutboundQueueProviderImpl; import org.opendaylight.openflowplugin.impl.device.listener.OpenflowProtocolListenerFullImpl; import org.opendaylight.openflowplugin.impl.util.DeviceInitializationUtils; +import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodesBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node; @@ -71,9 +72,10 @@ public class DeviceManagerImpl implements DeviceManager, ExtensionConverterProvi private final boolean switchFeaturesMandatory; private boolean isNotificationFlowRemovedOff; - private final int spyRate = 10; + private static final int SPY_RATE = 10; private final DataBroker dataBroker; + private final ConvertorExecutor convertorExecutor; private TranslatorLibrary translatorLibrary; private DeviceInitializationPhaseHandler deviceInitPhaseHandler; private DeviceTerminationPhaseHandler deviceTerminPhaseHandler; @@ -90,13 +92,18 @@ public class DeviceManagerImpl implements DeviceManager, ExtensionConverterProvi private final LifecycleConductor conductor; public DeviceManagerImpl(@Nonnull final DataBroker dataBroker, - final long globalNotificationQuota, final boolean switchFeaturesMandatory, - final long barrierInterval, final int barrierCountLimit, - final LifecycleConductor lifecycleConductor, boolean isNotificationFlowRemovedOff) { + final long globalNotificationQuota, + final boolean switchFeaturesMandatory, + final long barrierInterval, + final int barrierCountLimit, + final LifecycleConductor lifecycleConductor, + boolean isNotificationFlowRemovedOff, + final ConvertorExecutor convertorExecutor) { this.switchFeaturesMandatory = switchFeaturesMandatory; this.globalNotificationQuota = globalNotificationQuota; this.isNotificationFlowRemovedOff = isNotificationFlowRemovedOff; this.dataBroker = Preconditions.checkNotNull(dataBroker); + this.convertorExecutor = convertorExecutor; /* merge empty nodes to oper DS to predict any problems with missing parent for Node */ final WriteTransaction tx = dataBroker.newWriteOnlyTransaction(); @@ -130,7 +137,6 @@ public class DeviceManagerImpl implements DeviceManager, ExtensionConverterProvi // final phase - we have to add new Device to MD-SAL DataStore LOG.debug("Final phase of DeviceContextLevelUp for Node: {} ", deviceInfo.getNodeId()); DeviceContext deviceContext = Preconditions.checkNotNull(deviceContexts.get(deviceInfo)); - ((DeviceContextImpl) deviceContext).initialSubmitTransaction(); deviceContext.onPublished(); } @@ -139,7 +145,7 @@ public class DeviceManagerImpl implements DeviceManager, ExtensionConverterProvi Preconditions.checkArgument(connectionContext != null); DeviceInfo deviceInfo = connectionContext.getDeviceInfo(); - /** + /* * This part prevent destroy another device context. Throwing here an exception result to propagate close connection * in {@link org.opendaylight.openflowplugin.impl.connection.org.opendaylight.openflowplugin.impl.connection.HandshakeContextImpl} * If context already exist we are in state closing process (connection flapping) and we should not propagate connection close @@ -177,10 +183,14 @@ public class DeviceManagerImpl implements DeviceManager, ExtensionConverterProvi conductor, outboundQueueProvider, translatorLibrary, - this); + this, + connectionContext.getDeviceInfo(), + convertorExecutor); Verify.verify(deviceContexts.putIfAbsent(deviceInfo, deviceContext) == null, "DeviceCtx still not closed."); + deviceContext.setSwitchFeaturesMandatory(switchFeaturesMandatory); + ((ExtensionConverterProviderKeeper) deviceContext).setExtensionConverterProvider(extensionConverterProvider); deviceContext.setNotificationPublishService(conductor.getNotificationPublishService()); @@ -249,7 +259,7 @@ public class DeviceManagerImpl implements DeviceManager, ExtensionConverterProvi @Override public void initialize() { - spyPool.scheduleAtFixedRate(conductor.getMessageIntelligenceAgency(), spyRate, spyRate, TimeUnit.SECONDS); + spyPool.scheduleAtFixedRate(conductor.getMessageIntelligenceAgency(), SPY_RATE, SPY_RATE, TimeUnit.SECONDS); } @Override @@ -322,7 +332,7 @@ public class DeviceManagerImpl implements DeviceManager, ExtensionConverterProvi @Override public ListenableFuture onClusterRoleChange(final DeviceInfo deviceInfo, final OfpRole role) { - DeviceContext deviceContext = conductor.getDeviceContext(deviceInfo); + DeviceContext deviceContext = deviceContexts.get(deviceInfo); LOG.trace("onClusterRoleChange {} for node:", role, deviceInfo.getNodeId()); if (OfpRole.BECOMEMASTER.equals(role)) { return onDeviceTakeClusterLeadership(deviceInfo); @@ -373,13 +383,14 @@ public class DeviceManagerImpl implements DeviceManager, ExtensionConverterProvi LOG.warn(errMsg); return Futures.immediateFailedFuture(new IllegalStateException(errMsg)); } - DeviceContext deviceContext = conductor.getDeviceContext(deviceInfo); + DeviceContext deviceContext = deviceContexts.get(deviceInfo); /* Prepare init info collecting */ notifyDeviceSynchronizeListeners(deviceInfo, false); ((DeviceContextImpl)deviceContext).getTransactionChainManager().activateTransactionManager(); + ((DeviceContextImpl)deviceContext).getTransactionChainManager().initialSubmitWriteTransaction(); /* Init Collecting NodeInfo */ final ListenableFuture initCollectingDeviceInfo = DeviceInitializationUtils.initializeNodeInformation( - deviceContext, switchFeaturesMandatory); + deviceContext, switchFeaturesMandatory, convertorExecutor); /* Init Collecting StatInfo */ final ListenableFuture statPollFuture = Futures.transform(initCollectingDeviceInfo, new AsyncFunction() { @@ -391,29 +402,34 @@ public class DeviceManagerImpl implements DeviceManager, ExtensionConverterProvi } }); - return Futures.transform(statPollFuture, new Function() { + return Futures.transform(statPollFuture, getInitialDeviceInformation(deviceContext)); + } - @Override - public Void apply(final Boolean input) { - if (ConnectionContext.CONNECTION_STATE.RIP.equals(conductor.gainConnectionStateSafely(deviceInfo))) { - final String errMsg = String.format("We lost connection for Device %s, context has to be closed.", - deviceInfo.getNodeId()); - LOG.warn(errMsg); - throw new IllegalStateException(errMsg); - } - if (!input) { - final String errMsg = String.format("Get Initial Device %s information fails", - deviceInfo.getNodeId()); - LOG.warn(errMsg); - throw new IllegalStateException(errMsg); - } - LOG.debug("Get Initial Device {} information is successful", deviceInfo.getNodeId()); - notifyDeviceSynchronizeListeners(deviceInfo, true); - ((DeviceContextImpl)deviceContext).getTransactionChainManager().initialSubmitWriteTransaction(); - deviceContext.getDeviceState().setStatisticsPollingEnabledProp(true); - return null; + private Function getInitialDeviceInformation(final DeviceContext deviceContext) { + return input -> { + if (ConnectionContext.CONNECTION_STATE.RIP.equals( + conductor.gainConnectionStateSafely(deviceContext.getDeviceInfo()) + )) { + final String errMsg = + String.format("We lost connection for Device %s, context has to be closed.", + deviceContext.getDeviceInfo().getNodeId()); + LOG.warn(errMsg); + throw new IllegalStateException(errMsg); + } + + if (input == null || !input) { + final String errMsg = + String.format("Get Initial Device %s information fails", + deviceContext.getDeviceInfo().getNodeId()); + LOG.warn(errMsg); + throw new IllegalStateException(errMsg); } - }); + LOG.debug("Get Initial Device {} information is successful", + deviceContext.getDeviceInfo().getNodeId()); + notifyDeviceSynchronizeListeners(deviceContext.getDeviceInfo(), true); + deviceContext.getDeviceState().setStatisticsPollingEnabledProp(true); + return null; + }; } }