Added Dockerfile-based entry points to REST API.
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>
diff --git a/src/emuvim/api/rest/compute.py b/src/emuvim/api/rest/compute.py
index c4f7f3b..78d96da 100755
--- a/src/emuvim/api/rest/compute.py
+++ b/src/emuvim/api/rest/compute.py
@@ -29,6 +29,7 @@
from flask_restful import Resource
from flask import request
import json
+import threading
from copy import deepcopy
logging.basicConfig()
@@ -69,9 +70,30 @@
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: