Access to DC list in dummy gk
[osm/vim-emu.git] / src / emuvim / api / sonata / dummygatekeeper.py
index 52837ea..71fb559 100644 (file)
@@ -11,6 +11,7 @@ import uuid
 import hashlib
 import zipfile
 import yaml
+from docker import Client as DockerClient
 from flask import Flask, request
 import flask_restful as fr
 
@@ -27,6 +28,7 @@ class Gatekeeper(object):
 
     def __init__(self):
         self.services = dict()
+        self.dcs = list()
         LOG.info("Create SONATA dummy gatekeeper.")
 
     def register_service_package(self, service_uuid, service):
@@ -58,15 +60,21 @@ class Service(object):
         self.manifest = None
         self.nsd = None
         self.vnfds = dict()
-        self.docker_files = dict()
+        self.local_docker_files = dict()
         self.instances = dict()
 
-    def start_service(self, service_uuid):
+    def start_service(self):
         # TODO implement method
-        # 1. parse descriptors
-        # 2. do the corresponding dc.startCompute(name="foobar") calls
-        # 3. store references to the compute objects in self.instantiations
-        pass
+        instance_uuid = str(uuid.uuid4())
+        # 1. parse descriptors and get name of each docker container
+        for vnfd in self.vnfds.itervalues():
+            for u in vnfd.get("virtual_deployment_units"):
+                docker_name = u.get("vm_image")
+                # 2. do the corresponding dc.startCompute(name="foobar") calls
+                print "start %r" % docker_name
+                print "available dcs: %r " % GK.dcs
+                # 3. store references to the compute objects in self.instantiations
+        return instance_uuid
 
     def onboard(self):
         """
@@ -81,6 +89,8 @@ class Service(object):
         self._load_vnfd()
         self._load_docker_files()
         # 3. prepare container images (e.g. download or build Dockerfile)
+        self._build_images_from_dockerfiles()
+        self._download_predefined_dockerimages()
 
         LOG.info("On-boarded service: %r" % self.manifest.get("package_name"))
 
@@ -139,12 +149,26 @@ class Service(object):
                         self.package_content_path,
                         make_relative_path(df.get("name")))
                     # FIXME: Mapping to docker image names is hardcoded because of the missing mapping in the example package
-                    self.docker_files[helper_map_docker_name(df.get("name"))] = docker_path
+                    self.local_docker_files[helper_map_docker_name(df.get("name"))] = docker_path
                     LOG.debug("Found Dockerfile: %r" % docker_path)
 
-    def _build_images_from_dockerfile(self):
-        pass
+    def _build_images_from_dockerfiles(self):
+        """
+        Build Docker images for each local Dockerfile found in the package: self.local_docker_files
+        """
+        dc = DockerClient()
+        LOG.info("Building %d Docker images (this may take several minutes) ..." % len(self.local_docker_files))
+        for k, v in self.local_docker_files.iteritems():
+            for line in dc.build(path=v.replace("Dockerfile", ""), tag=k, rm=False, nocache=False):
+                LOG.debug("DOCKER BUILD: %s" % line)
+            LOG.info("Docker image created: %s" % k)
+
+    def _download_predefined_dockerimages(self):
+        """
+        If the package contains URLs to pre-build Docker images, we download them with this method.
+        """
         # TODO implement
+        pass
 
 
 """
@@ -200,12 +224,13 @@ class Instantiations(fr.Resource):
         """
         # TODO implement method (start real service)
         json_data = request.get_json(force=True)
-        service_uuid = json_data.get("service_uuid")
-        if service_uuid is not None:
-            service_instance_uuid = str(uuid.uuid4())
+        service_uuid = list(GK.services.iterkeys())[0] #json_data.get("service_uuid") # TODO only for quick testing
+        if service_uuid in GK.services:
             LOG.info("Starting service %r" % service_uuid)
+            service_instance_uuid = GK.services.get(service_uuid).start_service()
+            LOG.info("Service started. Instance id: %r" % service_instance_uuid)
             return {"service_instance_uuid": service_instance_uuid}
-        return None
+        return "Service not found", 404
 
     def get(self):
         """
@@ -227,7 +252,8 @@ api.add_resource(Packages, '/api/packages')
 api.add_resource(Instantiations, '/api/instantiations')
 
 
-def start_rest_api(host, port):
+def start_rest_api(host, port, datacenters=list()):
+    GK.dcs = datacenters
     # start the Flask server (not the best performance but ok for our use case)
     app.run(host=host,
             port=port,