1 # Licensed under the Apache License, Version 2.0 (the "License"); you may
2 # not use this file except in compliance with the License. You may obtain
3 # a copy of the License at
5 # http://www.apache.org/licenses/LICENSE-2.0
7 # Unless required by applicable law or agreed to in writing, software
8 # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
9 # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
10 # License for the specific language governing permissions and limitations
16 from toscaparser.common import exception
17 from toscaparser.imports import ImportsLoader
18 from toscaparser.nodetemplate import NodeTemplate
19 from toscaparser.parameters import Input
20 from toscaparser.parameters import Output
21 from toscaparser.policy import Policy
22 from toscaparser.relationship_template import RelationshipTemplate
23 from toscaparser.repositories import Repository
24 from toscaparser.tests.base import TestCase
25 from toscaparser.topology_template import TopologyTemplate
26 from toscaparser.tosca_template import ToscaTemplate
27 from toscaparser.triggers import Triggers
28 from toscaparser.utils.gettextutils import _
29 import toscaparser.utils.yamlparser
32 class ToscaTemplateValidationTest(TestCase):
34 def test_well_defined_template(self):
35 tpl_path = os.path.join(
36 os.path.dirname(os.path.abspath(__file__)),
37 "data/tosca_single_instance_wordpress.yaml")
38 self.assertIsNotNone(ToscaTemplate(tpl_path))
40 def test_first_level_sections(self):
41 tpl_path = os.path.join(
42 os.path.dirname(os.path.abspath(__file__)),
43 "data/test_tosca_top_level_error1.yaml")
44 self.assertRaises(exception.ValidationError, ToscaTemplate, tpl_path)
45 exception.ExceptionCollector.assertExceptionMessage(
46 exception.MissingRequiredFieldError,
47 _('Template is missing required field '
48 '"tosca_definitions_version".'))
50 tpl_path = os.path.join(
51 os.path.dirname(os.path.abspath(__file__)),
52 "data/test_tosca_top_level_error2.yaml")
53 self.assertRaises(exception.ValidationError, ToscaTemplate, tpl_path)
54 exception.ExceptionCollector.assertExceptionMessage(
55 exception.UnknownFieldError,
56 _('Template contains unknown field "node_template". Refer to the '
57 'definition to verify valid values.'))
59 def test_template_with_imports_validation(self):
60 tpl_path = os.path.join(
61 os.path.dirname(os.path.abspath(__file__)),
62 "data/tosca_imports_validation.yaml")
63 self.assertRaises(exception.ValidationError, ToscaTemplate, tpl_path)
64 exception.ExceptionCollector.assertExceptionMessage(
65 exception.UnknownFieldError,
66 _('Template custom_types/imported_sample.yaml contains unknown '
67 'field "descriptions". Refer to the definition'
68 ' to verify valid values.'))
69 exception.ExceptionCollector.assertExceptionMessage(
70 exception.UnknownFieldError,
71 _('Template custom_types/imported_sample.yaml contains unknown '
72 'field "node_typess". Refer to the definition to '
73 'verify valid values.'))
74 exception.ExceptionCollector.assertExceptionMessage(
75 exception.UnknownFieldError,
76 _('Template custom_types/imported_sample.yaml contains unknown '
77 'field "tosca1_definitions_version". Refer to the definition'
78 ' to verify valid values.'))
79 exception.ExceptionCollector.assertExceptionMessage(
80 exception.InvalidTemplateVersion,
81 _('The template version "tosca_simple_yaml_1_10 in '
82 'custom_types/imported_sample.yaml" is invalid. '
83 'Valid versions are "tosca_simple_yaml_1_0, '
84 'tosca_simple_profile_for_nfv_1_0_0".'))
85 exception.ExceptionCollector.assertExceptionMessage(
86 exception.UnknownFieldError,
87 _('Template custom_types/imported_sample.yaml contains unknown '
88 'field "policy_types1". Refer to the definition to '
89 'verify valid values.'))
90 exception.ExceptionCollector.assertExceptionMessage(
91 exception.UnknownFieldError,
92 _('Nodetype"tosca.nodes.SoftwareComponent.Logstash" contains '
93 'unknown field "capabilities1". Refer to the definition '
94 'to verify valid values.'))
95 exception.ExceptionCollector.assertExceptionMessage(
96 exception.UnknownFieldError,
97 _('Policy "mycompany.mytypes.myScalingPolicy" contains unknown '
98 'field "derived1_from". Refer to the definition to '
99 'verify valid values.'))
101 def test_inputs(self):
106 description: Number of CPUs for the server.
108 - valid_values: [ 1, 2, 4 ]
112 inputs = (toscaparser.utils.yamlparser.
113 simple_parse(tpl_snippet)['inputs'])
114 name, attrs = list(inputs.items())[0]
115 input = Input(name, attrs)
116 err = self.assertRaises(exception.UnknownFieldError, input.validate)
117 self.assertEqual(_('Input "cpus" contains unknown field "constraint". '
118 'Refer to the definition to verify valid values.'),
121 def _imports_content_test(self, tpl_snippet, path, custom_type_def):
122 imports = (toscaparser.utils.yamlparser.
123 simple_parse(tpl_snippet)['imports'])
124 loader = ImportsLoader(imports, path, custom_type_def)
125 return loader.get_custom_defs()
127 def test_imports_without_templates(self):
130 # omitted here for brevity
132 path = 'toscaparser/tests/data/tosca_elk.yaml'
133 errormsg = _('"imports" keyname is defined without including '
135 err = self.assertRaises(exception.ValidationError,
136 self._imports_content_test,
140 self.assertEqual(errormsg, err.__str__())
142 def test_imports_with_name_without_templates(self):
147 path = 'toscaparser/tests/data/tosca_elk.yaml'
148 errormsg = _('A template file name is not provided with import '
149 'definition "some_definitions".')
150 err = self.assertRaises(exception.ValidationError,
151 self._imports_content_test,
152 tpl_snippet, path, None)
153 self.assertEqual(errormsg, err.__str__())
155 def test_imports_without_import_name(self):
158 - custom_types/paypalpizzastore_nodejs_app.yaml
159 - https://raw.githubusercontent.com/openstack/\
160 tosca-parser/master/toscaparser/tests/data/custom_types/wordpress.yaml
162 path = 'toscaparser/tests/data/tosca_elk.yaml'
163 custom_defs = self._imports_content_test(tpl_snippet,
166 self.assertTrue(custom_defs)
168 def test_imports_wth_import_name(self):
171 - some_definitions: custom_types/paypalpizzastore_nodejs_app.yaml
173 file: 'https://raw.githubusercontent.com/openstack/tosca-parser\
174 /master/toscaparser/tests/data/custom_types/wordpress.yaml'
175 namespace_prefix: single_instance_wordpress
177 path = 'toscaparser/tests/data/tosca_elk.yaml'
178 custom_defs = self._imports_content_test(tpl_snippet,
181 self.assertTrue(custom_defs.get("single_instance_wordpress.tosca."
182 "nodes.WebApplication.WordPress"))
184 def test_imports_wth_namespace_prefix(self):
188 file: custom_types/nested_rsyslog.yaml
189 namespace_prefix: testprefix
191 path = 'toscaparser/tests/data/tosca_elk.yaml'
192 custom_defs = self._imports_content_test(tpl_snippet,
195 self.assertTrue(custom_defs.get("testprefix.Rsyslog"))
197 def test_imports_with_no_main_template(self):
200 - some_definitions: https://raw.githubusercontent.com/openstack/\
201 tosca-parser/master/toscaparser/tests/data/custom_types/wordpress.yaml
203 file: my_defns/my_typesdefs_n.yaml
205 errormsg = _('Input tosca template is not provided.')
206 err = self.assertRaises(exception.ValidationError,
207 self._imports_content_test,
208 tpl_snippet, None, None)
209 self.assertEqual(errormsg, err.__str__())
211 def test_imports_duplicate_name(self):
214 - some_definitions: https://raw.githubusercontent.com/openstack/\
215 tosca-parser/master/toscaparser/tests/data/custom_types/wordpress.yaml
217 file: my_defns/my_typesdefs_n.yaml
219 errormsg = _('Duplicate import name "some_definitions" was found.')
220 path = 'toscaparser/tests/data/tosca_elk.yaml'
221 err = self.assertRaises(exception.ValidationError,
222 self._imports_content_test,
223 tpl_snippet, path, None)
224 self.assertEqual(errormsg, err.__str__())
226 def test_imports_missing_req_field_in_def(self):
230 file1: my_defns/my_typesdefs_n.yaml
231 repository: my_company_repo
232 namespace_uri: http://mycompany.com/ns/tosca/2.0
233 namespace_prefix: mycompany
235 errormsg = _('Import of template "more_definitions" is missing '
236 'required field "file".')
237 path = 'toscaparser/tests/data/tosca_elk.yaml'
238 err = self.assertRaises(exception.MissingRequiredFieldError,
239 self._imports_content_test,
240 tpl_snippet, path, None)
241 self.assertEqual(errormsg, err.__str__())
243 def test_imports_file_with_uri(self):
247 file: https://raw.githubusercontent.com/openstack/\
248 tosca-parser/master/toscaparser/tests/data/custom_types/wordpress.yaml
250 path = 'https://raw.githubusercontent.com/openstack/\
251 tosca-parser/master/toscaparser/tests/data/\
252 tosca_single_instance_wordpress_with_url_import.yaml'
253 custom_defs = self._imports_content_test(tpl_snippet,
256 self.assertTrue(custom_defs.get("tosca.nodes."
257 "WebApplication.WordPress"))
259 def test_imports_file_namespace_fields(self):
263 file: https://raw.githubusercontent.com/openstack/\
264 heat-translator/master/translator/tests/data/custom_types/wordpress.yaml
265 namespace_prefix: mycompany
266 namespace_uri: http://docs.oasis-open.org/tosca/ns/simple/yaml/1.0
268 path = 'toscaparser/tests/data/tosca_elk.yaml'
269 custom_defs = self._imports_content_test(tpl_snippet,
272 self.assertTrue(custom_defs.get("mycompany.tosca.nodes."
273 "WebApplication.WordPress"))
275 def test_import_error_file_uri(self):
279 file: mycompany.com/ns/tosca/2.0/toscaparser/tests/data\
281 namespace_prefix: mycompany
282 namespace_uri: http://docs.oasis-open.org/tosca/ns/simple/yaml/1.0
284 path = 'toscaparser/tests/data/tosca_elk.yaml'
285 self.assertRaises(ImportError,
286 self._imports_content_test,
287 tpl_snippet, path, None)
289 def test_import_single_line_error(self):
292 - some_definitions: abc.com/tests/data/tosca_elk.yaml
294 errormsg = _('Import "abc.com/tests/data/tosca_elk.yaml" is not '
296 path = 'toscaparser/tests/data/tosca_elk.yaml'
297 err = self.assertRaises(ImportError,
298 self._imports_content_test,
299 tpl_snippet, path, None)
300 self.assertEqual(errormsg, err.__str__())
302 def test_outputs(self):
306 description: IP address of server instance.
307 values: { get_property: [server, private_address] }
309 outputs = (toscaparser.utils.yamlparser.
310 simple_parse(tpl_snippet)['outputs'])
311 name, attrs = list(outputs.items())[0]
312 output = Output(name, attrs)
315 except Exception as err:
317 isinstance(err, exception.MissingRequiredFieldError))
318 self.assertEqual(_('Output "server_address" is missing required '
319 'field "value".'), err.__str__())
324 descriptions: IP address of server instance.
325 value: { get_property: [server, private_address] }
327 outputs = (toscaparser.utils.yamlparser.
328 simple_parse(tpl_snippet)['outputs'])
329 name, attrs = list(outputs.items())[0]
330 output = Output(name, attrs)
333 except Exception as err:
334 self.assertTrue(isinstance(err, exception.UnknownFieldError))
335 self.assertEqual(_('Output "server_address" contains unknown '
336 'field "descriptions". Refer to the definition '
337 'to verify valid values.'),
340 def _repo_content(self, path):
341 repositories = path['repositories']
343 for name, val in repositories.items():
344 reposits = Repository(name, val)
345 reposit.append(reposits)
348 def test_repositories(self):
351 repo_code0: https://raw.githubusercontent.com/nandinivemula/intern
353 description: My project's code Repository in github usercontent.
354 url: https://github.com/nandinivemula/intern
359 description: My Project's code Repository in github.
360 url: https://github.com/nandinivemula/intern
365 tpl = (toscaparser.utils.yamlparser.simple_parse(tpl_snippet))
366 repoobject = self._repo_content(tpl)
367 actualrepo_names = []
368 for repo in repoobject:
370 actualrepo_names.append(repos)
371 reposname = list(tpl.values())
372 reposnames = reposname[0]
373 expected_reponames = list(reposnames.keys())
374 self.assertEqual(expected_reponames, actualrepo_names)
376 def test_repositories_with_missing_required_field(self):
379 repo_code0: https://raw.githubusercontent.com/nandinivemula/intern
381 description: My project's code Repository in github usercontent.
386 description: My Project's code Repository in github.
387 url: https://github.com/nandinivemula/intern
392 tpl = (toscaparser.utils.yamlparser.simple_parse(tpl_snippet))
393 err = self.assertRaises(exception.MissingRequiredFieldError,
394 self._repo_content, tpl)
395 expectedmessage = _('Repository "repo_code1" is missing '
396 'required field "url".')
397 self.assertEqual(expectedmessage, err.__str__())
399 def test_repositories_with_unknown_field(self):
402 repo_code0: https://raw.githubusercontent.com/nandinivemula/intern
404 description: My project's code Repository in github usercontent.
405 url: https://github.com/nandinivemula/intern
410 descripton: My Project's code Repository in github.
411 url: https://github.com/nandinivemula/intern
416 tpl = (toscaparser.utils.yamlparser.simple_parse(tpl_snippet))
417 err = self.assertRaises(exception.UnknownFieldError,
418 self._repo_content, tpl)
419 expectedmessage = _('repositories "repo_code2" contains unknown field'
420 ' "descripton". Refer to the definition to verify'
422 self.assertEqual(expectedmessage, err.__str__())
424 def test_repositories_with_invalid_url(self):
427 repo_code0: https://raw.githubusercontent.com/nandinivemula/intern
429 description: My project's code Repository in github usercontent.
435 description: My Project's code Repository in github.
436 url: https://github.com/nandinivemula/intern
441 tpl = (toscaparser.utils.yamlparser.simple_parse(tpl_snippet))
442 err = self.assertRaises(exception.URLException,
443 self._repo_content, tpl)
444 expectedmessage = _('repsositories "repo_code1" Invalid Url')
445 self.assertEqual(expectedmessage, err.__str__())
447 def test_groups(self):
451 type: tosca.nodes.Compute
454 capability: log_endpoint
457 type: tosca.nodes.DBMS
464 type: tosca.groups.Root
465 members: [ server, mysql_dbms ]
467 tpl = (toscaparser.utils.yamlparser.simple_parse(tpl_snippet))
468 TopologyTemplate(tpl, None)
470 def test_groups_with_missing_required_field(self):
474 type: tosca.nodes.Compute
477 capability: log_endpoint
480 type: tosca.nodes.DBMS
487 members: ['server', 'mysql_dbms']
489 tpl = (toscaparser.utils.yamlparser.simple_parse(tpl_snippet))
490 err = self.assertRaises(exception.MissingRequiredFieldError,
491 TopologyTemplate, tpl, None)
492 expectedmessage = _('Template "webserver_group" is missing '
493 'required field "type".')
494 self.assertEqual(expectedmessage, err.__str__())
496 def test_groups_with_unknown_target(self):
500 type: tosca.nodes.Compute
503 capability: log_endpoint
506 type: tosca.nodes.DBMS
513 type: tosca.groups.Root
514 members: [ serv, mysql_dbms ]
516 tpl = (toscaparser.utils.yamlparser.simple_parse(tpl_snippet))
517 expectedmessage = _('"Target member "serv" is not found in '
519 err = self.assertRaises(exception.InvalidGroupTargetException,
520 TopologyTemplate, tpl, None)
521 self.assertEqual(expectedmessage, err.__str__())
523 def test_groups_with_repeated_targets(self):
527 type: tosca.nodes.Compute
530 capability: log_endpoint
533 type: tosca.nodes.DBMS
540 type: tosca.groups.Root
541 members: [ server, server, mysql_dbms ]
543 tpl = (toscaparser.utils.yamlparser.simple_parse(tpl_snippet))
544 expectedmessage = _('"Member nodes '
545 '"[\'server\', \'server\', \'mysql_dbms\']" '
546 'should be >= 1 and not repeated"')
547 err = self.assertRaises(exception.InvalidGroupTargetException,
548 TopologyTemplate, tpl, None)
549 self.assertEqual(expectedmessage, err.__str__())
551 def test_groups_with_only_one_target(self):
555 type: tosca.nodes.Compute
558 capability: log_endpoint
561 type: tosca.nodes.DBMS
568 type: tosca.groups.Root
571 tpl = (toscaparser.utils.yamlparser.simple_parse(tpl_snippet))
572 expectedmessage = _('"Member nodes "[]" should be >= 1 '
574 err = self.assertRaises(exception.InvalidGroupTargetException,
575 TopologyTemplate, tpl, None)
576 self.assertEqual(expectedmessage, err.__str__())
578 def _custom_types(self):
580 def_file = os.path.join(
581 os.path.dirname(os.path.abspath(__file__)),
582 "data/custom_types/wordpress.yaml")
583 custom_type = toscaparser.utils.yamlparser.load_yaml(def_file)
584 node_types = custom_type['node_types']
585 for name in node_types:
586 defintion = node_types[name]
587 custom_types[name] = defintion
590 def _single_node_template_content_test(self, tpl_snippet):
591 nodetemplates = (toscaparser.utils.yamlparser.
592 simple_ordered_parse(tpl_snippet))['node_templates']
593 name = list(nodetemplates.keys())[0]
594 nodetemplate = NodeTemplate(name, nodetemplates,
595 self._custom_types())
596 nodetemplate.validate()
597 nodetemplate.requirements
598 nodetemplate.get_capabilities_objects()
599 nodetemplate.get_properties_objects()
600 nodetemplate.interfaces
602 def test_node_templates(self):
619 expectedmessage = _('Template "server" is missing required field '
621 err = self.assertRaises(
622 exception.MissingRequiredFieldError,
623 lambda: self._single_node_template_content_test(tpl_snippet))
624 self.assertEqual(expectedmessage, err.__str__())
626 def test_node_template_with_wrong_properties_keyname(self):
627 """Node template keyname 'properties' given as 'propertiessss'."""
631 type: tosca.nodes.DBMS
636 expectedmessage = _('Node template "mysql_dbms" contains unknown '
637 'field "propertiessss". Refer to the definition '
638 'to verify valid values.')
639 err = self.assertRaises(
640 exception.UnknownFieldError,
641 lambda: self._single_node_template_content_test(tpl_snippet))
642 self.assertEqual(expectedmessage, err.__str__())
644 def test_node_template_with_wrong_requirements_keyname(self):
645 """Node template keyname 'requirements' given as 'requirement'."""
649 type: tosca.nodes.DBMS
656 expectedmessage = _('Node template "mysql_dbms" contains unknown '
657 'field "requirement". Refer to the definition to '
658 'verify valid values.')
659 err = self.assertRaises(
660 exception.UnknownFieldError,
661 lambda: self._single_node_template_content_test(tpl_snippet))
662 self.assertEqual(expectedmessage, err.__str__())
664 def test_node_template_with_wrong_interfaces_keyname(self):
665 """Node template keyname 'interfaces' given as 'interfac'."""
669 type: tosca.nodes.DBMS
677 configure: mysql_database_configure.sh
679 expectedmessage = _('Node template "mysql_dbms" contains unknown '
680 'field "interfac". Refer to the definition to '
681 'verify valid values.')
682 err = self.assertRaises(
683 exception.UnknownFieldError,
684 lambda: self._single_node_template_content_test(tpl_snippet))
685 self.assertEqual(expectedmessage, err.__str__())
687 def test_node_template_with_wrong_capabilities_keyname(self):
688 """Node template keyname 'capabilities' given as 'capabilitiis'."""
692 type: tosca.nodes.Database
694 db_name: { get_input: db_name }
695 db_user: { get_input: db_user }
696 db_password: { get_input: db_pwd }
700 port: { get_input: db_port }
702 expectedmessage = _('Node template "mysql_database" contains unknown '
703 'field "capabilitiis". Refer to the definition to '
704 'verify valid values.')
705 err = self.assertRaises(
706 exception.UnknownFieldError,
707 lambda: self._single_node_template_content_test(tpl_snippet))
708 self.assertEqual(expectedmessage, err.__str__())
710 def test_node_template_with_wrong_artifacts_keyname(self):
711 """Node template keyname 'artifacts' given as 'artifactsss'."""
715 type: tosca.nodes.Database
718 implementation: files/my_db_content.txt
719 type: tosca.artifacts.File
721 expectedmessage = _('Node template "mysql_database" contains unknown '
722 'field "artifactsss". Refer to the definition to '
723 'verify valid values.')
724 err = self.assertRaises(
725 exception.UnknownFieldError,
726 lambda: self._single_node_template_content_test(tpl_snippet))
727 self.assertEqual(expectedmessage, err.__str__())
729 def test_node_template_with_multiple_wrong_keynames(self):
730 """Node templates given with multiple wrong keynames."""
734 type: tosca.nodes.DBMS
742 configure: mysql_database_configure.sh
744 expectedmessage = _('Node template "mysql_dbms" contains unknown '
745 'field "propertieees". Refer to the definition to '
746 'verify valid values.')
747 err = self.assertRaises(
748 exception.UnknownFieldError,
749 lambda: self._single_node_template_content_test(tpl_snippet))
750 self.assertEqual(expectedmessage, err.__str__())
755 type: tosca.nodes.Database
757 name: { get_input: db_name }
758 user: { get_input: db_user }
759 password: { get_input: db_pwd }
763 port: { get_input: db_port }
769 configure: mysql_database_configure.sh
772 expectedmessage = _('Node template "mysql_database" contains unknown '
773 'field "capabilitiiiies". Refer to the definition '
774 'to verify valid values.')
775 err = self.assertRaises(
776 exception.UnknownFieldError,
777 lambda: self._single_node_template_content_test(tpl_snippet))
778 self.assertEqual(expectedmessage, err.__str__())
780 def test_node_template_type(self):
784 type: tosca.nodes.Databases
786 db_name: { get_input: db_name }
787 db_user: { get_input: db_user }
788 db_password: { get_input: db_pwd }
792 port: { get_input: db_port }
797 configure: mysql_database_configure.sh
799 expectedmessage = _('Type "tosca.nodes.Databases" is not '
801 err = self.assertRaises(
802 exception.InvalidTypeError,
803 lambda: self._single_node_template_content_test(tpl_snippet))
804 self.assertEqual(expectedmessage, err.__str__())
806 def test_node_template_requirements(self):
810 type: tosca.nodes.WebServer
815 create: webserver_install.sh
818 expectedmessage = _('"requirements" of template "webserver" must be '
820 err = self.assertRaises(
821 exception.TypeMismatchError,
822 lambda: self._single_node_template_content_test(tpl_snippet))
823 self.assertEqual(expectedmessage, err.__str__())
828 type: tosca.nodes.Database
830 db_name: { get_input: db_name }
831 db_user: { get_input: db_user }
832 db_password: { get_input: db_pwd }
836 port: { get_input: db_port }
839 - database_endpoint: mysql_database
842 configure: mysql_database_configure.sh
844 expectedmessage = _('"requirements" of template "mysql_database" '
845 'contains unknown field "database_endpoint". '
846 'Refer to the definition to verify valid values.')
847 err = self.assertRaises(
848 exception.UnknownFieldError,
849 lambda: self._single_node_template_content_test(tpl_snippet))
850 self.assertEqual(expectedmessage, err.__str__())
852 def test_node_template_requirements_with_wrong_node_keyname(self):
853 """Node template requirements keyname 'node' given as 'nodes'."""
857 type: tosca.nodes.Database
863 expectedmessage = _('"requirements" of template "mysql_database" '
864 'contains unknown field "nodes". Refer to the '
865 'definition to verify valid values.')
866 err = self.assertRaises(
867 exception.UnknownFieldError,
868 lambda: self._single_node_template_content_test(tpl_snippet))
869 self.assertEqual(expectedmessage, err.__str__())
871 def test_node_template_requirements_with_wrong_capability_keyname(self):
872 """Incorrect node template requirements keyname
874 Node template requirements keyname 'capability' given as
880 type: tosca.nodes.Database
886 capabilityy: log_endpoint
888 type: tosca.relationships.ConnectsTo
891 expectedmessage = _('"requirements" of template "mysql_database" '
892 'contains unknown field "capabilityy". Refer to '
893 'the definition to verify valid values.')
894 err = self.assertRaises(
895 exception.UnknownFieldError,
896 lambda: self._single_node_template_content_test(tpl_snippet))
897 self.assertEqual(expectedmessage, err.__str__())
899 def test_node_template_requirements_with_wrong_relationship_keyname(self):
900 """Incorrect node template requirements keyname
902 Node template requirements keyname 'relationship' given as
908 type: tosca.nodes.Database
914 capability: log_endpoint
916 type: tosca.relationships.ConnectsTo
919 expectedmessage = _('"requirements" of template "mysql_database" '
920 'contains unknown field "relationshipppp". Refer '
921 'to the definition to verify valid values.')
922 err = self.assertRaises(
923 exception.UnknownFieldError,
924 lambda: self._single_node_template_content_test(tpl_snippet))
925 self.assertEqual(expectedmessage, err.__str__())
927 def test_node_template_requirements_with_wrong_occurrences_keyname(self):
928 """Incorrect node template requirements keyname
930 Node template requirements keyname 'occurrences' given as
936 type: tosca.nodes.Database
942 capability: log_endpoint
944 type: tosca.relationships.ConnectsTo
945 occurences: [0, UNBOUNDED]
947 expectedmessage = _('"requirements" of template "mysql_database" '
948 'contains unknown field "occurences". Refer to '
949 'the definition to verify valid values.')
950 err = self.assertRaises(
951 exception.UnknownFieldError,
952 lambda: self._single_node_template_content_test(tpl_snippet))
953 self.assertEqual(expectedmessage, err.__str__())
955 def test_node_template_requirements_with_multiple_wrong_keynames(self):
956 """Node templates given with multiple wrong requirements keynames."""
960 type: tosca.nodes.Database
966 capabilit: log_endpoint
968 type: tosca.relationships.ConnectsTo
971 expectedmessage = _('"requirements" of template "mysql_database" '
972 'contains unknown field "nod". Refer to the '
973 'definition to verify valid values.')
974 err = self.assertRaises(
975 exception.UnknownFieldError,
976 lambda: self._single_node_template_content_test(tpl_snippet))
977 self.assertEqual(expectedmessage, err.__str__())
982 type: tosca.nodes.Database
988 capabilit: log_endpoint
990 type: tosca.relationships.ConnectsTo
993 expectedmessage = _('"requirements" of template "mysql_database" '
994 'contains unknown field "capabilit". Refer to the '
995 'definition to verify valid values.')
996 err = self.assertRaises(
997 exception.UnknownFieldError,
998 lambda: self._single_node_template_content_test(tpl_snippet))
999 self.assertEqual(expectedmessage, err.__str__())
1001 def test_node_template_requirements_invalid_occurrences(self):
1005 type: tosca.nodes.Compute
1008 capability: log_endpoint
1009 occurrences: [0, -1]
1011 expectedmessage = _('Value of property "[0, -1]" is invalid.')
1012 err = self.assertRaises(
1013 exception.InvalidPropertyValueError,
1014 lambda: self._single_node_template_content_test(tpl_snippet))
1015 self.assertEqual(expectedmessage, err.__str__())
1020 type: tosca.nodes.Compute
1023 capability: log_endpoint
1026 expectedmessage = _('"a" is not an integer.')
1027 err = self.assertRaises(
1029 lambda: self._single_node_template_content_test(tpl_snippet))
1030 self.assertEqual(expectedmessage, err.__str__())
1035 type: tosca.nodes.Compute
1038 capability: log_endpoint
1041 expectedmessage = _('"-1" is not a list.')
1042 err = self.assertRaises(
1044 lambda: self._single_node_template_content_test(tpl_snippet))
1045 self.assertEqual(expectedmessage, err.__str__())
1050 type: tosca.nodes.Compute
1053 capability: log_endpoint
1056 expectedmessage = _('Value of property "[5, 1]" is invalid.')
1057 err = self.assertRaises(
1058 exception.InvalidPropertyValueError,
1059 lambda: self._single_node_template_content_test(tpl_snippet))
1060 self.assertEqual(expectedmessage, err.__str__())
1065 type: tosca.nodes.Compute
1068 capability: log_endpoint
1071 expectedmessage = _('Value of property "[0, 0]" is invalid.')
1072 err = self.assertRaises(
1073 exception.InvalidPropertyValueError,
1074 lambda: self._single_node_template_content_test(tpl_snippet))
1075 self.assertEqual(expectedmessage, err.__str__())
1077 def test_node_template_requirements_valid_occurrences(self):
1081 type: tosca.nodes.Compute
1084 capability: log_endpoint
1087 self._single_node_template_content_test(tpl_snippet)
1089 def test_node_template_capabilities(self):
1093 type: tosca.nodes.Database
1095 db_name: { get_input: db_name }
1096 db_user: { get_input: db_user }
1097 db_password: { get_input: db_pwd }
1101 port: { get_input: db_port }
1106 configure: mysql_database_configure.sh
1108 expectedmessage = _('"capabilities" of template "mysql_database" '
1109 'contains unknown field "http_endpoint". Refer to '
1110 'the definition to verify valid values.')
1111 err = self.assertRaises(
1112 exception.UnknownFieldError,
1113 lambda: self._single_node_template_content_test(tpl_snippet))
1114 self.assertEqual(expectedmessage, err.__str__())
1116 def test_node_template_properties(self):
1120 type: tosca.nodes.Compute
1122 os_image: F18_x86_64
1127 num_cpus: { get_input: cpus }
1131 architecture: x86_64
1133 distribution: Fedora
1136 expectedmessage = _('"properties" of template "server" contains '
1137 'unknown field "os_image". Refer to the '
1138 'definition to verify valid values.')
1139 err = self.assertRaises(
1140 exception.UnknownFieldError,
1141 lambda: self._single_node_template_content_test(tpl_snippet))
1142 self.assertEqual(expectedmessage, err.__str__())
1144 def test_node_template_interfaces(self):
1148 type: tosca.nodes.WebApplication.WordPress
1151 - database_endpoint: mysql_database
1154 create: wordpress_install.sh
1156 implementation: wordpress_configure.sh
1158 wp_db_name: { get_property: [ mysql_database, db_name ] }
1159 wp_db_user: { get_property: [ mysql_database, db_user ] }
1160 wp_db_password: { get_property: [ mysql_database, \
1162 wp_db_port: { get_property: [ SELF, \
1163 database_endpoint, port ] }
1165 expectedmessage = _('"interfaces" of template "wordpress" contains '
1166 'unknown field "Standards". Refer to the '
1167 'definition to verify valid values.')
1168 err = self.assertRaises(
1169 exception.UnknownFieldError,
1170 lambda: self._single_node_template_content_test(tpl_snippet))
1171 self.assertEqual(expectedmessage, err.__str__())
1176 type: tosca.nodes.WebApplication.WordPress
1179 - database_endpoint: mysql_database
1182 create: wordpress_install.sh
1184 implementation: wordpress_configure.sh
1186 wp_db_name: { get_property: [ mysql_database, db_name ] }
1187 wp_db_user: { get_property: [ mysql_database, db_user ] }
1188 wp_db_password: { get_property: [ mysql_database, \
1190 wp_db_port: { get_property: [ SELF, \
1191 database_endpoint, port ] }
1193 expectedmessage = _('"interfaces" of template "wordpress" contains '
1194 'unknown field "config". Refer to the definition '
1195 'to verify valid values.')
1196 err = self.assertRaises(
1197 exception.UnknownFieldError,
1198 lambda: self._single_node_template_content_test(tpl_snippet))
1199 self.assertEqual(expectedmessage, err.__str__())
1204 type: tosca.nodes.WebApplication.WordPress
1207 - database_endpoint: mysql_database
1210 create: wordpress_install.sh
1212 implementation: wordpress_configure.sh
1214 wp_db_name: { get_property: [ mysql_database, db_name ] }
1215 wp_db_user: { get_property: [ mysql_database, db_user ] }
1216 wp_db_password: { get_property: [ mysql_database, \
1218 wp_db_port: { get_ref_property: [ database_endpoint, \
1219 database_endpoint, port ] }
1221 expectedmessage = _('"interfaces" of template "wordpress" contains '
1222 'unknown field "input". Refer to the definition '
1223 'to verify valid values.')
1224 err = self.assertRaises(
1225 exception.UnknownFieldError,
1226 lambda: self._single_node_template_content_test(tpl_snippet))
1227 self.assertEqual(expectedmessage, err.__str__())
1229 def test_relationship_template_properties(self):
1231 relationship_templates:
1237 expectedmessage = _('"properties" of template "storage_attachto" is '
1238 'missing required field "[\'location\']".')
1239 rel_template = (toscaparser.utils.yamlparser.
1240 simple_parse(tpl_snippet))['relationship_templates']
1241 name = list(rel_template.keys())[0]
1242 rel_template = RelationshipTemplate(rel_template[name], name)
1243 err = self.assertRaises(exception.MissingRequiredFieldError,
1244 rel_template.validate)
1245 self.assertEqual(expectedmessage, six.text_type(err))
1247 def test_invalid_template_version(self):
1248 tosca_tpl = os.path.join(
1249 os.path.dirname(os.path.abspath(__file__)),
1250 "data/test_invalid_template_version.yaml")
1251 self.assertRaises(exception.ValidationError, ToscaTemplate, tosca_tpl)
1252 valid_versions = ', '.join(ToscaTemplate.VALID_TEMPLATE_VERSIONS)
1253 exception.ExceptionCollector.assertExceptionMessage(
1254 exception.InvalidTemplateVersion,
1255 (_('The template version "tosca_xyz" is invalid. Valid versions '
1256 'are "%s".') % valid_versions))
1258 def test_node_template_capabilities_properties(self):
1259 # validating capability property values
1263 type: tosca.nodes.WebServer
1269 expectedmessage = _('The value "test" of property "initiator" is '
1270 'not valid. Expected a value from "[source, '
1273 err = self.assertRaises(
1274 exception.ValidationError,
1275 lambda: self._single_node_template_content_test(tpl_snippet))
1276 self.assertEqual(expectedmessage, err.__str__())
1281 type: tosca.nodes.Compute
1286 num_cpus: { get_input: cpus }
1290 architecture: x86_64
1292 distribution: Fedora
1298 default_instances: 5
1300 expectedmessage = _('"properties" of template "server": '
1301 '"default_instances" value is not between '
1302 '"min_instances" and "max_instances".')
1303 err = self.assertRaises(
1304 exception.ValidationError,
1305 lambda: self._single_node_template_content_test(tpl_snippet))
1306 self.assertEqual(expectedmessage, err.__str__())
1308 def test_node_template_objectstorage_without_required_property(self):
1312 type: tosca.nodes.ObjectStorage
1316 expectedmessage = _('"properties" of template "server" is missing '
1317 'required field "[\'name\']".')
1318 err = self.assertRaises(
1319 exception.MissingRequiredFieldError,
1320 lambda: self._single_node_template_content_test(tpl_snippet))
1321 self.assertEqual(expectedmessage, err.__str__())
1323 def test_node_template_objectstorage_with_invalid_scalar_unit(self):
1327 type: tosca.nodes.ObjectStorage
1332 expectedmessage = _('"-1" is not a valid scalar-unit.')
1333 err = self.assertRaises(
1335 lambda: self._single_node_template_content_test(tpl_snippet))
1336 self.assertEqual(expectedmessage, err.__str__())
1338 def test_node_template_objectstorage_with_invalid_scalar_type(self):
1342 type: tosca.nodes.ObjectStorage
1347 expectedmessage = _('"1 XB" is not a valid scalar-unit.')
1348 err = self.assertRaises(
1350 lambda: self._single_node_template_content_test(tpl_snippet))
1351 self.assertEqual(expectedmessage, err.__str__())
1353 def test_special_keywords(self):
1354 """Test special keywords
1356 Test that special keywords, e.g. metadata, which are not part
1357 of specification do not throw any validation error.
1359 tpl_snippet_metadata_map = '''
1362 type: tosca.nodes.Compute
1367 self._single_node_template_content_test(tpl_snippet_metadata_map)
1369 tpl_snippet_metadata_inline = '''
1372 type: tosca.nodes.Compute
1375 self._single_node_template_content_test(tpl_snippet_metadata_inline)
1377 def test_policy_valid_keynames(self):
1380 - servers_placement:
1381 type: tosca.policies.Placement
1382 description: Apply placement policy to servers
1383 metadata: { user1: 1001, user2: 1002 }
1384 targets: [ serv1, serv2 ]
1386 policies = (toscaparser.utils.yamlparser.
1387 simple_parse(tpl_snippet))['policies'][0]
1388 name = list(policies.keys())[0]
1389 Policy(name, policies[name], None, None)
1391 def test_policy_invalid_keyname(self):
1394 - servers_placement:
1395 type: tosca.policies.Placement
1398 policies = (toscaparser.utils.yamlparser.
1399 simple_parse(tpl_snippet))['policies'][0]
1400 name = list(policies.keys())[0]
1402 expectedmessage = _('Policy "servers_placement" contains '
1403 'unknown field "testkey". Refer to the '
1404 'definition to verify valid values.')
1405 err = self.assertRaises(
1406 exception.UnknownFieldError,
1407 lambda: Policy(name, policies[name], None, None))
1408 self.assertEqual(expectedmessage, err.__str__())
1410 def test_policy_trigger_valid_keyname(self):
1414 description: trigger
1415 event_type: tosca.events.resource.utilization
1417 start_time: "2015-05-07T07:00:00Z"
1418 end_time: "2015-06-07T07:00:00Z"
1420 node: master-container
1422 capability: Container
1424 constraint: utilization greater_than 50%
1429 resize: # Operation name
1431 strategy: LEAST_USED
1432 implementation: Senlin.webhook()
1434 triggers = (toscaparser.utils.yamlparser.
1435 simple_parse(tpl_snippet))['triggers'][0]
1436 name = list(triggers.keys())[0]
1437 Triggers(name, triggers[name])
1439 def test_policy_trigger_invalid_keyname(self):
1443 description: trigger
1444 event_type: tosca.events.resource.utilization
1446 start_time: "2015-05-07T07:00:00Z"
1447 end_time: "2015-06-07T07:00:00Z"
1449 node: master-container
1451 capability: Container
1453 constraint: utilization greater_than 50%
1458 resize: # Operation name
1460 strategy: LEAST_USED
1461 implementation: Senlin.webhook()
1463 triggers = (toscaparser.utils.yamlparser.
1464 simple_parse(tpl_snippet))['triggers'][0]
1465 name = list(triggers.keys())[0]
1466 expectedmessage = _(
1467 'Triggers "resize_compute" contains unknown field '
1468 '"target_filter1". Refer to the definition '
1469 'to verify valid values.')
1470 err = self.assertRaises(
1471 exception.UnknownFieldError,
1472 lambda: Triggers(name, triggers[name]))
1473 self.assertEqual(expectedmessage, err.__str__())
1475 def test_policy_missing_required_keyname(self):
1478 - servers_placement:
1479 description: test description
1481 policies = (toscaparser.utils.yamlparser.
1482 simple_parse(tpl_snippet))['policies'][0]
1483 name = list(policies.keys())[0]
1485 expectedmessage = _('Template "servers_placement" is missing '
1486 'required field "type".')
1487 err = self.assertRaises(
1488 exception.MissingRequiredFieldError,
1489 lambda: Policy(name, policies[name], None, None))
1490 self.assertEqual(expectedmessage, err.__str__())
1492 def test_credential_datatype(self):
1493 tosca_tpl = os.path.join(
1494 os.path.dirname(os.path.abspath(__file__)),
1495 "data/test_credential_datatype.yaml")
1496 self.assertIsNotNone(ToscaTemplate(tosca_tpl))
1498 def test_invalid_default_value(self):
1499 tpl_path = os.path.join(
1500 os.path.dirname(os.path.abspath(__file__)),
1501 "data/test_invalid_input_defaults.yaml")
1502 self.assertRaises(exception.ValidationError, ToscaTemplate, tpl_path)
1503 exception.ExceptionCollector.assertExceptionMessage(
1504 ValueError, _('"two" is not an integer.'))
1506 def test_invalid_capability(self):
1510 type: tosca.nodes.Compute
1514 architecture: x86_64
1516 tpl = (toscaparser.utils.yamlparser.simple_parse(tpl_snippet))
1517 err = self.assertRaises(exception.UnknownFieldError,
1518 TopologyTemplate, tpl, None)
1519 expectedmessage = _('"capabilities" of template "server" contains '
1520 'unknown field "oss". Refer to the definition '
1521 'to verify valid values.')
1522 self.assertEqual(expectedmessage, err.__str__())