forked from GithubBackups/healthchecks
Merge branch 'jameskirsop-Retrieve-check-by-unique_key'
This commit is contained in:
commit
01fafd9908
@ -6,6 +6,7 @@ All notable changes to this project will be documented in this file.
|
||||
### Improvements
|
||||
- Paused ping handling can be controlled via API (#376)
|
||||
- Add "Get a list of checks's logged pings" API call (#371)
|
||||
- The /api/v1/checks/ endpoint now accepts either UUID or `unique_key` (#370)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
@ -54,6 +54,23 @@ class GetCheckTestCase(BaseTestCase):
|
||||
r = self.get(made_up_code)
|
||||
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):
|
||||
self.project.api_key_readonly = "R" * 32
|
||||
self.project.save()
|
||||
|
@ -5,7 +5,7 @@ from hc.api import views
|
||||
|
||||
|
||||
class QuoteConverter:
|
||||
regex = "[\w%~_.-]+"
|
||||
regex = r"[\w%~_.-]+"
|
||||
|
||||
def to_python(self, value):
|
||||
return unquote(value)
|
||||
@ -14,7 +14,18 @@ class QuoteConverter:
|
||||
return quote(value, safe="")
|
||||
|
||||
|
||||
class SHA1Converter:
|
||||
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(SHA1Converter, "sha1")
|
||||
|
||||
urlpatterns = [
|
||||
path("ping/<uuid:code>/", views.ping, name="hc-ping-slash"),
|
||||
@ -23,6 +34,7 @@ urlpatterns = [
|
||||
path("ping/<uuid:code>/start", views.ping, {"action": "start"}, name="hc-start"),
|
||||
path("api/v1/checks/", views.checks),
|
||||
path("api/v1/checks/<uuid:code>", views.single, name="hc-api-single"),
|
||||
path("api/v1/checks/<sha1:unique_key>", views.get_check_by_unique_key),
|
||||
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/checks/<uuid:code>/pings/", views.pings, name="hc-api-pings"),
|
||||
|
@ -192,6 +192,18 @@ def get_check(request, code):
|
||||
return JsonResponse(check.to_dict(readonly=request.readonly))
|
||||
|
||||
|
||||
@cors("GET")
|
||||
@csrf_exempt
|
||||
@validate_json()
|
||||
@authorize_read
|
||||
def get_check_by_unique_key(request, unique_key):
|
||||
checks = Check.objects.filter(project=request.project.id)
|
||||
for check in checks:
|
||||
if check.unique_key == unique_key:
|
||||
return JsonResponse(check.to_dict(readonly=request.readonly))
|
||||
return HttpResponseNotFound()
|
||||
|
||||
|
||||
@validate_json(schemas.check)
|
||||
@authorize
|
||||
def update_check(request, code):
|
||||
|
@ -19,6 +19,10 @@ checks in user's account.</p>
|
||||
<td><code>GET SITE_ROOT/api/v1/checks/<uuid></code></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="#get-check">Get a check by its unique_key</a></td>
|
||||
<td><code>GET SITE_ROOT/api/v1/checks/<unique_key></code></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="#create-check">Create a new check</a></td>
|
||||
<td><code>POST SITE_ROOT/api/v1/checks/</code></td>
|
||||
</tr>
|
||||
@ -152,7 +156,7 @@ specified value.</p>
|
||||
|
||||
<p>When using the read-only API key, the following fields are omitted:
|
||||
<code>ping_url</code>, <code>update_url</code>, <code>pause_url</code>, <code>channels</code>. An extra <code>unique_key</code> field
|
||||
is added. This identifier is stable across API calls. Example:</p>
|
||||
is added which can be used <a href="#get-check">to <code>GET</code> a check</a> in place of the <code>UUID</code>. The <code>unique_key</code> identifier is stable across API calls. Example:</p>
|
||||
<div class="highlight"><pre><span></span><code><span class="p">{</span>
|
||||
<span class="nt">"checks"</span><span class="p">:</span> <span class="p">[</span>
|
||||
<span class="p">{</span>
|
||||
@ -188,8 +192,11 @@ is added. This identifier is stable across API calls. Example:</p>
|
||||
|
||||
|
||||
<h2 class="rule" id="get-check">Get a Single Check</h2>
|
||||
<p><code>GET SITE_ROOT/api/v1/checks/<uuid></code></p>
|
||||
<p>Returns a JSON representation of a single check.</p>
|
||||
<p><code>GET SITE_ROOT/api/v1/checks/<uuid></code><br>
|
||||
<code>GET SITE_ROOT/api/v1/checks/<unique_key></code></p>
|
||||
<p>Returns a JSON representation of a single check. Accepts either check's UUID or
|
||||
the <code>unique_key</code> (a field derived from UUID, and returned by API responses when
|
||||
using the read-only API key) as an identifier.</p>
|
||||
<h3>Response Codes</h3>
|
||||
<dl>
|
||||
<dt>200 OK</dt>
|
||||
|
@ -9,6 +9,7 @@ Endpoint Name | Endpoint Address
|
||||
------------------------------------------------------|-------
|
||||
[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 check by its unique_key](#get-check) | `GET SITE_ROOT/api/v1/checks/<unique_key>`
|
||||
[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>`
|
||||
[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:
|
||||
`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
|
||||
{
|
||||
@ -165,9 +166,12 @@ is added. This identifier is stable across API calls. Example:
|
||||
```
|
||||
|
||||
## Get a Single Check {: #get-check .rule }
|
||||
`GET SITE_ROOT/api/v1/checks/<uuid>`
|
||||
`GET SITE_ROOT/api/v1/checks/<uuid>`<br>
|
||||
`GET SITE_ROOT/api/v1/checks/<unique_key>`
|
||||
|
||||
Returns a JSON representation of a single check.
|
||||
Returns a JSON representation of a single check. Accepts either check's UUID or
|
||||
the `unique_key` (a field derived from UUID, and returned by API responses when
|
||||
using the read-only API key) as an identifier.
|
||||
|
||||
### Response Codes
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user