From: stevenvanrossem Date: Tue, 14 Feb 2017 11:03:12 +0000 (+0100) Subject: Merge remote-tracking branch 'remotes/upstream/master' X-Git-Tag: v3.1~44^2~1 X-Git-Url: https://osm.etsi.org/gitweb/?p=osm%2Fvim-emu.git;a=commitdiff_plain;h=f045c142ee82c8da93756f4addff67dbf305888b;hp=ba7547e41ed94b83e8d7b96d5e4361bde2aca789 Merge remote-tracking branch 'remotes/upstream/master' --- diff --git a/src/emuvim/api/rest/compute.py b/src/emuvim/api/rest/compute.py index dc2b611..8d46aa2 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.debug("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_bw' in params: + cpu_period = int(dcs.get(dc_label).net.cpu_period) + value = params.get('cpu_bw') + 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") diff --git a/src/emuvim/dcemulator/monitoring.py b/src/emuvim/dcemulator/monitoring.py index de96e37..269a7e0 100755 --- a/src/emuvim/dcemulator/monitoring.py +++ b/src/emuvim/dcemulator/monitoring.py @@ -606,6 +606,7 @@ class DCNetworkMonitor(): while not started: list1 = self.dockercli.containers.list(filters={'status': 'running', 'name': 'prometheus'}) if len(list1) >= 1: + time.sleep(1) started = True if wait_time > 5: return 'skewmon not started' diff --git a/src/emuvim/dcemulator/node.py b/src/emuvim/dcemulator/node.py index 2702bf5..c5ac9b3 100755 --- a/src/emuvim/dcemulator/node.py +++ b/src/emuvim/dcemulator/node.py @@ -82,12 +82,12 @@ class EmulatorCompute(Docker): status["docker_network"] = self.dcinfo['NetworkSettings']['IPAddress'] status["image"] = self.dimage status["flavor_name"] = self.flavor_name - status["cpu_quota"] = self.cpu_quota - status["cpu_period"] = self.cpu_period - status["cpu_shares"] = self.cpu_shares - status["cpuset"] = self.cpuset - status["mem_limit"] = self.mem_limit - status["memswap_limit"] = self.memswap_limit + status["cpu_quota"] = self.resources.get('cpu_quota') + status["cpu_period"] = self.resources.get('cpu_period') + status["cpu_shares"] = self.resources.get('cpu_shares') + status["cpuset"] = self.resources.get('cpuset_cpus') + status["mem_limit"] = self.resources.get('mem_limit') + status["memswap_limit"] = self.resources.get('memswap_limit') status["state"] = self.dcli.inspect_container(self.dc)["State"] status["id"] = self.dcli.inspect_container(self.dc)["Id"] status["short_id"] = self.dcli.inspect_container(self.dc)["Id"][:12] diff --git a/src/emuvim/test/unittests/test_resourcemodel.py b/src/emuvim/test/unittests/test_resourcemodel.py index b15fed0..5fbd172 100755 --- a/src/emuvim/test/unittests/test_resourcemodel.py +++ b/src/emuvim/test/unittests/test_resourcemodel.py @@ -96,10 +96,11 @@ def createDummyContainerObject(name, flavor): class DummyContainer(object): def __init__(self): - self.cpu_period = -1 + # take defaukt values from son-emu + # self.cpu_period = -1 self.cpu_quota = -1 - self.mem_limit = -1 - self.memswap_limit = -1 + # self.mem_limit = -1 + # self.memswap_limit = -1 def updateCpuLimit(self, cpu_period, cpu_quota): self.cpu_period = cpu_period diff --git a/utils/docker/Dockerfile b/utils/docker/Dockerfile index b5a94af..eac132c 100755 --- a/utils/docker/Dockerfile +++ b/utils/docker/Dockerfile @@ -51,8 +51,10 @@ RUN make develop RUN echo 'install son-emu' RUN apt-get install -y python-dev python-zmq libzmq-dev libffi-dev libssl-dev RUN pip install -U zerorpc tabulate argparse networkx six ryu oslo.config pytest Flask flask_restful requests prometheus_client pyaml -WORKDIR / -RUN git clone https://github.com/sonata-nfv/son-emu.git +WORKDIR / +#avoid pulling not the latest git, copy the current dir, to run this from Jenkins +#RUN git clone https://github.com/sonata-nfv/son-emu.git +COPY . /son-emu WORKDIR son-emu/ RUN python setup.py develop WORKDIR /