diff options
Diffstat (limited to 'aria')
-rw-r--r-- | aria/aria-rest-server/src/main/python/aria-rest/aria_rest/rest.py | 91 | ||||
-rw-r--r-- | aria/aria-rest-server/src/main/python/aria-rest/setup.py | 2 |
2 files changed, 73 insertions, 20 deletions
diff --git a/aria/aria-rest-server/src/main/python/aria-rest/aria_rest/rest.py b/aria/aria-rest-server/src/main/python/aria-rest/aria_rest/rest.py index fae6afcfe6..7b9223d1c9 100644 --- a/aria/aria-rest-server/src/main/python/aria-rest/aria_rest/rest.py +++ b/aria/aria-rest-server/src/main/python/aria-rest/aria_rest/rest.py @@ -18,8 +18,7 @@ import os -from cStringIO import StringIO -from flask import Flask, render_template, request, jsonify +from flask import Flask, request, jsonify from flask_autodoc.autodoc import Autodoc from aria import install_aria_extensions from aria.parser import consumption @@ -34,6 +33,8 @@ from aria.utils import threading from aria.orchestrator.workflow_runner import WorkflowRunner from aria.orchestrator.workflows.executor.dry import DryExecutor import util +import tempfile +import shutil version_id = "0.1" route_base = "/api/" + version_id + "/" @@ -69,29 +70,75 @@ def index(): @aria.pass_logger def install_template(template_name, model_storage, resource_storage, plugin_manager, logger): + """ installs a template in Aria storage - """ - body = request.json - # Check body - if "service_template_path" in body: - service_template_path = body["service_template_path"] - else: - return "request body missing service_template_path", 501 + 3 modes possible: + + 1. PUT JSON body which points to a CSAR URL. Content-type must be + application/json. PUT data is a JSON object/map with the following + keys.: + * service_template_path (required): URL to CSAR + * service_template_filename (optional): service template file. + + 2. PUT with service template file body. Content-type must be + text/plain. + + 3. PUT with binary CSAR body. Content-type must be application/zip. + Optional query string arg "template_filename" can indicate the + service template filename in the CSAR. Defaults to + "service-template.yaml". + """ + + service_template_path = None + service_template_filename = "service-template.yaml" + + rtype = "unknown" + if request.is_json: + rtype = "json" + elif request.headers['Content-Type'] == "application/zip": + rtype = "zip" + suffix = ".csar" + elif request.headers['Content-Type'] == "text/plain": + rtype = "yaml" + suffix = ".yaml" + + if rtype == "zip" or rtype == "yaml": + with tempfile.NamedTemporaryFile(prefix = "ariatmp_", + suffix = suffix, + delete = False) as f: + f.write(request.data) + service_template_path = f.name + if request.headers['Content-Type'] == "application/zip": + if "template_filename" in request.args: + service_template_filename = request.args["template_filename"] + + elif rtype == "json": + + body = request.json or {} + + # Check body + if "service_template_path" in body: + service_template_path = body["service_template_path"] + else: + return "request body missing service_template_path", 501 + + if "service_template_filename" in body: + service_template_filename = body["service_template_filename"] + else: + service_template_filename = "service-template.yaml" - if "service_template_filename" in body: - service_template_filename = body["service_template_filename"] else: - service_template_filename = "service-template.yaml" + return "Unrecognized content type",400 - service_template_path = service_template_utils.get( + service_template_file_path = service_template_utils.get( service_template_path, service_template_filename) core = Core(model_storage, resource_storage, plugin_manager) try: - core.create_service_template(service_template_path, + core.create_service_template(service_template_file_path, os.path.dirname(service_template_path), template_name) except storage_exceptions.StorageError as e: @@ -102,6 +149,12 @@ def install_template(template_name, model_storage, resource_storage, except Exception as e: logger.error("catchall exception") return e.message, 500 + finally: + # cleanup + if rtype == "zip" or rtype == "yaml": + os.remove(service_template_path) + if rtype == "zip": + shutil.rmtree(os.path.dirname(service_template_file_path)) return "service template installed", 200 @@ -116,7 +169,7 @@ def validate_template(model_storage, resource_storage, plugin_manager, logger): """ Validates a TOSCA template """ - body = request.json + body = request.json or {} # Check body if "service_template_path" in body: @@ -332,7 +385,7 @@ def create_service(template_id, service_name, model_storage, resource_storage, """ Creates a service from the specified service template """ - body = request.json + body = request.json or {} inputs = {} if 'inputs' in body: inputs = body['inputs'] @@ -489,7 +542,7 @@ def start_execution( """ Start an execution for the specified service """ - body = request.json + body = request.json or {} executor = DryExecutor( ) if 'executor' in body and body['executor'] == 'dry' else None @@ -532,7 +585,7 @@ def resume_execution( """ Resume the specified execution """ - body = request.json + body = request.json or {} execution = model_storage.execution.get(execution_id) if execution.status != execution.status.CANCELLED: return "cancelled execution cannot be resumed", 400 @@ -566,7 +619,7 @@ def cancel_execution(execution_id, model_storage, logger): Cancel the specified execution """ logger.info("cancelling execution {}".format(execution_id)) - body = request.json + body = request.json or {} try: execution = model_storage.execution.get(execution_id) diff --git a/aria/aria-rest-server/src/main/python/aria-rest/setup.py b/aria/aria-rest-server/src/main/python/aria-rest/setup.py index 4bb79cc1d9..81beb0f9a7 100644 --- a/aria/aria-rest-server/src/main/python/aria-rest/setup.py +++ b/aria/aria-rest-server/src/main/python/aria-rest/setup.py @@ -36,6 +36,6 @@ setup( install_requires=[ 'Flask==0.12.2', 'flask-autodoc==0.1.2', - 'apache-ariatosca==0.2.0' + 'apache-ariatosca==0.1.1' ] ) |