[CORD-1528] Allow to reference models already created
Change-Id: Icf1cab69e0939d84f7f9c01d774f4399df51a7a4
diff --git a/src/grpc_client/models_accessor.py b/src/grpc_client/models_accessor.py
index 29c2f11..188a9ce 100644
--- a/src/grpc_client/models_accessor.py
+++ b/src/grpc_client/models_accessor.py
@@ -11,14 +11,13 @@
Give a Model Class Name and some data, check if that exits or instantiate a new one
"""
-
if data.get('name'):
used_key = 'name'
else:
used_key = data.keys()[0]
if class_name not in RESOURCES:
- raise Exception('[XOS-TOSCA] The model your tring to create (%s: %s, class: %s) is not know by xos-core' % (used_key, data[used_key], class_name))
+ raise Exception('[XOS-TOSCA] The model you are trying to create (%s: %s, class: %s) is not know by xos-core' % (used_key, data[used_key], class_name))
cls = RESOURCES[class_name]
models = cls.objects.filter(**{used_key: data[used_key]})
@@ -27,6 +26,10 @@
print "[XOS-Tosca] Model %s already exist, retrieving instance..." % data[used_key]
model = models[0]
elif len(models) == 0:
+
+ if 'must-exist' in data and data['must-exist']:
+ raise Exception("[XOS-TOSCA] Model %s:%s has property 'must-exist' but cannot be found" % (class_name, data[used_key]))
+
model = cls.objects.new()
print "[XOS-Tosca] Model %s is new, creating new instance..." % data[used_key]
else:
diff --git a/src/tosca/parser.py b/src/tosca/parser.py
index 029b6ed..7c4f429 100644
--- a/src/tosca/parser.py
+++ b/src/tosca/parser.py
@@ -1,4 +1,4 @@
-from toscaparser.tosca_template import ToscaTemplate
+from toscaparser.tosca_template import ToscaTemplate, ValidationError
from default import TOSCA_RECIPES_DIR
from grpc_client.resources import RESOURCES
from grpc_client.models_accessor import GRPCModelsAccessor
@@ -89,6 +89,8 @@
for line in msg.splitlines():
if line.strip().startswith('MissingRequiredFieldError'):
readable.append(line)
+ if line.strip().startswith('UnknownFieldError'):
+ readable.append(line)
if len(readable) > 0:
return '/n'.join(readable)
@@ -162,7 +164,7 @@
if class_name not in RESOURCES:
raise Exception("Nodetemplate %s's type %s is not a known resource" % (recipe.name, class_name))
model = GRPCModelsAccessor.get_model_from_classname(class_name, data)
- # [] populate model with data[[
+ # [] populate model with data
model = self.populate_model(model, data)
# [] check if the model has requirements
# [] if it has populate them
@@ -172,12 +174,11 @@
self.saved_model_by_name[recipe.name] = model
- except Exception as e:
- print e
+ except ValidationError as e:
if e.message:
- exception_msg = e.message
+ exception_msg = TOSCA_Parser._translate_exception(e.message)
else:
- exception_msg = str(e)
+ exception_msg = TOSCA_Parser._translate_exception(str(e))
raise Exception(exception_msg)
diff --git a/src/tosca/xtarget/tosca.xtarget b/src/tosca/xtarget/tosca.xtarget
index 313874b..2cdec9c 100644
--- a/src/tosca/xtarget/tosca.xtarget
+++ b/src/tosca/xtarget/tosca.xtarget
@@ -9,22 +9,10 @@
{{ m.name|lower }}:
type: tosca.capabilities.xos.{{ m.name }}
properties:
- no-delete:
+ must-exist:
type: boolean
default: false
- description: Do not allow Tosca to delete this object
- no-create:
- type: boolean
- default: false
- description: Do not allow Tosca to create this object
- no-update:
- type: boolean
- default: false
- description: Do not allow Tosca to update this object
- replaces:
- type: string
- required: false
- descrption: Replaces/renames this object
+ description: Allow to reference existing models in TOSCA recipes
{% for f in m.fields %}
{%- if not f.link -%}
{{ f.name }}: