Merge "Remove unnecessary check for pytest.skip"
[vvp/validation-scripts.git] / ice_validator / tests / test_contrail_instance_ip_parameters.py
index a708a58..4071f66 100644 (file)
 # ============LICENSE_END============================================
 #
 #
+import os
 import re
 
-from tests.structures import ContrailV2InstanceIpProcessor
-from tests.helpers import validates
+import pytest
+
+from tests.structures import ContrailV2InstanceIpProcessor, Heat
+from tests.helpers import validates, get_base_template_from_yaml_files, get_param
+from tests.utils.incrementals import get_incremental_modules
 from tests.utils.ports import check_parameter_format
 
 RE_EXTERNAL_PARAM_IIP = re.compile(  # match pattern
@@ -96,38 +100,86 @@ sid_regx_dict = {
         "string": {
             "readable": "{network-role}_subnet_id or {network-role}_v6_subnet_id",
             "machine": RE_EXTERNAL_PARAM_SID,
-        },
+        }
     },
     "internal": {
         "string": {
             "readable": "int_{network-role}_subnet_id or int_{network-role}_v6_subnet_id",
             "machine": RE_INTERNAL_PARAM_SID,
-        },
+        }
     },
     "parameter_to_resource_comparisons": ["network_role"],
 }
 
 
-@validates("R-100000", "R-100010", "R-100030", "R-100150", "R-100070")
+@validates("R-100000", "R-100010", "R-100030", "R-100050", "R-100070")
 def test_contrail_external_instance_ip_address_parameter(yaml_file):
-    check_parameter_format(yaml_file, iip_regx_dict, "external", ContrailV2InstanceIpProcessor, "instance_ip_address")
+    check_parameter_format(
+        yaml_file,
+        iip_regx_dict,
+        "external",
+        ContrailV2InstanceIpProcessor,
+        "instance_ip_address",
+    )
 
 
-@validates("R-100000", "R-100090", "R-100110", "R-100130", "R-100180")
+@validates("R-100000", "R-100090", "R-100110", "R-100130", "R-100150")
 def test_contrail_internal_instance_ip_address_parameter(yaml_file):
-    check_parameter_format(yaml_file, iip_regx_dict, "internal", ContrailV2InstanceIpProcessor, "instance_ip_address")
+    check_parameter_format(
+        yaml_file,
+        iip_regx_dict,
+        "internal",
+        ContrailV2InstanceIpProcessor,
+        "instance_ip_address",
+    )
 
 
 @validates("R-100190", "R-100200", "R-100220")
 def test_contrail_external_instance_subnet_id_parameter(yaml_file):
-    check_parameter_format(yaml_file, sid_regx_dict, "external", ContrailV2InstanceIpProcessor, "subnet_uuid")
+    check_parameter_format(
+        yaml_file,
+        sid_regx_dict,
+        "external",
+        ContrailV2InstanceIpProcessor,
+        "subnet_uuid",
+    )
 
 
 @validates("R-100190", "R-100240", "R-100260")
 def test_contrail_internal_instance_subnet_id_parameter(yaml_file):
-    check_parameter_format(yaml_file, sid_regx_dict, "internal", ContrailV2InstanceIpProcessor, "subnet_uuid")
-
-
-
-
-
+    check_parameter_format(
+        yaml_file,
+        sid_regx_dict,
+        "internal",
+        ContrailV2InstanceIpProcessor,
+        "subnet_uuid",
+    )
+
+
+@validates("R-100240", "R-100260")
+def test_contrail_incremental_module_internal_subnet_usage(yaml_files):
+    base_path = get_base_template_from_yaml_files(yaml_files)
+    if not base_path:
+        pytest.skip("No base module detected to check")
+    base_outputs = Heat(filepath=base_path).outputs
+    incremental_modules = get_incremental_modules(yaml_files)
+    errors = []
+    for module in incremental_modules:
+        heat = Heat(filepath=module)
+        ips = heat.get_resource_by_type(ContrailV2InstanceIpProcessor.resource_type)
+        internal_ips = ((r_id, props) for r_id, props in ips.items() if "_int_" in r_id)
+        for r_id, ip in internal_ips:
+            subnet_uuid = (ip.get("properties") or {}).get("subnet_uuid")
+            subnet_param = get_param(subnet_uuid)
+            if not subnet_param:
+                continue
+            if subnet_param not in base_outputs:
+                errors.append(
+                    (
+                        "Resource ({}) is designated as an internal IP, but its "
+                        "subnet_uuid parameter ({}) does not refer to subnet in "
+                        "this template nor is it defined in the output section "
+                        "of the base module ({})"
+                    ).format(r_id, subnet_param, os.path.basename(base_path))
+                )
+    assert not errors, ". ".join(errors)