1
0
Fork 0
mirror of https://github.com/ansible-collections/hetzner.hcloud.git synced 2026-02-04 08:01:49 +00:00

feat: improve hcloud library exceptions handling (#243)

This commit is contained in:
Jonas L 2023-07-20 14:34:48 +02:00 committed by GitHub
parent 8243d25710
commit c15377c672
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
32 changed files with 408 additions and 169 deletions

View file

@ -3,8 +3,11 @@
# Simplified BSD License (see licenses/simplified_bsd.txt or https://opensource.org/licenses/BSD-2-Clause)
import traceback
from ansible.module_utils.ansible_release import __version__
from ansible.module_utils.basic import env_fallback, missing_required_lib
from ansible.module_utils.common.text.converters import to_native
from ansible_collections.hetzner.hcloud.plugins.module_utils.vendor import hcloud
HAS_REQUESTS = True
@ -32,6 +35,30 @@ class Hcloud:
module.fail_json(msg=missing_required_lib("python-dateutil"))
self._build_client()
def fail_json_hcloud(self, exception, msg=None, params=None, **kwargs):
last_traceback = traceback.format_exc()
failure = {}
if params is not None:
failure["params"] = params
if isinstance(exception, hcloud.APIException):
failure["message"] = exception.message
failure["code"] = exception.code
failure["details"] = exception.details
elif isinstance(exception, hcloud.actions.domain.ActionException):
failure["action"] = {k: getattr(exception.action, k) for k in exception.action.__slots__}
exception_message = to_native(exception)
if msg is not None:
msg = f"{exception_message}: {msg}"
else:
msg = exception_message
self.module.fail_json(msg=msg, exception=last_traceback, failure=failure, **kwargs)
def _build_client(self):
self.client = hcloud.Client(
token=self.module.params["api_token"],

View file

@ -137,6 +137,9 @@ hcloud_certificate:
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.common.text.converters import to_native
from ansible_collections.hetzner.hcloud.plugins.module_utils.hcloud import Hcloud
from ansible_collections.hetzner.hcloud.plugins.module_utils.vendor.hcloud import (
HCloudException,
)
class AnsibleHcloudCertificate(Hcloud):
@ -164,8 +167,8 @@ class AnsibleHcloudCertificate(Hcloud):
elif self.module.params.get("name") is not None:
self.hcloud_certificate = self.client.certificates.get_by_name(self.module.params.get("name"))
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
def _create_certificate(self):
self.module.fail_on_missing_params(required_params=["name"])
@ -181,8 +184,8 @@ class AnsibleHcloudCertificate(Hcloud):
if not self.module.check_mode:
try:
self.client.certificates.create(**params)
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
else:
self.module.fail_on_missing_params(required_params=["domain_names"])
params["domain_names"] = self.module.params.get("domain_names")
@ -190,8 +193,8 @@ class AnsibleHcloudCertificate(Hcloud):
try:
resp = self.client.certificates.create_managed(**params)
resp.action.wait_until_finished(max_retries=1000)
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
self._mark_as_changed()
self._get_certificate()
@ -210,8 +213,8 @@ class AnsibleHcloudCertificate(Hcloud):
if not self.module.check_mode:
self.hcloud_certificate.update(labels=labels)
self._mark_as_changed()
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
self._get_certificate()
def present_certificate(self):
@ -227,8 +230,8 @@ class AnsibleHcloudCertificate(Hcloud):
if not self.module.check_mode:
try:
self.client.certificates.delete(self.hcloud_certificate)
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
self._mark_as_changed()
self.hcloud_certificate = None

View file

@ -85,6 +85,9 @@ hcloud_certificate_info:
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.common.text.converters import to_native
from ansible_collections.hetzner.hcloud.plugins.module_utils.hcloud import Hcloud
from ansible_collections.hetzner.hcloud.plugins.module_utils.vendor.hcloud import (
HCloudException,
)
class AnsibleHcloudCertificateInfo(Hcloud):
@ -124,8 +127,8 @@ class AnsibleHcloudCertificateInfo(Hcloud):
else:
self.hcloud_certificate_info = self.client.certificates.get_all()
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
@staticmethod
def define_module():

View file

@ -76,6 +76,9 @@ hcloud_datacenter_info:
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.common.text.converters import to_native
from ansible_collections.hetzner.hcloud.plugins.module_utils.hcloud import Hcloud
from ansible_collections.hetzner.hcloud.plugins.module_utils.vendor.hcloud import (
HCloudException,
)
class AnsibleHcloudDatacenterInfo(Hcloud):
@ -108,8 +111,8 @@ class AnsibleHcloudDatacenterInfo(Hcloud):
else:
self.hcloud_datacenter_info = self.client.datacenters.get_all()
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
@staticmethod
def define_module():

View file

@ -173,6 +173,7 @@ from ansible.module_utils.common.text.converters import to_native
from ansible_collections.hetzner.hcloud.plugins.module_utils.hcloud import Hcloud
from ansible_collections.hetzner.hcloud.plugins.module_utils.vendor.hcloud import (
APIException,
HCloudException,
)
from ansible_collections.hetzner.hcloud.plugins.module_utils.vendor.hcloud.firewalls.domain import (
FirewallRule,
@ -209,8 +210,8 @@ class AnsibleHcloudFirewall(Hcloud):
elif self.module.params.get("name") is not None:
self.hcloud_firewall = self.client.firewalls.get_by_name(self.module.params.get("name"))
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
def _create_firewall(self):
self.module.fail_on_missing_params(required_params=["name"])
@ -234,8 +235,8 @@ class AnsibleHcloudFirewall(Hcloud):
if not self.module.check_mode:
try:
self.client.firewalls.create(**params)
except Exception as e:
self.module.fail_json(msg=e.message, **params)
except HCloudException as e:
self.fail_json_hcloud(e, params=params)
self._mark_as_changed()
self._get_firewall()
@ -292,9 +293,9 @@ class AnsibleHcloudFirewall(Hcloud):
retry_count = retry_count + 1
time.sleep(0.5 * retry_count)
else:
self.module.fail_json(msg=e.message)
except Exception as e:
self.module.fail_json(msg=e.message)
self.fail_json_hcloud(e)
except HCloudException as e:
self.fail_json_hcloud(e)
self._mark_as_changed()
self.hcloud_firewall = None

View file

@ -164,6 +164,9 @@ hcloud_floating_ip:
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.common.text.converters import to_native
from ansible_collections.hetzner.hcloud.plugins.module_utils.hcloud import Hcloud
from ansible_collections.hetzner.hcloud.plugins.module_utils.vendor.hcloud import (
HCloudException,
)
class AnsibleHcloudFloatingIP(Hcloud):
@ -194,8 +197,8 @@ class AnsibleHcloudFloatingIP(Hcloud):
self.hcloud_floating_ip = self.client.floating_ips.get_by_id(self.module.params.get("id"))
else:
self.hcloud_floating_ip = self.client.floating_ips.get_by_name(self.module.params.get("name"))
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
def _create_floating_ip(self):
self.module.fail_on_missing_params(required_params=["type"])
@ -221,8 +224,8 @@ class AnsibleHcloudFloatingIP(Hcloud):
delete_protection = self.module.params.get("delete_protection")
if delete_protection is not None:
self.hcloud_floating_ip.change_protection(delete=delete_protection).wait_until_finished()
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
self._mark_as_changed()
self._get_floating_ip()
@ -268,8 +271,8 @@ class AnsibleHcloudFloatingIP(Hcloud):
self._mark_as_changed()
self._get_floating_ip()
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
def present_floating_ip(self):
self._get_floating_ip()
@ -292,8 +295,8 @@ class AnsibleHcloudFloatingIP(Hcloud):
)
self._mark_as_changed()
self.hcloud_floating_ip = None
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
@staticmethod
def define_module():

View file

@ -95,6 +95,9 @@ hcloud_floating_ip_info:
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.common.text.converters import to_native
from ansible_collections.hetzner.hcloud.plugins.module_utils.hcloud import Hcloud
from ansible_collections.hetzner.hcloud.plugins.module_utils.vendor.hcloud import (
HCloudException,
)
class AnsibleHcloudFloatingIPInfo(Hcloud):
@ -137,8 +140,8 @@ class AnsibleHcloudFloatingIPInfo(Hcloud):
else:
self.hcloud_floating_ip_info = self.client.floating_ips.get_all()
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
@staticmethod
def define_module():

View file

@ -111,6 +111,9 @@ hcloud_image_info:
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.common.text.converters import to_native
from ansible_collections.hetzner.hcloud.plugins.module_utils.hcloud import Hcloud
from ansible_collections.hetzner.hcloud.plugins.module_utils.vendor.hcloud import (
HCloudException,
)
class AnsibleHcloudImageInfo(Hcloud):
@ -170,8 +173,8 @@ class AnsibleHcloudImageInfo(Hcloud):
self.hcloud_image_info = self.client.images.get_all(**params)
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
@staticmethod
def define_module():

View file

@ -144,6 +144,9 @@ hcloud_load_balancer:
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.common.text.converters import to_native
from ansible_collections.hetzner.hcloud.plugins.module_utils.hcloud import Hcloud
from ansible_collections.hetzner.hcloud.plugins.module_utils.vendor.hcloud import (
HCloudException,
)
class AnsibleHcloudLoadBalancer(Hcloud):
@ -176,8 +179,8 @@ class AnsibleHcloudLoadBalancer(Hcloud):
self.hcloud_load_balancer = self.client.load_balancers.get_by_id(self.module.params.get("id"))
else:
self.hcloud_load_balancer = self.client.load_balancers.get_by_name(self.module.params.get("name"))
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
def _create_load_balancer(self):
self.module.fail_on_missing_params(required_params=["name", "load_balancer_type"])
@ -205,8 +208,8 @@ class AnsibleHcloudLoadBalancer(Hcloud):
if delete_protection is not None:
self._get_load_balancer()
self.hcloud_load_balancer.change_protection(delete=delete_protection).wait_until_finished()
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
self._mark_as_changed()
self._get_load_balancer()
@ -251,8 +254,8 @@ class AnsibleHcloudLoadBalancer(Hcloud):
self._mark_as_changed()
self._get_load_balancer()
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
def present_load_balancer(self):
self._get_load_balancer()
@ -269,8 +272,8 @@ class AnsibleHcloudLoadBalancer(Hcloud):
self.client.load_balancers.delete(self.hcloud_load_balancer)
self._mark_as_changed()
self.hcloud_load_balancer = None
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
@staticmethod
def define_module():

View file

@ -259,6 +259,9 @@ hcloud_load_balancer_info:
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.common.text.converters import to_native
from ansible_collections.hetzner.hcloud.plugins.module_utils.hcloud import Hcloud
from ansible_collections.hetzner.hcloud.plugins.module_utils.vendor.hcloud import (
HCloudException,
)
class AnsibleHcloudLoadBalancerInfo(Hcloud):
@ -360,8 +363,8 @@ class AnsibleHcloudLoadBalancerInfo(Hcloud):
self.hcloud_load_balancer_info = self.client.load_balancers.get_all(**params)
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
@staticmethod
def define_module():

View file

@ -94,6 +94,9 @@ hcloud_load_balancer_network:
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.common.text.converters import to_native
from ansible_collections.hetzner.hcloud.plugins.module_utils.hcloud import Hcloud
from ansible_collections.hetzner.hcloud.plugins.module_utils.vendor.hcloud import (
HCloudException,
)
class AnsibleHcloudLoadBalancerNetwork(Hcloud):
@ -123,8 +126,8 @@ class AnsibleHcloudLoadBalancerNetwork(Hcloud):
self.module.fail_json(msg="Load balancer does not exist: %s" % load_balancer_name)
self.hcloud_load_balancer_network = None
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
def _get_load_balancer_network(self):
for privateNet in self.hcloud_load_balancer.private_net:
@ -132,9 +135,7 @@ class AnsibleHcloudLoadBalancerNetwork(Hcloud):
self.hcloud_load_balancer_network = privateNet
def _create_load_balancer_network(self):
params = {
"network": self.hcloud_network,
}
params = {"network": self.hcloud_network}
if self.module.params.get("ip") is not None:
params["ip"] = self.module.params.get("ip")
@ -142,8 +143,8 @@ class AnsibleHcloudLoadBalancerNetwork(Hcloud):
if not self.module.check_mode:
try:
self.hcloud_load_balancer.attach_to_network(**params).wait_until_finished()
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
self._mark_as_changed()
self._get_load_balancer_and_network()
@ -165,8 +166,8 @@ class AnsibleHcloudLoadBalancerNetwork(Hcloud):
self.hcloud_load_balancer_network.network
).wait_until_finished()
self._mark_as_changed()
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
self.hcloud_load_balancer_network = None

View file

@ -284,6 +284,7 @@ from ansible.module_utils.common.text.converters import to_native
from ansible_collections.hetzner.hcloud.plugins.module_utils.hcloud import Hcloud
from ansible_collections.hetzner.hcloud.plugins.module_utils.vendor.hcloud import (
APIException,
HCloudException,
)
from ansible_collections.hetzner.hcloud.plugins.module_utils.vendor.hcloud.load_balancers.domain import (
LoadBalancerHealtCheckHttp,
@ -347,8 +348,8 @@ class AnsibleHcloudLoadBalancerService(Hcloud):
self.module.fail_json(msg="Load balancer does not exist: %s" % load_balancer_name)
self._get_load_balancer_service()
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
def _create_load_balancer_service(self):
self.module.fail_on_missing_params(required_params=["protocol"])
@ -377,8 +378,8 @@ class AnsibleHcloudLoadBalancerService(Hcloud):
self.hcloud_load_balancer.add_service(LoadBalancerService(**params)).wait_until_finished(
max_retries=1000
)
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
self._mark_as_changed()
self._get_load_balancer()
self._get_load_balancer_service()
@ -403,8 +404,8 @@ class AnsibleHcloudLoadBalancerService(Hcloud):
hcloud_cert = self.client.certificates.get_by_name(certificate)
except Exception:
hcloud_cert = self.client.certificates.get_by_id(certificate)
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
service_http.certificates.append(hcloud_cert)
return service_http
@ -473,8 +474,8 @@ class AnsibleHcloudLoadBalancerService(Hcloud):
self.hcloud_load_balancer.update_service(LoadBalancerService(**params)).wait_until_finished(
max_retries=1000
)
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
self._get_load_balancer()
if changed:
@ -501,12 +502,12 @@ class AnsibleHcloudLoadBalancerService(Hcloud):
self.hcloud_load_balancer.delete_service(self.hcloud_load_balancer_service).wait_until_finished(
max_retries=1000
)
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
self._mark_as_changed()
self.hcloud_load_balancer_service = None
except APIException as e:
self.module.fail_json(msg=e.message)
self.fail_json_hcloud(e)
@staticmethod
def define_module():

View file

@ -138,6 +138,10 @@ hcloud_load_balancer_target:
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.common.text.converters import to_native
from ansible_collections.hetzner.hcloud.plugins.module_utils.hcloud import Hcloud
from ansible_collections.hetzner.hcloud.plugins.module_utils.vendor.hcloud import (
APIException,
HCloudException,
)
from ansible_collections.hetzner.hcloud.plugins.module_utils.vendor.hcloud.load_balancers.domain import (
LoadBalancerTarget,
LoadBalancerTargetIP,
@ -181,8 +185,8 @@ class AnsibleHcloudLoadBalancerTarget(Hcloud):
self.module.fail_json(msg="Server not found: %s" % server_name)
self.hcloud_load_balancer_target = None
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
def _get_load_balancer_target(self):
for target in self.hcloud_load_balancer.targets:
@ -224,11 +228,13 @@ class AnsibleHcloudLoadBalancerTarget(Hcloud):
if not self.module.check_mode:
try:
self.hcloud_load_balancer.add_target(**params).wait_until_finished()
except Exception as e:
except APIException as e:
if e.code == "locked" or e.code == "conflict":
self._create_load_balancer_target()
else:
self.module.fail_json(msg=e.message)
self.fail_json_hcloud(e)
except HCloudException as e:
self.fail_json_hcloud(e)
self._mark_as_changed()
self._get_load_balancer_and_target()
@ -267,8 +273,8 @@ class AnsibleHcloudLoadBalancerTarget(Hcloud):
)
try:
self.hcloud_load_balancer.remove_target(target).wait_until_finished()
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
self._mark_as_changed()
self.hcloud_load_balancer_target = None

View file

@ -87,6 +87,9 @@ hcloud_load_balancer_type_info:
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.common.text.converters import to_native
from ansible_collections.hetzner.hcloud.plugins.module_utils.hcloud import Hcloud
from ansible_collections.hetzner.hcloud.plugins.module_utils.vendor.hcloud import (
HCloudException,
)
class AnsibleHcloudLoadBalancerTypeInfo(Hcloud):
@ -125,8 +128,8 @@ class AnsibleHcloudLoadBalancerTypeInfo(Hcloud):
else:
self.hcloud_load_balancer_type_info = self.client.load_balancer_types.get_all()
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
@staticmethod
def define_module():

View file

@ -77,6 +77,9 @@ hcloud_location_info:
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.common.text.converters import to_native
from ansible_collections.hetzner.hcloud.plugins.module_utils.hcloud import Hcloud
from ansible_collections.hetzner.hcloud.plugins.module_utils.vendor.hcloud import (
HCloudException,
)
class AnsibleHcloudLocationInfo(Hcloud):
@ -109,8 +112,8 @@ class AnsibleHcloudLocationInfo(Hcloud):
else:
self.hcloud_location_info = self.client.locations.get_all()
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
@staticmethod
def define_module():

View file

@ -119,6 +119,9 @@ hcloud_network:
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.common.text.converters import to_native
from ansible_collections.hetzner.hcloud.plugins.module_utils.hcloud import Hcloud
from ansible_collections.hetzner.hcloud.plugins.module_utils.vendor.hcloud import (
HCloudException,
)
class AnsibleHcloudNetwork(Hcloud):
@ -142,8 +145,8 @@ class AnsibleHcloudNetwork(Hcloud):
self.hcloud_network = self.client.networks.get_by_id(self.module.params.get("id"))
else:
self.hcloud_network = self.client.networks.get_by_name(self.module.params.get("name"))
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
def _create_network(self):
self.module.fail_on_missing_params(required_params=["name", "ip_range"])
@ -165,8 +168,8 @@ class AnsibleHcloudNetwork(Hcloud):
if delete_protection is not None:
self._get_network()
self.hcloud_network.change_protection(delete=delete_protection).wait_until_finished()
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
self._mark_as_changed()
self._get_network()
@ -198,8 +201,8 @@ class AnsibleHcloudNetwork(Hcloud):
if not self.module.check_mode:
self.hcloud_network.change_protection(delete=delete_protection).wait_until_finished()
self._mark_as_changed()
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
self._get_network()
def present_network(self):
@ -216,8 +219,8 @@ class AnsibleHcloudNetwork(Hcloud):
if not self.module.check_mode:
self.client.networks.delete(self.hcloud_network)
self._mark_as_changed()
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
self.hcloud_network = None
@staticmethod

View file

@ -184,6 +184,9 @@ hcloud_network_info:
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.common.text.converters import to_native
from ansible_collections.hetzner.hcloud.plugins.module_utils.hcloud import Hcloud
from ansible_collections.hetzner.hcloud.plugins.module_utils.vendor.hcloud import (
HCloudException,
)
class AnsibleHcloudNetworkInfo(Hcloud):
@ -259,8 +262,8 @@ class AnsibleHcloudNetworkInfo(Hcloud):
else:
self.hcloud_network_info = self.client.networks.get_all()
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
@staticmethod
def define_module():

View file

@ -110,6 +110,9 @@ hcloud_placement_group:
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.common.text.converters import to_native
from ansible_collections.hetzner.hcloud.plugins.module_utils.hcloud import Hcloud
from ansible_collections.hetzner.hcloud.plugins.module_utils.vendor.hcloud import (
HCloudException,
)
class AnsibleHcloudPlacementGroup(Hcloud):
@ -132,8 +135,8 @@ class AnsibleHcloudPlacementGroup(Hcloud):
self.hcloud_placement_group = self.client.placement_groups.get_by_id(self.module.params.get("id"))
elif self.module.params.get("name") is not None:
self.hcloud_placement_group = self.client.placement_groups.get_by_name(self.module.params.get("name"))
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
def _create_placement_group(self):
self.module.fail_on_missing_params(required_params=["name"])
@ -145,8 +148,8 @@ class AnsibleHcloudPlacementGroup(Hcloud):
if not self.module.check_mode:
try:
self.client.placement_groups.create(**params)
except Exception as e:
self.module.fail_json(msg=e.message, **params)
except HCloudException as e:
self.fail_json_hcloud(e, params=params)
self._mark_as_changed()
self._get_placement_group()

View file

@ -134,6 +134,9 @@ hcloud_primary_ip:
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.common.text.converters import to_native
from ansible_collections.hetzner.hcloud.plugins.module_utils.hcloud import Hcloud
from ansible_collections.hetzner.hcloud.plugins.module_utils.vendor.hcloud import (
HCloudException,
)
class AnsibleHcloudPrimaryIP(Hcloud):
@ -158,8 +161,8 @@ class AnsibleHcloudPrimaryIP(Hcloud):
self.hcloud_primary_ip = self.client.primary_ips.get_by_id(self.module.params.get("id"))
else:
self.hcloud_primary_ip = self.client.primary_ips.get_by_name(self.module.params.get("name"))
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
def _create_primary_ip(self):
self.module.fail_on_missing_params(required_params=["type", "datacenter"])
@ -179,8 +182,8 @@ class AnsibleHcloudPrimaryIP(Hcloud):
delete_protection = self.module.params.get("delete_protection")
if delete_protection is not None:
self.hcloud_primary_ip.change_protection(delete=delete_protection).wait_until_finished()
except Exception as e:
self.module.fail_json(msg=e)
except HCloudException as e:
self.fail_json_hcloud(e)
self._mark_as_changed()
self._get_primary_ip()
@ -199,8 +202,8 @@ class AnsibleHcloudPrimaryIP(Hcloud):
self._mark_as_changed()
self._get_primary_ip()
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
def present_primary_ip(self):
self._get_primary_ip()
@ -217,8 +220,8 @@ class AnsibleHcloudPrimaryIP(Hcloud):
self.client.primary_ips.delete(self.hcloud_primary_ip)
self._mark_as_changed()
self.hcloud_primary_ip = None
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
@staticmethod
def define_module():

View file

@ -120,6 +120,9 @@ hcloud_primary_ip_info:
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.common.text.converters import to_native
from ansible_collections.hetzner.hcloud.plugins.module_utils.hcloud import Hcloud
from ansible_collections.hetzner.hcloud.plugins.module_utils.vendor.hcloud import (
HCloudException,
)
class AnsibleHcloudPrimaryIPInfo(Hcloud):
@ -167,8 +170,8 @@ class AnsibleHcloudPrimaryIPInfo(Hcloud):
else:
self.hcloud_primary_ip_info = self.client.primary_ips.get_all()
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
@staticmethod
def define_module():

View file

@ -140,6 +140,9 @@ from ansible_collections.ansible.netcommon.plugins.module_utils.network.common i
utils,
)
from ansible_collections.hetzner.hcloud.plugins.module_utils.hcloud import Hcloud
from ansible_collections.hetzner.hcloud.plugins.module_utils.vendor.hcloud import (
HCloudException,
)
class AnsibleHcloudReverseDNS(Hcloud):
@ -185,8 +188,8 @@ class AnsibleHcloudReverseDNS(Hcloud):
self.hcloud_resource = self.client.load_balancers.get_by_name(self.module.params.get("load_balancer"))
if self.hcloud_resource is None:
self.module.fail_json(msg="The selected Load Balancer does not exist")
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
def _get_rdns(self):
ip_address = self.module.params.get("ip_address")
@ -266,8 +269,8 @@ class AnsibleHcloudReverseDNS(Hcloud):
if not self.module.check_mode:
try:
self.hcloud_resource.change_dns_ptr(**params).wait_until_finished()
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
self._mark_as_changed()
self._get_resource()
self._get_rdns()
@ -283,8 +286,8 @@ class AnsibleHcloudReverseDNS(Hcloud):
if not self.module.check_mode:
try:
self.hcloud_resource.change_dns_ptr(**params).wait_until_finished()
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
self._mark_as_changed()
self._get_resource()
self._get_rdns()
@ -304,8 +307,8 @@ class AnsibleHcloudReverseDNS(Hcloud):
if not self.module.check_mode:
try:
self.hcloud_resource.change_dns_ptr(ip=self.hcloud_rdns["ip_address"], dns_ptr=None)
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
self._mark_as_changed()
self.hcloud_rdns = None

View file

@ -90,6 +90,9 @@ hcloud_route:
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.common.text.converters import to_native
from ansible_collections.hetzner.hcloud.plugins.module_utils.hcloud import Hcloud
from ansible_collections.hetzner.hcloud.plugins.module_utils.vendor.hcloud import (
HCloudException,
)
from ansible_collections.hetzner.hcloud.plugins.module_utils.vendor.hcloud.networks.domain import (
NetworkRoute,
)
@ -112,8 +115,8 @@ class AnsibleHcloudRoute(Hcloud):
try:
self.hcloud_network = self.client.networks.get_by_name(self.module.params.get("network"))
self.hcloud_route = None
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
def _get_route(self):
destination = self.module.params.get("destination")
@ -130,8 +133,8 @@ class AnsibleHcloudRoute(Hcloud):
if not self.module.check_mode:
try:
self.hcloud_network.add_route(route=route).wait_until_finished()
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
self._mark_as_changed()
self._get_network()
@ -150,8 +153,8 @@ class AnsibleHcloudRoute(Hcloud):
if not self.module.check_mode:
try:
self.hcloud_network.delete_route(self.hcloud_route).wait_until_finished()
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
self._mark_as_changed()
self.hcloud_route = None

View file

@ -333,6 +333,9 @@ from datetime import datetime, timedelta, timezone
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.common.text.converters import to_native
from ansible_collections.hetzner.hcloud.plugins.module_utils.hcloud import Hcloud
from ansible_collections.hetzner.hcloud.plugins.module_utils.vendor.hcloud import (
HCloudException,
)
from ansible_collections.hetzner.hcloud.plugins.module_utils.vendor.hcloud.firewalls.domain import (
FirewallResource,
)
@ -393,8 +396,8 @@ class AnsibleHcloudServer(Hcloud):
self.hcloud_server = self.client.servers.get_by_id(self.module.params.get("id"))
else:
self.hcloud_server = self.client.servers.get_by_name(self.module.params.get("name"))
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
def _create_server(self):
self.module.fail_on_missing_params(required_params=["name", "server_type", "image"])
@ -486,8 +489,8 @@ class AnsibleHcloudServer(Hcloud):
delete=delete_protection,
rebuild=rebuild_protection,
).wait_until_finished()
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
self._mark_as_changed()
self._get_server()
@ -505,8 +508,8 @@ class AnsibleHcloudServer(Hcloud):
else:
try:
image = self.client.images.get_by_id(self.module.params.get("image"))
except Exception:
self.module.fail_json(msg="Image %s was not found" % self.module.params.get("image"))
except HCloudException as e:
self.fail_json_hcloud(e, msg="Image %s was not found" % self.module.params.get("image"))
if image.deprecated is not None:
available_until = image.deprecated + timedelta(days=90)
if self.module.params.get("allow_deprecated_image"):
@ -529,8 +532,11 @@ class AnsibleHcloudServer(Hcloud):
if server_type is None:
try:
server_type = self.client.server_types.get_by_id(self.module.params.get("server_type"))
except Exception:
self.module.fail_json(msg="server_type %s was not found" % self.module.params.get("server_type"))
except HCloudException as e:
self.fail_json_hcloud(
e,
msg="server_type %s was not found" % self.module.params.get("server_type"),
)
self._check_and_warn_deprecated_server(server_type)
@ -565,9 +571,10 @@ class AnsibleHcloudServer(Hcloud):
if placement_group is None:
try:
placement_group = self.client.placement_groups.get_by_id(self.module.params.get("placement_group"))
except Exception:
self.module.fail_json(
msg="placement_group %s was not found" % self.module.params.get("placement_group")
except HCloudException as e:
self.fail_json_hcloud(
e,
msg="placement_group %s was not found" % self.module.params.get("placement_group"),
)
return placement_group
@ -580,8 +587,8 @@ class AnsibleHcloudServer(Hcloud):
if primary_ip is None:
try:
primary_ip = self.client.primary_ips.get_by_id(self.module.params.get(field))
except Exception as e:
self.module.fail_json(msg="primary_ip %s was not found" % self.module.params.get(field))
except HCloudException as e:
self.fail_json_hcloud(e, msg="primary_ip %s was not found" % self.module.params.get(field))
return primary_ip
@ -775,8 +782,8 @@ class AnsibleHcloudServer(Hcloud):
).wait_until_finished()
self._mark_as_changed()
self._get_server()
except Exception as e:
self.module.fail_json(msg=e)
except HCloudException as e:
self.fail_json_hcloud(e)
def _set_rescue_mode(self, rescue_mode):
if self.module.params.get("ssh_keys"):
@ -800,8 +807,8 @@ class AnsibleHcloudServer(Hcloud):
self.client.servers.power_on(self.hcloud_server).wait_until_finished()
self._mark_as_changed()
self._get_server()
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
def stop_server(self):
try:
@ -811,8 +818,8 @@ class AnsibleHcloudServer(Hcloud):
self.client.servers.power_off(self.hcloud_server).wait_until_finished()
self._mark_as_changed()
self._get_server()
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
def stop_server_if_forced(self):
previous_server_status = self.hcloud_server.status
@ -842,8 +849,8 @@ class AnsibleHcloudServer(Hcloud):
self._mark_as_changed()
self._get_server()
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
def present_server(self):
self._get_server()
@ -860,8 +867,8 @@ class AnsibleHcloudServer(Hcloud):
self.client.servers.delete(self.hcloud_server).wait_until_finished()
self._mark_as_changed()
self.hcloud_server = None
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
@staticmethod
def define_module():

