From ff6b404f001a0460252a29051bc34c07c91e4cf1 Mon Sep 17 00:00:00 2001 From: stevenvanrossem Date: Thu, 14 Jul 2016 20:51:37 +0200 Subject: [PATCH] flask json argument needs to be a dict for unviersal use of the rest api --- src/emuvim/api/rest/compute.py | 34 ++++++++++++++++++++++++++++++---- src/emuvim/api/rest/network.py | 17 +++++++++++------ src/emuvim/cli/rest/compute.py | 24 +++--------------------- src/emuvim/cli/rest/network.py | 4 ++-- 4 files changed, 46 insertions(+), 33 deletions(-) diff --git a/src/emuvim/api/rest/compute.py b/src/emuvim/api/rest/compute.py index b935af8..f8da428 100755 --- a/src/emuvim/api/rest/compute.py +++ b/src/emuvim/api/rest/compute.py @@ -50,18 +50,42 @@ class ComputeStart(Resource): def put(self, dc_label, compute_name): logging.debug("API CALL: compute start") try: + #check if json data is a dict + data = request.json + if type(data) is not dict: + data = json.loads(request.json) + + network = data.get("network") + nw_list = self._parse_network(network) + image = data.get("image") + command = data.get("docker_command") - image = json.loads(request.json).get("image") - network = json.loads(request.json).get("network") - command = json.loads(request.json).get("docker_command") c = dcs.get(dc_label).startCompute( - compute_name, image= image, command= command, network= network) + compute_name, image= image, command= command, network= nw_list) # return docker inspect dict return c.getStatus(), 200 except Exception as ex: logging.exception("API error.") return ex.message, 500 + def _parse_network(self, network_str): + ''' + parse the options for all network interfaces of the vnf + :param network_str: (id=x,ip=x.x.x.x/x), ... + :return: list of dicts [{"id":x,"ip":"x.x.x.x/x"}, ...] + ''' + nw_list = list() + + if network_str is None or '),(' not in network_str : + return nw_list + + networks = network_str[1:-1].split('),(') + for nw in networks: + nw_dict = dict(tuple(e.split('=')) for e in nw.split(',')) + nw_list.append(nw_dict) + + return nw_list + class ComputeStop(Resource): global dcs @@ -134,3 +158,5 @@ class DatacenterStatus(Resource): except Exception as ex: logging.exception("API error.") return ex.message, 500 + + diff --git a/src/emuvim/api/rest/network.py b/src/emuvim/api/rest/network.py index ee0c389..68256f5 100755 --- a/src/emuvim/api/rest/network.py +++ b/src/emuvim/api/rest/network.py @@ -72,12 +72,17 @@ class NetworkAction(Resource): # call DCNetwork method, not really datacenter specific API for now... # no check if vnfs are really connected to this datacenter... try: - vnf_src_interface = json.loads(request.json).get("vnf_src_interface") - vnf_dst_interface = json.loads(request.json).get("vnf_dst_interface") - weight = json.loads(request.json).get("weight") - match = json.loads(request.json).get("match") - bidirectional = json.loads(request.json).get("bidirectional") - cookie = json.loads(request.json).get("cookie") + # check if json data is a dict + data = request.json + if type(data) is not dict: + data = json.loads(request.json) + + vnf_src_interface = data.get("vnf_src_interface") + vnf_dst_interface = data.get("vnf_dst_interface") + weight = data.get("weight") + match = data.get("match") + bidirectional = data.get("bidirectional") + cookie = data.get("cookie") c = net.setChain( vnf_src_name, vnf_dst_name, vnf_src_interface=vnf_src_interface, diff --git a/src/emuvim/cli/rest/compute.py b/src/emuvim/cli/rest/compute.py index 2a055a3..3a719cc 100755 --- a/src/emuvim/cli/rest/compute.py +++ b/src/emuvim/cli/rest/compute.py @@ -47,18 +47,16 @@ class RestApiClient(): def start(self, args): - nw_list = list() - if args.get("network") is not None: - nw_list = self._parse_network(args.get("network")) req = {'image':args.get("image"), 'command':args.get("docker_command"), - 'network':nw_list} + 'network':args.get("network")} response = put("%s/restapi/compute/%s/%s/start" % (args.get("endpoint"), args.get("datacenter"), args.get("name")), - json = json.dumps(req)) + json = req) + pp.pprint(response.json()) def stop(self, args): @@ -109,22 +107,6 @@ class RestApiClient(): pp.pprint(list) - - def _parse_network(self, network_str): - ''' - parse the options for all network interfaces of the vnf - :param network_str: (id=x,ip=x.x.x.x/x), ... - :return: list of dicts [{"id":x,"ip":"x.x.x.x/x"}, ...] - ''' - nw_list = list() - networks = network_str[1:-1].split('),(') - for nw in networks: - nw_dict = dict(tuple(e.split('=')) for e in nw.split(',')) - nw_list.append(nw_dict) - - return nw_list - - parser = argparse.ArgumentParser(description='son-emu datacenter') parser.add_argument( "command", diff --git a/src/emuvim/cli/rest/network.py b/src/emuvim/cli/rest/network.py index c87a924..c6e1dcc 100755 --- a/src/emuvim/cli/rest/network.py +++ b/src/emuvim/cli/rest/network.py @@ -61,7 +61,7 @@ class RestApiClient(): (args.get("endpoint"), vnf_src_name, vnf_dst_name), - json=json.dumps(params)) + json=params) pp.pprint(response.json()) def remove(self, args): @@ -80,7 +80,7 @@ class RestApiClient(): (args.get("endpoint"), vnf_src_name, vnf_dst_name), - json=json.dumps(params)) + json=params) pp.pprint(response.json()) def _parse_vnf_name(self, vnf_name_str): -- 2.25.1