+from tests.structures import Heat
+from tests.utils.nested_files import file_is_a_nested_template
+
+
+# Whats persistent mean? It means it goes in env.
+# When adding an additional case, note the ","
+# at the end of a property to make it a tuple.
+ENV_PARAMETER_SPEC = {
+ "PLATFORM PROVIDED": [
+ {"property": ("vnf_id",), "persistent": False, "kwargs": {}},
+ {"property": ("vnf_name",), "persistent": False, "kwargs": {}},
+ {"property": ("vf_module_id",), "persistent": False, "kwargs": {}},
+ {"property": ("vf_module_index",), "persistent": False, "kwargs": {}},
+ {"property": ("vf_module_name",), "persistent": False, "kwargs": {}},
+ {"property": ("workload_context",), "persistent": False, "kwargs": {}},
+ {"property": ("environment_context",), "persistent": False, "kwargs": {}},
+ {"property": (r"^(.+?)_net_fqdn$",), "persistent": False, "kwargs": {}},
+ ],
+ "ALL": [{"property": ("name",), "persistent": False, "kwargs": {}}],
+ "OS::Nova::Server": [
+ {"property": ("image",), "persistent": True, "kwargs": {}},
+ {"property": ("flavor",), "persistent": True, "kwargs": {}},
+ {"property": ("availability_zone",), "persistent": False, "kwargs": {}},
+ ],
+ "OS::Neutron::Port": [
+ {"property": ("network",), "persistent": False, "kwargs": {}},
+ {
+ "property": ("fixed_ips", "ip_address"),
+ "persistent": False,
+ "network_type": "external",
+ "kwargs": {"exclude_parameter": re.compile(r"^(.+?)_int_(.+?)$")},
+ },
+ {
+ "property": ("fixed_ips", "ip_address"),
+ "persistent": True,
+ "network_type": "internal",
+ "kwargs": {"exclude_parameter": re.compile(r"^((?!_int_).)*$")},
+ },
+ {"property": ("fixed_ips", "subnet"), "persistent": False, "kwargs": {}},
+ {
+ "property": ("fixed_ips", "allowed_address_pairs"),
+ "persistent": False,
+ "network_type": "external",
+ "kwargs": {"exclude_parameter": re.compile(r"^(.+?)_int_(.+?)$")},
+ },
+ {
+ "property": ("fixed_ips", "allowed_address_pairs"),
+ "persistent": True,
+ "network_type": "internal",
+ "kwargs": {"exclude_parameter": re.compile(r"^((?!_int_).)*$")},
+ },
+ ],
+ "OS::ContrailV2::InterfaceRouteTable": [
+ {
+ "property": (
+ "interface_route_table_routes",
+ "interface_route_table_routes_route",
+ ),
+ "persistent": False,
+ "kwargs": {},
+ }
+ ],
+ "OS::Heat::ResourceGroup": [
+ {
+ "property": ("count",),
+ "persistent": True,
+ "kwargs": {
+ "exclude_resource": re.compile(
+ r"^(.+?)_subint_(.+?)_port_(.+?)_subinterfaces$"
+ )
+ },
+ }
+ ],
+ "OS::ContrailV2::InstanceIp": [
+ {
+ "property": ("instance_ip_address",),
+ "persistent": False,
+ "network_type": "external",
+ "kwargs": {"exclude_resource": re.compile(r"^.*_int_.*$")},
+ },
+ {
+ "property": ("instance_ip_address",),
+ "persistent": True,
+ "network_type": "internal",
+ "kwargs": {"exclude_resource": re.compile(r"(?!.*_int_.*)")},
+ },
+ {
+ "property": ("subnet_uuid",),
+ "persistent": False,
+ "network_type": "internal",
+ "kwargs": {"exclude_resource": re.compile(r"(?!.*_int_.*)")},
+ },
+ ],
+ "OS::ContrailV2::VirtualMachineInterface": [
+ {
+ "property": (
+ "virtual_machine_interface_allowed_address_pairs",
+ "virtual_machine_interface_allowed_address_pairs_allowed_address_pair",
+ "virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip",
+ "virtual_machine_interface_allowed_address_pairs_allowed_address_pair_ip_ip_prefix",
+ ),
+ "persistent": False,
+ "network_type": "external",
+ "kwargs": {"exclude_resource": re.compile(r"(?!.*_int_.*)")},
+ }
+ ],
+}
+
+
+def run_test_parameter(yaml_file, resource_type, *prop, **kwargs):
+ template_parameters = []
+ invalid_parameters = []
+ param_spec = {}
+ parameter_spec = ENV_PARAMETER_SPEC.get(
+ resource_type
+ ) # matching spec dict on resource type
+ for spec in parameter_spec:
+ # iterating through spec dict and trying to match on property
+ if spec.get("property") == prop:
+ yep = True
+ for (
+ k,
+ v,
+ ) in (
+ kwargs.items()
+ ): # now matching on additional kwargs passed in from test (i.e. network_type)
+ if not spec.get(k) or spec.get(k) != v:
+ yep = False
+ if yep:
+ param_spec = spec
+ if resource_type == "PLATFORM PROVIDED":
+ if file_is_a_nested_template(yaml_file):
+ pytest.skip(
+ "Not checking nested files for PLATFORM PROVIDED params"
+ )
+ template_parameters.append(
+ {"resource": "", "param": param_spec.get("property")[0]}
+ )
+ else:
+ 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
+ )
+ )