X-Git-Url: https://osm.etsi.org/gitweb/?p=osm%2Fvim-emu.git;a=blobdiff_plain;f=src%2Femuvim%2Fapi%2Frest%2Fcompute.py;h=62a8f18e28bca14f2d4325ed1c4c7b0ea7dcafe4;hp=78d96da2ece7607796ffa70176f7060b2490ebcd;hb=0719f4efe35a1ef06fe2751228e63d38b855967c;hpb=2aecf1dc375ebd54a611ecef32790a0083053fbe diff --git a/src/emuvim/api/rest/compute.py b/src/emuvim/api/rest/compute.py index 78d96da..62a8f18 100755 --- a/src/emuvim/api/rest/compute.py +++ b/src/emuvim/api/rest/compute.py @@ -1,36 +1,33 @@ -""" -Copyright (c) 2015 SONATA-NFV and Paderborn University -ALL RIGHTS RESERVED. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -Neither the name of the SONATA-NFV, Paderborn University -nor the names of its contributors may be used to endorse or promote -products derived from this software without specific prior written -permission. - -This work has been performed in the framework of the SONATA project, -funded by the European Commission under Grant number 671517 through -the Horizon 2020 and 5G-PPP programmes. The authors would like to -acknowledge the contributions of their colleagues of the SONATA -partner consortium (www.sonata-nfv.eu). -""" +# Copyright (c) 2015 SONATA-NFV and Paderborn University +# ALL RIGHTS RESERVED. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Neither the name of the SONATA-NFV, Paderborn University +# nor the names of its contributors may be used to endorse or promote +# products derived from this software without specific prior written +# permission. +# +# This work has been performed in the framework of the SONATA project, +# funded by the European Commission under Grant number 671517 through +# the Horizon 2020 and 5G-PPP programmes. The authors would like to +# acknowledge the contributions of their colleagues of the SONATA +# partner consortium (www.sonata-nfv.eu). import logging from flask_restful import Resource from flask import request import json import threading -from copy import deepcopy logging.basicConfig() @@ -61,7 +58,7 @@ class Compute(Resource): data = request.json if data is None: data = {} - elif type(data) is not dict: + elif not isinstance(data, dict): data = json.loads(request.json) network = data.get("network") @@ -82,15 +79,22 @@ class Compute(Resource): try: config = c.dcinfo.get("Config", dict()) env = config.get("Env", list()) + legacy_command_execution = False for env_var in env: var, cmd = map(str.strip, map(str, env_var.split('=', 1))) - logging.debug("%r = %r" % (var , cmd)) - if var=="SON_EMU_CMD" or var=="VIM_EMU_CMD": - logging.info("Executing entry point script in %r: %r" % (c.name, cmd)) - # execute command in new thread to ensure that API is not blocked by VNF + logging.debug("%r = %r" % (var, cmd)) + if var == "SON_EMU_CMD" or var == "VIM_EMU_CMD": + logging.info("Executing script in '{}': {}={}" + .format(compute_name, var, cmd)) + # execute command in new thread to ensure that API is + # not blocked by VNF t = threading.Thread(target=c.cmdPrint, args=(cmd,)) t.daemon = True t.start() + legacy_command_execution = True + break + if not legacy_command_execution: + c.start() except Exception as ex: logging.warning("Couldn't run Docker entry point VIM_EMU_CMD") logging.exception("Exception:") @@ -105,7 +109,8 @@ class Compute(Resource): logging.debug("API CALL: compute status") try: - return dcs.get(dc_label).containers.get(compute_name).getStatus(), 200, CORS_HEADER + 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 @@ -113,7 +118,8 @@ class Compute(Resource): 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 + return dcs.get(dc_label).stopCompute( + compute_name), 200, CORS_HEADER except Exception as ex: logging.exception("API error.") return ex.message, 500, CORS_HEADER @@ -147,25 +153,21 @@ class ComputeList(Resource): if dc_label is None or dc_label == 'None': # return list with all compute nodes in all DCs all_containers = [] - all_extSAPs = [] for dc in dcs.itervalues(): all_containers += dc.listCompute() - all_extSAPs += dc.listExtSAPs() - - extSAP_list = [(sap.name, sap.getStatus()) for sap in all_extSAPs] - container_list = [(c.name, c.getStatus()) for c in all_containers] - total_list = container_list + extSAP_list - return total_list, 200, CORS_HEADER + container_list = [(c.name, c.getStatus()) + for c in all_containers] + return container_list, 200, CORS_HEADER else: # return list of compute nodes for specified DC - container_list = [(c.name, c.getStatus()) for c in dcs.get(dc_label).listCompute()] - extSAP_list = [(sap.name, sap.getStatus()) for sap in dcs.get(dc_label).listExtSAPs()] - total_list = container_list + extSAP_list - return total_list, 200, CORS_HEADER + container_list = [(c.name, c.getStatus()) + for c in dcs.get(dc_label).listCompute()] + return container_list, 200, CORS_HEADER except Exception as ex: logging.exception("API error.") return ex.message, 500, CORS_HEADER + class ComputeResources(Resource): """ Update the container's resources using the docker.update function @@ -206,8 +208,9 @@ class ComputeResources(Resource): # then no data if params is None: params = {} - logging.debug("REST CALL: update container resources {0}".format(params)) - #check if container exists + 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 @@ -217,24 +220,26 @@ class ComputeResources(Resource): 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 + # 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) + # 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} + 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