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_unsupported_type(self):
105 type: tosca.test.invalidtype
107 size: { get_input: storage_size }
108 snapshot_id: { get_input: storage_snapshot_id }
110 tpl = (toscaparser.utils.yamlparser.simple_parse(tpl_snippet))
111 err = self.assertRaises(exception.UnsupportedTypeError,
112 TopologyTemplate, tpl, None)
113 expectedmessage = _('Type "tosca.test.invalidtype" is valid'
114 ' TOSCA type but not supported at this time.')
115 self.assertEqual(expectedmessage, err.__str__())
117 def test_inputs(self):
122 description: Number of CPUs for the server.
124 - valid_values: [ 1, 2, 4 ]
132 description: Number of CPUs for the server.
134 - valid_values: [ 1, 2, 4 ]
138 inputs1 = (toscaparser.utils.yamlparser.
139 simple_parse(tpl_snippet1)['inputs'])
140 name1, attrs1 = list(inputs1.items())[0]
141 inputs2 = (toscaparser.utils.yamlparser.
142 simple_parse(tpl_snippet2)['inputs'])
143 name2, attrs2 = list(inputs2.items())[0]
146 except Exception as err:
147 # err=self.assertRaises(exception.UnknownFieldError,
149 self.assertEqual(_('Input "cpus" contains unknown field '
150 '"constraint". Refer to the definition to '
151 'verify valid values.'),
153 input2 = Input(name2, attrs2)
154 self.assertTrue(input2.required)
156 def _imports_content_test(self, tpl_snippet, path, custom_type_def):
157 imports = (toscaparser.utils.yamlparser.
158 simple_parse(tpl_snippet)['imports'])
159 loader = ImportsLoader(imports, path, custom_type_def)
160 return loader.get_custom_defs()
162 def test_imports_without_templates(self):
165 # omitted here for brevity
167 path = 'toscaparser/tests/data/tosca_elk.yaml'
168 errormsg = _('"imports" keyname is defined without including '
170 err = self.assertRaises(exception.ValidationError,
171 self._imports_content_test,
175 self.assertEqual(errormsg, err.__str__())
177 def test_imports_with_name_without_templates(self):
182 path = 'toscaparser/tests/data/tosca_elk.yaml'
183 errormsg = _('A template file name is not provided with import '
184 'definition "some_definitions".')
185 err = self.assertRaises(exception.ValidationError,
186 self._imports_content_test,
187 tpl_snippet, path, None)
188 self.assertEqual(errormsg, err.__str__())
190 def test_imports_without_import_name(self):
193 - custom_types/paypalpizzastore_nodejs_app.yaml
194 - https://raw.githubusercontent.com/openstack/\
195 tosca-parser/master/toscaparser/tests/data/custom_types/wordpress.yaml
197 path = 'toscaparser/tests/data/tosca_elk.yaml'
198 custom_defs = self._imports_content_test(tpl_snippet,
201 self.assertTrue(custom_defs)
203 def test_imports_wth_import_name(self):
206 - some_definitions: custom_types/paypalpizzastore_nodejs_app.yaml
208 file: 'https://raw.githubusercontent.com/openstack/tosca-parser\
209 /master/toscaparser/tests/data/custom_types/wordpress.yaml'
210 namespace_prefix: single_instance_wordpress
212 path = 'toscaparser/tests/data/tosca_elk.yaml'
213 custom_defs = self._imports_content_test(tpl_snippet,
216 self.assertTrue(custom_defs.get("single_instance_wordpress.tosca."
217 "nodes.WebApplication.WordPress"))
219 def test_imports_wth_namespace_prefix(self):
223 file: custom_types/nested_rsyslog.yaml
224 namespace_prefix: testprefix
226 path = 'toscaparser/tests/data/tosca_elk.yaml'
227 custom_defs = self._imports_content_test(tpl_snippet,
230 self.assertTrue(custom_defs.get("testprefix.Rsyslog"))
232 def test_imports_with_no_main_template(self):
235 - some_definitions: https://raw.githubusercontent.com/openstack/\
236 tosca-parser/master/toscaparser/tests/data/custom_types/wordpress.yaml
238 file: my_defns/my_typesdefs_n.yaml
240 errormsg = _('Input tosca template is not provided.')
241 err = self.assertRaises(exception.ValidationError,
242 self._imports_content_test,
243 tpl_snippet, None, None)
244 self.assertEqual(errormsg, err.__str__())
246 def test_imports_duplicate_name(self):
249 - some_definitions: https://raw.githubusercontent.com/openstack/\
250 tosca-parser/master/toscaparser/tests/data/custom_types/wordpress.yaml
252 file: my_defns/my_typesdefs_n.yaml
254 errormsg = _('Duplicate import name "some_definitions" was found.')
255 path = 'toscaparser/tests/data/tosca_elk.yaml'
256 err = self.assertRaises(exception.ValidationError,
257 self._imports_content_test,
258 tpl_snippet, path, None)
259 self.assertEqual(errormsg, err.__str__())
261 def test_imports_missing_req_field_in_def(self):
265 file1: my_defns/my_typesdefs_n.yaml
266 repository: my_company_repo
267 namespace_uri: http://mycompany.com/ns/tosca/2.0
268 namespace_prefix: mycompany
270 errormsg = _('Import of template "more_definitions" is missing '
271 'required field "file".')
272 path = 'toscaparser/tests/data/tosca_elk.yaml'
273 err = self.assertRaises(exception.MissingRequiredFieldError,
274 self._imports_content_test,
275 tpl_snippet, path, None)
276 self.assertEqual(errormsg, err.__str__())
278 def test_imports_file_with_uri(self):
282 file: https://raw.githubusercontent.com/openstack/\
283 tosca-parser/master/toscaparser/tests/data/custom_types/wordpress.yaml
285 path = 'https://raw.githubusercontent.com/openstack/\
286 tosca-parser/master/toscaparser/tests/data/\
287 tosca_single_instance_wordpress_with_url_import.yaml'
288 custom_defs = self._imports_content_test(tpl_snippet,
291 self.assertTrue(custom_defs.get("tosca.nodes."
292 "WebApplication.WordPress"))
294 def test_imports_file_namespace_fields(self):
298 file: https://raw.githubusercontent.com/openstack/\
299 heat-translator/master/translator/tests/data/custom_types/wordpress.yaml
300 namespace_prefix: mycompany
301 namespace_uri: http://docs.oasis-open.org/tosca/ns/simple/yaml/1.0
303 path = 'toscaparser/tests/data/tosca_elk.yaml'
304 custom_defs = self._imports_content_test(tpl_snippet,
307 self.assertTrue(custom_defs.get("mycompany.tosca.nodes."
308 "WebApplication.WordPress"))
310 def test_import_error_file_uri(self):
314 file: mycompany.com/ns/tosca/2.0/toscaparser/tests/data\
316 namespace_prefix: mycompany
317 namespace_uri: http://docs.oasis-open.org/tosca/ns/simple/yaml/1.0
319 path = 'toscaparser/tests/data/tosca_elk.yaml'
320 self.assertRaises(ImportError,
321 self._imports_content_test,
322 tpl_snippet, path, None)
324 def test_import_single_line_error(self):
327 - some_definitions: abc.com/tests/data/tosca_elk.yaml
329 errormsg = _('Import "abc.com/tests/data/tosca_elk.yaml" is not '
331 path = 'toscaparser/tests/data/tosca_elk.yaml'
332 err = self.assertRaises(ImportError,
333 self._imports_content_test,
334 tpl_snippet, path, None)
335 self.assertEqual(errormsg, err.__str__())
337 def test_outputs(self):
341 description: IP address of server instance.
342 values: { get_property: [server, private_address] }
344 outputs = (toscaparser.utils.yamlparser.
345 simple_parse(tpl_snippet)['outputs'])
346 name, attrs = list(outputs.items())[0]
347 output = Output(name, attrs)
350 except Exception as err:
352 isinstance(err, exception.MissingRequiredFieldError))
353 self.assertEqual(_('Output "server_address" is missing required '
354 'field "value".'), err.__str__())
359 descriptions: IP address of server instance.
360 value: { get_property: [server, private_address] }
362 outputs = (toscaparser.utils.yamlparser.
363 simple_parse(tpl_snippet)['outputs'])
364 name, attrs = list(outputs.items())[0]
365 output = Output(name, attrs)
368 except Exception as err:
369 self.assertTrue(isinstance(err, exception.UnknownFieldError))
370 self.assertEqual(_('Output "server_address" contains unknown '
371 'field "descriptions". Refer to the definition '
372 'to verify valid values.'),
375 def _repo_content(self, path):
376 repositories = path['repositories']
378 for name, val in repositories.items():
379 reposits = Repository(name, val)
380 reposit.append(reposits)
383 def test_repositories(self):
386 repo_code0: https://raw.githubusercontent.com/nandinivemula/intern
388 description: My project's code Repository in github usercontent.
389 url: https://github.com/nandinivemula/intern
394 description: My Project's code Repository in github.
395 url: https://github.com/nandinivemula/intern
400 tpl = (toscaparser.utils.yamlparser.simple_parse(tpl_snippet))
401 repoobject = self._repo_content(tpl)
402 actualrepo_names = []
403 for repo in repoobject:
405 actualrepo_names.append(repos)
406 reposname = list(tpl.values())
407 reposnames = reposname[0]
408 expected_reponames = list(reposnames.keys())
409 self.assertEqual(expected_reponames, actualrepo_names)
411 def test_repositories_with_missing_required_field(self):
414 repo_code0: https://raw.githubusercontent.com/nandinivemula/intern
416 description: My project's code Repository in github usercontent.
421 description: My Project's code Repository in github.
422 url: https://github.com/nandinivemula/intern
427 tpl = (toscaparser.utils.yamlparser.simple_parse(tpl_snippet))
428 err = self.assertRaises(exception.MissingRequiredFieldError,
429 self._repo_content, tpl)
430 expectedmessage = _('Repository "repo_code1" is missing '
431 'required field "url".')
432 self.assertEqual(expectedmessage, err.__str__())
434 def test_repositories_with_unknown_field(self):
437 repo_code0: https://raw.githubusercontent.com/nandinivemula/intern
439 description: My project's code Repository in github usercontent.
440 url: https://github.com/nandinivemula/intern
445 descripton: My Project's code Repository in github.
446 url: https://github.com/nandinivemula/intern
451 tpl = (toscaparser.utils.yamlparser.simple_parse(tpl_snippet))
452 err = self.assertRaises(exception.UnknownFieldError,
453 self._repo_content, tpl)
454 expectedmessage = _('repositories "repo_code2" contains unknown field'
455 ' "descripton". Refer to the definition to verify'
457 self.assertEqual(expectedmessage, err.__str__())
459 def test_repositories_with_invalid_url(self):
462 repo_code0: https://raw.githubusercontent.com/nandinivemula/intern
464 description: My project's code Repository in github usercontent.
470 description: My Project's code Repository in github.
471 url: https://github.com/nandinivemula/intern
476 tpl = (toscaparser.utils.yamlparser.simple_parse(tpl_snippet))
477 err = self.assertRaises(exception.URLException,
478 self._repo_content, tpl)
479 expectedmessage = _('repsositories "repo_code1" Invalid Url')
480 self.assertEqual(expectedmessage, err.__str__())
482 def test_groups(self):
486 type: tosca.nodes.Compute
489 capability: log_endpoint
492 type: tosca.nodes.DBMS
499 type: tosca.groups.Root
500 members: [ server, mysql_dbms ]
502 tpl = (toscaparser.utils.yamlparser.simple_parse(tpl_snippet))
503 TopologyTemplate(tpl, None)
505 def test_groups_with_missing_required_field(self):
509 type: tosca.nodes.Compute
512 capability: log_endpoint
515 type: tosca.nodes.DBMS
522 members: ['server', 'mysql_dbms']
524 tpl = (toscaparser.utils.yamlparser.simple_parse(tpl_snippet))
525 err = self.assertRaises(exception.MissingRequiredFieldError,
526 TopologyTemplate, tpl, None)
527 expectedmessage = _('Template "webserver_group" is missing '
528 'required field "type".')
529 self.assertEqual(expectedmessage, err.__str__())
531 def test_groups_with_unknown_target(self):
535 type: tosca.nodes.Compute
538 capability: log_endpoint
541 type: tosca.nodes.DBMS
548 type: tosca.groups.Root
549 members: [ serv, mysql_dbms ]
551 tpl = (toscaparser.utils.yamlparser.simple_parse(tpl_snippet))
552 expectedmessage = _('"Target member "serv" is not found in '
554 err = self.assertRaises(exception.InvalidGroupTargetException,
555 TopologyTemplate, tpl, None)
556 self.assertEqual(expectedmessage, err.__str__())
558 def test_groups_with_repeated_targets(self):
562 type: tosca.nodes.Compute
565 capability: log_endpoint
568 type: tosca.nodes.DBMS
575 type: tosca.groups.Root
576 members: [ server, server, mysql_dbms ]
578 tpl = (toscaparser.utils.yamlparser.simple_parse(tpl_snippet))
579 expectedmessage = _('"Member nodes '
580 '"[\'server\', \'server\', \'mysql_dbms\']" '
581 'should be >= 1 and not repeated"')
582 err = self.assertRaises(exception.InvalidGroupTargetException,
583 TopologyTemplate, tpl, None)
584 self.assertEqual(expectedmessage, err.__str__())
586 def test_groups_with_only_one_target(self):
590 type: tosca.nodes.Compute
593 capability: log_endpoint
596 type: tosca.nodes.DBMS
603 type: tosca.groups.Root
606 tpl = (toscaparser.utils.yamlparser.simple_parse(tpl_snippet))
607 expectedmessage = _('"Member nodes "[]" should be >= 1 '
609 err = self.assertRaises(exception.InvalidGroupTargetException,
610 TopologyTemplate, tpl, None)
611 self.assertEqual(expectedmessage, err.__str__())
613 def _custom_types(self):
615 def_file = os.path.join(
616 os.path.dirname(os.path.abspath(__file__)),
617 "data/custom_types/wordpress.yaml")
618 custom_type = toscaparser.utils.yamlparser.load_yaml(def_file)
619 node_types = custom_type['node_types']
620 for name in node_types:
621 defintion = node_types[name]
622 custom_types[name] = defintion
625 def _single_node_template_content_test(self, tpl_snippet):
626 nodetemplates = (toscaparser.utils.yamlparser.
627 simple_ordered_parse(tpl_snippet))['node_templates']
628 name = list(nodetemplates.keys())[0]
629 nodetemplate = NodeTemplate(name, nodetemplates,
630 self._custom_types())
631 nodetemplate.validate()
632 nodetemplate.requirements
633 nodetemplate.get_capabilities_objects()
634 nodetemplate.get_properties_objects()
635 nodetemplate.interfaces
637 def test_node_templates(self):
654 expectedmessage = _('Template "server" is missing required field '
656 err = self.assertRaises(
657 exception.MissingRequiredFieldError,
658 lambda: self._single_node_template_content_test(tpl_snippet))
659 self.assertEqual(expectedmessage, err.__str__())
661 def test_node_template_with_wrong_properties_keyname(self):
662 """Node template keyname 'properties' given as 'propertiessss'."""
666 type: tosca.nodes.DBMS
671 expectedmessage = _('Node template "mysql_dbms" contains unknown '
672 'field "propertiessss". Refer to the definition '
673 'to verify valid values.')
674 err = self.assertRaises(
675 exception.UnknownFieldError,
676 lambda: self._single_node_template_content_test(tpl_snippet))
677 self.assertEqual(expectedmessage, err.__str__())
679 def test_node_template_with_wrong_requirements_keyname(self):
680 """Node template keyname 'requirements' given as 'requirement'."""
684 type: tosca.nodes.DBMS
691 expectedmessage = _('Node template "mysql_dbms" contains unknown '
692 'field "requirement". Refer to the definition to '
693 'verify valid values.')
694 err = self.assertRaises(
695 exception.UnknownFieldError,
696 lambda: self._single_node_template_content_test(tpl_snippet))
697 self.assertEqual(expectedmessage, err.__str__())
699 def test_node_template_with_wrong_interfaces_keyname(self):
700 """Node template keyname 'interfaces' given as 'interfac'."""
704 type: tosca.nodes.DBMS
712 configure: mysql_database_configure.sh
714 expectedmessage = _('Node template "mysql_dbms" contains unknown '
715 'field "interfac". Refer to the definition to '
716 'verify valid values.')
717 err = self.assertRaises(
718 exception.UnknownFieldError,
719 lambda: self._single_node_template_content_test(tpl_snippet))
720 self.assertEqual(expectedmessage, err.__str__())
722 def test_node_template_with_wrong_capabilities_keyname(self):
723 """Node template keyname 'capabilities' given as 'capabilitiis'."""
727 type: tosca.nodes.Database
729 db_name: { get_input: db_name }
730 db_user: { get_input: db_user }
731 db_password: { get_input: db_pwd }
735 port: { get_input: db_port }
737 expectedmessage = _('Node template "mysql_database" contains unknown '
738 'field "capabilitiis". Refer to the definition to '
739 'verify valid values.')
740 err = self.assertRaises(
741 exception.UnknownFieldError,
742 lambda: self._single_node_template_content_test(tpl_snippet))
743 self.assertEqual(expectedmessage, err.__str__())
745 def test_node_template_with_wrong_artifacts_keyname(self):
746 """Node template keyname 'artifacts' given as 'artifactsss'."""
750 type: tosca.nodes.Database
753 implementation: files/my_db_content.txt
754 type: tosca.artifacts.File
756 expectedmessage = _('Node template "mysql_database" contains unknown '
757 'field "artifactsss". Refer to the definition to '
758 'verify valid values.')
759 err = self.assertRaises(
760 exception.UnknownFieldError,
761 lambda: self._single_node_template_content_test(tpl_snippet))
762 self.assertEqual(expectedmessage, err.__str__())
764 def test_node_template_with_multiple_wrong_keynames(self):
765 """Node templates given with multiple wrong keynames."""
769 type: tosca.nodes.DBMS
777 configure: mysql_database_configure.sh
779 expectedmessage = _('Node template "mysql_dbms" contains unknown '
780 'field "propertieees". Refer to the definition to '
781 'verify valid values.')
782 err = self.assertRaises(
783 exception.UnknownFieldError,
784 lambda: self._single_node_template_content_test(tpl_snippet))
785 self.assertEqual(expectedmessage, err.__str__())
790 type: tosca.nodes.Database
792 name: { get_input: db_name }
793 user: { get_input: db_user }
794 password: { get_input: db_pwd }
798 port: { get_input: db_port }
804 configure: mysql_database_configure.sh
807 expectedmessage = _('Node template "mysql_database" contains unknown '
808 'field "capabilitiiiies". Refer to the definition '
809 'to verify valid values.')
810 err = self.assertRaises(
811 exception.UnknownFieldError,
812 lambda: self._single_node_template_content_test(tpl_snippet))
813 self.assertEqual(expectedmessage, err.__str__())
815 def test_node_template_type(self):
819 type: tosca.nodes.Databases
821 db_name: { get_input: db_name }
822 db_user: { get_input: db_user }
823 db_password: { get_input: db_pwd }
827 port: { get_input: db_port }
832 configure: mysql_database_configure.sh
834 expectedmessage = _('Type "tosca.nodes.Databases" is not '
836 err = self.assertRaises(
837 exception.InvalidTypeError,
838 lambda: self._single_node_template_content_test(tpl_snippet))
839 self.assertEqual(expectedmessage, err.__str__())
841 def test_node_template_requirements(self):
845 type: tosca.nodes.WebServer
850 create: webserver_install.sh
853 expectedmessage = _('"requirements" of template "webserver" must be '
855 err = self.assertRaises(
856 exception.TypeMismatchError,
857 lambda: self._single_node_template_content_test(tpl_snippet))
858 self.assertEqual(expectedmessage, err.__str__())
863 type: tosca.nodes.Database
865 db_name: { get_input: db_name }
866 db_user: { get_input: db_user }
867 db_password: { get_input: db_pwd }
871 port: { get_input: db_port }
874 - database_endpoint: mysql_database
877 configure: mysql_database_configure.sh
879 expectedmessage = _('"requirements" of template "mysql_database" '
880 'contains unknown field "database_endpoint". '
881 'Refer to the definition to verify valid values.')
882 err = self.assertRaises(
883 exception.UnknownFieldError,
884 lambda: self._single_node_template_content_test(tpl_snippet))
885 self.assertEqual(expectedmessage, err.__str__())
887 def test_node_template_requirements_with_wrong_node_keyname(self):
888 """Node template requirements keyname 'node' given as 'nodes'."""
892 type: tosca.nodes.Database
898 expectedmessage = _('"requirements" of template "mysql_database" '
899 'contains unknown field "nodes". Refer to the '
900 'definition to verify valid values.')
901 err = self.assertRaises(
902 exception.UnknownFieldError,
903 lambda: self._single_node_template_content_test(tpl_snippet))
904 self.assertEqual(expectedmessage, err.__str__())
906 def test_node_template_requirements_with_wrong_capability_keyname(self):
907 """Incorrect node template requirements keyname
909 Node template requirements keyname 'capability' given as
915 type: tosca.nodes.Database
921 capabilityy: log_endpoint
923 type: tosca.relationships.ConnectsTo
926 expectedmessage = _('"requirements" of template "mysql_database" '
927 'contains unknown field "capabilityy". Refer to '
928 'the definition to verify valid values.')
929 err = self.assertRaises(
930 exception.UnknownFieldError,
931 lambda: self._single_node_template_content_test(tpl_snippet))
932 self.assertEqual(expectedmessage, err.__str__())
934 def test_node_template_requirements_with_wrong_relationship_keyname(self):
935 """Incorrect node template requirements keyname
937 Node template requirements keyname 'relationship' given as
943 type: tosca.nodes.Database
949 capability: log_endpoint
951 type: tosca.relationships.ConnectsTo
954 expectedmessage = _('"requirements" of template "mysql_database" '
955 'contains unknown field "relationshipppp". Refer '
956 'to the definition to verify valid values.')
957 err = self.assertRaises(
958 exception.UnknownFieldError,
959 lambda: self._single_node_template_content_test(tpl_snippet))
960 self.assertEqual(expectedmessage, err.__str__())
962 def test_node_template_requirements_with_wrong_occurrences_keyname(self):
963 """Incorrect node template requirements keyname
965 Node template requirements keyname 'occurrences' given as
971 type: tosca.nodes.Database
977 capability: log_endpoint
979 type: tosca.relationships.ConnectsTo
980 occurences: [0, UNBOUNDED]
982 expectedmessage = _('"requirements" of template "mysql_database" '
983 'contains unknown field "occurences". Refer to '
984 'the definition to verify valid values.')
985 err = self.assertRaises(
986 exception.UnknownFieldError,
987 lambda: self._single_node_template_content_test(tpl_snippet))
988 self.assertEqual(expectedmessage, err.__str__())
990 def test_node_template_requirements_with_multiple_wrong_keynames(self):
991 """Node templates given with multiple wrong requirements keynames."""
995 type: tosca.nodes.Database
1001 capabilit: log_endpoint
1003 type: tosca.relationships.ConnectsTo
1006 expectedmessage = _('"requirements" of template "mysql_database" '
1007 'contains unknown field "nod". Refer to the '
1008 'definition to verify valid values.')
1009 err = self.assertRaises(
1010 exception.UnknownFieldError,
1011 lambda: self._single_node_template_content_test(tpl_snippet))
1012 self.assertEqual(expectedmessage, err.__str__())
1017 type: tosca.nodes.Database
1023 capabilit: log_endpoint
1025 type: tosca.relationships.ConnectsTo
1028 expectedmessage = _('"requirements" of template "mysql_database" '
1029 'contains unknown field "capabilit". Refer to the '
1030 'definition to verify valid values.')
1031 err = self.assertRaises(
1032 exception.UnknownFieldError,
1033 lambda: self._single_node_template_content_test(tpl_snippet))
1034 self.assertEqual(expectedmessage, err.__str__())
1036 def test_node_template_requirements_invalid_occurrences(self):
1040 type: tosca.nodes.Compute
1043 capability: log_endpoint
1044 occurrences: [0, -1]
1046 expectedmessage = _('Value of property "[0, -1]" is invalid.')
1047 err = self.assertRaises(
1048 exception.InvalidPropertyValueError,
1049 lambda: self._single_node_template_content_test(tpl_snippet))
1050 self.assertEqual(expectedmessage, err.__str__())
1055 type: tosca.nodes.Compute
1058 capability: log_endpoint
1061 expectedmessage = _('"a" is not an integer.')
1062 err = self.assertRaises(
1064 lambda: self._single_node_template_content_test(tpl_snippet))
1065 self.assertEqual(expectedmessage, err.__str__())
1070 type: tosca.nodes.Compute
1073 capability: log_endpoint
1076 expectedmessage = _('"-1" is not a list.')
1077 err = self.assertRaises(
1079 lambda: self._single_node_template_content_test(tpl_snippet))
1080 self.assertEqual(expectedmessage, err.__str__())
1085 type: tosca.nodes.Compute
1088 capability: log_endpoint
1091 expectedmessage = _('Value of property "[5, 1]" is invalid.')
1092 err = self.assertRaises(
1093 exception.InvalidPropertyValueError,
1094 lambda: self._single_node_template_content_test(tpl_snippet))
1095 self.assertEqual(expectedmessage, err.__str__())
1100 type: tosca.nodes.Compute
1103 capability: log_endpoint
1106 expectedmessage = _('Value of property "[0, 0]" is invalid.')
1107 err = self.assertRaises(
1108 exception.InvalidPropertyValueError,
1109 lambda: self._single_node_template_content_test(tpl_snippet))
1110 self.assertEqual(expectedmessage, err.__str__())
1112 def test_node_template_requirements_valid_occurrences(self):
1116 type: tosca.nodes.Compute
1119 capability: log_endpoint
1122 self._single_node_template_content_test(tpl_snippet)
1124 def test_node_template_capabilities(self):
1128 type: tosca.nodes.Database
1130 db_name: { get_input: db_name }
1131 db_user: { get_input: db_user }
1132 db_password: { get_input: db_pwd }
1136 port: { get_input: db_port }
1141 configure: mysql_database_configure.sh
1143 expectedmessage = _('"capabilities" of template "mysql_database" '
1144 'contains unknown field "http_endpoint". Refer to '
1145 'the definition to verify valid values.')
1146 err = self.assertRaises(
1147 exception.UnknownFieldError,
1148 lambda: self._single_node_template_content_test(tpl_snippet))
1149 self.assertEqual(expectedmessage, err.__str__())
1151 def test_node_template_properties(self):
1155 type: tosca.nodes.Compute
1157 os_image: F18_x86_64
1162 num_cpus: { get_input: cpus }
1166 architecture: x86_64
1168 distribution: Fedora
1171 expectedmessage = _('"properties" of template "server" contains '
1172 'unknown field "os_image". Refer to the '
1173 'definition to verify valid values.')
1174 err = self.assertRaises(
1175 exception.UnknownFieldError,
1176 lambda: self._single_node_template_content_test(tpl_snippet))
1177 self.assertEqual(expectedmessage, err.__str__())
1179 def test_node_template_interfaces(self):
1183 type: tosca.nodes.WebApplication.WordPress
1186 - database_endpoint: mysql_database
1189 create: wordpress_install.sh
1191 implementation: wordpress_configure.sh
1193 wp_db_name: { get_property: [ mysql_database, db_name ] }
1194 wp_db_user: { get_property: [ mysql_database, db_user ] }
1195 wp_db_password: { get_property: [ mysql_database, \
1197 wp_db_port: { get_property: [ SELF, \
1198 database_endpoint, port ] }
1200 expectedmessage = _('"interfaces" of template "wordpress" contains '
1201 'unknown field "Standards". Refer to the '
1202 'definition to verify valid values.')
1203 err = self.assertRaises(
1204 exception.UnknownFieldError,
1205 lambda: self._single_node_template_content_test(tpl_snippet))
1206 self.assertEqual(expectedmessage, err.__str__())
1211 type: tosca.nodes.WebApplication.WordPress
1214 - database_endpoint: mysql_database
1217 create: wordpress_install.sh
1219 implementation: wordpress_configure.sh
1221 wp_db_name: { get_property: [ mysql_database, db_name ] }
1222 wp_db_user: { get_property: [ mysql_database, db_user ] }
1223 wp_db_password: { get_property: [ mysql_database, \
1225 wp_db_port: { get_property: [ SELF, \
1226 database_endpoint, port ] }
1228 expectedmessage = _('"interfaces" of template "wordpress" contains '
1229 'unknown field "config". Refer to the definition '
1230 'to verify valid values.')
1231 err = self.assertRaises(
1232 exception.UnknownFieldError,
1233 lambda: self._single_node_template_content_test(tpl_snippet))
1234 self.assertEqual(expectedmessage, err.__str__())
1239 type: tosca.nodes.WebApplication.WordPress
1242 - database_endpoint: mysql_database
1245 create: wordpress_install.sh
1247 implementation: wordpress_configure.sh
1249 wp_db_name: { get_property: [ mysql_database, db_name ] }
1250 wp_db_user: { get_property: [ mysql_database, db_user ] }
1251 wp_db_password: { get_property: [ mysql_database, \
1253 wp_db_port: { get_ref_property: [ database_endpoint, \
1254 database_endpoint, port ] }
1256 expectedmessage = _('"interfaces" of template "wordpress" contains '
1257 'unknown field "input". Refer to the definition '
1258 'to verify valid values.')
1259 err = self.assertRaises(
1260 exception.UnknownFieldError,
1261 lambda: self._single_node_template_content_test(tpl_snippet))
1262 self.assertEqual(expectedmessage, err.__str__())
1264 def test_relationship_template_properties(self):
1266 relationship_templates:
1272 expectedmessage = _('"properties" of template "storage_attachto" is '
1273 'missing required field "[\'location\']".')
1274 rel_template = (toscaparser.utils.yamlparser.
1275 simple_parse(tpl_snippet))['relationship_templates']
1276 name = list(rel_template.keys())[0]
1277 rel_template = RelationshipTemplate(rel_template[name], name)
1278 err = self.assertRaises(exception.MissingRequiredFieldError,
1279 rel_template.validate)
1280 self.assertEqual(expectedmessage, six.text_type(err))
1282 def test_invalid_template_version(self):
1283 tosca_tpl = os.path.join(
1284 os.path.dirname(os.path.abspath(__file__)),
1285 "data/test_invalid_template_version.yaml")
1286 self.assertRaises(exception.ValidationError, ToscaTemplate, tosca_tpl)
1287 valid_versions = ', '.join(ToscaTemplate.VALID_TEMPLATE_VERSIONS)
1288 exception.ExceptionCollector.assertExceptionMessage(
1289 exception.InvalidTemplateVersion,
1290 (_('The template version "tosca_xyz" is invalid. Valid versions '
1291 'are "%s".') % valid_versions))
1293 def test_node_template_capabilities_properties(self):
1294 # validating capability property values
1298 type: tosca.nodes.WebServer
1304 expectedmessage = _('The value "test" of property "initiator" is '
1305 'not valid. Expected a value from "[source, '
1308 err = self.assertRaises(
1309 exception.ValidationError,
1310 lambda: self._single_node_template_content_test(tpl_snippet))
1311 self.assertEqual(expectedmessage, err.__str__())
1316 type: tosca.nodes.Compute
1321 num_cpus: { get_input: cpus }
1325 architecture: x86_64
1327 distribution: Fedora
1333 default_instances: 5
1335 expectedmessage = _('"properties" of template "server": '
1336 '"default_instances" value is not between '
1337 '"min_instances" and "max_instances".')
1338 err = self.assertRaises(
1339 exception.ValidationError,
1340 lambda: self._single_node_template_content_test(tpl_snippet))
1341 self.assertEqual(expectedmessage, err.__str__())
1343 def test_node_template_objectstorage_without_required_property(self):
1347 type: tosca.nodes.ObjectStorage
1351 expectedmessage = _('"properties" of template "server" is missing '
1352 'required field "[\'name\']".')
1353 err = self.assertRaises(
1354 exception.MissingRequiredFieldError,
1355 lambda: self._single_node_template_content_test(tpl_snippet))
1356 self.assertEqual(expectedmessage, err.__str__())
1358 def test_node_template_objectstorage_with_invalid_scalar_unit(self):
1362 type: tosca.nodes.ObjectStorage
1367 expectedmessage = _('"-1" is not a valid scalar-unit.')
1368 err = self.assertRaises(
1370 lambda: self._single_node_template_content_test(tpl_snippet))
1371 self.assertEqual(expectedmessage, err.__str__())
1373 def test_node_template_objectstorage_with_invalid_scalar_type(self):
1377 type: tosca.nodes.ObjectStorage
1382 expectedmessage = _('"1 XB" is not a valid scalar-unit.')
1383 err = self.assertRaises(
1385 lambda: self._single_node_template_content_test(tpl_snippet))
1386 self.assertEqual(expectedmessage, err.__str__())
1388 def test_special_keywords(self):
1389 """Test special keywords
1391 Test that special keywords, e.g. metadata, which are not part
1392 of specification do not throw any validation error.
1394 tpl_snippet_metadata_map = '''
1397 type: tosca.nodes.Compute
1402 self._single_node_template_content_test(tpl_snippet_metadata_map)
1404 tpl_snippet_metadata_inline = '''
1407 type: tosca.nodes.Compute
1410 self._single_node_template_content_test(tpl_snippet_metadata_inline)
1412 def test_policy_valid_keynames(self):
1415 - servers_placement:
1416 type: tosca.policies.Placement
1417 description: Apply placement policy to servers
1418 metadata: { user1: 1001, user2: 1002 }
1419 targets: [ serv1, serv2 ]
1421 policies = (toscaparser.utils.yamlparser.
1422 simple_parse(tpl_snippet))['policies'][0]
1423 name = list(policies.keys())[0]
1424 Policy(name, policies[name], None, None)
1426 def test_policy_invalid_keyname(self):
1429 - servers_placement:
1430 type: tosca.policies.Placement
1433 policies = (toscaparser.utils.yamlparser.
1434 simple_parse(tpl_snippet))['policies'][0]
1435 name = list(policies.keys())[0]
1437 expectedmessage = _('Policy "servers_placement" contains '
1438 'unknown field "testkey". Refer to the '
1439 'definition to verify valid values.')
1440 err = self.assertRaises(
1441 exception.UnknownFieldError,
1442 lambda: Policy(name, policies[name], None, None))
1443 self.assertEqual(expectedmessage, err.__str__())
1445 def test_policy_trigger_valid_keyname(self):
1449 description: trigger
1450 event_type: tosca.events.resource.utilization
1452 start_time: "2015-05-07T07:00:00Z"
1453 end_time: "2015-06-07T07:00:00Z"
1455 node: master-container
1457 capability: Container
1459 constraint: utilization greater_than 50%
1464 resize: # Operation name
1466 strategy: LEAST_USED
1467 implementation: Senlin.webhook()
1469 triggers = (toscaparser.utils.yamlparser.
1470 simple_parse(tpl_snippet))['triggers'][0]
1471 name = list(triggers.keys())[0]
1472 Triggers(name, triggers[name])
1474 def test_policy_trigger_invalid_keyname(self):
1478 description: trigger
1479 event_type: tosca.events.resource.utilization
1481 start_time: "2015-05-07T07:00:00Z"
1482 end_time: "2015-06-07T07:00:00Z"
1484 node: master-container
1486 capability: Container
1488 constraint: utilization greater_than 50%
1493 resize: # Operation name
1495 strategy: LEAST_USED
1496 implementation: Senlin.webhook()
1498 triggers = (toscaparser.utils.yamlparser.
1499 simple_parse(tpl_snippet))['triggers'][0]
1500 name = list(triggers.keys())[0]
1501 expectedmessage = _(
1502 'Triggers "resize_compute" contains unknown field '
1503 '"target_filter1". Refer to the definition '
1504 'to verify valid values.')
1505 err = self.assertRaises(
1506 exception.UnknownFieldError,
1507 lambda: Triggers(name, triggers[name]))
1508 self.assertEqual(expectedmessage, err.__str__())
1510 def test_policy_missing_required_keyname(self):
1513 - servers_placement:
1514 description: test description
1516 policies = (toscaparser.utils.yamlparser.
1517 simple_parse(tpl_snippet))['policies'][0]
1518 name = list(policies.keys())[0]
1520 expectedmessage = _('Template "servers_placement" is missing '
1521 'required field "type".')
1522 err = self.assertRaises(
1523 exception.MissingRequiredFieldError,
1524 lambda: Policy(name, policies[name], None, None))
1525 self.assertEqual(expectedmessage, err.__str__())
1527 def test_credential_datatype(self):
1528 tosca_tpl = os.path.join(
1529 os.path.dirname(os.path.abspath(__file__)),
1530 "data/test_credential_datatype.yaml")
1531 self.assertIsNotNone(ToscaTemplate(tosca_tpl))
1533 def test_invalid_default_value(self):
1534 tpl_path = os.path.join(
1535 os.path.dirname(os.path.abspath(__file__)),
1536 "data/test_invalid_input_defaults.yaml")
1537 self.assertRaises(exception.ValidationError, ToscaTemplate, tpl_path)
1538 exception.ExceptionCollector.assertExceptionMessage(
1539 ValueError, _('"two" is not an integer.'))
1541 def test_invalid_capability(self):
1545 type: tosca.nodes.Compute
1549 architecture: x86_64
1551 tpl = (toscaparser.utils.yamlparser.simple_parse(tpl_snippet))
1552 err = self.assertRaises(exception.UnknownFieldError,
1553 TopologyTemplate, tpl, None)
1554 expectedmessage = _('"capabilities" of template "server" contains '
1555 'unknown field "oss". Refer to the definition '
1556 'to verify valid values.')
1557 self.assertEqual(expectedmessage, err.__str__())