X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=src%2Femuvim%2Fapi%2Fsonata%2Fdummygatekeeper.py;h=71fb559c3578c3be32939eb0a8fd61f418541582;hb=bea873776a074bb64c510d8cf6ab4b21ccc3e591;hp=52837eab02a6a80fe7e7ccff17d8a1abe7022906;hpb=7ec665dcbd1cdb9dabada7c6c4338e2ae2a5384b;p=osm%2Fvim-emu.git diff --git a/src/emuvim/api/sonata/dummygatekeeper.py b/src/emuvim/api/sonata/dummygatekeeper.py index 52837ea..71fb559 100644 --- a/src/emuvim/api/sonata/dummygatekeeper.py +++ b/src/emuvim/api/sonata/dummygatekeeper.py @@ -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,