View file

@ -140,6 +140,9 @@ hcloud_server_info:
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.common.text.converters import to_native
from ansible_collections.hetzner.hcloud.plugins.module_utils.hcloud import Hcloud
from ansible_collections.hetzner.hcloud.plugins.module_utils.vendor.hcloud import (
HCloudException,
)
class AnsibleHcloudServerInfo(Hcloud):
@ -195,8 +198,8 @@ class AnsibleHcloudServerInfo(Hcloud):
else:
self.hcloud_server_info = self.client.servers.get_all()
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
@staticmethod
def define_module():

View file

@ -117,6 +117,7 @@ from ansible.module_utils.common.text.converters import to_native
from ansible_collections.hetzner.hcloud.plugins.module_utils.hcloud import Hcloud
from ansible_collections.hetzner.hcloud.plugins.module_utils.vendor.hcloud import (
APIException,
HCloudException,
)
@ -140,8 +141,8 @@ class AnsibleHcloudServerNetwork(Hcloud):
self.hcloud_network = self.client.networks.get_by_name(self.module.params.get("network"))
self.hcloud_server = self.client.servers.get_by_name(self.module.params.get("server"))
self.hcloud_server_network = None
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
def _get_server_network(self):
for privateNet in self.hcloud_server.private_net:
@ -161,8 +162,8 @@ class AnsibleHcloudServerNetwork(Hcloud):
if not self.module.check_mode:
try:
self.hcloud_server.attach_to_network(**params).wait_until_finished()
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
self._mark_as_changed()
self._get_server_and_network()
@ -180,7 +181,7 @@ class AnsibleHcloudServerNetwork(Hcloud):
try:
self.hcloud_server.change_alias_ips(**params).wait_until_finished()
except APIException as e:
self.module.fail_json(msg=e.message)
self.fail_json_hcloud(e)
self._mark_as_changed()
self._get_server_and_network()
@ -201,8 +202,8 @@ class AnsibleHcloudServerNetwork(Hcloud):
if not self.module.check_mode:
try:
self.hcloud_server.detach_from_network(self.hcloud_server_network.network).wait_until_finished()
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
self._mark_as_changed()
self.hcloud_server_network = None

