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 ]
116 description: Number of CPUs for the server.
118 - valid_values: [ 1, 2, 4 ]
122 inputs1 = (toscaparser.utils.yamlparser.
123 simple_parse(tpl_snippet1)['inputs'])
124 name1, attrs1 = list(inputs1.items())[0]
125 inputs2 = (toscaparser.utils.yamlparser.
126 simple_parse(tpl_snippet2)['inputs'])
127 name2, attrs2 = list(inputs2.items())[0]
130 except Exception as err:
131 # err=self.assertRaises(exception.UnknownFieldError,
133 self.assertEqual(_('Input "cpus" contains unknown field '
134 '"constraint". Refer to the definition to '
135 'verify valid values.'),
137 input2 = Input(name2, attrs2)
138 self.assertTrue(input2.required)
140 def _imports_content_test(self, tpl_snippet, path, custom_type_def):
141 imports = (toscaparser.utils.yamlparser.
142 simple_parse(tpl_snippet)['imports'])
143 loader = ImportsLoader(imports, path, custom_type_def)
144 return loader.get_custom_defs()
146 def test_imports_without_templates(self):
149 # omitted here for brevity
151 path = 'toscaparser/tests/data/tosca_elk.yaml'
152 errormsg = _('"imports" keyname is defined without including '
154 err = self.assertRaises(exception.ValidationError,
155 self._imports_content_test,
159 self.assertEqual(errormsg, err.__str__())
161 def test_imports_with_name_without_templates(self):
166 path = 'toscaparser/tests/data/tosca_elk.yaml'
167 errormsg = _('A template file name is not provided with import '
168 'definition "some_definitions".')
169 err = self.assertRaises(exception.ValidationError,
170 self._imports_content_test,
171 tpl_snippet, path, None)
172 self.assertEqual(errormsg, err.__str__())
174 def test_imports_without_import_name(self):
177 - custom_types/paypalpizzastore_nodejs_app.yaml
178 - https://raw.githubusercontent.com/openstack/\
179 tosca-parser/master/toscaparser/tests/data/custom_types/wordpress.yaml
181 path = 'toscaparser/tests/data/tosca_elk.yaml'
182 custom_defs = self._imports_content_test(tpl_snippet,
185 self.assertTrue(custom_defs)
187 def test_imports_wth_import_name(self):
190 - some_definitions: custom_types/paypalpizzastore_nodejs_app.yaml
192 file: 'https://raw.githubusercontent.com/openstack/tosca-parser\
193 /master/toscaparser/tests/data/custom_types/wordpress.yaml'
194 namespace_prefix: single_instance_wordpress
196 path = 'toscaparser/tests/data/tosca_elk.yaml'
197 custom_defs = self._imports_content_test(tpl_snippet,
200 self.assertTrue(custom_defs.get("single_instance_wordpress.tosca."
201 "nodes.WebApplication.WordPress"))
203 def test_imports_wth_namespace_prefix(self):
207 file: custom_types/nested_rsyslog.yaml
208 namespace_prefix: testprefix
210 path = 'toscaparser/tests/data/tosca_elk.yaml'
211 custom_defs = self._imports_content_test(tpl_snippet,
214 self.assertTrue(custom_defs.get("testprefix.Rsyslog"))
216 def test_imports_with_no_main_template(self):
219 - some_definitions: https://raw.githubusercontent.com/openstack/\
220 tosca-parser/master/toscaparser/tests/data/custom_types/wordpress.yaml
222 file: my_defns/my_typesdefs_n.yaml
224 errormsg = _('Input tosca template is not provided.')
225 err = self.assertRaises(exception.ValidationError,
226 self._imports_content_test,
227 tpl_snippet, None, None)
228 self.assertEqual(errormsg, err.__str__())
230 def test_imports_duplicate_name(self):
233 - some_definitions: https://raw.githubusercontent.com/openstack/\
234 tosca-parser/master/toscaparser/tests/data/custom_types/wordpress.yaml
236 file: my_defns/my_typesdefs_n.yaml
238 errormsg = _('Duplicate import name "some_definitions" was found.')
239 path = 'toscaparser/tests/data/tosca_elk.yaml'
240 err = self.assertRaises(exception.ValidationError,
241 self._imports_content_test,
242 tpl_snippet, path, None)
243 self.assertEqual(errormsg, err.__str__())
245 def test_imports_missing_req_field_in_def(self):
249 file1: my_defns/my_typesdefs_n.yaml
250 repository: my_company_repo
251 namespace_uri: http://mycompany.com/ns/tosca/2.0
252 namespace_prefix: mycompany
254 errormsg = _('Import of template "more_definitions" is missing '
255 'required field "file".')
256 path = 'toscaparser/tests/data/tosca_elk.yaml'
257 err = self.assertRaises(exception.MissingRequiredFieldError,
258 self._imports_content_test,
259 tpl_snippet, path, None)
260 self.assertEqual(errormsg, err.__str__())
262 def test_imports_file_with_uri(self):
266 file: https://raw.githubusercontent.com/openstack/\
267 tosca-parser/master/toscaparser/tests/data/custom_types/wordpress.yaml
269 path = 'https://raw.githubusercontent.com/openstack/\
270 tosca-parser/master/toscaparser/tests/data/\
271 tosca_single_instance_wordpress_with_url_import.yaml'
272 custom_defs = self._imports_content_test(tpl_snippet,
275 self.assertTrue(custom_defs.get("tosca.nodes."
276 "WebApplication.WordPress"))
278 def test_imports_file_namespace_fields(self):
282 file: https://raw.githubusercontent.com/openstack/\
283 heat-translator/master/translator/tests/data/custom_types/wordpress.yaml
284 namespace_prefix: mycompany
285 namespace_uri: http://docs.oasis-open.org/tosca/ns/simple/yaml/1.0
287 path = 'toscaparser/tests/data/tosca_elk.yaml'
288 custom_defs = self._imports_content_test(tpl_snippet,
291 self.assertTrue(custom_defs.get("mycompany.tosca.nodes."
292 "WebApplication.WordPress"))
294 def test_import_error_file_uri(self):
298 file: mycompany.com/ns/tosca/2.0/toscaparser/tests/data\
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 self.assertRaises(ImportError,
305 self._imports_content_test,
306 tpl_snippet, path, None)
308 def test_import_single_line_error(self):
311 - some_definitions: abc.com/tests/data/tosca_elk.yaml
313 errormsg = _('Import "abc.com/tests/data/tosca_elk.yaml" is not '
315 path = 'toscaparser/tests/data/tosca_elk.yaml'
316 err = self.assertRaises(ImportError,
317 self._imports_content_test,
318 tpl_snippet, path, None)
319 self.assertEqual(errormsg, err.__str__())
321 def test_outputs(self):
325 description: IP address of server instance.
326 values: { get_property: [server, private_address] }
328 outputs = (toscaparser.utils.yamlparser.
329 simple_parse(tpl_snippet)['outputs'])
330 name, attrs = list(outputs.items())[0]
331 output = Output(name, attrs)
334 except Exception as err:
336 isinstance(err, exception.MissingRequiredFieldError))
337 self.assertEqual(_('Output "server_address" is missing required '
338 'field "value".'), err.__str__())
343 descriptions: IP address of server instance.
344 value: { get_property: [server, private_address] }
346 outputs = (toscaparser.utils.yamlparser.
347 simple_parse(tpl_snippet)['outputs'])
348 name, attrs = list(outputs.items())[0]
349 output = Output(name, attrs)
352 except Exception as err:
353 self.assertTrue(isinstance(err, exception.UnknownFieldError))
354 self.assertEqual(_('Output "server_address" contains unknown '
355 'field "descriptions". Refer to the definition '
356 'to verify valid values.'),
359 def _repo_content(self, path):
360 repositories = path['repositories']
362 for name, val in repositories.items():
363 reposits = Repository(name, val)
364 reposit.append(reposits)
367 def test_repositories(self):
370 repo_code0: https://raw.githubusercontent.com/nandinivemula/intern
372 description: My project's code Repository in github usercontent.
373 url: https://github.com/nandinivemula/intern
378 description: My Project's code Repository in github.
379 url: https://github.com/nandinivemula/intern
384 tpl = (toscaparser.utils.yamlparser.simple_parse(tpl_snippet))
385 repoobject = self._repo_content(tpl)
386 actualrepo_names = []
387 for repo in repoobject:
389 actualrepo_names.append(repos)
390 reposname = list(tpl.values())
391 reposnames = reposname[0]
392 expected_reponames = list(reposnames.keys())
393 self.assertEqual(expected_reponames, actualrepo_names)
395 def test_repositories_with_missing_required_field(self):
398 repo_code0: https://raw.githubusercontent.com/nandinivemula/intern
400 description: My project's code Repository in github usercontent.
405 description: My Project's code Repository in github.
406 url: https://github.com/nandinivemula/intern
411 tpl = (toscaparser.utils.yamlparser.simple_parse(tpl_snippet))
412 err = self.assertRaises(exception.MissingRequiredFieldError,
413 self._repo_content, tpl)
414 expectedmessage = _('Repository "repo_code1" is missing '
415 'required field "url".')
416 self.assertEqual(expectedmessage, err.__str__())
418 def test_repositories_with_unknown_field(self):
421 repo_code0: https://raw.githubusercontent.com/nandinivemula/intern
423 description: My project's code Repository in github usercontent.
424 url: https://github.com/nandinivemula/intern
429 descripton: My Project's code Repository in github.
430 url: https://github.com/nandinivemula/intern
435 tpl = (toscaparser.utils.yamlparser.simple_parse(tpl_snippet))
436 err = self.assertRaises(exception.UnknownFieldError,
437 self._repo_content, tpl)
438 expectedmessage = _('repositories "repo_code2" contains unknown field'
439 ' "descripton". Refer to the definition to verify'
441 self.assertEqual(expectedmessage, err.__str__())
443 def test_repositories_with_invalid_url(self):
446 repo_code0: https://raw.githubusercontent.com/nandinivemula/intern
448 description: My project's code Repository in github usercontent.
454 description: My Project's code Repository in github.
455 url: https://github.com/nandinivemula/intern
460 tpl = (toscaparser.utils.yamlparser.simple_parse(tpl_snippet))
461 err = self.assertRaises(exception.URLException,
462 self._repo_content, tpl)
463 expectedmessage = _('repsositories "repo_code1" Invalid Url')
464 self.assertEqual(expectedmessage, err.__str__())
466 def test_groups(self):
470 type: tosca.nodes.Compute
473 capability: log_endpoint
476 type: tosca.nodes.DBMS
483 type: tosca.groups.Root
484 members: [ server, mysql_dbms ]
486 tpl = (toscaparser.utils.yamlparser.simple_parse(tpl_snippet))
487 TopologyTemplate(tpl, None)
489 def test_groups_with_missing_required_field(self):
493 type: tosca.nodes.Compute
496 capability: log_endpoint
499 type: tosca.nodes.DBMS
506 members: ['server', 'mysql_dbms']
508 tpl = (toscaparser.utils.yamlparser.simple_parse(tpl_snippet))
509 err = self.assertRaises(exception.MissingRequiredFieldError,
510 TopologyTemplate, tpl, None)
511 expectedmessage = _('Template "webserver_group" is missing '
512 'required field "type".')
513 self.assertEqual(expectedmessage, err.__str__())
515 def test_groups_with_unknown_target(self):
519 type: tosca.nodes.Compute
522 capability: log_endpoint
525 type: tosca.nodes.DBMS
532 type: tosca.groups.Root
533 members: [ serv, mysql_dbms ]
535 tpl = (toscaparser.utils.yamlparser.simple_parse(tpl_snippet))
536 expectedmessage = _('"Target member "serv" is not found in '
538 err = self.assertRaises(exception.InvalidGroupTargetException,
539 TopologyTemplate, tpl, None)
540 self.assertEqual(expectedmessage, err.__str__())
542 def test_groups_with_repeated_targets(self):
546 type: tosca.nodes.Compute
549 capability: log_endpoint
552 type: tosca.nodes.DBMS
559 type: tosca.groups.Root
560 members: [ server, server, mysql_dbms ]
562 tpl = (toscaparser.utils.yamlparser.simple_parse(tpl_snippet))
563 expectedmessage = _('"Member nodes '
564 '"[\'server\', \'server\', \'mysql_dbms\']" '
565 'should be >= 1 and not repeated"')
566 err = self.assertRaises(exception.InvalidGroupTargetException,
567 TopologyTemplate, tpl, None)
568 self.assertEqual(expectedmessage, err.__str__())
570 def test_groups_with_only_one_target(self):
574 type: tosca.nodes.Compute
577 capability: log_endpoint
580 type: tosca.nodes.DBMS
587 type: tosca.groups.Root
590 tpl = (toscaparser.utils.yamlparser.simple_parse(tpl_snippet))
591 expectedmessage = _('"Member nodes "[]" should be >= 1 '
593 err = self.assertRaises(exception.InvalidGroupTargetException,
594 TopologyTemplate, tpl, None)
595 self.assertEqual(expectedmessage, err.__str__())
597 def _custom_types(self):
599 def_file = os.path.join(
600 os.path.dirname(os.path.abspath(__file__)),
601 "data/custom_types/wordpress.yaml")
602 custom_type = toscaparser.utils.yamlparser.load_yaml(def_file)
603 node_types = custom_type['node_types']
604 for name in node_types:
605 defintion = node_types[name]
606 custom_types[name] = defintion
609 def _single_node_template_content_test(self, tpl_snippet):
610 nodetemplates = (toscaparser.utils.yamlparser.
611 simple_ordered_parse(tpl_snippet))['node_templates']
612 name = list(nodetemplates.keys())[0]
613 nodetemplate = NodeTemplate(name, nodetemplates,
614 self._custom_types())
615 nodetemplate.validate()
616 nodetemplate.requirements
617 nodetemplate.get_capabilities_objects()
618 nodetemplate.get_properties_objects()
619 nodetemplate.interfaces
621 def test_node_templates(self):
638 expectedmessage = _('Template "server" is missing required field '
640 err = self.assertRaises(
641 exception.MissingRequiredFieldError,
642 lambda: self._single_node_template_content_test(tpl_snippet))
643 self.assertEqual(expectedmessage, err.__str__())
645 def test_node_template_with_wrong_properties_keyname(self):
646 """Node template keyname 'properties' given as 'propertiessss'."""
650 type: tosca.nodes.DBMS
655 expectedmessage = _('Node template "mysql_dbms" contains unknown '
656 'field "propertiessss". Refer to the definition '
657 'to verify valid values.')
658 err = self.assertRaises(
659 exception.UnknownFieldError,
660 lambda: self._single_node_template_content_test(tpl_snippet))
661 self.assertEqual(expectedmessage, err.__str__())
663 def test_node_template_with_wrong_requirements_keyname(self):
664 """Node template keyname 'requirements' given as 'requirement'."""
668 type: tosca.nodes.DBMS
675 expectedmessage = _('Node template "mysql_dbms" contains unknown '
676 'field "requirement". Refer to the definition to '
677 'verify valid values.')
678 err = self.assertRaises(
679 exception.UnknownFieldError,
680 lambda: self._single_node_template_content_test(tpl_snippet))
681 self.assertEqual(expectedmessage, err.__str__())
683 def test_node_template_with_wrong_interfaces_keyname(self):
684 """Node template keyname 'interfaces' given as 'interfac'."""
688 type: tosca.nodes.DBMS
696 configure: mysql_database_configure.sh
698 expectedmessage = _('Node template "mysql_dbms" contains unknown '
699 'field "interfac". Refer to the definition to '
700 'verify valid values.')
701 err = self.assertRaises(
702 exception.UnknownFieldError,
703 lambda: self._single_node_template_content_test(tpl_snippet))
704 self.assertEqual(expectedmessage, err.__str__())
706 def test_node_template_with_wrong_capabilities_keyname(self):
707 """Node template keyname 'capabilities' given as 'capabilitiis'."""
711 type: tosca.nodes.Database
713 db_name: { get_input: db_name }
714 db_user: { get_input: db_user }
715 db_password: { get_input: db_pwd }
719 port: { get_input: db_port }
721 expectedmessage = _('Node template "mysql_database" contains unknown '
722 'field "capabilitiis". 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_wrong_artifacts_keyname(self):
730 """Node template keyname 'artifacts' given as 'artifactsss'."""
734 type: tosca.nodes.Database
737 implementation: files/my_db_content.txt
738 type: tosca.artifacts.File
740 expectedmessage = _('Node template "mysql_database" contains unknown '
741 'field "artifactsss". Refer to the definition to '
742 'verify valid values.')
743 err = self.assertRaises(
744 exception.UnknownFieldError,
745 lambda: self._single_node_template_content_test(tpl_snippet))
746 self.assertEqual(expectedmessage, err.__str__())
748 def test_node_template_with_multiple_wrong_keynames(self):
749 """Node templates given with multiple wrong keynames."""
753 type: tosca.nodes.DBMS
761 configure: mysql_database_configure.sh
763 expectedmessage = _('Node template "mysql_dbms" contains unknown '
764 'field "propertieees". Refer to the definition to '
765 'verify valid values.')
766 err = self.assertRaises(
767 exception.UnknownFieldError,
768 lambda: self._single_node_template_content_test(tpl_snippet))
769 self.assertEqual(expectedmessage, err.__str__())
774 type: tosca.nodes.Database
776 name: { get_input: db_name }
777 user: { get_input: db_user }
778 password: { get_input: db_pwd }
782 port: { get_input: db_port }
788 configure: mysql_database_configure.sh
791 expectedmessage = _('Node template "mysql_database" contains unknown '
792 'field "capabilitiiiies". Refer to the definition '
793 'to verify valid values.')
794 err = self.assertRaises(
795 exception.UnknownFieldError,
796 lambda: self._single_node_template_content_test(tpl_snippet))
797 self.assertEqual(expectedmessage, err.__str__())
799 def test_node_template_type(self):
803 type: tosca.nodes.Databases
805 db_name: { get_input: db_name }
806 db_user: { get_input: db_user }
807 db_password: { get_input: db_pwd }
811 port: { get_input: db_port }
816 configure: mysql_database_configure.sh
818 expectedmessage = _('Type "tosca.nodes.Databases" is not '
820 err = self.assertRaises(
821 exception.InvalidTypeError,
822 lambda: self._single_node_template_content_test(tpl_snippet))
823 self.assertEqual(expectedmessage, err.__str__())
825 def test_node_template_requirements(self):
829 type: tosca.nodes.WebServer
834 create: webserver_install.sh
837 expectedmessage = _('"requirements" of template "webserver" must be '
839 err = self.assertRaises(
840 exception.TypeMismatchError,
841 lambda: self._single_node_template_content_test(tpl_snippet))
842 self.assertEqual(expectedmessage, err.__str__())
847 type: tosca.nodes.Database
849 db_name: { get_input: db_name }
850 db_user: { get_input: db_user }
851 db_password: { get_input: db_pwd }
855 port: { get_input: db_port }
858 - database_endpoint: mysql_database
861 configure: mysql_database_configure.sh
863 expectedmessage = _('"requirements" of template "mysql_database" '
864 'contains unknown field "database_endpoint". '
865 'Refer to the 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_node_keyname(self):
872 """Node template requirements keyname 'node' given as 'nodes'."""
876 type: tosca.nodes.Database
882 expectedmessage = _('"requirements" of template "mysql_database" '
883 'contains unknown field "nodes". Refer to the '
884 'definition to verify valid values.')
885 err = self.assertRaises(
886 exception.UnknownFieldError,
887 lambda: self._single_node_template_content_test(tpl_snippet))
888 self.assertEqual(expectedmessage, err.__str__())
890 def test_node_template_requirements_with_wrong_capability_keyname(self):
891 """Incorrect node template requirements keyname
893 Node template requirements keyname 'capability' given as
899 type: tosca.nodes.Database
905 capabilityy: log_endpoint
907 type: tosca.relationships.ConnectsTo
910 expectedmessage = _('"requirements" of template "mysql_database" '
911 'contains unknown field "capabilityy". Refer to '
912 'the definition to verify valid values.')
913 err = self.assertRaises(
914 exception.UnknownFieldError,
915 lambda: self._single_node_template_content_test(tpl_snippet))
916 self.assertEqual(expectedmessage, err.__str__())
918 def test_node_template_requirements_with_wrong_relationship_keyname(self):
919 """Incorrect node template requirements keyname
921 Node template requirements keyname 'relationship' given as
927 type: tosca.nodes.Database
933 capability: log_endpoint
935 type: tosca.relationships.ConnectsTo
938 expectedmessage = _('"requirements" of template "mysql_database" '
939 'contains unknown field "relationshipppp". Refer '
940 'to the definition to verify valid values.')
941 err = self.assertRaises(
942 exception.UnknownFieldError,
943 lambda: self._single_node_template_content_test(tpl_snippet))
944 self.assertEqual(expectedmessage, err.__str__())
946 def test_node_template_requirements_with_wrong_occurrences_keyname(self):
947 """Incorrect node template requirements keyname
949 Node template requirements keyname 'occurrences' given as
955 type: tosca.nodes.Database
961 capability: log_endpoint
963 type: tosca.relationships.ConnectsTo
964 occurences: [0, UNBOUNDED]
966 expectedmessage = _('"requirements" of template "mysql_database" '
967 'contains unknown field "occurences". Refer to '
968 'the definition to verify valid values.')
969 err = self.assertRaises(
970 exception.UnknownFieldError,
971 lambda: self._single_node_template_content_test(tpl_snippet))
972 self.assertEqual(expectedmessage, err.__str__())
974 def test_node_template_requirements_with_multiple_wrong_keynames(self):
975 """Node templates given with multiple wrong requirements keynames."""
979 type: tosca.nodes.Database
985 capabilit: log_endpoint
987 type: tosca.relationships.ConnectsTo
990 expectedmessage = _('"requirements" of template "mysql_database" '
991 'contains unknown field "nod". Refer to the '
992 'definition to verify valid values.')
993 err = self.assertRaises(
994 exception.UnknownFieldError,
995 lambda: self._single_node_template_content_test(tpl_snippet))
996 self.assertEqual(expectedmessage, err.__str__())
1001 type: tosca.nodes.Database
1007 capabilit: log_endpoint
1009 type: tosca.relationships.ConnectsTo
1012 expectedmessage = _('"requirements" of template "mysql_database" '
1013 'contains unknown field "capabilit". Refer to the '
1014 'definition to verify valid values.')
1015 err = self.assertRaises(
1016 exception.UnknownFieldError,
1017 lambda: self._single_node_template_content_test(tpl_snippet))
1018 self.assertEqual(expectedmessage, err.__str__())
1020 def test_node_template_requirements_invalid_occurrences(self):
1024 type: tosca.nodes.Compute
1027 capability: log_endpoint
1028 occurrences: [0, -1]
1030 expectedmessage = _('Value of property "[0, -1]" is invalid.')
1031 err = self.assertRaises(
1032 exception.InvalidPropertyValueError,
1033 lambda: self._single_node_template_content_test(tpl_snippet))
1034 self.assertEqual(expectedmessage, err.__str__())
1039 type: tosca.nodes.Compute
1042 capability: log_endpoint
1045 expectedmessage = _('"a" is not an integer.')
1046 err = self.assertRaises(
1048 lambda: self._single_node_template_content_test(tpl_snippet))
1049 self.assertEqual(expectedmessage, err.__str__())
1054 type: tosca.nodes.Compute
1057 capability: log_endpoint
1060 expectedmessage = _('"-1" is not a list.')
1061 err = self.assertRaises(
1063 lambda: self._single_node_template_content_test(tpl_snippet))
1064 self.assertEqual(expectedmessage, err.__str__())
1069 type: tosca.nodes.Compute
1072 capability: log_endpoint
1075 expectedmessage = _('Value of property "[5, 1]" is invalid.')
1076 err = self.assertRaises(
1077 exception.InvalidPropertyValueError,
1078 lambda: self._single_node_template_content_test(tpl_snippet))
1079 self.assertEqual(expectedmessage, err.__str__())
1084 type: tosca.nodes.Compute
1087 capability: log_endpoint
1090 expectedmessage = _('Value of property "[0, 0]" is invalid.')
1091 err = self.assertRaises(
1092 exception.InvalidPropertyValueError,
1093 lambda: self._single_node_template_content_test(tpl_snippet))
1094 self.assertEqual(expectedmessage, err.__str__())
1096 def test_node_template_requirements_valid_occurrences(self):
1100 type: tosca.nodes.Compute
1103 capability: log_endpoint
1106 self._single_node_template_content_test(tpl_snippet)
1108 def test_node_template_capabilities(self):
1112 type: tosca.nodes.Database
1114 db_name: { get_input: db_name }
1115 db_user: { get_input: db_user }
1116 db_password: { get_input: db_pwd }
1120 port: { get_input: db_port }
1125 configure: mysql_database_configure.sh
1127 expectedmessage = _('"capabilities" of template "mysql_database" '
1128 'contains unknown field "http_endpoint". Refer to '
1129 'the definition to verify valid values.')
1130 err = self.assertRaises(
1131 exception.UnknownFieldError,
1132 lambda: self._single_node_template_content_test(tpl_snippet))
1133 self.assertEqual(expectedmessage, err.__str__())
1135 def test_node_template_properties(self):
1139 type: tosca.nodes.Compute
1141 os_image: F18_x86_64
1146 num_cpus: { get_input: cpus }
1150 architecture: x86_64
1152 distribution: Fedora
1155 expectedmessage = _('"properties" of template "server" contains '
1156 'unknown field "os_image". Refer to the '
1157 'definition to verify valid values.')
1158 err = self.assertRaises(
1159 exception.UnknownFieldError,
1160 lambda: self._single_node_template_content_test(tpl_snippet))
1161 self.assertEqual(expectedmessage, err.__str__())
1163 def test_node_template_interfaces(self):
1167 type: tosca.nodes.WebApplication.WordPress
1170 - database_endpoint: mysql_database
1173 create: wordpress_install.sh
1175 implementation: wordpress_configure.sh
1177 wp_db_name: { get_property: [ mysql_database, db_name ] }
1178 wp_db_user: { get_property: [ mysql_database, db_user ] }
1179 wp_db_password: { get_property: [ mysql_database, \
1181 wp_db_port: { get_property: [ SELF, \
1182 database_endpoint, port ] }
1184 expectedmessage = _('"interfaces" of template "wordpress" contains '
1185 'unknown field "Standards". Refer to the '
1186 'definition to verify valid values.')
1187 err = self.assertRaises(
1188 exception.UnknownFieldError,
1189 lambda: self._single_node_template_content_test(tpl_snippet))
1190 self.assertEqual(expectedmessage, err.__str__())
1195 type: tosca.nodes.WebApplication.WordPress
1198 - database_endpoint: mysql_database
1201 create: wordpress_install.sh
1203 implementation: wordpress_configure.sh
1205 wp_db_name: { get_property: [ mysql_database, db_name ] }
1206 wp_db_user: { get_property: [ mysql_database, db_user ] }
1207 wp_db_password: { get_property: [ mysql_database, \
1209 wp_db_port: { get_property: [ SELF, \
1210 database_endpoint, port ] }
1212 expectedmessage = _('"interfaces" of template "wordpress" contains '
1213 'unknown field "config". Refer to the definition '
1214 'to verify valid values.')
1215 err = self.assertRaises(
1216 exception.UnknownFieldError,
1217 lambda: self._single_node_template_content_test(tpl_snippet))
1218 self.assertEqual(expectedmessage, err.__str__())
1223 type: tosca.nodes.WebApplication.WordPress
1226 - database_endpoint: mysql_database
1229 create: wordpress_install.sh
1231 implementation: wordpress_configure.sh
1233 wp_db_name: { get_property: [ mysql_database, db_name ] }
1234 wp_db_user: { get_property: [ mysql_database, db_user ] }
1235 wp_db_password: { get_property: [ mysql_database, \
1237 wp_db_port: { get_ref_property: [ database_endpoint, \
1238 database_endpoint, port ] }
1240 expectedmessage = _('"interfaces" of template "wordpress" contains '
1241 'unknown field "input". Refer to the definition '
1242 'to verify valid values.')
1243 err = self.assertRaises(
1244 exception.UnknownFieldError,
1245 lambda: self._single_node_template_content_test(tpl_snippet))
1246 self.assertEqual(expectedmessage, err.__str__())
1248 def test_relationship_template_properties(self):
1250 relationship_templates:
1256 expectedmessage = _('"properties" of template "storage_attachto" is '
1257 'missing required field "[\'location\']".')
1258 rel_template = (toscaparser.utils.yamlparser.
1259 simple_parse(tpl_snippet))['relationship_templates']
1260 name = list(rel_template.keys())[0]
1261 rel_template = RelationshipTemplate(rel_template[name], name)
1262 err = self.assertRaises(exception.MissingRequiredFieldError,
1263 rel_template.validate)
1264 self.assertEqual(expectedmessage, six.text_type(err))
1266 def test_invalid_template_version(self):
1267 tosca_tpl = os.path.join(
1268 os.path.dirname(os.path.abspath(__file__)),
1269 "data/test_invalid_template_version.yaml")
1270 self.assertRaises(exception.ValidationError, ToscaTemplate, tosca_tpl)
1271 valid_versions = ', '.join(ToscaTemplate.VALID_TEMPLATE_VERSIONS)
1272 exception.ExceptionCollector.assertExceptionMessage(
1273 exception.InvalidTemplateVersion,
1274 (_('The template version "tosca_xyz" is invalid. Valid versions '
1275 'are "%s".') % valid_versions))
1277 def test_node_template_capabilities_properties(self):
1278 # validating capability property values
1282 type: tosca.nodes.WebServer
1288 expectedmessage = _('The value "test" of property "initiator" is '
1289 'not valid. Expected a value from "[source, '
1292 err = self.assertRaises(
1293 exception.ValidationError,
1294 lambda: self._single_node_template_content_test(tpl_snippet))
1295 self.assertEqual(expectedmessage, err.__str__())
1300 type: tosca.nodes.Compute
1305 num_cpus: { get_input: cpus }
1309 architecture: x86_64
1311 distribution: Fedora
1317 default_instances: 5
1319 expectedmessage = _('"properties" of template "server": '
1320 '"default_instances" value is not between '
1321 '"min_instances" and "max_instances".')
1322 err = self.assertRaises(
1323 exception.ValidationError,
1324 lambda: self._single_node_template_content_test(tpl_snippet))
1325 self.assertEqual(expectedmessage, err.__str__())
1327 def test_node_template_objectstorage_without_required_property(self):
1331 type: tosca.nodes.ObjectStorage
1335 expectedmessage = _('"properties" of template "server" is missing '
1336 'required field "[\'name\']".')
1337 err = self.assertRaises(
1338 exception.MissingRequiredFieldError,
1339 lambda: self._single_node_template_content_test(tpl_snippet))
1340 self.assertEqual(expectedmessage, err.__str__())
1342 def test_node_template_objectstorage_with_invalid_scalar_unit(self):
1346 type: tosca.nodes.ObjectStorage
1351 expectedmessage = _('"-1" is not a valid scalar-unit.')
1352 err = self.assertRaises(
1354 lambda: self._single_node_template_content_test(tpl_snippet))
1355 self.assertEqual(expectedmessage, err.__str__())
1357 def test_node_template_objectstorage_with_invalid_scalar_type(self):
1361 type: tosca.nodes.ObjectStorage
1366 expectedmessage = _('"1 XB" is not a valid scalar-unit.')
1367 err = self.assertRaises(
1369 lambda: self._single_node_template_content_test(tpl_snippet))
1370 self.assertEqual(expectedmessage, err.__str__())
1372 def test_special_keywords(self):
1373 """Test special keywords
1375 Test that special keywords, e.g. metadata, which are not part
1376 of specification do not throw any validation error.
1378 tpl_snippet_metadata_map = '''
1381 type: tosca.nodes.Compute
1386 self._single_node_template_content_test(tpl_snippet_metadata_map)
1388 tpl_snippet_metadata_inline = '''
1391 type: tosca.nodes.Compute
1394 self._single_node_template_content_test(tpl_snippet_metadata_inline)
1396 def test_policy_valid_keynames(self):
1399 - servers_placement:
1400 type: tosca.policies.Placement
1401 description: Apply placement policy to servers
1402 metadata: { user1: 1001, user2: 1002 }
1403 targets: [ serv1, serv2 ]
1405 policies = (toscaparser.utils.yamlparser.
1406 simple_parse(tpl_snippet))['policies'][0]
1407 name = list(policies.keys())[0]
1408 Policy(name, policies[name], None, None)
1410 def test_policy_invalid_keyname(self):
1413 - servers_placement:
1414 type: tosca.policies.Placement
1417 policies = (toscaparser.utils.yamlparser.
1418 simple_parse(tpl_snippet))['policies'][0]
1419 name = list(policies.keys())[0]
1421 expectedmessage = _('Policy "servers_placement" contains '
1422 'unknown field "testkey". Refer to the '
1423 'definition to verify valid values.')
1424 err = self.assertRaises(
1425 exception.UnknownFieldError,
1426 lambda: Policy(name, policies[name], None, None))
1427 self.assertEqual(expectedmessage, err.__str__())
1429 def test_policy_trigger_valid_keyname(self):
1433 description: trigger
1434 event_type: tosca.events.resource.utilization
1436 start_time: "2015-05-07T07:00:00Z"
1437 end_time: "2015-06-07T07:00:00Z"
1439 node: master-container
1441 capability: Container
1443 constraint: utilization greater_than 50%
1448 resize: # Operation name
1450 strategy: LEAST_USED
1451 implementation: Senlin.webhook()
1453 triggers = (toscaparser.utils.yamlparser.
1454 simple_parse(tpl_snippet))['triggers'][0]
1455 name = list(triggers.keys())[0]
1456 Triggers(name, triggers[name])
1458 def test_policy_trigger_invalid_keyname(self):
1462 description: trigger
1463 event_type: tosca.events.resource.utilization
1465 start_time: "2015-05-07T07:00:00Z"
1466 end_time: "2015-06-07T07:00:00Z"
1468 node: master-container
1470 capability: Container
1472 constraint: utilization greater_than 50%
1477 resize: # Operation name
1479 strategy: LEAST_USED
1480 implementation: Senlin.webhook()
1482 triggers = (toscaparser.utils.yamlparser.
1483 simple_parse(tpl_snippet))['triggers'][0]
1484 name = list(triggers.keys())[0]
1485 expectedmessage = _(
1486 'Triggers "resize_compute" contains unknown field '
1487 '"target_filter1". Refer to the definition '
1488 'to verify valid values.')
1489 err = self.assertRaises(
1490 exception.UnknownFieldError,
1491 lambda: Triggers(name, triggers[name]))
1492 self.assertEqual(expectedmessage, err.__str__())
1494 def test_policy_missing_required_keyname(self):
1497 - servers_placement:
1498 description: test description
1500 policies = (toscaparser.utils.yamlparser.
1501 simple_parse(tpl_snippet))['policies'][0]
1502 name = list(policies.keys())[0]
1504 expectedmessage = _('Template "servers_placement" is missing '
1505 'required field "type".')
1506 err = self.assertRaises(
1507 exception.MissingRequiredFieldError,
1508 lambda: Policy(name, policies[name], None, None))
1509 self.assertEqual(expectedmessage, err.__str__())
1511 def test_credential_datatype(self):
1512 tosca_tpl = os.path.join(
1513 os.path.dirname(os.path.abspath(__file__)),
1514 "data/test_credential_datatype.yaml")
1515 self.assertIsNotNone(ToscaTemplate(tosca_tpl))
1517 def test_invalid_default_value(self):
1518 tpl_path = os.path.join(
1519 os.path.dirname(os.path.abspath(__file__)),
1520 "data/test_invalid_input_defaults.yaml")
1521 self.assertRaises(exception.ValidationError, ToscaTemplate, tpl_path)
1522 exception.ExceptionCollector.assertExceptionMessage(
1523 ValueError, _('"two" is not an integer.'))
1525 def test_invalid_capability(self):
1529 type: tosca.nodes.Compute
1533 architecture: x86_64
1535 tpl = (toscaparser.utils.yamlparser.simple_parse(tpl_snippet))
1536 err = self.assertRaises(exception.UnknownFieldError,
1537 TopologyTemplate, tpl, None)
1538 expectedmessage = _('"capabilities" of template "server" contains '
1539 'unknown field "oss". Refer to the definition '
1540 'to verify valid values.')
1541 self.assertEqual(expectedmessage, err.__str__())