Skip to content

Commit

Permalink
Preliminary implementation of separate ping/management api's
Browse files Browse the repository at this point in the history
  • Loading branch information
Penagwin committed Nov 10, 2023
1 parent ce18a85 commit 921ea7d
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 26 deletions.
79 changes: 53 additions & 26 deletions plugins/module_utils/healthchecksio.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,26 +43,25 @@ def status_code(self):
class HealthchecksioHelper:
def __init__(self, module):
self.module = module
api_base_url = module.params.get("api_base_url")
if api_base_url == self.healthchecksio_argument_spec().get("api_base_url").get(
"default"
):
self.ping_api_base_url = "https://hc-ping.com"
else:
self.ping_api_base_url = urljoin(api_base_url, "/ping")
self.baseurl = urljoin(api_base_url, "/api/v1")
self.base_url = self._get_base_url(module)
self.api_token = self._get_api_token(module)
self.timeout = module.params.get("timeout", 30)
self.api_token = module.params.get("api_token")
self.headers = {"X-Api-Key": self.api_token}

response = self.get("checks")
if response.status_code == 401:
self.module.fail_json(msg="Failed to login using API token")

def _get_api_token(self, module):
return module.params.get("management_api_token")

def _get_base_url(self, module):
return module.params.get("management_api_base_url")

def _url_builder(self, path):
if path[0] == "/":
path = path[1:]
return "%s/%s" % (self.baseurl, path)
return "%s/%s" % (self.base_url, path)

def send(self, method, path, data=None):
url = self._url_builder(path)
Expand Down Expand Up @@ -98,7 +97,7 @@ def delete(self, path, data=None):
def head(self, path, data=None):
resp, info = fetch_url(
self.module,
"{0}/{1}".format(self.ping_api_base_url, path),
"{0}/{1}".format(self.base_url, path),
data=data,
headers=self.headers,
method="HEAD",
Expand All @@ -110,33 +109,61 @@ def head(self, path, data=None):
def healthchecksio_argument_spec():
return dict(
state=dict(type="str", choices=["present", "absent"], default="present"),
api_token=dict(
management_api_token=dict(
type="str",
aliases=["api_key"],
aliases=["management_api_key"],
fallback=(
env_fallback,
[
"HEALTHCHECKSIO_API_TOKEN",
"HEALTHCHECKSIO_API_KEY",
"HC_API_TOKEN",
"HC_API_KEY",
"HEALTHCHECKSIO_MANAGEMENT_APT_KEY",
"HC_MANAGEMENT_APT_KEY",
"HC_MANAGEMENT_KEY",
],
),
required=True,
required=False,
no_log=True,
),
api_base_url=dict(
management_api_base_url=dict(
type="str",
fallback=(
env_fallback,
["HEALTHCHECKSIO_API_BASE_URL", "HC_API_BASE_URL"],
["HEALTHCHECKSIO_API_MANAGEMENT_BASE_URL", "HC_API_MANAGEMENT_BASE_URL"],
),
required=False,
no_log=False,
default=" https://healthchecks.io/",
),
ping_api_base_url=dict(
type="str",
fallback=(
env_fallback,
["HEALTHCHECKSIO_API_PING_BASE_URL", "HC_API_PING_BASE_URL"],
),
required=False,
no_log=False,
default="https://hc-ping.com/",
),
ping_api_token=dict(
type="str",
aliases=["ping_api_key"],
fallback=(
env_fallback,
["HEALTHCHECKSIO_API_PING_KEY", "HC_API_PING_KEY"],
),
required=False,
no_log=True,
default="https://hc-ping.com",
),

)
class HealthchecksioPingHelper(HealthchecksioHelper):
def _get_api_token(self, module):
# We can use the management API token instead of the ping token
if module.params.get('ping_api_token') != "":
return module.params.get("ping_api_token")
return module.params.get("management_api_token")

def _get_base_url(self, module):
return module.params.get("ping_api_base_url")

class BadgesInfo(object):
def __init__(self, module):
Expand Down Expand Up @@ -287,7 +314,6 @@ class Checks(object):
def __init__(self, module):
self.module = module
self.rest = HealthchecksioHelper(module)
self.api_token = module.params.pop("api_token")

def get_uuid(self, json_data):
ping_url = json_data.get("ping_url", None)
Expand Down Expand Up @@ -346,7 +372,9 @@ def create(self):
channels = request_params["channels"]

# If all request parameters (except unique and api_key) match, exit without changes
skip_idempotency_params = ["unique", "api_key", "api_base_url", "channels"]
skip_idempotency_params = ["unique", "management_api_key", "management_api_token",
"management_api_base_url", "ping_api_key",
"ping_api_base_url", "ping_api_token", "channels"]
if (
len(c) == 1
and all(
Expand Down Expand Up @@ -436,8 +464,7 @@ def pause(self):
class Ping(object):
def __init__(self, module):
self.module = module
self.rest = HealthchecksioHelper(module)
self.api_token = module.params.pop("api_token")
self.rest = HealthchecksioPingHelper(module)

def create(self, uuid, signal):
if self.module.check_mode:
Expand All @@ -460,6 +487,6 @@ def create(self, uuid, signal):
self.module.fail_json(
changed=False,
msg="Failed to send {0} signal to {1} [HTTP {2}]".format(
signal, endpoint, status_code
signal, json.dumps(response.info), status_code
),
)
1 change: 1 addition & 0 deletions plugins/modules/checks.py
Original file line number Diff line number Diff line change
Expand Up @@ -208,6 +208,7 @@ def main():
channels=dict(type="str", required=False, default=""),
unique=dict(type="list", elements="str", required=False, default=[]),
uuid=dict(type="str", required=False, default=""),
slug=dict(type="str", required=False, default=""),
)
module = AnsibleModule(
argument_spec=argument_spec,
Expand Down

0 comments on commit 921ea7d

Please sign in to comment.