# Scalar index
if e.type == 1:
return e.scalar_value
- return None
if e.type == 2:
return simple_counter_vec_list(api, e.simple_counter_vec)
if e.type == 3:
class VPPStatsIOError(IOError):
- pass
+ message = "Stat segment client connection returned: " \
+ "%(retval)s %(strerror)s."
+
+ strerror = {-1: "Stat client couldn't open socket",
+ -2: "Stat client socket open but couldn't connect",
+ -3: "Receiving file descriptor failed",
+ -4: "mmap fstat failed",
+ -5: "mmap map failed"
+ }
+
+ def __init__(self, message=None, **kwargs):
+ if 'retval' in kwargs:
+ self.retval = kwargs['retval']
+ kwargs['strerror'] = self.strerror[int(self.retval)]
+
+ if not message:
+ try:
+ message = self.message % kwargs
+ except Exception as e:
+ message = self.message
+ else:
+ message = message % kwargs
+
+ super(VPPStatsIOError, self).__init__(message)
class VPPStatsClientLoadError(RuntimeError):
break
if rv != 0:
- raise VPPStatsIOError()
+ raise VPPStatsIOError(retval=rv)
def heartbeat(self):
return self.api.stat_segment_heartbeat_r(self.client)
retries = 0
while True:
try:
- dir = self.ls(name)
- return self.dump(dir).values()[0]
+ d = self.ls(name)
+ s = self.dump(d)
+ if len(s) > 1:
+ raise AttributeError('Matches multiple counters {}'
+ .format(name))
+ k, v = s.popitem()
+ return v
except VPPStatsIOError as e:
if retries > 10:
return None