From: stevenvanrossem Date: Fri, 10 Feb 2017 11:56:15 +0000 (+0100) Subject: update son-emu rest API to control resources (link to docker update in containernet) X-Git-Tag: v3.1~44^2~5 X-Git-Url: https://osm.etsi.org/gitweb/?p=osm%2Fvim-emu.git;a=commitdiff_plain;h=7953f2fa5e8041cb8abdcb376bfa0bc8b988f229 update son-emu rest API to control resources (link to docker update in containernet) --- diff --git a/src/emuvim/api/rest/compute.py b/src/emuvim/api/rest/compute.py index dc2b611..2ffa3e8 100755 --- a/src/emuvim/api/rest/compute.py +++ b/src/emuvim/api/rest/compute.py @@ -29,6 +29,7 @@ import logging from flask_restful import Resource from flask import request import json +from copy import deepcopy logging.basicConfig(level=logging.INFO) @@ -51,10 +52,6 @@ class Compute(Resource): global dcs 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 @@ -79,20 +76,6 @@ class Compute(Resource): 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") @@ -151,6 +134,74 @@ class ComputeList(Resource): logging.exception("API error.") return ex.message, 500, CORS_HEADER +class ComputeResources(Resource): + """ + Update the container's resources using the docker.update function + re-using the same parameters: + url params: + blkio_weight + cpu_period, cpu_quota, cpu_shares + cpuset_cpus + cpuset_mems + mem_limit + mem_reservation + memswap_limit + kernel_memory + restart_policy + see https://docs.docker.com/engine/reference/commandline/update/ + or API docs: https://docker-py.readthedocs.io/en/stable/api.html#module-docker.api.container + :param dc_label: name of the DC + :param compute_name: compute container name + + :return: docker inspect dict of deployed docker + """ + global dcs + + def put(self, dc_label, compute_name): + logging.debug("REST CALL: update container resources") + + try: + c = self._update_resources(dc_label, compute_name) + return c.getStatus(), 200, CORS_HEADER + except Exception as ex: + logging.exception("API error.") + return ex.message, 500, CORS_HEADER + + def _update_resources(self, dc_label, compute_name): + + # get URL parameters + params = request.args + # then no data + if params is None: + params = {} + logging.info("REST CALL: update container resources {0}".format(params)) + #check if container exists + d = dcs.get(dc_label).net.getNodeByName(compute_name) + + # general request of cpu percentage + # create a mutable copy + params = params.to_dict() + if 'cpu' in params: + cpu_period = int(dcs.get(dc_label).net.cpu_period) + value = params.get('cpu') + cpu_quota = int(cpu_period * float(value)) + #put default values back + if float(value) <= 0: + cpu_period = 100000 + cpu_quota = -1 + params['cpu_period'] = cpu_period + params['cpu_quota'] = cpu_quota + #d.updateCpuLimit(cpu_period=cpu_period, cpu_quota=cpu_quota) + + # only pass allowed keys to docker + allowed_keys = ['blkio_weight', 'cpu_period', 'cpu_quota', 'cpu_shares', 'cpuset_cpus', + 'cpuset_mems', 'mem_limit', 'mem_reservation', 'memswap_limit', + 'kernel_memory', 'restart_policy'] + filtered_params = {key:params[key] for key in allowed_keys if key in params} + + d.update_resources(**filtered_params) + + return d class DatacenterList(Resource): global dcs diff --git a/src/emuvim/api/rest/rest_api_endpoint.py b/src/emuvim/api/rest/rest_api_endpoint.py index 0ecf548..fc48a33 100755 --- a/src/emuvim/api/rest/rest_api_endpoint.py +++ b/src/emuvim/api/rest/rest_api_endpoint.py @@ -32,7 +32,7 @@ from flask_restful import Api # need to import total module to set its global variable dcs import compute -from compute import dcs, ComputeList, Compute, DatacenterList, DatacenterStatus +from compute import dcs, ComputeList, Compute, ComputeResources, DatacenterList, DatacenterStatus # need to import total module to set its global variable net import network @@ -62,12 +62,11 @@ class RestApiEndpoint(object): # setup endpoints # compute related actions (start/stop VNFs, get info) - self.api.add_resource(Compute, - "/restapi/compute//", - "/restapi/compute////") + self.api.add_resource(Compute, "/restapi/compute//") self.api.add_resource(ComputeList, "/restapi/compute", "/restapi/compute/") + self.api.add_resource(ComputeResources, "/restapi/compute/resources//") self.api.add_resource(DatacenterStatus, "/restapi/datacenter/") self.api.add_resource(DatacenterList, "/restapi/datacenter")