[VVP] adding subnet_uuid to nested parameter check
[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 nrid, nresource_dict in resources.items():  # iterate through nested file until found target r type
85
86                 if (
87                     nresource_dict.get("type")
88                     and nresource_dict.get("type") != nresource_type
89                 ):
90                     continue
91
92                 for nparam in prop_iterator(nresource_dict, *nprops):  # get iterator of all target parameters
93                     if nparam:  # iterator yields None if parameter isn't found
94                         for k1, v1 in properties.items():  # found nparam, now comparing to parent template
95                             if isinstance(v1, dict) and "get_param" in v1:
96                                 parameter = v1.get("get_param")
97                                 # k1: nested resource parameter definition
98                                 # parameter: parent parameter name
99                                 # nparam: nested parameter name
100
101                                 # resolve list params like [param, { get_param: index }]
102                                 if isinstance(nparam, list):
103                                     nparam = nparam[0]
104                                 if isinstance(parameter, list):
105                                     parameter = parameter[0]
106
107                                 if k1 != nparam:  # we only care about the parameter we found in nested template
108                                     continue
109
110                                 if k1 != parameter:
111                                     msg = (
112                                         "{} property {} cannot change when passed into "
113                                         "a nested template. Nested parameter change detected in "
114                                         "resource {}: parent parameter = {}, nested parameter = {}".format(
115                                             nresource_type,
116                                             nprops,
117                                             resource_id,
118                                             parameter,
119                                             nparam,
120                                         )
121                                     )
122                                     invalid_parameters.append(msg)
123
124     assert not invalid_parameters, "\n".join(invalid_parameters)
125
126
127 # @validates("R-708564")
128 # def test_parameter_name_doesnt_change_in_nested_template(yaml_file):
129 #    check_nested_parameter_doesnt_change(yaml_file)
130
131 @validates("R-708564")
132 def test_server_name_parameter_name_doesnt_change_in_nested_template(heat_template):
133     check_nested_parameter_doesnt_change(heat_template, "OS::Nova::Server", "name")
134
135
136 @validates("R-708564")
137 def test_server_image_parameter_name_doesnt_change_in_nested_template(heat_template):
138     check_nested_parameter_doesnt_change(heat_template, "OS::Nova::Server", "image")
139
140
141 @validates("R-708564")
142 def test_server_flavor_parameter_name_doesnt_change_in_nested_template(heat_template):
143     check_nested_parameter_doesnt_change(heat_template, "OS::Nova::Server", "flavor")
144
145
146 @validates("R-708564")
147 def test_server_metadata_vnf_id_parameter_name_doesnt_change_in_nested_template(
148     heat_template
149 ):
150     check_nested_parameter_doesnt_change(
151         heat_template, "OS::Nova::Server", "metadata", "vnf_id"
152     )
153
154
155 @validates("R-708564")
156 def test_server_metadata_vf_module_id_parameter_name_doesnt_change_in_nested_template(
157     heat_template
158 ):
159     check_nested_parameter_doesnt_change(
160         heat_template, "OS::Nova::Server", "metadata", "vf_module_id"
161     )
162
163
164 @validates("R-708564")
165 def test_server_metadata_vnf_name_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_name"
170     )
171
172
173 @validates("R-708564")
174 def test_server_metadata_vf_module_name_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_name"
179     )
180
181
182 @validates("R-708564")
183 def test_server_metadata_vm_role_parameter_name_doesnt_change_in_nested_template(
184     heat_template
185 ):
186     check_nested_parameter_doesnt_change(
187         heat_template, "OS::Nova::Server", "metadata", "vm_role"
188     )
189
190
191 @validates("R-708564")
192 def test_server_metadata_vf_module_index_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_index"
197     )
198
199
200 @validates("R-708564")
201 def test_server_metadata_workload_context_parameter_name_doesnt_change_in_nested_template(
202     heat_template
203 ):
204     check_nested_parameter_doesnt_change(
205         heat_template, "OS::Nova::Server", "metadata", "workload_context"
206     )
207
208
209 @validates("R-708564")
210 def test_server_metadata_environment_context_parameter_name_doesnt_change_in_nested_template(
211     heat_template
212 ):
213     check_nested_parameter_doesnt_change(
214         heat_template, "OS::Nova::Server", "metadata", "environment_context"
215     )
216
217
218 @validates("R-708564")
219 def test_port_network_parameter_name_doesnt_change_in_nested_template(heat_template):
220     check_nested_parameter_doesnt_change(heat_template, "OS::Neutron::Port", "network")
221
222
223 @validates("R-708564")
224 def test_port_fip_ip_parameter_name_doesnt_change_in_nested_template(heat_template):
225     check_nested_parameter_doesnt_change(
226         heat_template, "OS::Neutron::Port", "fixed_ips", "ip_address"
227     )
228
229
230 @validates("R-708564")
231 def test_port_fip_subnet_parameter_name_doesnt_change_in_nested_template(heat_template):
232     check_nested_parameter_doesnt_change(
233         heat_template, "OS::Neutron::Port", "fixed_ips", "subnet"
234     )
235
236
237 @validates("R-708564")
238 def test_port_aap_ip_parameter_name_doesnt_change_in_nested_template(heat_template):
239     check_nested_parameter_doesnt_change(
240         heat_template, "OS::Neutron::Port", "allowed_address_pairs", "ip_address"
241     )
242
243
244 @validates("R-708564")
245 def test_vmi_net_ref_parameter_name_doesnt_change_in_nested_template(heat_template):
246     check_nested_parameter_doesnt_change(
247         heat_template, "OS::ContrailV2::VirtualMachineInterface", "virtual_network_refs"
248     )
249
250
251 @validates("R-708564")
252 def test_vmi_aap_parameter_name_doesnt_change_in_nested_template(heat_template):
253     check_nested_parameter_doesnt_change(
254         heat_template,
255         "OS::ContrailV2::VirtualMachineInterface",
256         "virtual_machine_interface_allowed_address_pairs",
257         "virtual_machine_interface_allowed_address_pairs_allowed_address_pair",
258         "virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip",
259         "virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix"
260     )
261
262
263 @validates("R-708564")
264 def test_iip_instance_ip_parameter_name_doesnt_change_in_nested_template(heat_template):
265     check_nested_parameter_doesnt_change(
266         heat_template, "OS::ContrailV2::InstanceIp", "instance_ip_address"
267     )
268
269
270 @validates("R-708564")
271 def test_iip_subnet_uuid_parameter_name_doesnt_change_in_nested_template(heat_template):
272     check_nested_parameter_doesnt_change(
273         heat_template, "OS::ContrailV2::InstanceIp", "subnet_uuid"
274     )