X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=src%2Femuvim%2Fapi%2Frest%2Fcompute.py;h=dc2b611a9858f5b048669f87406ae37d916e5f69;hb=a5a0ea08373c54e0855efad1dcc83d67ba577943;hp=e412133c99bf2a5834a3b70066bb97e614237c8f;hpb=8414ccbe462576089a53b1fdb58df056099b502d;p=osm%2Fvim-emu.git diff --git a/src/emuvim/api/rest/compute.py b/src/emuvim/api/rest/compute.py index e412133..dc2b611 100755 --- a/src/emuvim/api/rest/compute.py +++ b/src/emuvim/api/rest/compute.py @@ -32,9 +32,12 @@ import json logging.basicConfig(level=logging.INFO) +CORS_HEADER = {'Access-Control-Allow-Origin': '*'} + dcs = {} -class ComputeStart(Resource): + +class Compute(Resource): """ Start a new compute instance: A docker container (note: zerorpc does not support keyword arguments) :param dc_label: name of the DC @@ -47,28 +50,66 @@ class ComputeStart(Resource): """ global dcs - 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 data is None: - data = {} - elif 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") + def put(self, dc_label, compute_name, resource=None, value=None): + # check if resource update + if resource and value: + c = self._update_resource(dc_label, compute_name, resource, value) + return c.getStatus(), 200 + + # deploy new container + # check if json data is a dict + data = request.json + if data is None: + data = {} + elif 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") + try: + logging.debug("API CALL: compute start") c = dcs.get(dc_label).startCompute( - compute_name, image= image, command= command, network= nw_list) + compute_name, image=image, command=command, network=nw_list) # return docker inspect dict - return c.getStatus(), 200 + return c.getStatus(), 200, CORS_HEADER + except Exception as ex: + logging.exception("API error.") + return ex.message, 500, CORS_HEADER + + def _update_resource(self, dc_label, compute_name, resource, value): + #check if container exists + d = dcs.get(dc_label).net.getNodeByName(compute_name) + if resource == 'cpu': + cpu_period = int(dcs.get(dc_label).net.cpu_period) + cpu_quota = int(cpu_period * float(value)) + #put default values back + if float(value) <= 0: + cpu_period = 100000 + cpu_quota = -1 + d.updateCpuLimit(cpu_period=cpu_period, cpu_quota=cpu_quota) + return d + + + def get(self, dc_label, compute_name): + + logging.debug("API CALL: compute status") + + try: + return dcs.get(dc_label).containers.get(compute_name).getStatus(), 200, CORS_HEADER + except Exception as ex: + logging.exception("API error.") + return ex.message, 500, CORS_HEADER + + def delete(self, dc_label, compute_name): + logging.debug("API CALL: compute stop") + try: + return dcs.get(dc_label).stopCompute(compute_name), 200, CORS_HEADER except Exception as ex: logging.exception("API error.") - return ex.message, 500 + return ex.message, 500, CORS_HEADER def _parse_network(self, network_str): ''' @@ -78,7 +119,8 @@ class ComputeStart(Resource): ''' nw_list = list() - if network_str is None or '),(' not in network_str : + # TODO make this more robust with regex check + if network_str is None: return nw_list networks = network_str[1:-1].split('),(') @@ -88,77 +130,47 @@ class ComputeStart(Resource): return nw_list -class ComputeStop(Resource): - - global dcs - - def get(self, dc_label, compute_name): - logging.debug("API CALL: compute stop") - try: - return dcs.get(dc_label).stopCompute(compute_name), 200 - except Exception as ex: - logging.exception("API error.") - return ex.message,500 - class ComputeList(Resource): - global dcs - def get(self, dc_label): + def get(self, dc_label=None): logging.debug("API CALL: compute list") try: - if dc_label == 'None': + if dc_label is None or dc_label == 'None': # return list with all compute nodes in all DCs all_containers = [] for dc in dcs.itervalues(): all_containers += dc.listCompute() - return [(c.name, c.getStatus()) for c in all_containers], 200 + return [(c.name, c.getStatus()) for c in all_containers], 200, CORS_HEADER else: # return list of compute nodes for specified DC return [(c.name, c.getStatus()) - for c in dcs.get(dc_label).listCompute()], 200 + for c in dcs.get(dc_label).listCompute()], 200, CORS_HEADER except Exception as ex: logging.exception("API error.") - return ex.message, 500 - - -class ComputeStatus(Resource): - - global dcs - - def get(self, dc_label, compute_name): - - logging.debug("API CALL: compute list") + return ex.message, 500, CORS_HEADER - try: - return dcs.get(dc_label).containers.get(compute_name).getStatus(), 200 - except Exception as ex: - logging.exception("API error.") - return ex.message, 500 class DatacenterList(Resource): - global dcs def get(self): logging.debug("API CALL: datacenter list") try: - return [d.getStatus() for d in dcs.itervalues()], 200 + return [d.getStatus() for d in dcs.itervalues()], 200, CORS_HEADER except Exception as ex: logging.exception("API error.") - return ex.message, 500 + return ex.message, 500, CORS_HEADER -class DatacenterStatus(Resource): +class DatacenterStatus(Resource): global dcs def get(self, dc_label): logging.debug("API CALL: datacenter status") try: - return dcs.get(dc_label).getStatus(), 200 + return dcs.get(dc_label).getStatus(), 200, CORS_HEADER except Exception as ex: logging.exception("API error.") - return ex.message, 500 - - + return ex.message, 500, CORS_HEADER