Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for overridding whether resources are enabled #5506

Merged
merged 23 commits into from
Mar 8, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
f5a6aa8
Initial changes to support pack override of enable parameter
amanda11 Dec 10, 2021
af455f6
Add UTs and make more generic
amanda11 Dec 10, 2021
6592a7c
Add global override
amanda11 Dec 16, 2021
8f4f4f8
Add changelog and black formatting
amanda11 Dec 16, 2021
d7a1435
Update test_content_loader.py
amanda11 Dec 19, 2021
e3c8352
Add review comments
amanda11 Jan 7, 2022
20fe84f
Merge branch 'add_override_support' of https://github.com/StackStorm/…
amanda11 Jan 7, 2022
6200478
Change level of logging so doesn't appear in output when do a st2ctl …
amanda11 Jan 31, 2022
2415056
Add output to reload to indicate number of resources where metadata i…
amanda11 Feb 7, 2022
9ce0662
Merge branch 'master' into add_override_support
amanda11 Feb 11, 2022
df920ab
Fix black error
amanda11 Feb 14, 2022
e8ea7a4
Fix flake8
amanda11 Feb 14, 2022
7938dce
Fix UT
amanda11 Feb 14, 2022
27da722
Fix UT
amanda11 Feb 14, 2022
3635f4c
Fix UT
amanda11 Feb 14, 2022
70035fc
Fix Black UT
amanda11 Feb 14, 2022
3810862
Apply suggestions from code review
amanda11 Feb 17, 2022
0f1d233
Merge branch 'master' into add_override_support
amanda11 Feb 28, 2022
455f890
Add reserved pack list name - currently just global
amanda11 Mar 4, 2022
ef1b2c2
Merge branch 'master' into add_override_support
amanda11 Mar 4, 2022
03671cf
Fix flake8 UT error
amanda11 Mar 4, 2022
d485fc4
Merge branch 'add_override_support' of https://github.com/StackStorm/…
amanda11 Mar 4, 2022
45c6bc9
Rename overrides global to _global
amanda11 Mar 7, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,10 @@ Added

Contributed by @Rand01ph

* Added support to override enabled parameter of resources. #5506

Contributed by Amanda McGuinness (@amanda11 Intive)

Fixed
~~~~~

Expand Down
2 changes: 1 addition & 1 deletion st2actions/tests/unit/test_actions_registrar.py
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ def test_register_action_with_no_params(self):
"generic", "actions", "action-with-no-parameters.yaml"
)

self.assertEqual(registrar._register_action("dummy", action_file), None)
self.assertEqual(registrar._register_action("dummy", action_file), False)

