Merge pull request #2975 from pypeclub/enhancement/OP-1136_Tools-with-host-definition

General: Tools with host filters
This commit is contained in:
Jakub Trllo 2022-03-31 11:46:05 +02:00 committed by GitHub
commit 465e6ec9a5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 102 additions and 9 deletions

View file

@ -211,6 +211,7 @@ class ApplicationGroup:
data (dict): Group defying data loaded from settings.
manager (ApplicationManager): Manager that created the group.
"""
def __init__(self, name, data, manager):
self.name = name
self.manager = manager
@ -374,6 +375,7 @@ class ApplicationManager:
will always use these values. Gives ability to create manager
using different settings.
"""
def __init__(self, system_settings=None):
self.log = PypeLogger.get_logger(self.__class__.__name__)
@ -530,13 +532,13 @@ class EnvironmentToolGroup:
variants = data.get("variants") or {}
label_by_key = variants.pop(M_DYNAMIC_KEY_LABEL, {})
variants_by_name = {}
for variant_name, variant_env in variants.items():
for variant_name, variant_data in variants.items():
if variant_name in METADATA_KEYS:
continue
variant_label = label_by_key.get(variant_name) or variant_name
tool = EnvironmentTool(
variant_name, variant_label, variant_env, self
variant_name, variant_label, variant_data, self
)
variants_by_name[variant_name] = tool
self.variants = variants_by_name
@ -560,15 +562,30 @@ class EnvironmentTool:
Args:
name (str): Name of the tool.
environment (dict): Variant environments.
variant_data (dict): Variant data with environments and
host and app variant filters.
group (str): Name of group which wraps tool.
"""
def __init__(self, name, label, environment, group):
def __init__(self, name, label, variant_data, group):
# Backwards compatibility 3.9.1 - 3.9.2
# - 'variant_data' contained only environments but contain also host
# and application variant filters
host_names = variant_data.get("host_names", [])
app_variants = variant_data.get("app_variants", [])
if "environment" in variant_data:
environment = variant_data["environment"]
else:
environment = variant_data
self.host_names = host_names
self.app_variants = app_variants
self.name = name
self.variant_label = label
self.label = " ".join((group.label, label))
self.group = group
self._environment = environment
self.full_name = "/".join((group.name, name))
@ -579,6 +596,19 @@ class EnvironmentTool:
def environment(self):
return copy.deepcopy(self._environment)
def is_valid_for_app(self, app):
"""Is tool valid for application.
Args:
app (Application): Application for which are prepared environments.
"""
if self.app_variants and app.full_name not in self.app_variants:
return False
if self.host_names and app.host_name not in self.host_names:
return False
return True
class ApplicationExecutable:
"""Representation of executable loaded from settings."""
@ -1384,7 +1414,7 @@ def prepare_app_environments(data, env_group=None, implementation_envs=True):
# Make sure each tool group can be added only once
for key in asset_doc["data"].get("tools_env") or []:
tool = app.manager.tools.get(key)
if not tool:
if not tool or not tool.is_valid_for_app(app):
continue
groups_by_name[tool.group.name] = tool.group
tool_by_group_name[tool.group.name][tool.name] = tool

View file

@ -25,10 +25,18 @@
},
"variants": {
"3-2": {
"MTOA_VERSION": "3.2"
"host_names": [],
"app_variants": [],
"environment": {
"MTOA_VERSION": "3.2"
}
},
"3-1": {
"MTOA_VERSION": "3.1"
"host_names": [],
"app_variants": [],
"environment": {
"MTOA_VERSION": "3.1"
}
},
"__dynamic_keys_labels__": {
"3-2": "3.2",

View file

@ -25,7 +25,30 @@
"key": "variants",
"collapsible_key": true,
"object_type": {
"type": "raw-json"
"type": "dict",
"children": [
{
"key": "host_names",
"label": "Hosts",
"type": "hosts-enum",
"multiselection": true
},
{
"key": "app_variants",
"label": "Applications",
"type": "apps-enum",
"multiselection": true,
"tooltip": "Applications are not \"live\" and may require to Save and refresh settings UI to update values."
},
{
"type": "separator"
},
{
"key": "environment",
"label": "Environments",
"type": "raw-json"
}
]
}
}
]

View file

@ -265,11 +265,43 @@ def save_project_anatomy(project_name, anatomy_data):
raise SaveWarningExc(warnings)
def _system_settings_backwards_compatible_conversion(studio_overrides):
# Backwards compatibility of tools 3.9.1 - 3.9.2 to keep
# "tools" environments
if (
"tools" in studio_overrides
and "tool_groups" in studio_overrides["tools"]
):
tool_groups = studio_overrides["tools"]["tool_groups"]
for tool_group, group_value in tool_groups.items():
if tool_group in METADATA_KEYS:
continue
variants = group_value.get("variants")
if not variants:
continue
for key in set(variants.keys()):
if key in METADATA_KEYS:
continue
variant_value = variants[key]
if "environment" not in variant_value:
variants[key] = {
"environment": variant_value
}
@require_handler
def get_studio_system_settings_overrides(return_version=False):
return _SETTINGS_HANDLER.get_studio_system_settings_overrides(
output = _SETTINGS_HANDLER.get_studio_system_settings_overrides(
return_version
)
value = output
if return_version:
value, version = output
_system_settings_backwards_compatible_conversion(value)
return output
@require_handler