View file

@ -123,6 +123,9 @@ hcloud_server_type_info:
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.common.text.converters import to_native
from ansible_collections.hetzner.hcloud.plugins.module_utils.hcloud import Hcloud
from ansible_collections.hetzner.hcloud.plugins.module_utils.vendor.hcloud import (
HCloudException,
)
class AnsibleHcloudServerTypeInfo(Hcloud):
@ -166,8 +169,8 @@ class AnsibleHcloudServerTypeInfo(Hcloud):
else:
self.hcloud_server_type_info = self.client.server_types.get_all()
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
@staticmethod
def define_module():

View file

@ -113,6 +113,9 @@ hcloud_ssh_key:
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.common.text.converters import to_native
from ansible_collections.hetzner.hcloud.plugins.module_utils.hcloud import Hcloud
from ansible_collections.hetzner.hcloud.plugins.module_utils.vendor.hcloud import (
HCloudException,
)
class AnsibleHcloudSSHKey(Hcloud):
@ -138,8 +141,8 @@ class AnsibleHcloudSSHKey(Hcloud):
elif self.module.params.get("name") is not None:
self.hcloud_ssh_key = self.client.ssh_keys.get_by_name(self.module.params.get("name"))
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
def _create_ssh_key(self):
self.module.fail_on_missing_params(required_params=["name", "public_key"])
@ -152,8 +155,8 @@ class AnsibleHcloudSSHKey(Hcloud):
if not self.module.check_mode:
try:
self.client.ssh_keys.create(**params)
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
self._mark_as_changed()
self._get_ssh_key()
@ -186,8 +189,8 @@ class AnsibleHcloudSSHKey(Hcloud):
if not self.module.check_mode:
try:
self.client.ssh_keys.delete(self.hcloud_ssh_key)
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
self._mark_as_changed()
self.hcloud_ssh_key = None

