Added Dockerfile-based entry points to REST API. 41/5741/1
authorpeusterm <manuel.peuster@uni-paderborn.de>
Wed, 29 Nov 2017 11:02:42 +0000 (12:02 +0100)
committerpeusterm <manuel.peuster@uni-paderborn.de>
Wed, 29 Nov 2017 11:02:42 +0000 (12:02 +0100)
Allows the user of the emulator to specify entry point
scripts for their VNF containers inside the Dockerfiles.

The emulator automatically runs these scripts when a new
VNF is started using the emulators REST API.

Change-Id: I2cb42f1cc33f7ae4ba6fc4e7a05d7dff0f7046c2
Signed-off-by: peusterm <manuel.peuster@uni-paderborn.de>
src/emuvim/api/rest/compute.py

index c4f7f3b..78d96da 100755 (executable)
@@ -29,6 +29,7 @@ import logging
 from flask_restful import Resource
 from flask import request
 import json
+import threading
 from copy import deepcopy
 
 logging.basicConfig()
@@ -69,9 +70,30 @@ class Compute(Resource):
         command = data.get("docker_command")
 
         try:
-            logging.debug("API CALL: compute start")
+            if compute_name is None or compute_name == "None":
+                logging.error("No compute name defined in request.")
+                return "No compute name defined in request.", 500, CORS_HEADER
+            if dc_label is None or dcs.get(dc_label) is None:
+                logging.error("No datacenter defined in request.")
+                return "No datacenter defined in request.", 500, CORS_HEADER
             c = dcs.get(dc_label).startCompute(
                 compute_name, image=image, command=command, network=nw_list)
+            # (if available) trigger emu. entry point given in Dockerfile
+            try:
+                config = c.dcinfo.get("Config", dict())
+                env = config.get("Env", list())
+                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
+                        t = threading.Thread(target=c.cmdPrint, args=(cmd,))
+                        t.daemon = True
+                        t.start()
+            except Exception as ex:
+                logging.warning("Couldn't run Docker entry point VIM_EMU_CMD")
+                logging.exception("Exception:")
             # return docker inspect dict
             return c.getStatus(), 200, CORS_HEADER
         except Exception as ex: