diff --git a/CHANGELOG.md b/CHANGELOG.md index 164f2fad..02814b5e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] +### Fixed +- Update base operator to handle case where all nodes to act on have exceeded their retry limit +- Fix return value of CAPMC client power function when no nodes specified ## [2.0.30] - 03-08-2024 ### Changed diff --git a/src/bos/operators/base.py b/src/bos/operators/base.py index 69abd96a..d53f30af 100644 --- a/src/bos/operators/base.py +++ b/src/bos/operators/base.py @@ -2,7 +2,7 @@ # # MIT License # -# (C) Copyright 2021-2023 Hewlett Packard Enterprise Development LP +# (C) Copyright 2021-2024 Hewlett Packard Enterprise Development LP # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), @@ -116,6 +116,9 @@ def _run(self) -> None: LOGGER.info('Found {} components that require action'.format(len(components))) if self.retry_attempt_field: # Only check for failed components if we track retries for this operator components = self._handle_failed_components(components) + if not components: + LOGGER.debug('After removing components that exceeded their retry limit, 0 components require action') + return for component in components: # Unset old errors components component['error'] = '' try: diff --git a/src/bos/operators/utils/clients/capmc.py b/src/bos/operators/utils/clients/capmc.py index c02f7c83..983f2945 100644 --- a/src/bos/operators/utils/clients/capmc.py +++ b/src/bos/operators/utils/clients/capmc.py @@ -1,7 +1,7 @@ # # MIT License # -# (C) Copyright 2021-2022 Hewlett Packard Enterprise Development LP +# (C) Copyright 2021-2022, 2024 Hewlett Packard Enterprise Development LP # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the "Software"), @@ -386,7 +386,9 @@ def power(nodes: List, state: str, force: bool = True, session = None, """ if not nodes: LOGGER.warning("power called without nodes; returning without action.") - return set(), {} + # Instantiating this with an empty dictionary is the equivalent of reporting + # no errors + return CapmcXnameOnOffReturnedError({}) valid_states = ["off", "on"] state = state.lower()