View file

@ -77,6 +77,9 @@ hcloud_ssh_key_info:
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.common.text.converters import to_native
from ansible_collections.hetzner.hcloud.plugins.module_utils.hcloud import Hcloud
from ansible_collections.hetzner.hcloud.plugins.module_utils.vendor.hcloud import (
HCloudException,
)
class AnsibleHcloudSSHKeyInfo(Hcloud):
@ -117,8 +120,8 @@ class AnsibleHcloudSSHKeyInfo(Hcloud):
else:
self.hcloud_ssh_key_info = self.client.ssh_keys.get_all()
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
@staticmethod
def define_module():

View file

@ -127,6 +127,9 @@ hcloud_subnetwork:
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.common.text.converters import to_native
from ansible_collections.hetzner.hcloud.plugins.module_utils.hcloud import Hcloud
from ansible_collections.hetzner.hcloud.plugins.module_utils.vendor.hcloud import (
HCloudException,
)
from ansible_collections.hetzner.hcloud.plugins.module_utils.vendor.hcloud.networks.domain import (
NetworkSubnet,
)
@ -152,8 +155,8 @@ class AnsibleHcloudSubnetwork(Hcloud):
try:
self.hcloud_network = self.client.networks.get_by_name(self.module.params.get("network"))
self.hcloud_subnetwork = None
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
def _get_subnetwork(self):
subnet_ip_range = self.module.params.get("ip_range")
@ -174,8 +177,8 @@ class AnsibleHcloudSubnetwork(Hcloud):
if not self.module.check_mode:
try:
self.hcloud_network.add_subnet(subnet=NetworkSubnet(**params)).wait_until_finished()
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
self._mark_as_changed()
self._get_network()
@ -194,8 +197,8 @@ class AnsibleHcloudSubnetwork(Hcloud):
if not self.module.check_mode:
try:
self.hcloud_network.delete_subnet(self.hcloud_subnetwork).wait_until_finished()
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
self._mark_as_changed()
self.hcloud_subnetwork = None

