From 4855ee8dacd73ac995f24c027d31e02c57c79f61 Mon Sep 17 00:00:00 2001 From: Evan Zeller Date: Mon, 9 Apr 2018 16:54:17 -0700 Subject: [PATCH] must use full node-connector string when writing queue stats OPNFLWPLUG-995 Similar to port statistics, when writing queue statistics into the operational datastore, make sure to use the full md-sal node-connector string. i.e. 'openflow:1:1' rather than '1'. Change-Id: If9ae252c762ac26830539722481bcf11b58199e9 Signed-off-by: Evan Zeller --- .../MultipartWriterProviderFactory.java | 3 +- .../multipart/QueueStatsMultipartWriter.java | 57 +++++++++++++------ .../QueueDirectStatisticsServiceTest.java | 16 ++++++ .../QueueDirectStatisticsServiceTest.java | 16 ++++++ 4 files changed, 74 insertions(+), 18 deletions(-) diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/datastore/MultipartWriterProviderFactory.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/datastore/MultipartWriterProviderFactory.java index adae26e900..aa0c693de1 100644 --- a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/datastore/MultipartWriterProviderFactory.java +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/datastore/MultipartWriterProviderFactory.java @@ -50,7 +50,8 @@ public final class MultipartWriterProviderFactory { provider.register(MultipartType.OFPMPMETER, new MeterStatsMultipartWriter(deviceContext, instanceIdentifier)); provider.register(MultipartType.OFPMPPORTSTATS, new PortStatsMultipartWriter(deviceContext, instanceIdentifier, deviceContext.getPrimaryConnectionContext().getFeatures())); - provider.register(MultipartType.OFPMPQUEUE, new QueueStatsMultipartWriter(deviceContext, instanceIdentifier)); + provider.register(MultipartType.OFPMPQUEUE, new QueueStatsMultipartWriter(deviceContext, + instanceIdentifier, deviceContext.getPrimaryConnectionContext().getFeatures())); provider.register(MultipartType.OFPMPFLOW, new FlowStatsMultipartWriter(deviceContext, instanceIdentifier, deviceContext, deviceContext.getDeviceInfo().getVersion())); provider.register(MultipartType.OFPMPGROUPDESC, new GroupDescMultipartWriter(deviceContext, diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/datastore/multipart/QueueStatsMultipartWriter.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/datastore/multipart/QueueStatsMultipartWriter.java index 6fe50d03cb..f4a87bae45 100644 --- a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/datastore/multipart/QueueStatsMultipartWriter.java +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/datastore/multipart/QueueStatsMultipartWriter.java @@ -9,13 +9,17 @@ package org.opendaylight.openflowplugin.impl.datastore.multipart; import org.opendaylight.openflowplugin.api.openflow.device.TxFacade; +import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion; +import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.queues.Queue; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.queues.QueueBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.queues.QueueKey; +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.NodeConnectorKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FeaturesReply; import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.FlowCapableNodeConnectorQueueStatisticsData; import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.FlowCapableNodeConnectorQueueStatisticsDataBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.QueueIdAndStatisticsMap; @@ -24,8 +28,14 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; public class QueueStatsMultipartWriter extends AbstractMultipartWriter { - public QueueStatsMultipartWriter(final TxFacade txFacade, final InstanceIdentifier instanceIdentifier) { + private final FeaturesReply features; + + + public QueueStatsMultipartWriter(final TxFacade txFacade, + final InstanceIdentifier instanceIdentifier, + final FeaturesReply features) { super(txFacade, instanceIdentifier); + this.features = features; } @Override @@ -35,23 +45,36 @@ public class QueueStatsMultipartWriter extends AbstractMultipartWriter writeToTransaction( - getInstanceIdentifier() - .child(NodeConnector.class, new NodeConnectorKey(stat.getNodeConnectorId())) - .augmentation(FlowCapableNodeConnector.class) - .child(Queue.class, new QueueKey(stat.getQueueId())), - new QueueBuilder() - .setKey(new QueueKey(stat.getQueueId())) - .setQueueId(stat.getQueueId()) - .addAugmentation( - FlowCapableNodeConnectorQueueStatisticsData.class, - new FlowCapableNodeConnectorQueueStatisticsDataBuilder() - .setFlowCapableNodeConnectorQueueStatistics( - new FlowCapableNodeConnectorQueueStatisticsBuilder(stat).build()) - .build()) - .build(), - withParents)); + .forEach((stat) -> { + final Long port = InventoryDataServiceUtil + .portNumberfromNodeConnectorId(openflowVersion, stat.getNodeConnectorId()); + final NodeConnectorId id = InventoryDataServiceUtil + .nodeConnectorIdfromDatapathPortNo( + features.getDatapathId(), + port, + OpenflowVersion.get(features.getVersion())); + + writeToTransaction( + getInstanceIdentifier() + .child(NodeConnector.class, new NodeConnectorKey(id)) + .augmentation(FlowCapableNodeConnector.class) + .child(Queue.class, new QueueKey(stat.getQueueId())), + new QueueBuilder() + .setKey(new QueueKey(stat.getQueueId())) + .setQueueId(stat.getQueueId()) + .addAugmentation( + FlowCapableNodeConnectorQueueStatisticsData.class, + new FlowCapableNodeConnectorQueueStatisticsDataBuilder() + .setFlowCapableNodeConnectorQueueStatistics( + new FlowCapableNodeConnectorQueueStatisticsBuilder(stat) + .build()) + .build()) + .build(), + withParents); + }); } } diff --git a/openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/statistics/services/direct/multilayer/QueueDirectStatisticsServiceTest.java b/openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/statistics/services/direct/multilayer/QueueDirectStatisticsServiceTest.java index 3afe8edcd9..e57f794083 100644 --- a/openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/statistics/services/direct/multilayer/QueueDirectStatisticsServiceTest.java +++ b/openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/statistics/services/direct/multilayer/QueueDirectStatisticsServiceTest.java @@ -19,6 +19,7 @@ import static org.mockito.Mockito.when; import java.math.BigInteger; import java.util.Collections; import java.util.List; +import org.junit.Test; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.openflowplugin.api.openflow.device.Xid; import org.opendaylight.openflowplugin.impl.statistics.services.direct.AbstractDirectStatisticsServiceTest; @@ -93,10 +94,25 @@ public class QueueDirectStatisticsServiceTest extends AbstractDirectStatisticsSe assertEquals(map.getNodeConnectorId(), nodeConnectorId); } + @Test + public void testStoreStatisticsBarePortNo() throws Exception { + final QueueIdAndStatisticsMap map = mock(QueueIdAndStatisticsMap.class); + when(map.getQueueId()).thenReturn(new QueueId(QUEUE_NO)); + when(map.getNodeConnectorId()).thenReturn(new NodeConnectorId("1")); + + final List maps = Collections.singletonList(map); + final GetQueueStatisticsOutput output = mock(GetQueueStatisticsOutput.class); + when(output.getQueueIdAndStatisticsMap()).thenReturn(maps); + + multipartWriterProvider.lookup(MultipartType.OFPMPQUEUE).get().write(output, true); + verify(deviceContext).writeToTransactionWithParentsSlow(eq(LogicalDatastoreType.OPERATIONAL), any(), any()); + } + @Override public void testStoreStatistics() throws Exception { final QueueIdAndStatisticsMap map = mock(QueueIdAndStatisticsMap.class); when(map.getQueueId()).thenReturn(new QueueId(QUEUE_NO)); + when(map.getNodeConnectorId()).thenReturn(new NodeConnectorId("openflow:1:1")); final List maps = Collections.singletonList(map); final GetQueueStatisticsOutput output = mock(GetQueueStatisticsOutput.class); diff --git a/openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/statistics/services/direct/singlelayer/QueueDirectStatisticsServiceTest.java b/openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/statistics/services/direct/singlelayer/QueueDirectStatisticsServiceTest.java index 9f28b7d21b..d709649440 100644 --- a/openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/statistics/services/direct/singlelayer/QueueDirectStatisticsServiceTest.java +++ b/openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/statistics/services/direct/singlelayer/QueueDirectStatisticsServiceTest.java @@ -19,6 +19,7 @@ import static org.mockito.Mockito.when; import java.math.BigInteger; import java.util.Collections; import java.util.List; +import org.junit.Test; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.openflowplugin.api.openflow.device.Xid; import org.opendaylight.openflowplugin.impl.statistics.services.direct.AbstractDirectStatisticsServiceTest; @@ -89,10 +90,25 @@ public class QueueDirectStatisticsServiceTest extends AbstractDirectStatisticsSe assertEquals(map.getNodeConnectorId().getValue(), PORT_NO.toString()); } + @Test + public void testStoreStatisticsBarePortNo() throws Exception { + final QueueIdAndStatisticsMap map = mock(QueueIdAndStatisticsMap.class); + when(map.getQueueId()).thenReturn(new QueueId(QUEUE_NO)); + when(map.getNodeConnectorId()).thenReturn(new NodeConnectorId("1")); + + final List maps = Collections.singletonList(map); + final GetQueueStatisticsOutput output = mock(GetQueueStatisticsOutput.class); + when(output.getQueueIdAndStatisticsMap()).thenReturn(maps); + + multipartWriterProvider.lookup(MultipartType.OFPMPQUEUE).get().write(output, true); + verify(deviceContext).writeToTransactionWithParentsSlow(eq(LogicalDatastoreType.OPERATIONAL), any(), any()); + } + @Override public void testStoreStatistics() throws Exception { final QueueIdAndStatisticsMap map = mock(QueueIdAndStatisticsMap.class); when(map.getQueueId()).thenReturn(new QueueId(QUEUE_NO)); + when(map.getNodeConnectorId()).thenReturn(new NodeConnectorId("openflow:1:1")); final List maps = Collections.singletonList(map); final GetQueueStatisticsOutput output = mock(GetQueueStatisticsOutput.class); -- 2.36.6