X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=resources%2Ftools%2Fpapi%2Fvpp_papi_provider.py;h=ded3c3069e14c8c835e83a4ae4eafb3259b1741c;hb=1577123a3c27541181097cb4186aa8855f20b1cc;hp=299cd2c962f71f12681e52064ad82a63c44d096c;hpb=2dc5924d35671c01e9aaa4ea6b9ae18bdd184ca8;p=csit.git diff --git a/resources/tools/papi/vpp_papi_provider.py b/resources/tools/papi/vpp_papi_provider.py index 299cd2c962..ded3c3069e 100755 --- a/resources/tools/papi/vpp_papi_provider.py +++ b/resources/tools/papi/vpp_papi_provider.py @@ -96,7 +96,20 @@ def _convert_reply(api_r): reply_value = dict() for item in dir(api_r): if not item.startswith('_') and item not in unwanted_fields: - reply_value[item] = getattr(api_r, item) + attr_value = getattr(api_r, item) + if isinstance(attr_value, list) or isinstance(attr_value, dict): + value = attr_value + elif hasattr(attr_value, '__int__'): + value = int(attr_value) + elif hasattr(attr_value, '__str__'): + value = binascii.hexlify(str(attr_value)) + # Next handles parameters not supporting preferred integer or string + # representation to get it logged + elif hasattr(attr_value, '__repr__'): + value = repr(attr_value) + else: + value = attr_value + reply_value[item] = value reply_dict[reply_key] = reply_value return reply_dict @@ -118,6 +131,19 @@ def process_json_request(args): reply = list() + def process_value(val): + if isinstance(val, dict): + val_dict = dict() + for val_k, val_v in val.iteritems(): + val_dict[str(val_k)] = process_value(val_v) + return val_dict + elif isinstance(val, unicode): + return binascii.unhexlify(val) + elif isinstance(val, int): + return val + else: + return str(val) + json_data = json.loads(args.data) vpp.connect(CLIENT_NAME) for data in json_data: @@ -126,8 +152,7 @@ def process_json_request(args): api_reply = dict(api_name=api_name) api_args = dict() for a_k, a_v in api_args_unicode.items(): - value = binascii.unhexlify(a_v) if isinstance(a_v, unicode) else a_v - api_args[str(a_k)] = value if isinstance(value, int) else str(value) + api_args[str(a_k)] = process_value(a_v) try: papi_fn = getattr(vpp.api, api_name) rep = papi_fn(**api_args) @@ -182,6 +207,37 @@ def process_stats(args): data = stats.dump(directory) reply.append(data) + try: + return json.dumps(reply) + except UnicodeDecodeError as err: + raise RuntimeError('PAPI reply {reply} error:\n{exc}'.format( + reply=reply, exc=repr(err))) + + +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) @@ -193,7 +249,8 @@ def main(): process_request = dict( request=process_json_request, dump=process_json_request, - stats=process_stats + stats=process_stats, + stats_request=process_stats_request ) parser = argparse.ArgumentParser(