View file

@ -160,6 +160,9 @@ hcloud_volume:
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.common.text.converters import to_native
from ansible_collections.hetzner.hcloud.plugins.module_utils.hcloud import Hcloud
from ansible_collections.hetzner.hcloud.plugins.module_utils.vendor.hcloud import (
HCloudException,
)
class AnsibleHcloudVolume(Hcloud):
@ -189,8 +192,8 @@ class AnsibleHcloudVolume(Hcloud):
self.hcloud_volume = self.client.volumes.get_by_id(self.module.params.get("id"))
else:
self.hcloud_volume = self.client.volumes.get_by_name(self.module.params.get("name"))
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
def _create_volume(self):
self.module.fail_on_missing_params(required_params=["name", "size"])
@ -217,8 +220,8 @@ class AnsibleHcloudVolume(Hcloud):
if delete_protection is not None:
self._get_volume()
self.hcloud_volume.change_protection(delete=delete_protection).wait_until_finished()
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
self._mark_as_changed()
self._get_volume()
@ -260,8 +263,8 @@ class AnsibleHcloudVolume(Hcloud):
self._mark_as_changed()
self._get_volume()
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
def present_volume(self):
self._get_volume()
@ -280,8 +283,8 @@ class AnsibleHcloudVolume(Hcloud):
self.client.volumes.delete(self.hcloud_volume)
self._mark_as_changed()
self.hcloud_volume = None
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
@staticmethod
def define_module():

