diff --git a/Services/ui_forms/Demo.yaml.orig b/Services/ui_forms/Demo.yaml.orig
deleted file mode 100644
index 0105eb1..0000000
--- a/Services/ui_forms/Demo.yaml.orig
+++ /dev/null
@@ -1,83 +0,0 @@
-name: Demo Service
-type: demoService
-
-description: >-
- Demo Service
- shows how Murano is working.
-
-unitTemplates:
- - {}
-
-forms:
- - serviceConfiguration:
- fields:
- - name: configuration
- type: string
- hidden: true
- initial: standalone
- - name: name
- type: string
- label: Service Name
- description: >-
- To identify your service in logs please specify a service name
- - name: dcInstances
- type: instance
- label: Instance Count
- description: >-
- Murano can provision more then one instance of the service at a time.
- For a demo scenario only 2 instances are allowed.
- attributeNames: units
- minValue: 1
- maxValue: 2
- initial: 2
-<<<<<<< HEAD
- helpText: Enter 1 and 2 value
- - name: unitNamingPattern
- type: string
- label: Hostname template
- description: >-
- For your convenience all instance hostnames can be named
- in the same way. Enter a name and use # character for incrementation.
- For example, host# turns into host1, host2, etc. Please follow Windows
- hostname restrictions.
- required: false
- regexpValidator: '^(([a-zA-Z0-9#][a-zA-Z0-9-#]*[a-zA-Z0-9#])\.)*([A-Za-z0-9#]|[A-Za-z0-9#][A-Za-z0-9-#]*[A-Za-z0-9#])$'
- helpText: Optional field for a machine hostname template
- # temporaryHack
- widgetMedia:
- js: [muranodashboard/js/support_placeholder.js]
- css: {all: [muranodashboard/css/support_placeholder.css]}
- validators:
- # if unitNamingPattern is given and dcInstances > 1, then '#' should occur in unitNamingPattern
- - expr: {YAQL: not $.serviceConfiguration.unitNamingPattern.bool() or ('#' in $.serviceConfiguration.unitNamingPattern)}
- message: Incrementation symbol "#" is required in the Hostname template
- - instanceConfiguration:
- fields:
- - name: title
- type: string
- required: false
- hidden: true
- attributeNames: false
- descriptionTitle: Instance Configuration
- description: Specify some instance parameters on which service would be created.
- - name: flavor
- type: flavor
- label: Instance flavor
- description: >-
- Select registered in Openstack flavor. Consider that service performance
- depends on this parameter.
- required: false
- - name: osImage
- type: image
- label: Instance image
- description: >-
- Select valid image for a service. Image should already be prepared and
- registered in glance.
- - name: availabilityZone
- type: azone
- label: Availability zone
- description: Select availability zone where service would be installed.
- required: false
-=======
- helpText: Enter 1 and 2 value
->>>>>>> 0dffd2a... Add new service for demo
diff --git a/consts.py b/consts.py
index 1bd10fa..ec4b3f3 100644
--- a/consts.py
+++ b/consts.py
@@ -12,27 +12,34 @@
# License for the specific language governing permissions and limitations
# under the License.
import os
+#---mappings to possible data types in service manifests---
UI_FORMS = u"ui_forms"
WORKFLOWS = u"workflows"
HEAT_TEMPLATES = u"heat_templates"
AGENT_TEMPLATES = u"agent_templates"
SCRIPTS = u"scripts"
+MANIFESTS = u"manifests"
-DATA_TYPES = [UI_FORMS, WORKFLOWS, HEAT_TEMPLATES, AGENT_TEMPLATES, SCRIPTS]
+DATA_TYPES = [UI_FORMS, WORKFLOWS, HEAT_TEMPLATES, AGENT_TEMPLATES, SCRIPTS, MANIFESTS]
+
+#---main directory - parent for manifests files and data types directories
+ROOT_DIRECTORY = os.path.join(os.path.dirname(__file__),
+ u'Services')
+
+#---directory names of data types
UI_FORMS_ROOT_DIR = u"ui_forms"
WORKFLOWS_ROOT_DIR = u"workflows"
HEAT_TEMPLATES_ROOT_DIR = u"heat_templates"
AGENT_TEMPLATES_ROOT_DIR = u"agent_templates"
SCRIPTS_ROOT_DIR = u"scripts"
#root directory should contain manifests files
-ROOT_DIRECTORY = os.path.join(os.path.dirname(__file__),
- u'Services')
DIRECTORIES_BY_TYPE = {UI_FORMS: UI_FORMS_ROOT_DIR,
WORKFLOWS: WORKFLOWS_ROOT_DIR,
HEAT_TEMPLATES: HEAT_TEMPLATES_ROOT_DIR,
AGENT_TEMPLATES_ROOT_DIR: AGENT_TEMPLATES_ROOT_DIR,
- SCRIPTS: SCRIPTS_ROOT_DIR
+ SCRIPTS: SCRIPTS_ROOT_DIR,
+ MANIFESTS: ROOT_DIRECTORY
}
diff --git a/parser.py b/parser.py
index 4e70f43..0519670 100644
--- a/parser.py
+++ b/parser.py
@@ -16,51 +16,12 @@ import os
import yaml
import logging as log
from manifest import Manifest
+from consts import DIRECTORIES_BY_TYPE, DATA_TYPES
class ManifestParser(object):
- def __init__(self,
- manifest_directory,
- ui_forms_directory="ui_forms",
- workflows_directory="workflows",
- heat_templates_directory="heat_templates",
- agent_templates_directory="agent_templates",
- scripts_directory="scripts"
- ):
- """
- manifest_directory -- absolute path to the directory with manifests
- ui_forms_directory -- absolute or relative path to ui forms definitions
- workflows_directory -- absolute or relative path to workflow
- definitions
- heat_templates_directory -- absolute or relative path to heat templates
- agent_templates_directory --absolute or relative path to agent
- templates
- scripts_directory -- absolute or relative path to scripts
- """
- if not os.path.isabs(ui_forms_directory):
- ui_forms_directory = os.path.join(manifest_directory,
- ui_forms_directory)
- if not os.path.isabs(workflows_directory):
- workflows_directory = os.path.join(manifest_directory,
- workflows_directory)
- if not os.path.isabs(heat_templates_directory):
- heat_templates_directory = os.path.join(manifest_directory,
- heat_templates_directory)
- if not os.path.isabs(agent_templates_directory):
- agent_templates_directory = os.path.join(manifest_directory,
- agent_templates_directory)
- if not os.path.isabs(scripts_directory):
- scripts_directory = os.path.join(manifest_directory,
- scripts_directory)
-
+ def __init__(self, manifest_directory):
self.manifest_directory = manifest_directory
- self.directory_mapping = {"ui_forms": ui_forms_directory,
- "workflows": workflows_directory,
- "heat_templates":
- heat_templates_directory,
- "agent_templates": agent_templates_directory,
- "scripts": scripts_directory
- }
def parse(self):
manifests = []
@@ -84,16 +45,16 @@ class ManifestParser(object):
for key, value in service_manifest_data.iteritems():
valid_file_info = True
- directory_location = self.directory_mapping.get(key)
- if directory_location:
+ if key in DATA_TYPES:
+ root_directory = DIRECTORIES_BY_TYPE.get(key)
if not isinstance(value, list):
log.error("{0} section should represent a file"
" listing in manifest {1}"
- "".format(directory_location, file))
+ "".format(root_directory, file))
valid_file_info = False
continue
for i, filename in enumerate(value):
- absolute_path = os.path.join(directory_location,
+ absolute_path = os.path.join(root_directory,
filename)
service_manifest_data[key][i] = absolute_path
diff --git a/test.py b/test.py
index 0315f69..4aedcd4 100644
--- a/test.py
+++ b/test.py
@@ -13,7 +13,8 @@
# under the License.
from flask import Flask, make_response, send_from_directory, send_file, \
- jsonify, request
+ jsonify, request, abort
+from werkzeug import secure_filename
import os
from parser import ManifestParser
from archiver import Archiver
@@ -27,10 +28,6 @@ def get_ui_data():
manifests = parser.parse()
archive_name = Archiver().create(manifests, "ui_forms")
- # resp = make_response()
- # resp.mimetype = 'application/z-gzip'
- # resp.headers["Content-Disposition"] = "attachment; " \
- # "filename={0}".format(location)
return send_from_directory(os.path.dirname(__file__), archive_name)
@@ -48,41 +45,102 @@ def get_conductor_data():
@app.route('/admin/', methods=['GET', 'POST'])
def get_data_type_locations(data_type):
- if request.method == 'GET':
- parser = ManifestParser(app.config["ROOT_DIRECTORY"])
- manifests = parser.parse()
- locations = []
- if data_type not in app.config['DATA_TYPES']:
- #return 404
- pass
-
- for manifest in manifests:
- if hasattr(manifest, data_type):
- for file_path in getattr(manifest, data_type):
- locations.append(file_path)
- if request.method == 'POST':
-
- return jsonify(data_type=locations)
-
-
-@app.route('/admin//', methods=['GET', 'POST'])
-def get_data_type_locations_by_path_or_get_file(data_type, path):
- locations = []
+ ####### validation ########
+ if data_type not in app.config['DATA_TYPES']:
+ abort(404)
result_path = os.path.join(app.config["ROOT_DIRECTORY"],
- app.config["DIRECTORIES_BY_TYPE"][data_type],
+ app.config["DIRECTORIES_BY_TYPE"][
+ data_type])
+ ####### end validation ########
+ if request.method == 'GET':
+ locations = []
+
+ for path, subdirs, files in os.walk(result_path):
+ for name in files:
+ locations.append(os.path.join(path, name))
+ result = {data_type: locations}
+ return jsonify(result)
+
+ if request.method == 'POST':
+ file_to_upload = request.files.get('file')
+ if file_to_upload:
+ filename = secure_filename(file_to_upload.filename)
+ file_to_upload.save(os.path.join(result_path, filename))
+ return jsonify(result="success")
+ else:
+ abort(503)
+
+
+@app.route('/admin//', methods=['GET', 'POST'])
+def get_data_type_locations_by_path_or_get_file(data_type, path):
+ ####### validation ########
+ if data_type not in app.config['DATA_TYPES']:
+ abort(404)
+ result_path = os.path.join(app.config["ROOT_DIRECTORY"],
+ app.config["DIRECTORIES_BY_TYPE"][
+ data_type],
path)
if not os.path.exists(result_path):
- #throw 404
- pass
- #return file content or directory content
- if os.path.isfile(result_path):
- return send_file(result_path)
- else:
- for file in os.listdir(result_path):
- locations.append(os.path.join(path, file))
- return jsonify(data_type=locations)
+ abort(404)
+ ####### end validation ########
+ if request.method == 'GET':
+ locations = []
+ #return file content or directory content
+ if os.path.isfile(result_path):
+ return send_file(result_path)
+ else:
+ for file in os.listdir(result_path):
+ locations.append(os.path.join(path, file))
+ result = {data_type: locations}
+ return jsonify(result)
+ if request.method == 'POST':
+ file_to_upload = request.files.get('file')
+ if file_to_upload:
+ filename = secure_filename(file_to_upload.filename)
+ file_to_upload.save(os.path.join(result_path, filename))
+ return jsonify(result="success")
+ else:
+ abort(403)
+
+
+@app.route('/admin//', methods=['PUT', 'DELETE'])
+def create_dirs(data_type, path):
+ if data_type not in app.config['DATA_TYPES']:
+ abort(404)
+ result_path = os.path.join(app.config["ROOT_DIRECTORY"],
+ app.config["DIRECTORIES_BY_TYPE"][
+ data_type],
+ path)
+ if request.method == 'PUT':
+ resp = make_response()
+ if os.path.exists(result_path):
+ return resp
+ if data_type == app.config['MANIFESTS']:
+ abort(403)
+ try:
+ os.makedirs(result_path)
+ except Exception as e:
+ abort(403)
+ return resp
+
+ if request.method == 'DELETE':
+ if not os.path.exists(result_path):
+ abort(404)
+ if os.path.isfile(result_path):
+ try:
+ os.remove(result_path)
+ except Exception as e:
+ abort(404)
+ else:
+ try:
+ os.rmdir(result_path)
+ except Exception as e:
+ abort(403)
+ resp = make_response()
+ return resp
if __name__ == '__main__':
- app.run(debug=True)
\ No newline at end of file
+ app.run(debug=True)
+ #by default server running on localhost:5000
\ No newline at end of file