Enforce black code format via pre-commit hook
[vvp/validation-scripts.git] / ice_validator / tests / test_nested_parameters.py
1 # -*- coding: utf8 -*-
2 # ============LICENSE_START====================================================
3 # org.onap.vvp/validation-scripts
4 # ===================================================================
5 # Copyright © 2019 AT&T Intellectual Property. All rights reserved.
6 # ===================================================================
7 #
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
12 #
13 #             http://www.apache.org/licenses/LICENSE-2.0
14 #
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.
20 #
21 #
22 #
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
27 #
28 #             https://creativecommons.org/licenses/by/4.0/
29 #
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.
35 #
36 # ============LICENSE_END============================================
37 #
38 #
39
40 """heat parameters
41 """
42 import pytest
43 from tests import cached_yaml as yaml
44 from tests.structures import Resource
45 from .helpers import validates, prop_iterator
46 import os
47
48 VERSION = "1.0.0"
49
50
51 def check_nested_parameter_doesnt_change(yaml_file, nresource_type, *nprops):
52     """
53     yaml_file: input heat template
54     nresource_type: target resource type to look for in nested file
55     nprops: list of props to dig through to get to parameter
56     """
57     base_dir, _ = os.path.split(yaml_file)
58     invalid_parameters = []
59
60     with open(yaml_file) as fh:
61         yml = yaml.load(fh)
62
63     # skip if resources are not defined
64     if "resources" not in yml:
65         pytest.skip("No resources specified in the heat template")
66
67     for resource_id, resource in yml.get("resources", {}).items():
68         resource_type = resource.get("type")
69         if resource_type and (
70             resource_type.endswith("yaml")
71             or resource_type.endswith("yml")
72             or resource_type == "OS::Heat::ResourceGroup"
73         ):
74             # workaround for subinterfaces
75             metadata = resource.get("metadata")
76             if metadata:
77                 subinterface_type = metadata.get("subinterface_type")
78                 if subinterface_type and subinterface_type == "network_collection":
79                     continue
80
81             r = Resource(resource_id=resource_id, resource=resource)
82             properties = r.get_nested_properties()
83             resources = r.get_nested_yaml(base_dir).get("resources", {})
84             for (
85                 nrid,
86                 nresource_dict,
87             ) in (
88                 resources.items()
89             ):  # iterate through nested file until found target r type
90
91                 if (
92                     nresource_dict.get("type")
93                     and nresource_dict.get("type") != nresource_type
94                 ):
95                     continue
96
97                 for nparam in prop_iterator(
98                     nresource_dict, *nprops
99                 ):  # get iterator of all target parameters
100                     if (
101                         nparam and "get_param" in nparam
102                     ):  # iterator yields None if parameter isn't found
103                         nparam = nparam.get("get_param")
104                         for (
105                             k1,
106                             v1,
107                         ) in (
108                             properties.items()
109                         ):  # found nparam, now comparing to parent template
110                             if isinstance(v1, dict) and "get_param" in v1:
111                                 parameter = v1.get("get_param")
112                                 # k1: nested resource parameter definition
113                                 # parameter: parent parameter name
114                                 # nparam: nested parameter name
115
116                                 # resolve list params like [param, { get_param: index }]
117                                 if isinstance(nparam, list):
118                                     nparam = nparam[0]
119                                 if isinstance(parameter, list):
120                                     parameter = parameter[0]
121
122                                 if (
123                                     k1 != nparam
124                                 ):  # we only care about the parameter we found in nested template
125                                     continue
126
127                                 if k1 != parameter:
128                                     msg = (
129                                         "{} property {} cannot change when passed into "
130                                         "a nested template. Nested parameter change detected in "
131                                         "resource {}: parent parameter = {}, nested parameter = {}".format(
132                                             nresource_type,
133                                             nprops,
134                                             resource_id,
135                                             parameter,
136                                             nparam,
137                                         )
138                                     )
139                                     invalid_parameters.append(msg)
140
141     assert not invalid_parameters, "\n".join(invalid_parameters)
142
143
144 # @validates("R-708564")
145 # def test_parameter_name_doesnt_change_in_nested_template(yaml_file):
146 #    check_nested_parameter_doesnt_change(yaml_file)
147
148
149 @validates("R-708564")
150 def test_server_name_parameter_name_doesnt_change_in_nested_template(heat_template):
151     check_nested_parameter_doesnt_change(heat_template, "OS::Nova::Server", "name")
152
153
154 @validates("R-708564")
155 def test_server_image_parameter_name_doesnt_change_in_nested_template(heat_template):
156     check_nested_parameter_doesnt_change(heat_template, "OS::Nova::Server", "image")
157
158
159 @validates("R-708564")
160 def test_server_flavor_parameter_name_doesnt_change_in_nested_template(heat_template):
161     check_nested_parameter_doesnt_change(heat_template, "OS::Nova::Server", "flavor")
162
163
164 @validates("R-708564")
165 def test_server_metadata_vnf_id_parameter_name_doesnt_change_in_nested_template(
166     heat_template
167 ):
168     check_nested_parameter_doesnt_change(
169         heat_template, "OS::Nova::Server", "metadata", "vnf_id"
170     )
171
172
173 @validates("R-708564")
174 def test_server_metadata_vf_module_id_parameter_name_doesnt_change_in_nested_template(
175     heat_template
176 ):
177     check_nested_parameter_doesnt_change(
178         heat_template, "OS::Nova::Server", "metadata", "vf_module_id"
179     )
180
181
182 @validates("R-708564")
183 def test_server_metadata_vnf_name_parameter_name_doesnt_change_in_nested_template(
184     heat_template
185 ):
186     check_nested_parameter_doesnt_change(
187         heat_template, "OS::Nova::Server", "metadata", "vnf_name"
188     )
189
190
191 @validates("R-708564")
192 def test_server_metadata_vf_module_name_parameter_name_doesnt_change_in_nested_template(
193     heat_template
194 ):
195     check_nested_parameter_doesnt_change(
196         heat_template, "OS::Nova::Server", "metadata", "vf_module_name"
197     )
198
199
200 @validates("R-708564")
201 def test_server_metadata_vm_role_parameter_name_doesnt_change_in_nested_template(
202     heat_template
203 ):
204     check_nested_parameter_doesnt_change(
205         heat_template, "OS::Nova::Server", "metadata", "vm_role"
206     )
207
208
209 @validates("R-708564")
210 def test_server_metadata_vf_module_index_parameter_name_doesnt_change_in_nested_template(
211     heat_template
212 ):
213     check_nested_parameter_doesnt_change(
214         heat_template, "OS::Nova::Server", "metadata", "vf_module_index"
215     )
216
217
218 @validates("R-708564")
219 def test_server_metadata_workload_context_parameter_name_doesnt_change_in_nested_template(
220     heat_template
221 ):
222     check_nested_parameter_doesnt_change(
223         heat_template, "OS::Nova::Server", "metadata", "workload_context"
224     )
225
226
227 @validates("R-708564")
228 def test_server_metadata_environment_context_parameter_name_doesnt_change_in_nested_template(
229     heat_template
230 ):
231     check_nested_parameter_doesnt_change(
232         heat_template, "OS::Nova::Server", "metadata", "environment_context"
233     )
234
235
236 @validates("R-708564")
237 def test_port_network_parameter_name_doesnt_change_in_nested_template(heat_template):
238     check_nested_parameter_doesnt_change(heat_template, "OS::Neutron::Port", "network")
239
240
241 @validates("R-708564")
242 def test_port_fip_ip_parameter_name_doesnt_change_in_nested_template(heat_template):
243     check_nested_parameter_doesnt_change(
244         heat_template, "OS::Neutron::Port", "fixed_ips", "ip_address"
245     )
246
247
248 @validates("R-708564")
249 def test_port_fip_subnet_parameter_name_doesnt_change_in_nested_template(heat_template):
250     check_nested_parameter_doesnt_change(
251         heat_template, "OS::Neutron::Port", "fixed_ips", "subnet"
252     )
253
254
255 @validates("R-708564")
256 def test_port_aap_ip_parameter_name_doesnt_change_in_nested_template(heat_template):
257     check_nested_parameter_doesnt_change(
258         heat_template, "OS::Neutron::Port", "allowed_address_pairs", "ip_address"
259     )
260
261
262 @validates("R-708564")
263 def test_vmi_net_ref_parameter_name_doesnt_change_in_nested_template(heat_template):
264     check_nested_parameter_doesnt_change(
265         heat_template, "OS::ContrailV2::VirtualMachineInterface", "virtual_network_refs"
266     )
267
268
269 @validates("R-708564")
270 def test_vmi_aap_parameter_name_doesnt_change_in_nested_template(heat_template):
271     check_nested_parameter_doesnt_change(
272         heat_template,
273         "OS::ContrailV2::VirtualMachineInterface",
274         "virtual_machine_interface_allowed_address_pairs",
275         "virtual_machine_interface_allowed_address_pairs_allowed_address_pair",
276         "virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip",
277         "virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix",
278     )
279
280
281 @validates("R-708564")
282 def test_iip_instance_ip_parameter_name_doesnt_change_in_nested_template(heat_template):
283     check_nested_parameter_doesnt_change(
284         heat_template, "OS::ContrailV2::InstanceIp", "instance_ip_address"
285     )
286
287
288 @validates("R-708564")
289 def test_iip_subnet_uuid_parameter_name_doesnt_change_in_nested_template(heat_template):
290     check_nested_parameter_doesnt_change(
291         heat_template, "OS::ContrailV2::InstanceIp", "subnet_uuid"
292     )