diff --git a/translator/toscalib/common/exception.py b/translator/toscalib/common/exception.py index 7cc956f..2a1e8d2 100644 --- a/translator/toscalib/common/exception.py +++ b/translator/toscalib/common/exception.py @@ -89,3 +89,8 @@ class UnknownInputError(TOSCAException): class InvalidPropertyValueError(TOSCAException): msg_fmt = _('Value of property "%(what)s" is invalid.') + + +class InvalidTemplateVersion(TOSCAException): + msg_fmt = _('The template version "%(what)s" is invalid. ' + 'The valid versions are: "%(valid_versions)s"') diff --git a/translator/toscalib/tests/data/test_invalid_template_version.yaml b/translator/toscalib/tests/data/test_invalid_template_version.yaml new file mode 100644 index 0000000..2011f8f --- /dev/null +++ b/translator/toscalib/tests/data/test_invalid_template_version.yaml @@ -0,0 +1,11 @@ +tosca_definitions_version: tosca_xyz + +description: > + Test template with an invalid template version. + +node_templates: + server: + type: tosca.nodes.Compute + properties: + os_type: Linux + num_cpus: 2 \ No newline at end of file diff --git a/translator/toscalib/tests/test_toscatplvalidation.py b/translator/toscalib/tests/test_toscatplvalidation.py index 7b8f86d..aaab6ab 100644 --- a/translator/toscalib/tests/test_toscatplvalidation.py +++ b/translator/toscalib/tests/test_toscatplvalidation.py @@ -13,6 +13,7 @@ import os import six +from translator.toscalib.common.exception import InvalidTemplateVersion from translator.toscalib.common.exception import InvalidTypeError from translator.toscalib.common.exception import MissingRequiredFieldError from translator.toscalib.common.exception import TypeMismatchError @@ -430,3 +431,14 @@ class ToscaTemplateValidationTest(TestCase): rel_template = RelationshipTemplate(rel_template[name], name) err = self.assertRaises(expectederror, rel_template.validate) self.assertEqual(expectedmessage, six.text_type(err)) + + def test_invalid_template_version(self): + tosca_tpl = os.path.join( + os.path.dirname(os.path.abspath(__file__)), + "data/test_invalid_template_version.yaml") + err = self.assertRaises(InvalidTemplateVersion, ToscaTemplate, + tosca_tpl) + valid_versions = ', '.join(ToscaTemplate.VALID_TEMPLATE_VERSIONS) + ex_err_msg = ('The template version "tosca_xyz" is invalid. ' + 'The valid versions are: "%s"' % valid_versions) + self.assertEqual(six.text_type(err), ex_err_msg) diff --git a/translator/toscalib/tosca_template.py b/translator/toscalib/tosca_template.py index f231eb2..4cd2ccb 100644 --- a/translator/toscalib/tosca_template.py +++ b/translator/toscalib/tosca_template.py @@ -14,6 +14,7 @@ import logging import os +from translator.toscalib.common.exception import InvalidTemplateVersion from translator.toscalib.common.exception import MissingRequiredFieldError from translator.toscalib.common.exception import UnknownFieldError from translator.toscalib import functions @@ -44,6 +45,9 @@ YAML_LOADER = translator.toscalib.utils.yamlparser.load_yaml class ToscaTemplate(object): + + VALID_TEMPLATE_VERSIONS = ['tosca_simple_yaml_1_0_0'] + '''Load the template data.''' def __init__(self, path): self.tpl = YAML_LOADER(path) @@ -151,7 +155,8 @@ class ToscaTemplate(object): def _validate_field(self): try: - self._tpl_version() + version = self._tpl_version() + self._validate_version(version) except KeyError: raise MissingRequiredFieldError(what='Template', required=DEFINITION_VERSION) @@ -190,3 +195,9 @@ class ToscaTemplate(object): func = functions.get_function(self, self.outputs, output.value) if isinstance(func, functions.GetAttribute): output.attrs[output.VALUE] = func + + def _validate_version(self, version): + if version not in self.VALID_TEMPLATE_VERSIONS: + raise InvalidTemplateVersion( + what=version, + valid_versions=', '. join(self.VALID_TEMPLATE_VERSIONS))