View file

@ -94,6 +94,9 @@ hcloud_volume_info:
from ansible.module_utils.basic import AnsibleModule
from ansible.module_utils.common.text.converters import to_native
from ansible_collections.hetzner.hcloud.plugins.module_utils.hcloud import Hcloud
from ansible_collections.hetzner.hcloud.plugins.module_utils.vendor.hcloud import (
HCloudException,
)
class AnsibleHcloudVolumeInfo(Hcloud):
@ -137,8 +140,8 @@ class AnsibleHcloudVolumeInfo(Hcloud):
else:
self.hcloud_volume_info = self.client.volumes.get_all()
except Exception as e:
self.module.fail_json(msg=e.message)
except HCloudException as e:
self.fail_json_hcloud(e)
@staticmethod
def define_module():

View file

@ -0,0 +1,123 @@
import traceback
from datetime import datetime, timezone
from unittest.mock import MagicMock
from ansible_collections.hetzner.hcloud.plugins.module_utils.hcloud import Hcloud
from ansible_collections.hetzner.hcloud.plugins.module_utils.vendor.hcloud import (
APIException,
)
from ansible_collections.hetzner.hcloud.plugins.module_utils.vendor.hcloud.actions.domain import (
Action,
ActionException,
ActionFailedException,
ActionTimeoutException,
)
def test_hcloud_fail_json_hcloud():
module = MagicMock()
module.params = {
"api_token": "fake_token",
"endpoint": "https://api.hetzner.cloud/v1",
}
hcloud = Hcloud(module, "hcloud_test")
try:
raise APIException(
code="invalid_input",
message="invalid input in fields 'server', 'home_location'",
details={
"fields": [
{"messages": ["either server or home_location must be provided"], "name": "server"},
{"messages": ["either server or home_location must be provided"], "name": "home_location"},
]
},
)
except APIException as exception:
hcloud.fail_json_hcloud(exception)
module.fail_json.assert_called_with(
msg="invalid input in fields 'server', 'home_location'",
exception=traceback.format_exc(),
failure={
"message": "invalid input in fields 'server', 'home_location'",
"code": "invalid_input",
"details": {
"fields": [
{"messages": ["either server or home_location must be provided"], "name": "server"},
{"messages": ["either server or home_location must be provided"], "name": "home_location"},
]
},
},
)
try:
raise ActionFailedException(
action=Action(
**{
"id": 1084730887,
"command": "change_server_type",
"status": "error",
"progress": 100,
"resources": [{"id": 34574042, "type": "server"}],
"error": {"code": "server_does_not_exist_anymore", "message": "Server does not exist anymore"},
"started": "2023-07-06T14:52:42+00:00",
"finished": "2023-07-06T14:53:08+00:00",
}
)
)
except ActionException as exception:
hcloud.fail_json_hcloud(exception)
module.fail_json.assert_called_with(
msg="The pending action failed: Server does not exist anymore",
exception=traceback.format_exc(),
failure={
"action": {
"id": 1084730887,
"command": "change_server_type",
"status": "error",
"progress": 100,
"resources": [{"id": 34574042, "type": "server"}],
"error": {"code": "server_does_not_exist_anymore", "message": "Server does not exist anymore"},
"started": datetime(2023, 7, 6, 14, 52, 42, tzinfo=timezone.utc),
"finished": datetime(2023, 7, 6, 14, 53, 8, tzinfo=timezone.utc),
}
},
)
try:
raise ActionTimeoutException(
action=Action(
**{
"id": 1084659545,
"command": "create_server",
"status": "running",
"progress": 50,
"started": "2023-07-06T13:58:38+00:00",
"finished": None,
"resources": [{"id": 34572291, "type": "server"}],
"error": None,
}
)
)
except ActionException as exception:
hcloud.fail_json_hcloud(exception)
module.fail_json.assert_called_with(
msg="The pending action timed out",
exception=traceback.format_exc(),
failure={
"action": {
"id": 1084659545,
"command": "create_server",
"status": "running",
"progress": 50,
"resources": [{"id": 34572291, "type": "server"}],
"error": None,
"started": datetime(2023, 7, 6, 13, 58, 38, tzinfo=timezone.utc),
"finished": None,
}
},
)