[VVP] adding subnet_uuid to nested parameter check
[vvp/validation-scripts.git] / ice_validator / tests / test_nested_parameters.py
index 3e3bb06..846a977 100644 (file)
@@ -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
 #
 # ============LICENSE_END============================================
 #
-# ECOMP is a trademark and service mark of AT&T Intellectual Property.
 #
 
 """heat parameters
 """
-
 import pytest
 from tests import cached_yaml as yaml
 from tests.structures import Resource
-
-from .helpers import validates
+from .helpers import validates, prop_iterator
+import os
 
 VERSION = "1.0.0"
 
 
-def check_nested_parameter_doesnt_change(yaml_file, parameter):
+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)
@@ -59,83 +64,211 @@ def check_nested_parameter_doesnt_change(yaml_file, parameter):
     if "resources" not in yml:
         pytest.skip("No resources specified in the heat template")
 
-    invalid_parameters = []
-
-    """
-    checking if property: { get_param: <parameter> }, then property == <parameter>
-
-    resource_id:
-        type: nested.yaml
-        properties:
-            property: { get_param: <parameter> }
-
-    resource_id:
-        type: OS::Heat::ResourceGroup
-        properties:
-            resource_def:
-                properties:
-                    property: { get_param: <parameter> }
-    """
     for resource_id, resource in yml.get("resources", {}).items():
-        r = Resource(resource_id=resource_id, resource=resource)
-        properties = r.get_nested_properties()
-        for k1, v1 in properties.items():
-            if (
-                isinstance(v1, dict)
-                and "get_param" in v1
-                and parameter == v1.get("get_param")
-            ):
-                if k1 != parameter:
-                    invalid_parameters.append(
-                        {
-                            "resource": r.resource_id,
-                            "nested parameter": k1,
-                            "parameter": parameter,
-                        }
-                    )
-
-    assert (
-        not invalid_parameters
-    ), "Invalid parameter name change detected in nested template {}".format(
-        invalid_parameters
+        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-70757")
-def test_vm_role_doesnt_change_in_nested_template(yaml_file):
-    check_nested_parameter_doesnt_change(yaml_file, "vm_role")
+@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-44491")
-def test_vnf_id_doesnt_change_in_nested_template(yaml_file):
-    check_nested_parameter_doesnt_change(yaml_file, "vnf_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-86237")
-def test_vf_module_id_doesnt_change_in_nested_template(yaml_file):
-    check_nested_parameter_doesnt_change(yaml_file, "vf_module_id")
+@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-16576")
-def test_vnf_name_doesnt_change_in_nested_template(yaml_file):
-    check_nested_parameter_doesnt_change(yaml_file, "vnf_name")
+@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-49177")
-def test_vf_module_name_doesnt_change_in_nested_template(yaml_file):
-    check_nested_parameter_doesnt_change(yaml_file, "vf_module_name")
+@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-22441")
-def test_vf_module_index_name_doesnt_change_in_nested_template(yaml_file):
-    check_nested_parameter_doesnt_change(yaml_file, "vf_module_index")
+@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-62954")
-def test_environment_context_name_doesnt_change_in_nested_template(yaml_file):
-    check_nested_parameter_doesnt_change(yaml_file, "environment_context")
+@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-75202")
-def test_workload_context_name_doesnt_change_in_nested_template(yaml_file):
-    check_nested_parameter_doesnt_change(yaml_file, "workload_context")
+@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"
+    )