aboutsummaryrefslogtreecommitdiffstats
path: root/ice_validator/tests/test_nova_servers_vm_types.py
diff options
context:
space:
mode:
Diffstat (limited to 'ice_validator/tests/test_nova_servers_vm_types.py')
-rw-r--r--ice_validator/tests/test_nova_servers_vm_types.py128
1 files changed, 124 insertions, 4 deletions
diff --git a/ice_validator/tests/test_nova_servers_vm_types.py b/ice_validator/tests/test_nova_servers_vm_types.py
index 48abe04..233304c 100644
--- a/ice_validator/tests/test_nova_servers_vm_types.py
+++ b/ice_validator/tests/test_nova_servers_vm_types.py
@@ -37,14 +37,21 @@
#
# ECOMP is a trademark and service mark of AT&T Intellectual Property.
#
-from .helpers import validates
import pytest
-import yaml
+import re
+
+from tests import cached_yaml as yaml
+
+from .helpers import validates
+
from .utils.vm_types import get_vm_types_for_resource
+from .utils.vm_types import get_vm_types
+
+from .utils.network_roles import get_network_roles
-@validates('R-57282', 'R-40499')
+@validates('R-57282')
def test_vm_type_consistent_on_nova_servers(heat_template):
'''
Make sure all nova servers have properly formatted properties
@@ -70,4 +77,117 @@ def test_vm_type_consistent_on_nova_servers(heat_template):
if len(vm_types) != 1:
invalid_nova_servers.append(k)
- assert not set(invalid_nova_servers)
+ assert not set(invalid_nova_servers), \
+ "vm_types not consistant on the following resources {}" \
+ .format(invalid_nova_servers)
+
+
+@validates('R-48067',
+ 'R-00977')
+def test_vm_type_network_role_collision(yaml_file):
+ with open(yaml_file) as fh:
+ yml = yaml.load(fh)
+
+ # skip if resources are not defined
+ if "resources" not in yml:
+ pytest.skip("No resources specified in the heat template")
+
+ resources = yml["resources"]
+
+ vm_types = get_vm_types(resources)
+ network_roles = get_network_roles(resources)
+
+ collisions = []
+ for nr in network_roles:
+ for vt in vm_types:
+ if vt in nr or nr in vt:
+ collisions.append({"vm_type": vt, "network_role": nr})
+
+ assert not collisions, \
+ "vm_type and network_role should not be substrings {}" .format(collisions)
+
+
+@validates('R-50436',
+ 'R-45188',
+ 'R-40499')
+def test_nova_server_flavor_parameter(yaml_file):
+
+ prop = "flavor"
+ check_nova_parameter_format(prop, yaml_file)
+
+
+@validates('R-51430',
+ 'R-54171',
+ 'R-87817')
+def test_nova_server_name_parameter(yaml_file):
+
+ prop = "name"
+ check_nova_parameter_format(prop, yaml_file)
+
+
+@validates('R-71152',
+ 'R-45188',
+ 'R-57282')
+def test_nova_server_image_parameter(yaml_file):
+
+ prop = "image"
+ check_nova_parameter_format(prop, yaml_file)
+
+
+def check_nova_parameter_format(prop, yaml_file):
+
+ formats = {
+ "string": {
+ "name": re.compile(r'(.+?)_name_\d+$'),
+ "flavor": re.compile(r'(.+?)_flavor_name$'),
+ "image": re.compile(r'(.+?)_image_name$')
+ },
+ "comma_delimited_list": {
+ "name": re.compile(r'(.+?)_names$')
+ }
+ }
+
+ with open(yaml_file) as fh:
+ yml = yaml.load(fh)
+
+ # skip if resources are not defined
+ if "resources" not in yml:
+ pytest.skip("No resources specified in the heat template")
+
+ # skip if resources are not defined
+ if "parameters" not in yml:
+ pytest.skip("No parameters specified in the heat template")
+
+ invalid_parameters = []
+
+ for k, v in yml["resources"].items():
+ if not isinstance(v, dict):
+ continue
+ if v.get('type') != 'OS::Nova::Server':
+ continue
+
+ prop_param = v.get("properties", {}) \
+ .get(prop, {}) \
+ .get("get_param")
+
+ if not prop_param:
+ pytest.skip("{} doesn't have property {}".format(k, prop))
+ elif isinstance(prop_param, list):
+ prop_param = prop_param[0]
+
+ template_param_type = yml.get("parameters", {}) \
+ .get(prop_param, {}) \
+ .get("type")
+
+ if not template_param_type:
+ pytest.skip("could not determine param type for {}".format(prop_param))
+
+ format_match = formats.get(template_param_type, {}) \
+ .get(prop)
+
+ if not format_match or not format_match.match(prop_param):
+ invalid_parameters.append(prop_param)
+
+ assert not set(invalid_parameters), \
+ "invalid {} parameters detected {}" \
+ .format(prop, invalid_parameters)