# ============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
#
# ============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 and "get_param" in nparam
+ ): # iterator yields None if parameter isn't found
+ nparam = nparam.get("get_param")
+ 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"
+ )
+
+
+@validates("R-708564")
+def test_iip_subnet_uuid_parameter_name_doesnt_change_in_nested_template(heat_template):
+ check_nested_parameter_doesnt_change(
+ heat_template, "OS::ContrailV2::InstanceIp", "subnet_uuid"
+ )