2 # ============LICENSE_START=======================================================
3 # org.onap.vvp/validation-scripts
4 # ===================================================================
5 # Copyright © 2019 AT&T Intellectual Property. All rights reserved.
6 # ===================================================================
8 # Unless otherwise specified, all software contained herein is licensed
9 # under the Apache License, Version 2.0 (the "License");
10 # you may not use this software except in compliance with the License.
11 # You may obtain a copy of the License at
13 # http://www.apache.org/licenses/LICENSE-2.0
15 # Unless required by applicable law or agreed to in writing, software
16 # distributed under the License is distributed on an "AS IS" BASIS,
17 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 # See the License for the specific language governing permissions and
19 # limitations under the License.
23 # Unless otherwise specified, all documentation contained herein is licensed
24 # under the Creative Commons License, Attribution 4.0 Intl. (the "License");
25 # you may not use this documentation except in compliance with the License.
26 # You may obtain a copy of the License at
28 # https://creativecommons.org/licenses/by/4.0/
30 # Unless required by applicable law or agreed to in writing, documentation
31 # distributed under the License is distributed on an "AS IS" BASIS,
32 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
33 # See the License for the specific language governing permissions and
34 # limitations under the License.
36 # ============LICENSE_END============================================
38 # ECOMP is a trademark and service mark of AT&T Intellectual Property.
44 from tests import cached_yaml as yaml
46 from .helpers import validates
48 from .utils.vm_types import get_vm_types_for_resource, get_vm_types
50 from .utils.network_roles import get_network_roles
54 def test_vm_type_consistent_on_nova_servers(heat_template):
56 Make sure all nova servers have properly formatted properties
57 for their name, image and flavor
59 with open(heat_template) as fh:
62 # skip if resources are not defined
63 if "resources" not in yml:
64 pytest.skip("No resources specified in the heat template")
66 invalid_nova_servers = []
67 for k, v in yml["resources"].items():
68 if not isinstance(v, dict):
70 if v.get("type") != "OS::Nova::Server":
72 if "properties" not in v:
75 vm_types = get_vm_types_for_resource(v)
76 if len(vm_types) != 1:
77 invalid_nova_servers.append(k)
81 ), "vm_types not consistant on the following resources: {}".format(
82 ",".join(invalid_nova_servers)
86 @validates("R-48067", "R-00977")
87 def test_vm_type_network_role_collision(yaml_file):
88 with open(yaml_file) as fh:
91 # skip if resources are not defined
92 if "resources" not in yml:
93 pytest.skip("No resources specified in the heat template")
95 resources = yml["resources"]
97 vm_types = get_vm_types(resources)
98 network_roles = get_network_roles(resources)
101 for nr in network_roles:
106 "vm_type ({}) cannot be a substring " "of network_role ({})"
112 "network_role ({}) cannot be a substring " "of vm_type ({})"
116 assert not collisions, ", ".join(collisions)
119 @validates("R-50436", "R-45188", "R-40499")
120 def test_nova_server_flavor_parameter(yaml_file):
121 check_nova_parameter_format("flavor", yaml_file)
124 @validates("R-51430", "R-54171", "R-87817")
125 def test_nova_server_name_parameter(yaml_file):
126 check_nova_parameter_format("name", yaml_file)
129 @validates("R-71152", "R-57282", "R-58670")
130 def test_nova_server_image_parameter(yaml_file):
131 check_nova_parameter_format("image", yaml_file)
134 def check_nova_parameter_format(prop, yaml_file):
138 "name": re.compile(r"(.+?)_name_\d+$"),
139 "flavor": re.compile(r"(.+?)_flavor_name$"),
140 "image": re.compile(r"(.+?)_image_name$"),
142 "comma_delimited_list": {"name": re.compile(r"(.+?)_names$")},
145 with open(yaml_file) as fh:
148 # skip if resources are not defined
149 if "resources" not in yml:
150 pytest.skip("No resources specified in the heat template")
152 # skip if resources are not defined
153 if "parameters" not in yml:
154 pytest.skip("No parameters specified in the heat template")
156 invalid_parameters = []
158 for k, v in yml["resources"].items():
159 if not isinstance(v, dict):
161 if v.get("type") != "OS::Nova::Server":
164 prop_val = v.get("properties", {}).get(prop, {})
165 prop_param = prop_val.get("get_param", "") if isinstance(prop_val, dict) else ""
168 pytest.skip("{} doesn't have property {}".format(k, prop))
169 elif isinstance(prop_param, list):
170 prop_param = prop_param[0]
172 template_param_type = yml.get("parameters", {}).get(prop_param, {}).get("type")
174 if not template_param_type:
175 pytest.skip("could not determine param type for {}".format(prop_param))
177 format_match = formats.get(template_param_type, {}).get(prop)
179 if not format_match or not format_match.match(prop_param):
181 "Invalid parameter format ({}) on Resource ID ({}) property" " ({})"
182 ).format(prop_param, k, prop)
183 invalid_parameters.append(msg)
185 assert not set(invalid_parameters), ", ".join(invalid_parameters)