[VVP] stand alone tool, script updates
[vvp/validation-scripts.git] / ice_validator / tests / test_nested_parameters.py
index a1af4bd..5c93e77 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
 
 """heat parameters
 """
-
-import os
-
 import pytest
 from tests import cached_yaml as yaml
-
+from tests.structures import Resource
 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):
 
-    '''
     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")
+
+    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():
+        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()
+            for k1, v1 in properties.items():
+                if isinstance(v1, dict) and "get_param" in v1:
+                    parameter = v1.get("get_param")
+                    if isinstance(parameter, list):
+                        parameter = parameter[0]
+
+                    if k1 != parameter:
+                        invalid_parameters.append(
+                            {
+                                "resource": r.resource_id,
+                                "nested parameter": k1,
+                                "parameter": parameter,
+                                "file": yaml_file,
+                            }
+                        )
+
+    assert (
+        not invalid_parameters
+    ), "Invalid parameter name change detected in nested template {}".format(
+        invalid_parameters
+    )
+
+
+@validates("R-708564")
+def test_parameter_name_doesnt_change_in_nested_template(yaml_file):
+    check_nested_parameter_doesnt_change(yaml_file)