forked from GithubBackups/healthchecks
Implementing new changes discussed to resolve #370
This commit is contained in:
parent
fd4d59c4e1
commit
8725c81144
@ -6,6 +6,7 @@ All notable changes to this project will be documented in this file.
|
|||||||
### Improvements
|
### Improvements
|
||||||
- Paused ping handling can be controlled via API (#376)
|
- Paused ping handling can be controlled via API (#376)
|
||||||
- Add "Get a list of checks's logged pings" API call (#371)
|
- Add "Get a list of checks's logged pings" API call (#371)
|
||||||
|
- Allowed the /api/v1/checks/ endpoint to receive a UUID or `unique_key` (#370)
|
||||||
|
|
||||||
|
|
||||||
### Bug Fixes
|
### Bug Fixes
|
||||||
|
@ -54,6 +54,23 @@ class GetCheckTestCase(BaseTestCase):
|
|||||||
r = self.get(made_up_code)
|
r = self.get(made_up_code)
|
||||||
self.assertEqual(r.status_code, 404)
|
self.assertEqual(r.status_code, 404)
|
||||||
|
|
||||||
|
def test_it_handles_unique_key(self):
|
||||||
|
r = self.get(self.a1.unique_key)
|
||||||
|
self.assertEqual(r.status_code, 200)
|
||||||
|
self.assertEqual(r["Access-Control-Allow-Origin"], "*")
|
||||||
|
|
||||||
|
doc = r.json()
|
||||||
|
self.assertEqual(len(doc), 14)
|
||||||
|
|
||||||
|
self.assertEqual(doc["timeout"], 3600)
|
||||||
|
self.assertEqual(doc["grace"], 900)
|
||||||
|
self.assertEqual(doc["ping_url"], self.a1.url())
|
||||||
|
self.assertEqual(doc["last_ping"], None)
|
||||||
|
self.assertEqual(doc["n_pings"], 0)
|
||||||
|
self.assertEqual(doc["status"], "new")
|
||||||
|
self.assertEqual(doc["channels"], str(self.c1.code))
|
||||||
|
self.assertEqual(doc["desc"], "This is description")
|
||||||
|
|
||||||
def test_readonly_key_works(self):
|
def test_readonly_key_works(self):
|
||||||
self.project.api_key_readonly = "R" * 32
|
self.project.api_key_readonly = "R" * 32
|
||||||
self.project.save()
|
self.project.save()
|
||||||
|
@ -13,8 +13,17 @@ class QuoteConverter:
|
|||||||
def to_url(self, value):
|
def to_url(self, value):
|
||||||
return quote(value, safe="")
|
return quote(value, safe="")
|
||||||
|
|
||||||
|
class UniqueKeyConverter:
|
||||||
|
regex = "[A-z0-9]{40}"
|
||||||
|
|
||||||
|
def to_python(self, value):
|
||||||
|
return value
|
||||||
|
|
||||||
|
def to_url(self, value):
|
||||||
|
return value
|
||||||
|
|
||||||
register_converter(QuoteConverter, "quoted")
|
register_converter(QuoteConverter, "quoted")
|
||||||
|
register_converter(UniqueKeyConverter, "unique_key")
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path("ping/<uuid:code>/", views.ping, name="hc-ping-slash"),
|
path("ping/<uuid:code>/", views.ping, name="hc-ping-slash"),
|
||||||
@ -23,6 +32,7 @@ urlpatterns = [
|
|||||||
path("ping/<uuid:code>/start", views.ping, {"action": "start"}, name="hc-start"),
|
path("ping/<uuid:code>/start", views.ping, {"action": "start"}, name="hc-start"),
|
||||||
path("api/v1/checks/", views.checks),
|
path("api/v1/checks/", views.checks),
|
||||||
path("api/v1/checks/<uuid:code>", views.single, name="hc-api-single"),
|
path("api/v1/checks/<uuid:code>", views.single, name="hc-api-single"),
|
||||||
|
path("api/v1/checks/<unique_key:code>", views.single, name="hc-api-single"),
|
||||||
path("api/v1/checks/<uuid:code>/pause", views.pause, name="hc-api-pause"),
|
path("api/v1/checks/<uuid:code>/pause", views.pause, name="hc-api-pause"),
|
||||||
path("api/v1/notifications/<uuid:code>/bounce", views.bounce, name="hc-api-bounce"),
|
path("api/v1/notifications/<uuid:code>/bounce", views.bounce, name="hc-api-bounce"),
|
||||||
path("api/v1/checks/<uuid:code>/pings/", views.pings, name="hc-api-pings"),
|
path("api/v1/checks/<uuid:code>/pings/", views.pings, name="hc-api-pings"),
|
||||||
|
@ -191,6 +191,14 @@ def get_check(request, code):
|
|||||||
|
|
||||||
return JsonResponse(check.to_dict(readonly=request.readonly))
|
return JsonResponse(check.to_dict(readonly=request.readonly))
|
||||||
|
|
||||||
|
@validate_json()
|
||||||
|
@authorize_read
|
||||||
|
def get_check_unique(request, code):
|
||||||
|
checks = Check.objects.filter(project=request.project.id)
|
||||||
|
for check in checks:
|
||||||
|
if check.unique_key == code:
|
||||||
|
return JsonResponse(check.to_dict(readonly=request.readonly))
|
||||||
|
return HttpResponseNotFound()
|
||||||
|
|
||||||
@validate_json(schemas.check)
|
@validate_json(schemas.check)
|
||||||
@authorize
|
@authorize
|
||||||
@ -228,7 +236,10 @@ def single(request, code):
|
|||||||
if request.method == "DELETE":
|
if request.method == "DELETE":
|
||||||
return delete_check(request, code)
|
return delete_check(request, code)
|
||||||
|
|
||||||
|
if type(code) == uuid.UUID:
|
||||||
return get_check(request, code)
|
return get_check(request, code)
|
||||||
|
else:
|
||||||
|
return get_check_unique(request, code)
|
||||||
|
|
||||||
|
|
||||||
@cors("POST")
|
@cors("POST")
|
||||||
|
@ -9,6 +9,7 @@ Endpoint Name | Endpoint Address
|
|||||||
------------------------------------------------------|-------
|
------------------------------------------------------|-------
|
||||||
[Get a list of existing checks](#list-checks) | `GET SITE_ROOT/api/v1/checks/`
|
[Get a list of existing checks](#list-checks) | `GET SITE_ROOT/api/v1/checks/`
|
||||||
[Get a single check](#get-check) | `GET SITE_ROOT/api/v1/checks/<uuid>`
|
[Get a single check](#get-check) | `GET SITE_ROOT/api/v1/checks/<uuid>`
|
||||||
|
[Get a single check (using Read Only API)](#get-check) | `GET SITE_ROOT/api/v1/checks/<unique_key>`
|
||||||
[Create a new check](#create-check) | `POST SITE_ROOT/api/v1/checks/`
|
[Create a new check](#create-check) | `POST SITE_ROOT/api/v1/checks/`
|
||||||
[Update an existing check](#update-check) | `POST SITE_ROOT/api/v1/checks/<uuid>`
|
[Update an existing check](#update-check) | `POST SITE_ROOT/api/v1/checks/<uuid>`
|
||||||
[Pause monitoring of a check](#pause-check) | `POST SITE_ROOT/api/v1/checks/<uuid>/pause`
|
[Pause monitoring of a check](#pause-check) | `POST SITE_ROOT/api/v1/checks/<uuid>/pause`
|
||||||
@ -128,7 +129,7 @@ curl --header "X-Api-Key: your-api-key" SITE_ROOT/api/v1/checks/
|
|||||||
|
|
||||||
When using the read-only API key, the following fields are omitted:
|
When using the read-only API key, the following fields are omitted:
|
||||||
`ping_url`, `update_url`, `pause_url`, `channels`. An extra `unique_key` field
|
`ping_url`, `update_url`, `pause_url`, `channels`. An extra `unique_key` field
|
||||||
is added. This identifier is stable across API calls. Example:
|
is added which can be used [to `GET` a check](#get-check) in place of the `UUID`. The `unique_key` identifier is stable across API calls. Example:
|
||||||
|
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
@ -165,9 +166,9 @@ is added. This identifier is stable across API calls. Example:
|
|||||||
```
|
```
|
||||||
|
|
||||||
## Get a Single Check {: #get-check .rule }
|
## Get a Single Check {: #get-check .rule }
|
||||||
`GET SITE_ROOT/api/v1/checks/<uuid>`
|
`GET SITE_ROOT/api/v1/checks/<uuid>` OR `GET SITE_ROOT/api/v1/checks/<unique_key>`
|
||||||
|
|
||||||
Returns a JSON representation of a single check.
|
Returns a JSON representation of a single check. Can take either the UUID or the `unique_key` (see [information above](#list-checks)) as the identifier of the check to return.
|
||||||
|
|
||||||
### Response Codes
|
### Response Codes
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user