From a132d6e141fccc257c0814fb6e24927e41f3a028 Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 25 Apr 2019 20:32:10 +0200 Subject: [PATCH] Refactor client into class --- scripts/rest_client.py | 95 +++++++++++++++++++++++++++--------------- 1 file changed, 62 insertions(+), 33 deletions(-) diff --git a/scripts/rest_client.py b/scripts/rest_client.py index bd1187a3e..4e576d3cd 100755 --- a/scripts/rest_client.py +++ b/scripts/rest_client.py @@ -10,10 +10,10 @@ so it can be used as a standalone script. import argparse import json import logging -from sys import argv +from urllib.parse import urlencode, urlparse, urlunparse from pathlib import Path -from requests import get +import requests from requests.exceptions import ConnectionError logging.basicConfig( @@ -37,6 +37,63 @@ INFO_COMMANDS = {"version": [], } +class FtRestClient(): + + def __init__(self, serverurl): + self.serverurl = serverurl + + self.session = requests.Session() + + def call(self, method, apipath, params: dict = None, data=None, files=None): + + if str(method).upper() not in ('GET', 'POST', 'PUT', 'DELETE'): + raise ValueError('invalid method <{0}>'.format(method)) + basepath = f"{self.serverurl}/{apipath}" + + hd = {"Accept": "application/json", + "Content-Type": "application/json" + } + + # Split url + schema, netloc, path, params, query, fragment = urlparse(basepath) + # URLEncode query string + query = urlencode(params) + # recombine url + url = urlunparse((schema, netloc, path, params, query, fragment)) + print(url) + try: + + req = requests.Request(method, url, headers=hd, data=data, + # auth=self.session.auth + ) + reqp = req.prepare() + return self.session.send(reqp).json() + # return requests.get(url).json() + except ConnectionError: + logger.warning("Connection error") + + def call_command_noargs(self, command): + logger.info(f"Running command `{command}` at {self.serverurl}") + r = self.call("GET", command) + logger.info(r) + + def call_info(self, command, command_args): + logger.info( + f"Running command `{command}` with parameters `{command_args}` at {self.serverurl}") + args = INFO_COMMANDS[command] + if len(args) < len(command_args): + logger.error(f"Command {command} does only support {len(args)} arguments.") + return + params = {} + for idx, arg in enumerate(command_args): + params[args[idx]] = arg + + logger.debug(params) + r = self.call("GET", command, params) + + logger.info(r) + + def add_arguments(): parser = argparse.ArgumentParser() parser.add_argument("command", @@ -74,48 +131,20 @@ def load_config(configfile): return {} -def call_authorized(url): - try: - return get(url).json() - except ConnectionError: - logger.warning("Connection error") - - -def call_command_noargs(server_url, command): - logger.info(f"Running command `{command}` at {server_url}") - r = call_authorized(f"{server_url}/{command}") - logger.info(r) - - -def call_info(server_url, command, command_args): - logger.info(f"Running command `{command}` with parameters `{command_args}` at {server_url}") - call = f"{server_url}/{command}?" - args = INFO_COMMANDS[command] - if len(args) < len(command_args): - logger.error(f"Command {command} does only support {len(args)} arguments.") - return - for idx, arg in enumerate(command_args): - - call += f"{args[idx]}={arg}" - logger.debug(call) - r = call_authorized(call) - - logger.info(r) - - def main(args): config = load_config(args["config"]) url = config.get("api_server", {}).get("server_url", "127.0.0.1") port = config.get("api_server", {}).get("listen_port", "8080") server_url = f"http://{url}:{port}" + client = FtRestClient(server_url) # Call commands without arguments if args["command"] in COMMANDS_NO_ARGS: - call_command_noargs(server_url, args["command"]) + client.call_command_noargs(args["command"]) if args["command"] in INFO_COMMANDS: - call_info(server_url, args["command"], args["command_arguments"]) + client.call_info(args["command"], args["command_arguments"]) if __name__ == "__main__":