fix container image and use latest code
[samplevnf.git] / VNFs / DPPD-PROX / helper-scripts / rapid / prox_ctrl.py
index 8cd2e3f..40375c5 100644 (file)
@@ -25,7 +25,7 @@ import os
 import time
 import subprocess
 import socket
-from rapid_log import RapidLog 
+from rapid_log import RapidLog
 
 class prox_ctrl(object):
     def __init__(self, ip, key=None, user=None):
@@ -223,9 +223,10 @@ class prox_sock(object):
             result['lat_avg'] += int(stats[2])
             #min_since begin = int(stats[3])
             #max_since_begin = int(stats[4])
-            result['lat_tsc'] = int(stats[5]) # Taking the last tsc as the timestamp since
-                                # PROX will return the same tsc for each 
-                                # core/task combination 
+            result['lat_tsc'] = int(stats[5])
+            # Taking the last tsc as the timestamp since
+            # PROX will return the same tsc for each
+            # core/task combination
             result['lat_hz'] = int(stats[6])
             #coreid = int(stats[7])
             #taskid = int(stats[8])
@@ -241,7 +242,7 @@ class prox_sock(object):
             result['buckets'][0] = int(stats[1])
             for i in range(1, 128):
                 stats = self._recv().split(':')
-                result['buckets'][i] = int(stats[1])
+                result['buckets'][i] += int(stats[1])
         result['lat_avg'] = old_div(result['lat_avg'],
                 number_tasks_returning_stats)
         self._send('stats latency(0).used')
@@ -252,7 +253,7 @@ class prox_sock(object):
         return (result)
 
     def irq_stats(self, core, bucket, task=0):
-        self._send('stats task.core(%s).task(%s).irq(%s)' % 
+        self._send('stats task.core(%s).task(%s).irq(%s)' %
                 (core, task, bucket))
         stats = self._recv().split(',')
         return int(stats[0])
@@ -266,12 +267,12 @@ class prox_sock(object):
 
     def core_stats(self, cores, tasks=[0]):
         rx = tx = drop = tsc = hz = rx_non_dp = tx_non_dp = tx_fail = 0
-        self._send('dp core stats %s %s' % (','.join(map(str, cores)), 
+        self._send('dp core stats %s %s' % (','.join(map(str, cores)),
             ','.join(map(str, tasks))))
         for core in cores:
             for task in tasks:
                 stats = self._recv().split(',')
-                if stats[0].startswith('error'):  
+                if stats[0].startswith('error'):
                     if stats[0].startswith('error: invalid syntax'):
                         RapidLog.critical("dp core stats error: unexpected \
                                 invalid syntax (potential incompatibility \
@@ -292,7 +293,7 @@ class prox_sock(object):
         rx = tx = port_id = tsc = no_mbufs = errors = 0
         self._send('multi port stats %s' % (','.join(map(str, ports))))
         result = self._recv().split(';')
-        if result[0].startswith('error'):  
+        if result[0].startswith('error'):
             RapidLog.critical("multi port stats error: unexpected invalid \
                     syntax (potential incompatibility between scripts and \
                     PROX)")
@@ -308,19 +309,19 @@ class prox_sock(object):
         return rx, tx, no_mbufs, errors, tsc
 
     def set_random(self, cores, task, offset, mask, length):
-        self._send('set random %s %s %s %s %s' % (','.join(map(str, cores)), 
+        self._send('set random %s %s %s %s %s' % (','.join(map(str, cores)),
             task, offset, mask, length))
 
     def set_size(self, cores, task, pkt_size):
-        self._send('pkt_size %s %s %s' % (','.join(map(str, cores)), task, 
+        self._send('pkt_size %s %s %s' % (','.join(map(str, cores)), task,
             pkt_size))
 
     def set_imix(self, cores, task, imix):
-        self._send('imix %s %s %s' % (','.join(map(str, cores)), task, 
+        self._send('imix %s %s %s' % (','.join(map(str, cores)), task,
             ','.join(map(str,imix))))
 
     def set_value(self, cores, task, offset, value, length):
-        self._send('set value %s %s %s %s %s' % (','.join(map(str, cores)), 
+        self._send('set value %s %s %s %s %s' % (','.join(map(str, cores)),
             task, offset, value, length))
 
     def quit_prox(self):
@@ -330,16 +331,24 @@ class prox_sock(object):
         """Append LF and send command to the PROX instance."""
         if self._sock is None:
             raise RuntimeError("PROX socket closed, cannot send '%s'" % cmd)
-        self._sock.sendall(cmd.encode() + b'\n')
+        try:
+            self._sock.sendall(cmd.encode() + b'\n')
+        except ConnectionResetError as e:
+            RapidLog.error('Pipe reset by Prox instance: traffic too high?')
+            raise
 
     def _recv(self):
         """Receive response from PROX instance, return it with LF removed."""
         if self._sock is None:
             raise RuntimeError("PROX socket closed, cannot receive anymore")
-        pos = self._rcvd.find(b'\n')
-        while pos == -1:
-            self._rcvd += self._sock.recv(256)
+        try:
             pos = self._rcvd.find(b'\n')
-        rsp = self._rcvd[:pos]
-        self._rcvd = self._rcvd[pos+1:]
+            while pos == -1:
+                self._rcvd += self._sock.recv(256)
+                pos = self._rcvd.find(b'\n')
+            rsp = self._rcvd[:pos]
+            self._rcvd = self._rcvd[pos+1:]
+        except ConnectionResetError as e:
+            RapidLog.error('Pipe reset by Prox instance: traffic too high?')
+            raise
         return rsp.decode()