must use full node-connector string when writing queue stats 83/70683/6
authorEvan Zeller <evanrzeller@gmail.com>
Mon, 9 Apr 2018 23:54:17 +0000 (16:54 -0700)
committerEvan Zeller <evanrzeller@gmail.com>
Wed, 25 Apr 2018 21:06:12 +0000 (21:06 +0000)
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 <evanrzeller@gmail.com>
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/datastore/MultipartWriterProviderFactory.java
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/datastore/multipart/QueueStatsMultipartWriter.java
openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/statistics/services/direct/multilayer/QueueDirectStatisticsServiceTest.java
openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/statistics/services/direct/singlelayer/QueueDirectStatisticsServiceTest.java

index adae26e900ef27f3c28316c05eeb9596dd7840e8..aa0c693de1b38a06b698e23a9ae7ed79946b43ba 100644 (file)
@@ -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,
index 6fe50d03cbf6cdbb871e14ae416fa093586fa908..f4a87bae456ab3fd0cba806a6d88fdddd0ab2810 100644 (file)
@@ -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<QueueIdAndStatisticsMap> {
 
-    public QueueStatsMultipartWriter(final TxFacade txFacade, final InstanceIdentifier<Node> instanceIdentifier) {
+    private final FeaturesReply features;
+
+
+    public QueueStatsMultipartWriter(final TxFacade txFacade,
+                                     final InstanceIdentifier<Node> instanceIdentifier,
+                                     final FeaturesReply features) {
         super(txFacade, instanceIdentifier);
+        this.features = features;
     }
 
     @Override
@@ -35,23 +45,36 @@ public class QueueStatsMultipartWriter extends AbstractMultipartWriter<QueueIdAn
 
     @Override
     public void storeStatistics(final QueueIdAndStatisticsMap statistics, final boolean withParents) {
+        final OpenflowVersion openflowVersion = OpenflowVersion.get(features.getVersion());
+
         statistics.getQueueIdAndStatisticsMap()
-            .forEach(stat -> 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);
+            });
     }
 
 }
index 3afe8edcd9095546c4a4287cfad0e7a21203a946..e57f79408353772ed2138f28394241fde4d12e55 100644 (file)
@@ -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<QueueIdAndStatisticsMap> 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<QueueIdAndStatisticsMap> maps = Collections.singletonList(map);
         final GetQueueStatisticsOutput output = mock(GetQueueStatisticsOutput.class);
index 9f28b7d21b519fab4dec62c9bfee96e61964e55f..d7096494407dd154bcb28248c53d60796d4bdcd9 100644 (file)
@@ -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<QueueIdAndStatisticsMap> 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<QueueIdAndStatisticsMap> maps = Collections.singletonList(map);
         final GetQueueStatisticsOutput output = mock(GetQueueStatisticsOutput.class);