X-Git-Url: https://gerrit.onap.org/r/gitweb?a=blobdiff_plain;f=ice_validator%2Ftests%2Ftest_nested_parameters.py;h=26220444f2443e2f27aa91ff647c228adc1b1c61;hb=684ad537becece9df772b04d0d8226bcb7c30ca4;hp=a1af4bd2b493efffbbf3eabdbc1027c8696ea1cf;hpb=60d5ad7d00eadd6395eca186e6fa76a43df3c6cf;p=vvp%2Fvalidation-scripts.git diff --git a/ice_validator/tests/test_nested_parameters.py b/ice_validator/tests/test_nested_parameters.py index a1af4bd..2622044 100644 --- a/ice_validator/tests/test_nested_parameters.py +++ b/ice_validator/tests/test_nested_parameters.py @@ -2,7 +2,7 @@ # ============LICENSE_START==================================================== # org.onap.vvp/validation-scripts # =================================================================== -# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# Copyright © 2019 AT&T Intellectual Property. All rights reserved. # =================================================================== # # Unless otherwise specified, all software contained herein is licensed @@ -35,46 +35,233 @@ # # ============LICENSE_END============================================ # -# ECOMP is a trademark and service mark of AT&T Intellectual Property. # """heat parameters """ - -import os - import pytest from tests import cached_yaml as yaml +from tests.structures import Resource +from .helpers import validates, prop_iterator +import os -from .helpers import validates -from .utils.nested_files import get_list_of_nested_files - -VERSION = '1.0.0' +VERSION = "1.0.0" -@validates('R-00011') -def test_nested_parameter(yaml_file): - ''' - A VNF's Heat Orchestration Template's Nested YAML file's - parameter's **MUST NOT** have a parameter constraint defined. +def check_nested_parameter_doesnt_change(yaml_file, nresource_type, *nprops): + """ + yaml_file: input heat template + nresource_type: target resource type to look for in nested file + nprops: list of props to dig through to get to parameter + """ + base_dir, _ = os.path.split(yaml_file) + invalid_parameters = [] - ''' with open(yaml_file) as fh: yml = yaml.load(fh) - dirname = os.path.dirname(yaml_file) - nested_files = get_list_of_nested_files(yml, dirname) - if nested_files: - for filename in nested_files: - with open(filename) as fh: - template = yaml.load(fh) - parameters = template.get('parameters') - if parameters and isinstance(parameters, dict): - for param, value in parameters.items(): - if isinstance(value, dict): - assert 'constraints' not in value, ( - '%s parameter "%s" has "constraints"' % ( - filename, - param)) - else: - pytest.skip('No nested files') + # skip if resources are not defined + if "resources" not in yml: + pytest.skip("No resources specified in the heat template") + + for resource_id, resource in yml.get("resources", {}).items(): + resource_type = resource.get("type") + if resource_type and ( + resource_type.endswith("yaml") + or resource_type.endswith("yml") + or resource_type == "OS::Heat::ResourceGroup" + ): + # workaround for subinterfaces + metadata = resource.get("metadata") + if metadata: + subinterface_type = metadata.get("subinterface_type") + if subinterface_type and subinterface_type == "network_collection": + continue + + r = Resource(resource_id=resource_id, resource=resource) + properties = r.get_nested_properties() + resources = r.get_nested_yaml(base_dir).get("resources", {}) + for nrid, nresource_dict in resources.items(): # iterate through nested file until found target r type + + if ( + nresource_dict.get("type") + and nresource_dict.get("type") != nresource_type + ): + continue + + for nparam in prop_iterator(nresource_dict, *nprops): # get iterator of all target parameters + if nparam: # iterator yields None if parameter isn't found + for k1, v1 in properties.items(): # found nparam, now comparing to parent template + if isinstance(v1, dict) and "get_param" in v1: + parameter = v1.get("get_param") + # k1: nested resource parameter definition + # parameter: parent parameter name + # nparam: nested parameter name + + # resolve list params like [param, { get_param: index }] + if isinstance(nparam, list): + nparam = nparam[0] + if isinstance(parameter, list): + parameter = parameter[0] + + if k1 != nparam: # we only care about the parameter we found in nested template + continue + + if k1 != parameter: + msg = ( + "{} property {} cannot change when passed into " + "a nested template. Nested parameter change detected in " + "resource {}: parent parameter = {}, nested parameter = {}".format( + nresource_type, + nprops, + resource_id, + parameter, + nparam, + ) + ) + invalid_parameters.append(msg) + + assert not invalid_parameters, "\n".join(invalid_parameters) + + +# @validates("R-708564") +# def test_parameter_name_doesnt_change_in_nested_template(yaml_file): +# check_nested_parameter_doesnt_change(yaml_file) + +@validates("R-708564") +def test_server_name_parameter_name_doesnt_change_in_nested_template(heat_template): + check_nested_parameter_doesnt_change(heat_template, "OS::Nova::Server", "name") + + +@validates("R-708564") +def test_server_image_parameter_name_doesnt_change_in_nested_template(heat_template): + check_nested_parameter_doesnt_change(heat_template, "OS::Nova::Server", "image") + + +@validates("R-708564") +def test_server_flavor_parameter_name_doesnt_change_in_nested_template(heat_template): + check_nested_parameter_doesnt_change(heat_template, "OS::Nova::Server", "flavor") + + +@validates("R-708564") +def test_server_metadata_vnf_id_parameter_name_doesnt_change_in_nested_template( + heat_template +): + check_nested_parameter_doesnt_change( + heat_template, "OS::Nova::Server", "metadata", "vnf_id" + ) + + +@validates("R-708564") +def test_server_metadata_vf_module_id_parameter_name_doesnt_change_in_nested_template( + heat_template +): + check_nested_parameter_doesnt_change( + heat_template, "OS::Nova::Server", "metadata", "vf_module_id" + ) + + +@validates("R-708564") +def test_server_metadata_vnf_name_parameter_name_doesnt_change_in_nested_template( + heat_template +): + check_nested_parameter_doesnt_change( + heat_template, "OS::Nova::Server", "metadata", "vnf_name" + ) + + +@validates("R-708564") +def test_server_metadata_vf_module_name_parameter_name_doesnt_change_in_nested_template( + heat_template +): + check_nested_parameter_doesnt_change( + heat_template, "OS::Nova::Server", "metadata", "vf_module_name" + ) + + +@validates("R-708564") +def test_server_metadata_vm_role_parameter_name_doesnt_change_in_nested_template( + heat_template +): + check_nested_parameter_doesnt_change( + heat_template, "OS::Nova::Server", "metadata", "vm_role" + ) + + +@validates("R-708564") +def test_server_metadata_vf_module_index_parameter_name_doesnt_change_in_nested_template( + heat_template +): + check_nested_parameter_doesnt_change( + heat_template, "OS::Nova::Server", "metadata", "vf_module_index" + ) + + +@validates("R-708564") +def test_server_metadata_workload_context_parameter_name_doesnt_change_in_nested_template( + heat_template +): + check_nested_parameter_doesnt_change( + heat_template, "OS::Nova::Server", "metadata", "workload_context" + ) + + +@validates("R-708564") +def test_server_metadata_environment_context_parameter_name_doesnt_change_in_nested_template( + heat_template +): + check_nested_parameter_doesnt_change( + heat_template, "OS::Nova::Server", "metadata", "environment_context" + ) + + +@validates("R-708564") +def test_port_network_parameter_name_doesnt_change_in_nested_template(heat_template): + check_nested_parameter_doesnt_change(heat_template, "OS::Neutron::Port", "network") + + +@validates("R-708564") +def test_port_fip_ip_parameter_name_doesnt_change_in_nested_template(heat_template): + check_nested_parameter_doesnt_change( + heat_template, "OS::Neutron::Port", "fixed_ips", "ip_address" + ) + + +@validates("R-708564") +def test_port_fip_subnet_parameter_name_doesnt_change_in_nested_template(heat_template): + check_nested_parameter_doesnt_change( + heat_template, "OS::Neutron::Port", "fixed_ips", "subnet" + ) + + +@validates("R-708564") +def test_port_aap_ip_parameter_name_doesnt_change_in_nested_template(heat_template): + check_nested_parameter_doesnt_change( + heat_template, "OS::Neutron::Port", "allowed_address_pairs", "ip_address" + ) + + +@validates("R-708564") +def test_vmi_net_ref_parameter_name_doesnt_change_in_nested_template(heat_template): + check_nested_parameter_doesnt_change( + heat_template, "OS::ContrailV2::VirtualMachineInterface", "virtual_network_refs" + ) + + +@validates("R-708564") +def test_vmi_aap_parameter_name_doesnt_change_in_nested_template(heat_template): + check_nested_parameter_doesnt_change( + heat_template, + "OS::ContrailV2::VirtualMachineInterface", + "virtual_machine_interface_allowed_address_pairs", + "virtual_machine_interface_allowed_address_pairs_allowed_address_pair", + "virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip", + "virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix" + ) + + +@validates("R-708564") +def test_iip_instance_ip_parameter_name_doesnt_change_in_nested_template(heat_template): + check_nested_parameter_doesnt_change( + heat_template, "OS::ContrailV2::InstanceIp", "instance_ip_address" + )