@mock.patch.object(
action_validator, "_is_valid_pack", mock.MagicMock(return_value=True)
Expand Down
29 changes: 21 additions & 8 deletions st2api/st2api/controllers/v1/packs.py
Original file line number Diff line number Diff line change
Expand Up @@ -201,10 +201,17 @@ def post(self, pack_register_request):
pack_path = content_utils.get_pack_base_path(pack)

try:
registered_count = registrar.register_from_pack(
pack_dir=pack_path
)
result[name] += registered_count
res = registrar.register_from_pack(pack_dir=pack_path)
# Where overridding is supported return is tuple of
# (registered,overridden) else its just registered
# count return
if isinstance(res, tuple):
result[name] += res[0]
if res[1] != 0:
result[f"{name}(overridden)"] = res[1]
else:
result[name] += res

except ValueError as e:
# Throw more user-friendly exception if requsted pack doesn't exist
if re.match(
Expand All @@ -219,10 +226,16 @@ def post(self, pack_register_request):
raise e
else:
packs_base_paths = content_utils.get_packs_base_paths()
registered_count = registrar.register_from_packs(
base_dirs=packs_base_paths
)
result[name] += registered_count
res = registrar.register_from_packs(base_dirs=packs_base_paths)
# Where overridding is supported return is tuple of
# (registered,overridden) else its just registered
# count return
if isinstance(res, tuple):
result[name] += res[0]
if res[1] != 0:
result[f"{name}(overridden)"] = res[1]
else:
result[name] += res

return result

Expand Down
33 changes: 23 additions & 10 deletions st2common/st2common/bootstrap/actionsregistrar.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,13 +43,14 @@ def register_from_packs(self, base_dirs):
Discover all the packs in the provided directory and register actions from all of the
discovered packs.
:return: Number of actions registered.
:rtype: ``int``
:return: Number of actions registered, Number of actions overridden
:rtype: ``tuple``
"""
# Register packs first
self.register_packs(base_dirs=base_dirs)

registered_count = 0
overridden_count = 0
content = self._pack_loader.get_content(
base_dirs=base_dirs, content_type="actions"
)
Expand All @@ -63,8 +64,11 @@ def register_from_packs(self, base_dirs):
"Registering actions from pack %s:, dir: %s", pack, actions_dir
)
actions = self._get_actions_from_pack(actions_dir)
count = self._register_actions_from_pack(pack=pack, actions=actions)
count, overridden = self._register_actions_from_pack(
pack=pack, actions=actions
)
registered_count += count
overridden_count += overridden
except Exception as e:
if self._fail_on_failure:
raise e
Expand All @@ -73,14 +77,14 @@ def register_from_packs(self, base_dirs):
"Failed registering all actions from pack: %s", actions_dir
)

return registered_count
return registered_count, overridden_count

def register_from_pack(self, pack_dir):
"""
Register all the actions from the provided pack.
:return: Number of actions registered.
:rtype: ``int``
:return: Number of actions registered, Number of actions overridden
:rtype: ``tuple``
"""
pack_dir = pack_dir[:-1] if pack_dir.endswith("/") else pack_dir
_, pack = os.path.split(pack_dir)
Expand All @@ -92,14 +96,15 @@ def register_from_pack(self, pack_dir):
self.register_pack(pack_name=pack, pack_dir=pack_dir)

registered_count = 0
overridden_count = 0
if not actions_dir:
return registered_count

LOG.debug("Registering actions from pack %s:, dir: %s", pack, actions_dir)

try:
actions = self._get_actions_from_pack(actions_dir=actions_dir)
registered_count = self._register_actions_from_pack(
registered_count, overridden_count = self._register_actions_from_pack(
pack=pack, actions=actions
)
except Exception as e:
Expand All @@ -108,7 +113,7 @@ def register_from_pack(self, pack_dir):

LOG.exception("Failed registering all actions from pack: %s", actions_dir)

return registered_count
return registered_count, overridden_count

def _get_actions_from_pack(self, actions_dir):
actions = self.get_resources_from_pack(resources_dir=actions_dir)
Expand Down Expand Up @@ -142,6 +147,9 @@ def _register_action(self, pack, action):
)
content["metadata_file"] = metadata_file

# Pass override information
altered = self._override_loader.override(pack, "actions", content)

action_api = ActionAPI(**content)

try:
Expand Down Expand Up @@ -214,12 +222,17 @@ def _register_action(self, pack, action):
LOG.exception("Failed to write action to db %s.", model.name)
raise

return altered

def _register_actions_from_pack(self, pack, actions):
registered_count = 0
overridden_count = 0
for action in actions:
try:
LOG.debug("Loading action from %s.", action)
self._register_action(pack=pack, action=action)
altered = self._register_action(pack=pack, action=action)
if altered:
overridden_count += 1
except Exception as e:
if self._fail_on_failure:
msg = 'Failed to register action "%s" from pack "%s": %s' % (
Expand All @@ -234,7 +247,7 @@ def _register_actions_from_pack(self, pack, actions):
else:
registered_count += 1

return registered_count
return registered_count, overridden_count


def register_actions(
Expand Down
40 changes: 26 additions & 14 deletions st2common/st2common/bootstrap/aliasesregistrar.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,13 +40,14 @@ def register_from_packs(self, base_dirs):
Discover all the packs in the provided directory and register aliases from all of the
discovered packs.
:return: Number of aliases registered.
:rtype: ``int``
:return: Tuple, Number of aliases registered, overridden.
:rtype: ``tuple``
"""
# Register packs first
self.register_packs(base_dirs=base_dirs)

registered_count = 0
overridden_count = 0
content = self._pack_loader.get_content(
base_dirs=base_dirs, content_type="aliases"
)
Expand All @@ -60,8 +61,11 @@ def register_from_packs(self, base_dirs):
"Registering aliases from pack %s:, dir: %s", pack, aliases_dir
)
aliases = self._get_aliases_from_pack(aliases_dir)
count = self._register_aliases_from_pack(pack=pack, aliases=aliases)
count, overridden = self._register_aliases_from_pack(
pack=pack, aliases=aliases
)
registered_count += count
overridden_count += overridden
except Exception as e:
if self._fail_on_failure:
raise e
Expand All @@ -70,14 +74,14 @@ def register_from_packs(self, base_dirs):
"Failed registering all aliases from pack: %s", aliases_dir
)

