Skip to content

Commit

Permalink
Merge pull request #5506 from StackStorm/add_override_support
Browse files Browse the repository at this point in the history
Add support for overridding whether resources are enabled
  • Loading branch information
cognifloyd authored Mar 8, 2022
2 parents 721aa69 + 45c6bc9 commit a80fa2b
Show file tree
Hide file tree
Showing 23 changed files with 456 additions and 60 deletions.
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

0 comments on commit a80fa2b

Please sign in to comment.