- continue
-
- if not pattern:
- continue
-
- if check_param_in_env_file(environment_pair, pattern, DESIRED):
- invalid_parameters.append(pattern)
-
- return set(invalid_parameters)
-
-
-@validates('R-91125')
-def test_nova_server_image_parameter_exists_in_environment_file(heat_template):
-
- if pytest.config.getoption("validation_profile") == "heat_only":
- pytest.skip("skipping test because validation profile is heat only")
-
- environment_pair = get_environment_pair(heat_template)
-
- prop = "image"
- DESIRED = True
- resource_type = "OS::Nova::Server"
-
- invalid_parameters = check_resource_parameter(environment_pair,
- prop,
- DESIRED,
- resource_type)
-
- assert not invalid_parameters, ("OS::Nova::Server {} parameters not"
- " found in {} environment file {}"
- .format(prop,
- environment_pair.get("name"),
- invalid_parameters))
-
-
-@validates('R-69431')
-def test_nova_server_flavor_parameter_exists_in_environment_file(heat_template):
-
- if pytest.config.getoption("validation_profile") == "heat_only":
- pytest.skip("skipping test because validation profile is heat only")
-
- environment_pair = get_environment_pair(heat_template)
-
- prop = "flavor"
- DESIRED = True
- resource_type = "OS::Nova::Server"
-
- invalid_parameters = check_resource_parameter(environment_pair,
- prop,
- DESIRED,
- resource_type)
-
- assert not invalid_parameters, ("OS::Nova::Server {} parameters not"
- " found in {} environment file {}"
- .format(prop,
- environment_pair.get("name"),
- invalid_parameters))
-
-
-@validates('R-22838')
-def test_nova_server_name_parameter_doesnt_exist_in_environment_file(heat_template):
-
- if pytest.config.getoption("validation_profile") == "heat_only":
- pytest.skip("skipping test because validation profile is heat only")
-
- environment_pair = get_environment_pair(heat_template)
-
- prop = "name"
- DESIRED = False
- resource_type = "OS::Nova::Server"
-
- invalid_parameters = check_resource_parameter(environment_pair,
- prop,
- DESIRED,
- resource_type)
-
- assert not invalid_parameters, ("OS::Nova::Server {} parameters"
- " found in {} environment file {}"
- .format(prop,
- environment_pair.get("name"),
- invalid_parameters))
-
-
-@validates('R-59568')
-def test_nova_server_az_parameter_doesnt_exist_in_environment_file(heat_template):
-
- if pytest.config.getoption("validation_profile") == "heat_only":
- pytest.skip("skipping test because validation profile is heat only")
-
- environment_pair = get_environment_pair(heat_template)
-
- prop = "availability_zone"
- DESIRED = False
- resource_type = "OS::Nova::Server"
-
- invalid_parameters = check_resource_parameter(environment_pair,
- prop,
- DESIRED,
- resource_type)
-
- assert not invalid_parameters, ("OS::Nova::Server {} parameters"
- " found in {} environment file {}"
- .format(prop,
- environment_pair.get("name"),
- invalid_parameters))
-
-
-@validates('R-20856')
-def test_nova_server_vnf_id_parameter_doesnt_exist_in_environment_file(heat_template):
-
- if pytest.config.getoption("validation_profile") == "heat_only":
- pytest.skip("skipping test because validation profile is heat only")
-
- environment_pair = get_environment_pair(heat_template)
-
- prop = "vnf_id"
- DESIRED = False
-
- invalid_parameters = check_param_in_env_file(environment_pair,
- prop,
- DESIRED)
-
- assert not invalid_parameters, ("{} parameters"
- " found in {} environment file {}"
- .format(prop,
- environment_pair.get("name"),
- invalid_parameters))
-
-
-@validates('R-72871')
-def test_nova_server_vf_module_id_parameter_doesnt_exist_in_environment_file(heat_template):
-
- if pytest.config.getoption("validation_profile") == "heat_only":
- pytest.skip("skipping test because validation profile is heat only")
-
- environment_pair = get_environment_pair(heat_template)
-
- prop = "vf_module_id"
- DESIRED = False
-
- invalid_parameters = check_param_in_env_file(environment_pair,
- prop,
- DESIRED)
-
- assert not invalid_parameters, ("{} parameters"
- " found in {} environment file {}"
- .format(prop,
- environment_pair.get("name"),
- invalid_parameters))
-
-
-@validates('R-36542')
-def test_nova_server_vnf_name_parameter_doesnt_exist_in_environment_file(heat_template):
-
- if pytest.config.getoption("validation_profile") == "heat_only":
- pytest.skip("skipping test because validation profile is heat only")
-
- environment_pair = get_environment_pair(heat_template)
-
- prop = "vnf_name"
- DESIRED = False
-
- invalid_parameters = check_param_in_env_file(environment_pair,
- prop,
- DESIRED)
-
- assert not invalid_parameters, ("{} parameters"
- " found in {} environment file {}"
- .format(prop,
- environment_pair.get("name"),
- invalid_parameters))
-
-
-@validates('R-80374')
-def test_nova_server_vf_module_name_parameter_doesnt_exist_in_environment_file(heat_template):
-
- if pytest.config.getoption("validation_profile") == "heat_only":
- pytest.skip("skipping test because validation profile is heat only")
-
- environment_pair = get_environment_pair(heat_template)
-
- prop = "vf_module_name"
- DESIRED = False
-
- invalid_parameters = check_param_in_env_file(environment_pair,
- prop,
- DESIRED)
-
- assert not invalid_parameters, ("{} parameters"
- " found in {} environment file {}"
- .format(prop,
- environment_pair.get("name"),
- invalid_parameters))
-
-
-@validates('R-02691')
-def test_nova_server_workload_context_parameter_doesnt_exist_in_environment_file(heat_template):
-
- if pytest.config.getoption("validation_profile") == "heat_only":
- pytest.skip("skipping test because validation profile is heat only")
-
- environment_pair = get_environment_pair(heat_template)
-
- prop = "workload_context"
- DESIRED = False
-
- invalid_parameters = check_param_in_env_file(environment_pair,
- prop,
- DESIRED)
-
- assert not invalid_parameters, ("{} parameters"
- " found in {} environment file {}"
- .format(prop,
- environment_pair.get("name"),
- invalid_parameters))
-
-
-@validates('R-13194')
-def test_nova_server_environment_context_parameter_doesnt_exist_in_environment_file(heat_template):
-
- if pytest.config.getoption("validation_profile") == "heat_only":
- pytest.skip("skipping test because validation profile is heat only")
-
- environment_pair = get_environment_pair(heat_template)
-
- prop = "environment_context"
- DESIRED = False
-
- invalid_parameters = check_param_in_env_file(environment_pair,
- prop,
- DESIRED)
-
- assert not invalid_parameters, ("{} parameters"
- " found in {} environment file {}"
- .format(prop,
- environment_pair.get("name"),
- invalid_parameters))
-
-
-@validates('R-29872')
-def test_nova_server_network_parameter_doesnt_exist_in_environment_file(heat_template):
-
- if pytest.config.getoption("validation_profile") == "heat_only":
- pytest.skip("skipping test because validation profile is heat only")
-
- environment_pair = get_environment_pair(heat_template)
-
- prop = "networks"
- nested_prop = "network"
- DESIRED = False
- resource_type = "OS::Nova::Server"
-
- invalid_parameters = check_resource_parameter(environment_pair,
- prop,
- DESIRED,
- resource_type,
- nested_prop=nested_prop)
-
- assert not invalid_parameters, ("{} {} parameters"
- " found in {} environment file {}"
- .format(resource_type,
- nested_prop,
- environment_pair.get("name"),
- invalid_parameters))
-
-
-@validates('R-39841',
- 'R-87123',
- 'R-28795',
- 'R-97201',
- 'R-62590',
- 'R-93496',
- 'R-98905',
- 'R-93030',
- 'R-90206',
- 'R-98569',
- 'R-62590',
- 'R-93496')
-def test_neutron_port_fixedips_ipaddress_parameter_doesnt_exist_in_environment_file(heat_template):
-
- if pytest.config.getoption("validation_profile") == "heat_only":
- pytest.skip("skipping test because validation profile is heat only")
-
- environment_pair = get_environment_pair(heat_template)
-
- prop = "fixed_ips"
- nested_prop = "ip_address"
- DESIRED = False
- resource_type = "OS::Neutron::Port"
-
- invalid_parameters = check_resource_parameter(environment_pair,
- prop,
- DESIRED,
- resource_type,
- nested_prop=nested_prop)
-
- assert not invalid_parameters, ("{} {} parameters"
- " found in {} environment file {}"
- .format(resource_type,
- nested_prop,
- environment_pair.get("name"),
- invalid_parameters))
-
-
-@validates('R-83677',
- 'R-80829',
- 'R-69634',
- 'R-22288')
-def test_neutron_port_fixedips_subnet_parameter_doesnt_exist_in_environment_file(heat_template):
-
- if pytest.config.getoption("validation_profile") == "heat_only":
- pytest.skip("skipping test because validation profile is heat only")
-
- environment_pair = get_environment_pair(heat_template)
-
- prop = "fixed_ips"
- nested_prop = "subnet_id"
- DESIRED = False
- resource_type = "OS::Neutron::Port"
-
- invalid_parameters = check_resource_parameter(environment_pair,
- prop,
- DESIRED,
- resource_type,
- nested_prop=nested_prop)
-
- assert not invalid_parameters, ("{} {} parameters"
- " found in {} environment file {}"
- .format(resource_type,
- nested_prop,
- environment_pair.get("name"),
- invalid_parameters))
-
-
-@validates('R-83412',
- 'R-83418')
-def test_neutron_port_aap_ip_parameter_doesnt_exist_in_environment_file(heat_template):
-
- if pytest.config.getoption("validation_profile") == "heat_only":
- pytest.skip("skipping test because validation profile is heat only")
-
- environment_pair = get_environment_pair(heat_template)
-
- prop = "allowed_address_pairs"
- nested_prop = "ip_address"
- DESIRED = False
- resource_type = "OS::Neutron::Port"
-
- invalid_parameters = check_resource_parameter(environment_pair,
- prop,
- DESIRED,
- resource_type,
- nested_prop=nested_prop)
-
- assert not invalid_parameters, ("{} {} parameters"
- " found in {} environment file {}"
- .format(resource_type,
- nested_prop,
- environment_pair.get("name"),
- invalid_parameters))
-
-
-@validates('R-99812')
-def test_non_nova_server_name_parameter_doesnt_exist_in_environment_file(heat_template):
-
- if pytest.config.getoption("validation_profile") == "heat_only":
- pytest.skip("skipping test because validation profile is heat only")
-
- environment_pair = get_environment_pair(heat_template)
-
- prop = "name"
- DESIRED = False
- resource_type = "OS::Nova::Server"
-
- invalid_parameters = check_resource_parameter(environment_pair,
- prop,
- DESIRED,
- resource_type,
- resource_type_inverse=True)
-
- assert not invalid_parameters, ("non-{} {} parameters"
- " found in {} environment file {}"
- .format(resource_type,
- prop,
- environment_pair.get("name"),
- invalid_parameters))
-
-
-@validates('R-92193')
-def test_network_fqdn_parameter_doesnt_exist_in_environment_file(heat_template):
-
- if pytest.config.getoption("validation_profile") == "heat_only":
- pytest.skip("skipping test because validation profile is heat only")
-
- environment_pair = get_environment_pair(heat_template)
-
- prop = r'^(.+?)_net_fqdn$'
- DESIRED = False
-
- invalid_parameters = check_param_in_env_file(environment_pair,
- prop,
- DESIRED)
-
- assert not invalid_parameters, ("{} parameters"
- " found in {} environment file {}"
- .format(prop,
- environment_pair.get("name"),
- invalid_parameters))
-
-
-@validates('R-76682')
-def test_contrail_route_prefixes_parameter_doesnt_exist_in_environment_file(heat_template):
-
- if pytest.config.getoption("validation_profile") == "heat_only":
- pytest.skip("skipping test because validation profile is heat only")
-
- environment_pair = get_environment_pair(heat_template)
-
- prop = "interface_route_table_routes"
- nested_prop = "interface_route_table_routes_route"
- DESIRED = False
- resource_type = "OS::ContrailV2::InterfaceRouteTable"
-
- invalid_parameters = check_resource_parameter(environment_pair,
- prop,
- DESIRED,
- resource_type,
- nested_prop=nested_prop)
-
- assert not invalid_parameters, ("{} {} parameters"
- " found in {} environment file {}"
- .format(resource_type,
- nested_prop,
- environment_pair.get("name"),
- invalid_parameters))
-
-
-@validates('R-50011')
-def test_heat_rg_count_parameter_exists_in_environment_file(heat_template):
-
- if pytest.config.getoption("validation_profile") == "heat_only":
- pytest.skip("skipping test because validation profile is heat only")
-
- environment_pair = get_environment_pair(heat_template)
+ all_resources = False
+ if resource_type == "ALL":
+ all_resources = True
+ template_parameters = get_template_parameters(
+ yaml_file,
+ resource_type,
+ param_spec,
+ all_resources=all_resources,
+ ) # found the correct spec, proceeding w/ test
+ break
+
+ for parameter in template_parameters:
+ param = parameter.get("param")
+ persistence = param_spec.get("persistent")
+
+ if env_violation(yaml_file, param, spec.get("persistent")):
+ human_text = "must" if persistence else "must not"
+ human_text2 = "was not" if persistence else "was"
+
+ invalid_parameters.append(
+ "{} parameter {} {} be enumerated in an environment file, but "
+ "parameter {} for {} {} found.".format(
+ resource_type, prop, human_text, param, yaml_file, human_text2
+ )
+ )
+
+ assert not invalid_parameters, "\n".join(invalid_parameters)
+
+
+def get_preload_excluded_parameters(yaml_file, persistent_only=False, env_spec=None):
+ """
+ Returns set of all parameters that should not be included in the preload's
+ vnf parameters/tag-values section.
+
+ if persistent_only only parameters that are marked as persistent will
+ be excluded
+ """
+ env_spec = env_spec or ENV_PARAMETER_SPEC
+ results = []
+ for resource_type, specs in env_spec.items():
+ # apply to all resources if not in the format of an OpenStack resource
+ all_resources = "::" not in resource_type
+ for spec in specs:
+ if persistent_only and not spec.get("persistent"):
+ continue
+ results.extend(get_template_parameters(yaml_file, resource_type,
+ spec, all_resources, nested_resources=True))
+ results = {item["param"] for item in results}
+ for param in Heat(yaml_file).parameters:
+ # AZs often are manipulated and passed into nested templates making
+ # them difficult to detect by looking for the assignment. We'll
+ # just extract them from the parameters if they are there to be safe
+ if re.match(r"availability_zone_\d+", param):
+ results.add(param)
+ return results
+
+
+def get_template_parameters(yaml_file, resource_type, spec, all_resources=False, nested_resources=False):
+ parameters = []
+
+ heat = Heat(yaml_file)
+ if all_resources:
+ resources = heat.resources if not nested_resources else heat.get_all_resources()
+ else:
+ resources = heat.get_resource_by_type(resource_type, all_resources=nested_resources)
+ for rid, resource_props in resources.items():
+ for param in prop_iterator(resource_props, *spec.get("property")):
+ if param and get_param(param) and param_helper(spec, get_param(param), rid):
+ # this is first getting the param
+ # then checking if its actually using get_param
+ # then checking a custom helper function (mostly for internal vs external networks)
+ parameters.append({"resource": rid, "param": get_param(param)})
+ return parameters
+
+
+def env_violation(yaml_file, parameter, persistent):
+ # Returns True IF there's a violation, False if everything looks good.
+
+ filepath, filename = os.path.split(yaml_file)
+ environment_pair = get_environment_pair(yaml_file)
+ if not environment_pair: # this is a nested file perhaps?
+ environment_pair = find_environment_file(
+ yaml_file
+ ) # we want to check parent env
+ if not environment_pair:
+ pytest.skip("unable to determine environment file for nested yaml file")