return registered_count
return registered_count, overridden_count

def register_from_pack(self, pack_dir):
"""
Register all the aliases from the provided pack.
:return: Number of aliases registered.
:rtype: ``int``
:return: Tuple, Number of aliases registered, overridden
:rtype: ``tuple``
"""
pack_dir = pack_dir[:-1] if pack_dir.endswith("/") else pack_dir
_, pack = os.path.split(pack_dir)
Expand All @@ -89,24 +93,25 @@ def register_from_pack(self, pack_dir):
self.register_pack(pack_name=pack, pack_dir=pack_dir)

registered_count = 0
overridden_count = 0
if not aliases_dir:
return registered_count
return registered_count, overridden_count

LOG.debug("Registering aliases from pack %s:, dir: %s", pack, aliases_dir)

try:
aliases = self._get_aliases_from_pack(aliases_dir=aliases_dir)
registered_count = self._register_aliases_from_pack(
registered_count, overridden_count = self._register_aliases_from_pack(
pack=pack, aliases=aliases
)
except Exception as e:
if self._fail_on_failure:
raise e

LOG.exception("Failed registering all aliases from pack: %s", aliases_dir)
return registered_count
return registered_count, overridden_count

return registered_count
return registered_count, overridden_count

def _get_aliases_from_pack(self, aliases_dir):
return self.get_resources_from_pack(resources_dir=aliases_dir)
Expand Down Expand Up @@ -144,14 +149,17 @@ def _get_action_alias_db(
else:
content["metadata_file"] = metadata_file

# Pass override information
altered = self._override_loader.override(pack, "aliases", content)

action_alias_api = ActionAliasAPI(**content)
action_alias_api.validate()
action_alias_db = ActionAliasAPI.to_model(action_alias_api)

return action_alias_db
return action_alias_db, altered

def _register_action_alias(self, pack, action_alias):
action_alias_db = self._get_action_alias_db(
action_alias_db, altered = self._get_action_alias_db(
pack=pack, action_alias=action_alias
)

Expand Down Expand Up @@ -181,14 +189,18 @@ def _register_action_alias(self, pack, action_alias):
except Exception:
LOG.exception("Failed to create action alias %s.", action_alias_db.name)
raise
return altered

def _register_aliases_from_pack(self, pack, aliases):
registered_count = 0
overridden_count = 0

for alias in aliases:
try:
LOG.debug("Loading alias from %s.", alias)
self._register_action_alias(pack, alias)
altered = self._register_action_alias(pack, alias)
if altered:
overridden_count += 1
except Exception as e:
if self._fail_on_failure:
msg = 'Failed to register alias "%s" from pack "%s": %s' % (
Expand All @@ -203,7 +215,7 @@ def _register_aliases_from_pack(self, pack, aliases):
else:
registered_count += 1

return registered_count
return registered_count, overridden_count


def register_aliases(
Expand Down
2 changes: 2 additions & 0 deletions st2common/st2common/bootstrap/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
from st2common import log as logging
from st2common.constants.pack import CONFIG_SCHEMA_FILE_NAME
from st2common.content.loader import MetaLoader
from st2common.content.loader import OverrideLoader
from st2common.content.loader import ContentPackLoader
from st2common.models.api.pack import PackAPI
from st2common.models.api.pack import ConfigSchemaAPI
Expand Down Expand Up @@ -68,6 +69,7 @@ def __init__(
self._fail_on_failure = fail_on_failure

self._meta_loader = MetaLoader()
self._override_loader = OverrideLoader()
self._pack_loader = ContentPackLoader()

# Maps runner name -> RunnerTypeDB
Expand Down
Loading