Fix: 5GTANGO LLCM now correctly applies resource limits.
[osm/vim-emu.git] / src / emuvim / api / tango / llcm.py
index d7c24dd..b3916bb 100755 (executable)
@@ -240,27 +240,33 @@ class Service(object):
         Extract resource limits from deployment units.
         """
         # defaults
-        cpu_list = "1"
+        cpu_list = None
         cpu_period, cpu_quota = self._calculate_cpu_cfs_values(float(1.0))
-        mem_limit = 0
+        mem_limit = None
         # update from descriptor
         if "resource_requirements" in deployment_unit:
             res_req = deployment_unit.get("resource_requirements")
-            cpu_list = res_req.get("cpu").get("cores")
+            cpu_list = res_req.get("cpu").get("cpuset")
             if cpu_list is None:
                 cpu_list = res_req.get("cpu").get("vcpus")
-            cpu_bw = res_req.get("cpu").get("cpu_bw", 1.0)
+            if cpu_list is not None:
+                # attention: docker expects list as string w/o spaces:
+                cpu_list = str(cpu_list).replace(" ", "").strip()
+            cpu_bw = res_req.get("cpu").get("cpu_bw")
+            if cpu_bw is None:
+                cpu_bw = 1.0
             cpu_period, cpu_quota = self._calculate_cpu_cfs_values(float(cpu_bw))
-            mem_num = str(res_req.get("memory").get("size", 2))
+            mem_limit = res_req.get("memory").get("size")
             mem_unit = str(res_req.get("memory").get("size_unit", "GB"))
-            mem_limit = float(mem_num)
-            if mem_unit == "GB":
-                mem_limit = mem_limit * 1024 * 1024 * 1024
-            elif mem_unit == "MB":
-                mem_limit = mem_limit * 1024 * 1024
-            elif mem_unit == "KB":
-                mem_limit = mem_limit * 1024
-            mem_limit = int(mem_limit)
+            if mem_limit is not None:
+                mem_limit = int(mem_limit)
+                # to bytes
+                if "G" in mem_unit:
+                    mem_limit = mem_limit * 1024 * 1024 * 1024
+                elif "M" in mem_unit:
+                    mem_limit = mem_limit * 1024 * 1024
+                elif "K" in mem_unit:
+                    mem_limit = mem_limit * 1024
         return cpu_list, cpu_period, cpu_quota, mem_limit
 
     def _start_vnfd(self, vnfd, vnf_id, **kwargs):
@@ -329,7 +335,7 @@ class Service(object):
                 image=docker_image_name,
                 cpu_quota=cpu_quota,
                 cpu_period=cpu_period,
-                cpuset=cpu_list,
+                cpuset_cpus=cpu_list,
                 mem_limit=mem_limit,
                 volumes=volumes,
                 properties=cenv,  # environment
@@ -883,7 +889,15 @@ class Instantiations(fr.Resource):
         # try to extract the service uuid from the request
         json_data = request.get_json(force=True)
         service_uuid = json_data.get("service_uuid")
-
+        service_name = json_data.get("service_name")
+
+        # first try to find by service_name
+        if service_name is not None:
+            for s_uuid, s in GK.services.iteritems():
+                if s.manifest.get("name") == service_name:
+                    LOG.info("Found service: {} with UUID: {}"
+                             .format(service_name, s_uuid))
+                    service_uuid = s_uuid
         # lets be a bit fuzzy here to make testing easier
         if (service_uuid is None or service_uuid ==
                 "latest") and len(GK.services) > 0:
@@ -912,24 +926,32 @@ class Instantiations(fr.Resource):
         """
         # try to extract the service  and instance UUID from the request
         json_data = request.get_json(force=True)
-        service_uuid = json_data.get("service_uuid")
-        instance_uuid = json_data.get("service_instance_uuid")
-
+        service_uuid_input = json_data.get("service_uuid")
+        instance_uuid_input = json_data.get("service_instance_uuid")
+        if len(GK.services) < 1:
+            return "No service on-boarded.", 404
         # try to be fuzzy
-        if service_uuid is None and len(GK.services) > 0:
-            # if we don't get a service uuid, we simply stop the last service
-            # in the list
-            service_uuid = list(GK.services.iterkeys())[0]
-        if instance_uuid is None and len(
-                GK.services[service_uuid].instances) > 0:
-            instance_uuid = list(
-                GK.services[service_uuid].instances.iterkeys())[0]
-
-        if service_uuid in GK.services and instance_uuid in GK.services[service_uuid].instances:
-            # valid service and instance UUID, stop service
-            GK.services.get(service_uuid).stop_service(instance_uuid)
-            return "service instance with uuid %r stopped." % instance_uuid, 200
-        return "Service not found", 404
+        if service_uuid_input is None:
+            # if we don't get a service uuid we stop all services
+            service_uuid_list = list(GK.services.iterkeys())
+            LOG.info("No service_uuid given, stopping all.")
+        else:
+            service_uuid_list = [service_uuid_input]
+        # for each service
+        for service_uuid in service_uuid_list:
+            if instance_uuid_input is None:
+                instance_uuid_list = list(
+                    GK.services[service_uuid].instances.iterkeys())
+            else:
+                instance_uuid_list = [instance_uuid_input]
+            # for all service instances
+            for instance_uuid in instance_uuid_list:
+                if (service_uuid in GK.services and
+                        instance_uuid in GK.services[service_uuid].instances):
+                    # valid service and instance UUID, stop service
+                    GK.services.get(service_uuid).stop_service(instance_uuid)
+                    LOG.info("Service instance with uuid %r stopped." % instance_uuid)
+        return "Service(s) stopped.", 200
 
 
 class Exit(fr.Resource):