aboutsummaryrefslogtreecommitdiffstats
path: root/ice_validator/tests/utils/nested_iterables.py
diff options
context:
space:
mode:
authorMichael F. Lamb <mike@datagrok.org>2017-09-05 11:21:28 -0700
committerMichael F. Lamb <mike@datagrok.org>2017-09-05 11:48:52 -0700
commitcc21b8b08b6dbcec577bfb26ff397ac899da8002 (patch)
tree5d8a26586b0b0aee94002b472dfe995ffcb58fdf /ice_validator/tests/utils/nested_iterables.py
parent6755f61e44870ff65de0630a403f7b4ddfea4071 (diff)
Commit seed code for validation-scripts
This imports the initial seed code for validation scripts. These files were imported from a tarball with the SHA1SUM ce2ae49c82546b987c8ad2f68ac43d94b4934818. From the contents of the tarball, some errant .pyc files were removed, and a .gitignore file was added. The result matches exactly the contents of the origin private repository at hash 88c656e. Change-Id: I97d19b11495e116890ca6577e83037b0934519cc Issue-Id: VVP-11 Signed-off-by: Michael F. Lamb <mike@datagrok.org>
Diffstat (limited to 'ice_validator/tests/utils/nested_iterables.py')
-rw-r--r--ice_validator/tests/utils/nested_iterables.py207
1 files changed, 207 insertions, 0 deletions
diff --git a/ice_validator/tests/utils/nested_iterables.py b/ice_validator/tests/utils/nested_iterables.py
new file mode 100644
index 0000000..47b0609
--- /dev/null
+++ b/ice_validator/tests/utils/nested_iterables.py
@@ -0,0 +1,207 @@
+# -*- coding: utf8 -*-
+# ============LICENSE_START=======================================================
+# org.onap.vvp/validation-scripts
+# ===================================================================
+# Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+# ===================================================================
+#
+# Unless otherwise specified, all software contained herein is licensed
+# under the Apache License, Version 2.0 (the “License”);
+# you may not use this software except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#
+#
+# Unless otherwise specified, all documentation contained herein is licensed
+# under the Creative Commons License, Attribution 4.0 Intl. (the “License”);
+# you may not use this documentation except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://creativecommons.org/licenses/by/4.0/
+#
+# Unless required by applicable law or agreed to in writing, documentation
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# ============LICENSE_END============================================
+#
+# ECOMP is a trademark and service mark of AT&T Intellectual Property.
+#
+
+
+def parse_nested_dict(d, key=""):
+ '''
+ parse the nested dictionary and return values of
+ given key of function parameter only
+ '''
+ nested_elements = []
+ for k, v in d.items():
+ if isinstance(v, dict):
+ sub_dict = parse_nested_dict(v, key)
+ nested_elements.extend(sub_dict)
+ else:
+ if key:
+ if k == key:
+ nested_elements.append(v)
+ else:
+ nested_elements.append(v)
+
+ return nested_elements
+
+
+def find_all_get_param_in_yml(yml):
+ '''
+ Recursively find all referenced parameters in a parsed yaml body
+ and return a list of parameters
+ '''
+ os_pseudo_parameters = ['OS::stack_name',
+ 'OS::stack_id',
+ 'OS::project_id']
+
+ if not hasattr(yml, 'items'):
+ return []
+ params = []
+ for k, v in yml.items():
+ if k == 'get_param' and v not in os_pseudo_parameters:
+ for item in (v if isinstance(v, list) else [v]):
+ if isinstance(item, dict):
+ params.extend(find_all_get_param_in_yml(item))
+ elif isinstance(item, str):
+ params.append(item)
+ continue
+ if isinstance(v, dict):
+ params.extend(find_all_get_param_in_yml(v))
+ elif isinstance(v, list):
+ for d in v:
+ params.extend(find_all_get_param_in_yml(d))
+ return params
+
+
+def find_all_get_resource_in_yml(yml):
+ '''
+ Recursively find all referenced resources
+ in a parsed yaml body and return a list of resource ids
+ '''
+ if not hasattr(yml, 'items'):
+ return []
+ resources = []
+ for k, v in yml.items():
+ if k == 'get_resource':
+ if isinstance(v, list):
+ resources.append(v[0])
+ else:
+ resources.append(v)
+ continue
+ if isinstance(v, dict):
+ resources.extend(find_all_get_resource_in_yml(v))
+ elif isinstance(v, list):
+ for d in v:
+ resources.extend(find_all_get_resource_in_yml(d))
+ return resources
+
+
+def find_all_get_file_in_yml(yml):
+ '''
+ Recursively find all get_file in a parsed yaml body
+ and return the list of referenced files/urls
+ '''
+ if not hasattr(yml, 'items'):
+ return []
+ resources = []
+ for k, v in yml.items():
+ if k == 'get_file':
+ if isinstance(v, list):
+ resources.append(v[0])
+ else:
+ resources.append(v)
+ continue
+ if isinstance(v, dict):
+ resources.extend(find_all_get_file_in_yml(v))
+ elif isinstance(v, list):
+ for d in v:
+ resources.extend(find_all_get_file_in_yml(d))
+ return resources
+
+
+def find_all_get_resource_in_resource(resource):
+ '''
+ Recursively find all referenced resources
+ in a heat resource and return a list of resource ids
+ '''
+ if not hasattr(resource, 'items'):
+ return []
+
+ resources = []
+ for k, v in resource.items():
+ if k == 'get_resource':
+ if isinstance(v, list):
+ resources.append(v[0])
+ else:
+ resources.append(v)
+ continue
+ if isinstance(v, dict):
+ resources.extend(
+ find_all_get_resource_in_resource(v))
+ elif isinstance(v, list):
+ for d in v:
+ resources.extend(
+ find_all_get_resource_in_resource(d))
+ return resources
+
+
+def get_associated_resources_per_resource(resources):
+ '''
+ Recursively find all referenced resources for each resource
+ in a list of resource ids
+ '''
+ if not hasattr(resources, 'items'):
+ return None
+
+ resources_dict = {}
+ resources_dict["resources"] = {}
+ ref_resources = []
+
+ for res_key, res_value in resources.items():
+ get_resources = []
+
+ for k, v in res_value:
+ if k == 'get_resource' and\
+ isinstance(v, dict):
+ get_resources = find_all_get_resource_in_resource(v)
+
+ # if resources found, add to dict
+ if get_resources:
+ ref_resources.extend(get_resources)
+ resources_dict["resources"][res_key] = {
+ "res_value": res_value,
+ "get_resources": get_resources,
+ }
+
+ resources_dict["ref_resources"] = set(ref_resources)
+
+ return resources_dict
+
+
+def flatten(items):
+ '''
+ flatten items from any nested iterable
+ '''
+
+ merged_list = []
+ for item in items:
+ if isinstance(item, list):
+ sub_list = flatten(item)
+ merged_list.extend(sub_list)
+ else:
+ merged_list.append(item)
+ return merged_list