aboutsummaryrefslogtreecommitdiffstats
path: root/aria
diff options
context:
space:
mode:
Diffstat (limited to 'aria')
-rw-r--r--aria/aria-rest-server/src/main/python/aria-rest/aria_rest/rest.py91
-rw-r--r--aria/aria-rest-server/src/main/python/aria-rest/setup.py2
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'
]
)