def process_stats(args): """Process the VPP Stats. The reply contains single item covering all paths. :param args: Command line arguments passed to VPP PAPI Provider. :type args: ArgumentParser :returns: JSON formatted string. :rtype: str :raises RuntimeError: If PAPI command error occurs. """ try: stats = VPPStats(args.socket) except Exception as err: raise RuntimeError(f"PAPI init failed:\n{err!r}") paths = json.loads(args.data) directory = stats.ls(paths) reply = [stats.dump(directory)] try: return json.dumps(reply) except UnicodeDecodeError as err: raise RuntimeError(f"PAPI reply {reply} error:\n{err!r}")
def process_stats(args): """Process the VPP Stats. :param args: Command line arguments passed to VPP PAPI Provider. :type args: ArgumentParser :returns: JSON formatted string. :rtype: str :raises RuntimeError: If PAPI command error occurs. """ try: stats = VPPStats(args.socket) except Exception as err: raise RuntimeError(f"PAPI init failed:\n{err!r}") json_data = json.loads(args.data) reply = list() for path in json_data: directory = stats.ls(path) data = stats.dump(directory) reply.append(data) try: return json.dumps(reply) except UnicodeDecodeError as err: raise RuntimeError(f"PAPI reply {reply} error:\n{err!r}")
def process_stats_request(args): """Process the VPP Stats requests. :param args: Command line arguments passed to VPP PAPI Provider. :type args: ArgumentParser :returns: JSON formatted string. :rtype: str :raises RuntimeError: If PAPI command error occurs. """ try: stats = VPPStats(args.socket) except Exception as err: raise RuntimeError('PAPI init failed:\n{err}'.format(err=repr(err))) try: json_data = json.loads(args.data) except ValueError as err: raise RuntimeError( 'Input json string is invalid:\n{err}'.format(err=repr(err))) papi_fn = getattr(stats, json_data["api_name"]) reply = papi_fn(**json_data.get("api_args", {})) return json.dumps(reply)
def test_client_fd_leak(self): """Test file descriptor count - VPP-1486""" cls = self.__class__ p = psutil.Process() initial_fds = p.num_fds() for _ in range(100): stats = VPPStats(socketname=cls.stats_sock) stats.disconnect() ending_fds = p.num_fds() self.assertEqual(initial_fds, ending_fds, "initial client side file descriptor count: %s " "is not equal to " "ending client side file descriptor count: %s" % ( initial_fds, ending_fds))
def setUpClass(cls): """ Perform class setup before running the testcase Remove shared memory files, start vpp and connect the vpp-api """ gc.collect() # run garbage collection first random.seed() cls.logger = get_logger(cls.__name__) if hasattr(cls, 'parallel_handler'): cls.logger.addHandler(cls.parallel_handler) cls.logger.propagate = False cls.tempdir = tempfile.mkdtemp( prefix='vpp-unittest-%s-' % cls.__name__) cls.stats_sock = "%s/stats.sock" % cls.tempdir cls.file_handler = FileHandler("%s/log.txt" % cls.tempdir) cls.file_handler.setFormatter( Formatter(fmt='%(asctime)s,%(msecs)03d %(message)s', datefmt="%H:%M:%S")) cls.file_handler.setLevel(DEBUG) cls.logger.addHandler(cls.file_handler) cls.shm_prefix = os.path.basename(cls.tempdir) os.chdir(cls.tempdir) cls.logger.info("Temporary dir is %s, shm prefix is %s", cls.tempdir, cls.shm_prefix) cls.setUpConstants() cls.reset_packet_infos() cls._captures = [] cls._zombie_captures = [] cls.verbose = 0 cls.vpp_dead = False cls.registry = VppObjectRegistry() cls.vpp_startup_failed = False cls.reporter = KeepAliveReporter() # need to catch exceptions here because if we raise, then the cleanup # doesn't get called and we might end with a zombie vpp try: cls.run_vpp() cls.reporter.send_keep_alive(cls, 'setUpClass') VppTestResult.current_test_case_info = TestCaseInfo( cls.logger, cls.tempdir, cls.vpp.pid, cls.vpp_bin) cls.vpp_stdout_deque = deque() cls.vpp_stderr_deque = deque() cls.pump_thread_stop_flag = Event() cls.pump_thread_wakeup_pipe = os.pipe() cls.pump_thread = Thread(target=pump_output, args=(cls,)) cls.pump_thread.daemon = True cls.pump_thread.start() if cls.debug_gdb or cls.debug_gdbserver: read_timeout = 0 else: read_timeout = 5 cls.vapi = VppPapiProvider(cls.shm_prefix, cls.shm_prefix, cls, read_timeout) if cls.step: hook = StepHook(cls) else: hook = PollHook(cls) cls.vapi.register_hook(hook) cls.wait_for_stats_socket() cls.statistics = VPPStats(socketname=cls.stats_sock) try: hook.poll_vpp() except VppDiedError: cls.vpp_startup_failed = True cls.logger.critical( "VPP died shortly after startup, check the" " output to standard error for possible cause") raise try: cls.vapi.connect() except Exception: try: cls.vapi.disconnect() except Exception: pass if cls.debug_gdbserver: print(colorize("You're running VPP inside gdbserver but " "VPP-API connection failed, did you forget " "to 'continue' VPP from within gdb?", RED)) raise except Exception: try: cls.quit() except Exception: pass raise