[NFVBENCH-81]With some Intel X710 NIC cards, NFVbench reports erroneous RX counters
[nfvbench.git] / nfvbench / chain_managers.py
index cbc53e2..de6afca 100644 (file)
@@ -96,11 +96,12 @@ class StatsManager(object):
             raise exc
 
     def _get_data(self):
-        return self.worker.get_data()
+        return self.worker.get_data() if self.worker else {}
 
-    def _get_network(self, traffic_port, index=None, reverse=False):
-        interfaces = [self.clients['traffic'].get_interface(traffic_port)]
-        interfaces.extend(self.worker.get_network_interfaces(index))
+    def _get_network(self, traffic_port, index, stats, reverse=False):
+        interfaces = [self.clients['traffic'].get_interface(traffic_port, stats)]
+        if self.worker:
+            interfaces.extend(self.worker.get_network_interfaces(index))
         return Network(interfaces, reverse)
 
     def _config_interfaces(self):
@@ -111,7 +112,7 @@ class StatsManager(object):
 
     def _generate_traffic(self):
         if self.config.no_traffic:
-            return
+            return {}
 
         self.interval_collector = IntervalCollector(time.time())
         self.interval_collector.attach_notifier(self.notifier)
@@ -127,13 +128,14 @@ class StatsManager(object):
         return self.interval_collector.get() if self.interval_collector else []
 
     def get_version(self):
-        return self.worker.get_version()
+        return self.worker.get_version() if self.worker else {}
 
     def run(self):
         """
         Run analysis in both direction and return the analysis
         """
-        self.worker.run()
+        if self.worker:
+            self.worker.run()
 
         stats = self._generate_traffic()
         result = {
@@ -142,22 +144,27 @@ class StatsManager(object):
             'stats': stats
         }
 
+        # fetch latest stats from traffic gen
+        if self.config.no_traffic:
+            stats = None
+        else:
+            stats = self.clients['traffic'].get_stats()
         LOG.info('Requesting packet analysis on the forward direction...')
         result['packet_analysis']['direction-forward'] = \
-            self.get_analysis([self._get_network(0, 0),
-                               self._get_network(0, 1, reverse=True)])
+            self.get_analysis([self._get_network(0, 0, stats),
+                               self._get_network(0, 1, stats, reverse=True)])
         LOG.info('Packet analysis on the forward direction completed')
 
         LOG.info('Requesting packet analysis on the reverse direction...')
         result['packet_analysis']['direction-reverse'] = \
-            self.get_analysis([self._get_network(1, 1),
-                               self._get_network(1, 0, reverse=True)])
+            self.get_analysis([self._get_network(1, 1, stats),
+                               self._get_network(1, 0, stats, reverse=True)])
 
         LOG.info('Packet analysis on the reverse direction completed')
         return result
 
     def get_compute_nodes_bios(self):
-        return self.worker.get_compute_nodes_bios()
+        return self.worker.get_compute_nodes_bios() if self.worker else {}
 
     @staticmethod
     def get_analysis(nets):
@@ -176,7 +183,8 @@ class StatsManager(object):
         return packet_analyzer.get_analysis()
 
     def close(self):
-        self.worker.close()
+        if self.worker:
+            self.worker.close()
 
 
 class PVPStatsManager(StatsManager):
@@ -202,16 +210,20 @@ class PVVPStatsManager(StatsManager):
             'packet_analysis': {},
             'stats': stats
         }
-
-        fwd_nets = [self._get_network(0, 0)]
+        # fetch latest stats from traffic gen
+        if self.config.no_traffic:
+            stats = None
+        else:
+            stats = self.clients['traffic'].get_stats()
+        fwd_nets = [self._get_network(0, 0, stats)]
         if fwd_v2v_net:
             fwd_nets.append(fwd_v2v_net)
-        fwd_nets.append(self._get_network(0, 1, reverse=True))
+        fwd_nets.append(self._get_network(0, 1, stats, reverse=True))
 
-        rev_nets = [self._get_network(1, 1)]
+        rev_nets = [self._get_network(1, 1, stats)]
         if rev_v2v_net:
             rev_nets.append(rev_v2v_net)
-        rev_nets.append(self._get_network(1, 0, reverse=True))
+        rev_nets.append(self._get_network(1, 0, stats, reverse=True))
 
         LOG.info('Requesting packet analysis on the forward direction...')
         result['packet_analysis']['direction-forward'] = self.get_analysis(fwd_nets)
@@ -229,10 +241,13 @@ class EXTStatsManager(StatsManager):
         StatsManager.__init__(self, config, clients, specs, factory, vlans, notifier)
 
     def _setup(self):
-        WORKER_CLASS = self.factory.get_chain_worker(self.specs.openstack.encaps,
-                                                     self.config.service_chain)
-        self.worker = WORKER_CLASS(self.config, self.clients, self.specs)
-        self.worker.set_vlans(self.vlans)
+        if self.specs.openstack:
+            WORKER_CLASS = self.factory.get_chain_worker(self.specs.openstack.encaps,
+                                                         self.config.service_chain)
+            self.worker = WORKER_CLASS(self.config, self.clients, self.specs)
+            self.worker.set_vlans(self.vlans)
 
-        if not self.config.no_int_config:
-            self._config_interfaces()
+            if not self.config.no_int_config:
+                self._config_interfaces()
+        else:
+            self.worker = None