mirror of
https://github.com/ansible-collections/kubernetes.core.git
synced 2026-07-28 10:24:45 +00:00
Ensure CoreExceptions are handled gracefully (#476)
Ensure CoreExceptions are handled gracefully SUMMARY CoreExceptions, when raised, should have a reasonably helpful and actionable message associated with them. This adds a final check in module execution to gracefully fail from these exceptions. A new fail_from_exception method is added both to simplify exiting the module, and to ensure that any chained exceptions are available when using -vvv. ISSUE TYPE COMPONENT NAME ADDITIONAL INFORMATION Reviewed-by: Alina Buzachis <None> Reviewed-by: Joseph Torcasso <None>
This commit is contained in:
@@ -15,6 +15,9 @@ from ansible_collections.kubernetes.core.plugins.module_utils.args_common import
|
|||||||
from ansible_collections.kubernetes.core.plugins.module_utils.k8s.core import (
|
from ansible_collections.kubernetes.core.plugins.module_utils.k8s.core import (
|
||||||
requires as _requires,
|
requires as _requires,
|
||||||
)
|
)
|
||||||
|
from ansible_collections.kubernetes.core.plugins.module_utils.k8s.exceptions import (
|
||||||
|
CoreException,
|
||||||
|
)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from ansible_collections.kubernetes.core.plugins.module_utils import (
|
from ansible_collections.kubernetes.core.plugins.module_utils import (
|
||||||
@@ -335,9 +338,13 @@ def get_api_client(module=None, **kwargs: Optional[Any]) -> K8SClient:
|
|||||||
if auth_spec.get("no_proxy"):
|
if auth_spec.get("no_proxy"):
|
||||||
requires("kubernetes", "19.15.0", "to use the no_proxy feature")
|
requires("kubernetes", "19.15.0", "to use the no_proxy feature")
|
||||||
|
|
||||||
configuration = _create_configuration(auth_spec)
|
try:
|
||||||
headers = _create_headers(module, **kwargs)
|
configuration = _create_configuration(auth_spec)
|
||||||
client = create_api_client(configuration, **headers)
|
headers = _create_headers(module, **kwargs)
|
||||||
|
client = create_api_client(configuration, **headers)
|
||||||
|
except kubernetes.config.ConfigException as e:
|
||||||
|
msg = "Could not create API client: {0}".format(e)
|
||||||
|
raise CoreException(msg) from e
|
||||||
|
|
||||||
k8s_client = K8SClient(
|
k8s_client = K8SClient(
|
||||||
configuration=configuration,
|
configuration=configuration,
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
|
import traceback
|
||||||
|
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
from ansible_collections.kubernetes.core.plugins.module_utils.version import (
|
from ansible_collections.kubernetes.core.plugins.module_utils.version import (
|
||||||
@@ -72,6 +74,13 @@ class AnsibleK8SModule:
|
|||||||
def fail_json(self, *args, **kwargs):
|
def fail_json(self, *args, **kwargs):
|
||||||
return self._module.fail_json(*args, **kwargs)
|
return self._module.fail_json(*args, **kwargs)
|
||||||
|
|
||||||
|
def fail_from_exception(self, exception):
|
||||||
|
msg = to_text(exception)
|
||||||
|
tb = "".join(
|
||||||
|
traceback.format_exception(None, exception, exception.__traceback__)
|
||||||
|
)
|
||||||
|
return self.fail_json(msg=msg, exception=tb)
|
||||||
|
|
||||||
def has_at_least(
|
def has_at_least(
|
||||||
self, dependency: str, minimum: Optional[str] = None, warn: bool = False
|
self, dependency: str, minimum: Optional[str] = None, warn: bool = False
|
||||||
) -> bool:
|
) -> bool:
|
||||||
|
|||||||
@@ -8,6 +8,9 @@ from ansible.module_utils._text import to_native
|
|||||||
from ansible_collections.kubernetes.core.plugins.module_utils.k8s.client import (
|
from ansible_collections.kubernetes.core.plugins.module_utils.k8s.client import (
|
||||||
get_api_client,
|
get_api_client,
|
||||||
)
|
)
|
||||||
|
from ansible_collections.kubernetes.core.plugins.module_utils.k8s.exceptions import (
|
||||||
|
CoreException,
|
||||||
|
)
|
||||||
from ansible_collections.kubernetes.core.plugins.module_utils.k8s.resource import (
|
from ansible_collections.kubernetes.core.plugins.module_utils.k8s.resource import (
|
||||||
create_definitions,
|
create_definitions,
|
||||||
)
|
)
|
||||||
@@ -48,7 +51,11 @@ def run_module(module) -> None:
|
|||||||
changed = False
|
changed = False
|
||||||
client = get_api_client(module)
|
client = get_api_client(module)
|
||||||
svc = K8sService(client, module)
|
svc = K8sService(client, module)
|
||||||
definitions = create_definitions(module.params)
|
try:
|
||||||
|
definitions = create_definitions(module.params)
|
||||||
|
except Exception as e:
|
||||||
|
msg = "Failed to load resource definition: {0}".format(e)
|
||||||
|
raise CoreException(msg) from e
|
||||||
|
|
||||||
for definition in definitions:
|
for definition in definitions:
|
||||||
result = {"changed": False, "result": {}}
|
result = {"changed": False, "result": {}}
|
||||||
|
|||||||
@@ -394,6 +394,9 @@ from ansible_collections.kubernetes.core.plugins.module_utils.args_common import
|
|||||||
from ansible_collections.kubernetes.core.plugins.module_utils.k8s.core import (
|
from ansible_collections.kubernetes.core.plugins.module_utils.k8s.core import (
|
||||||
AnsibleK8SModule,
|
AnsibleK8SModule,
|
||||||
)
|
)
|
||||||
|
from ansible_collections.kubernetes.core.plugins.module_utils.k8s.exceptions import (
|
||||||
|
CoreException,
|
||||||
|
)
|
||||||
from ansible_collections.kubernetes.core.plugins.module_utils.k8s.runner import (
|
from ansible_collections.kubernetes.core.plugins.module_utils.k8s.runner import (
|
||||||
run_module,
|
run_module,
|
||||||
)
|
)
|
||||||
@@ -458,7 +461,10 @@ def main():
|
|||||||
mutually_exclusive=mutually_exclusive,
|
mutually_exclusive=mutually_exclusive,
|
||||||
supports_check_mode=True,
|
supports_check_mode=True,
|
||||||
)
|
)
|
||||||
run_module(module)
|
try:
|
||||||
|
run_module(module)
|
||||||
|
except CoreException as e:
|
||||||
|
module.fail_from_exception(e)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|||||||
@@ -157,6 +157,9 @@ from ansible_collections.kubernetes.core.plugins.module_utils.ansiblemodule impo
|
|||||||
from ansible_collections.kubernetes.core.plugins.module_utils.k8s.core import (
|
from ansible_collections.kubernetes.core.plugins.module_utils.k8s.core import (
|
||||||
AnsibleK8SModule,
|
AnsibleK8SModule,
|
||||||
)
|
)
|
||||||
|
from ansible_collections.kubernetes.core.plugins.module_utils.k8s.exceptions import (
|
||||||
|
CoreException,
|
||||||
|
)
|
||||||
from ansible_collections.kubernetes.core.plugins.module_utils.args_common import (
|
from ansible_collections.kubernetes.core.plugins.module_utils.args_common import (
|
||||||
AUTH_ARG_SPEC,
|
AUTH_ARG_SPEC,
|
||||||
)
|
)
|
||||||
@@ -219,7 +222,10 @@ def main():
|
|||||||
get_api_client,
|
get_api_client,
|
||||||
)
|
)
|
||||||
|
|
||||||
execute_module(module, client=get_api_client(module=module))
|
try:
|
||||||
|
execute_module(module, client=get_api_client(module=module))
|
||||||
|
except CoreException as e:
|
||||||
|
module.fail_from_exception(e)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|||||||
@@ -148,6 +148,9 @@ from ansible_collections.kubernetes.core.plugins.module_utils.k8s.client import
|
|||||||
from ansible_collections.kubernetes.core.plugins.module_utils.k8s.core import (
|
from ansible_collections.kubernetes.core.plugins.module_utils.k8s.core import (
|
||||||
AnsibleK8SModule,
|
AnsibleK8SModule,
|
||||||
)
|
)
|
||||||
|
from ansible_collections.kubernetes.core.plugins.module_utils.k8s.exceptions import (
|
||||||
|
CoreException,
|
||||||
|
)
|
||||||
from ansible_collections.kubernetes.core.plugins.module_utils.k8s.service import (
|
from ansible_collections.kubernetes.core.plugins.module_utils.k8s.service import (
|
||||||
K8sService,
|
K8sService,
|
||||||
)
|
)
|
||||||
@@ -212,7 +215,10 @@ def main():
|
|||||||
supports_check_mode=True,
|
supports_check_mode=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
execute_module(module)
|
try:
|
||||||
|
execute_module(module)
|
||||||
|
except CoreException as e:
|
||||||
|
module.fail_from_exception(e)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|||||||
@@ -142,6 +142,10 @@ from ansible_collections.kubernetes.core.plugins.module_utils.k8s.client import
|
|||||||
from ansible_collections.kubernetes.core.plugins.module_utils.k8s.core import (
|
from ansible_collections.kubernetes.core.plugins.module_utils.k8s.core import (
|
||||||
AnsibleK8SModule,
|
AnsibleK8SModule,
|
||||||
)
|
)
|
||||||
|
from ansible_collections.kubernetes.core.plugins.module_utils.k8s.exceptions import (
|
||||||
|
CoreException,
|
||||||
|
)
|
||||||
|
|
||||||
from ansible.module_utils._text import to_native
|
from ansible.module_utils._text import to_native
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@@ -497,9 +501,12 @@ def main():
|
|||||||
error=to_native(k8s_import_exception),
|
error=to_native(k8s_import_exception),
|
||||||
)
|
)
|
||||||
|
|
||||||
client = get_api_client(module=module)
|
try:
|
||||||
k8s_drain = K8sDrainAnsible(module, client.client)
|
client = get_api_client(module=module)
|
||||||
k8s_drain.execute_module()
|
k8s_drain = K8sDrainAnsible(module, client.client)
|
||||||
|
k8s_drain.execute_module()
|
||||||
|
except CoreException as e:
|
||||||
|
module.fail_from_exception(e)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|||||||
@@ -144,6 +144,9 @@ from ansible_collections.kubernetes.core.plugins.module_utils.k8s.core import (
|
|||||||
from ansible_collections.kubernetes.core.plugins.module_utils.k8s.client import (
|
from ansible_collections.kubernetes.core.plugins.module_utils.k8s.client import (
|
||||||
get_api_client,
|
get_api_client,
|
||||||
)
|
)
|
||||||
|
from ansible_collections.kubernetes.core.plugins.module_utils.k8s.exceptions import (
|
||||||
|
CoreException,
|
||||||
|
)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from kubernetes.client.apis import core_v1_api
|
from kubernetes.client.apis import core_v1_api
|
||||||
@@ -240,8 +243,11 @@ def main():
|
|||||||
supports_check_mode=True,
|
supports_check_mode=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
client = get_api_client(module)
|
try:
|
||||||
execute_module(module, client.client)
|
client = get_api_client(module)
|
||||||
|
execute_module(module, client.client)
|
||||||
|
except CoreException as e:
|
||||||
|
module.fail_from_exception(e)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|||||||
@@ -161,6 +161,9 @@ from ansible_collections.kubernetes.core.plugins.module_utils.k8s.core import (
|
|||||||
from ansible_collections.kubernetes.core.plugins.module_utils.k8s.client import (
|
from ansible_collections.kubernetes.core.plugins.module_utils.k8s.client import (
|
||||||
get_api_client,
|
get_api_client,
|
||||||
)
|
)
|
||||||
|
from ansible_collections.kubernetes.core.plugins.module_utils.k8s.exceptions import (
|
||||||
|
CoreException,
|
||||||
|
)
|
||||||
from ansible_collections.kubernetes.core.plugins.module_utils.k8s.service import (
|
from ansible_collections.kubernetes.core.plugins.module_utils.k8s.service import (
|
||||||
K8sService,
|
K8sService,
|
||||||
)
|
)
|
||||||
@@ -202,9 +205,12 @@ def main():
|
|||||||
module = AnsibleK8SModule(
|
module = AnsibleK8SModule(
|
||||||
module_class=AnsibleModule, argument_spec=argspec(), supports_check_mode=True
|
module_class=AnsibleModule, argument_spec=argspec(), supports_check_mode=True
|
||||||
)
|
)
|
||||||
client = get_api_client(module)
|
try:
|
||||||
svc = K8sService(client, module)
|
client = get_api_client(module)
|
||||||
execute_module(module, svc)
|
svc = K8sService(client, module)
|
||||||
|
execute_module(module, svc)
|
||||||
|
except CoreException as e:
|
||||||
|
module.fail_from_exception(e)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|||||||
@@ -142,6 +142,9 @@ from ansible_collections.kubernetes.core.plugins.module_utils.k8s.client import
|
|||||||
from ansible_collections.kubernetes.core.plugins.module_utils.k8s.core import (
|
from ansible_collections.kubernetes.core.plugins.module_utils.k8s.core import (
|
||||||
AnsibleK8SModule,
|
AnsibleK8SModule,
|
||||||
)
|
)
|
||||||
|
from ansible_collections.kubernetes.core.plugins.module_utils.k8s.exceptions import (
|
||||||
|
CoreException,
|
||||||
|
)
|
||||||
from ansible_collections.kubernetes.core.plugins.module_utils.k8s.service import (
|
from ansible_collections.kubernetes.core.plugins.module_utils.k8s.service import (
|
||||||
diff_objects,
|
diff_objects,
|
||||||
)
|
)
|
||||||
@@ -283,8 +286,11 @@ def main():
|
|||||||
module = AnsibleK8SModule(
|
module = AnsibleK8SModule(
|
||||||
module_class=AnsibleModule, argument_spec=args, supports_check_mode=True
|
module_class=AnsibleModule, argument_spec=args, supports_check_mode=True
|
||||||
)
|
)
|
||||||
client = get_api_client(module)
|
try:
|
||||||
execute_module(module, client)
|
client = get_api_client(module)
|
||||||
|
execute_module(module, client)
|
||||||
|
except CoreException as e:
|
||||||
|
module.fail_from_exception(e)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|||||||
@@ -272,7 +272,7 @@ def main():
|
|||||||
result = execute_module(svc, module.params)
|
result = execute_module(svc, module.params)
|
||||||
module.exit_json(**result)
|
module.exit_json(**result)
|
||||||
except CoreException as e:
|
except CoreException as e:
|
||||||
module.fail_json(msg=e)
|
module.fail_from_exception(e)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|||||||
@@ -262,9 +262,12 @@ def main():
|
|||||||
module_class=AnsibleModule, argument_spec=argspec(), supports_check_mode=True
|
module_class=AnsibleModule, argument_spec=argspec(), supports_check_mode=True
|
||||||
)
|
)
|
||||||
|
|
||||||
client = get_api_client(module=module)
|
try:
|
||||||
svc = K8sService(client, module)
|
client = get_api_client(module=module)
|
||||||
execute_module(svc)
|
svc = K8sService(client, module)
|
||||||
|
execute_module(svc)
|
||||||
|
except CoreException as e:
|
||||||
|
module.fail_from_exception(e)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|||||||
@@ -411,8 +411,11 @@ def main():
|
|||||||
supports_check_mode=True,
|
supports_check_mode=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
client = get_api_client(module=module)
|
try:
|
||||||
execute_module(client, module)
|
client = get_api_client(module=module)
|
||||||
|
execute_module(client, module)
|
||||||
|
except CoreException as e:
|
||||||
|
module.fail_from_exception(e)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|||||||
@@ -160,6 +160,9 @@ from ansible_collections.kubernetes.core.plugins.module_utils.k8s.core import (
|
|||||||
from ansible_collections.kubernetes.core.plugins.module_utils.k8s.client import (
|
from ansible_collections.kubernetes.core.plugins.module_utils.k8s.client import (
|
||||||
get_api_client,
|
get_api_client,
|
||||||
)
|
)
|
||||||
|
from ansible_collections.kubernetes.core.plugins.module_utils.k8s.exceptions import (
|
||||||
|
CoreException,
|
||||||
|
)
|
||||||
from ansible_collections.kubernetes.core.plugins.module_utils.k8s.service import (
|
from ansible_collections.kubernetes.core.plugins.module_utils.k8s.service import (
|
||||||
K8sService,
|
K8sService,
|
||||||
)
|
)
|
||||||
@@ -274,9 +277,12 @@ def main():
|
|||||||
supports_check_mode=True,
|
supports_check_mode=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
client = get_api_client(module=module)
|
try:
|
||||||
svc = K8sService(client, module)
|
client = get_api_client(module=module)
|
||||||
execute_module(svc)
|
svc = K8sService(client, module)
|
||||||
|
execute_module(svc)
|
||||||
|
except CoreException as e:
|
||||||
|
module.fail_from_exception(e)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|||||||
Reference in New Issue
Block a user