X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=openflowplugin-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fopenflowplugin%2Fimpl%2Fdevice%2FDeviceContextImpl.java;h=362225125e0e3cd5a3c1e7ce8530fec617ce9089;hb=27a959952ec08018d1844dd1d3129c32f8872225;hp=4fdc7c092f92e9bce1533af1687254f679e68c4b;hpb=cdf58ed1ab86c9e4d39f03386d7d83c847348868;p=openflowplugin.git diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/device/DeviceContextImpl.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/device/DeviceContextImpl.java index 4fdc7c092f..362225125e 100644 --- a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/device/DeviceContextImpl.java +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/device/DeviceContextImpl.java @@ -12,19 +12,18 @@ import com.google.common.base.Preconditions; import com.google.common.util.concurrent.SettableFuture; import io.netty.util.HashedWheelTimer; import io.netty.util.Timeout; -import io.netty.util.TimerTask; import java.math.BigInteger; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.TreeMap; -import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicLong; import javax.annotation.Nonnull; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.ReadTransaction; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; +import org.opendaylight.controller.sal.binding.api.NotificationProviderService; import org.opendaylight.openflowplugin.api.openflow.connection.ConnectionContext; import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext; import org.opendaylight.openflowplugin.api.openflow.device.DeviceState; @@ -34,24 +33,35 @@ import org.opendaylight.openflowplugin.api.openflow.device.TranslatorLibrary; import org.opendaylight.openflowplugin.api.openflow.device.Xid; import org.opendaylight.openflowplugin.api.openflow.device.exception.DeviceDataException; import org.opendaylight.openflowplugin.api.openflow.device.listener.OpenflowMessageListenerFacade; -import org.opendaylight.openflowplugin.api.openflow.flow.registry.FlowRegistry; +import org.opendaylight.openflowplugin.api.openflow.flow.registry.DeviceFlowRegistry; import org.opendaylight.openflowplugin.api.openflow.md.core.SwitchConnectionDistinguisher; import org.opendaylight.openflowplugin.api.openflow.md.core.TranslatorKey; -import org.opendaylight.openflowplugin.impl.flow.registry.DeviceFlowRegistry; +import org.opendaylight.openflowplugin.impl.common.NodeStaticReplyTranslatorUtil; +import org.opendaylight.openflowplugin.impl.flow.registry.DeviceFlowRegistryImpl; import org.opendaylight.openflowplugin.impl.translator.PacketReceivedTranslator; import org.opendaylight.openflowplugin.openflow.md.core.session.SwitchConnectionCookieOFImpl; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector; +import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId; +import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector; +import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortReason; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.Error; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowRemoved; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReply; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketInMessage; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortGrouping; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortStatusMessage; import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketReceived; +import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.FlowCapableNodeConnectorStatisticsData; +import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.FlowCapableNodeConnectorStatisticsDataBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TableFeatures; import org.opendaylight.yangtools.yang.binding.ChildOf; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier; import org.opendaylight.yangtools.yang.common.RpcError; import org.opendaylight.yangtools.yang.common.RpcResult; import org.opendaylight.yangtools.yang.common.RpcResultBuilder; @@ -76,7 +86,9 @@ public class DeviceContextImpl implements DeviceContext { private final TransactionChainManager txChainManager; private TranslatorLibrary translatorLibrary; private OpenflowMessageListenerFacade openflowMessageListenerFacade; - private FlowRegistry flowRegistry; + private final DeviceFlowRegistry deviceFlowRegistry; + private Timeout barrierTaskTimeout; + private NotificationProviderService notificationService; @VisibleForTesting DeviceContextImpl(@Nonnull final ConnectionContext primaryConnectionContext, @@ -87,10 +99,10 @@ public class DeviceContextImpl implements DeviceContext { this.dataBroker = Preconditions.checkNotNull(dataBroker); this.hashedWheelTimer = Preconditions.checkNotNull(hashedWheelTimer); xidGenerator = new XidGenerator(); - txChainManager = new TransactionChainManager(dataBroker, 500L); + txChainManager = new TransactionChainManager(dataBroker, hashedWheelTimer, 500L); auxiliaryConnectionContexts = new HashMap<>(); requests = new HashMap<>(); - flowRegistry = new DeviceFlowRegistry(); + deviceFlowRegistry = new DeviceFlowRegistryImpl(); } /** @@ -100,12 +112,6 @@ public class DeviceContextImpl implements DeviceContext { void submitTransaction() { txChainManager.submitTransaction(); txChainManager.enableCounter(); - hashedWheelTimer.newTimeout(new TimerTask() { - @Override - public void run(final Timeout timeout) throws Exception { - submitTransaction(); - } - }, 0, TimeUnit.MILLISECONDS); } @Override @@ -141,6 +147,11 @@ public class DeviceContextImpl implements DeviceContext { txChainManager.writeToTransaction(store, path, data); } + @Override + public void addDeleteToTxChain(final LogicalDatastoreType store, final InstanceIdentifier path) { + txChainManager.addDeleteOperationTotTxChain(store, path); + } + @Override public TableFeatures getCapabilities() { // TODO Auto-generated method stub @@ -162,6 +173,7 @@ public class DeviceContextImpl implements DeviceContext { return xidGenerator.generate(); } + @Override public Map getRequests() { return requests; } @@ -184,8 +196,8 @@ public class DeviceContextImpl implements DeviceContext { } @Override - public FlowRegistry getFlowRegistry() { - return flowRegistry; + public DeviceFlowRegistry getDeviceFlowRegistry() { + return deviceFlowRegistry; } @Override @@ -273,10 +285,27 @@ public class DeviceContextImpl implements DeviceContext { @Override public void processPortStatusMessage(final PortStatusMessage portStatus) { - final TranslatorKey translatorKey = new TranslatorKey(portStatus.getVersion(), PortStatusMessage.class.getName()); - final MessageTranslator messageTranslator = translatorLibrary.lookupTranslator(translatorKey); - final FlowCapableNodeConnector nodeConnector = messageTranslator.translate(portStatus, this, null); - //TODO write into datastore + final TranslatorKey translatorKey = new TranslatorKey(portStatus.getVersion(), PortGrouping.class.getName()); + final MessageTranslator messageTranslator = translatorLibrary.lookupTranslator(translatorKey); + final FlowCapableNodeConnector flowCapableNodeConnector = messageTranslator.translate(portStatus, this, null); + + final KeyedInstanceIdentifier iiToNodeConnector = provideIIToNodeConnector(portStatus.getPortNo(), portStatus.getVersion()); + if (portStatus.getReason().equals(PortReason.OFPPRADD) || portStatus.getReason().equals(PortReason.OFPPRMODIFY)) { + // because of ADD status node connector has to be created + final NodeConnectorBuilder nConnectorBuilder = new NodeConnectorBuilder().setKey(iiToNodeConnector.getKey()); + nConnectorBuilder.addAugmentation(FlowCapableNodeConnectorStatisticsData.class, new FlowCapableNodeConnectorStatisticsDataBuilder().build()); + nConnectorBuilder.addAugmentation(FlowCapableNodeConnector.class, flowCapableNodeConnector); + writeToTransaction(LogicalDatastoreType.OPERATIONAL, iiToNodeConnector, nConnectorBuilder.build()); + } else if (portStatus.getReason().equals(PortReason.OFPPRDELETE) ) { + addDeleteToTxChain(LogicalDatastoreType.OPERATIONAL, iiToNodeConnector); + } + } + + private KeyedInstanceIdentifier provideIIToNodeConnector(final long portNo, final short version) { + final InstanceIdentifier iiToNodes = deviceState.getNodeInstanceIdentifier(); + final BigInteger dataPathId = deviceState.getFeatures().getDatapathId(); + final NodeConnectorId nodeConnectorId = NodeStaticReplyTranslatorUtil.nodeConnectorId(dataPathId.toString(), portNo, version); + return iiToNodes.child(NodeConnector.class, new NodeConnectorKey(nodeConnectorId)); } @Override @@ -284,7 +313,7 @@ public class DeviceContextImpl implements DeviceContext { final TranslatorKey translatorKey = new TranslatorKey(packetInMessage.getVersion(), PacketReceivedTranslator.class.getName()); final MessageTranslator messageTranslator = translatorLibrary.lookupTranslator(translatorKey); final PacketReceived packetReceived = messageTranslator.translate(packetInMessage, this, null); - //TODO publish to MD-SAL + notificationService.publish(packetReceived); } @Override @@ -324,4 +353,19 @@ public class DeviceContextImpl implements DeviceContext { } return nextMessage; } + + @Override + public void setCurrentBarrierTimeout(final Timeout timeout) { + barrierTaskTimeout = timeout; + } + + @Override + public Timeout getBarrierTaskTimeout() { + return barrierTaskTimeout; + } + + @Override + public void setNotificationService(final NotificationProviderService notificationServiceParam) { + notificationService = notificationServiceParam; + } }