Skip to content

Commit 7bfd8dc

Browse files
authored
Add Hetzner RSS status check (#673)
1 parent 023a6d8 commit 7bfd8dc

File tree

3 files changed

+43
-3
lines changed

3 files changed

+43
-3
lines changed

docs/checks.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ pip install django-health-check[rss,atlassian]
7474

7575
::: health_check.contrib.rss.Heroku
7676

77+
::: health_check.contrib.rss.Hetzner
78+
7779
::: health_check.contrib.atlassian.PlatformSh
7880

7981
::: health_check.contrib.atlassian.Render

health_check/contrib/rss.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,28 @@ class Heroku(Feed):
182182
)
183183

184184

185+
@dataclasses.dataclass
186+
class Hetzner(Feed):
187+
"""
188+
Check Hetzner platform status via their public ATOM status feed.
189+
190+
Args:
191+
timeout: Request timeout duration.
192+
max_age: Maximum age for an incident to be considered active.
193+
194+
"""
195+
196+
timeout: datetime.timedelta = dataclasses.field(
197+
default=datetime.timedelta(seconds=10), repr=False
198+
)
199+
max_age: datetime.timedelta = dataclasses.field(
200+
default=datetime.timedelta(hours=8), repr=False
201+
)
202+
feed_url: str = dataclasses.field(
203+
default="https://status.hetzner.com/en.atom", init=False, repr=False
204+
)
205+
206+
185207
@dataclasses.dataclass
186208
class Azure(Feed):
187209
"""

tests/contrib/test_rss.py

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,15 @@
66

77
import pytest
88

9-
pytest.importorskip("httpx")
9+
httpx = pytest.importorskip("httpx")
1010

11-
from health_check.contrib.rss import (
11+
from health_check.contrib.rss import ( # noqa: E402
1212
AWS,
1313
Azure,
1414
GoogleCloud,
1515
Heroku,
1616
)
17-
from health_check.exceptions import ServiceUnavailable, ServiceWarning
17+
from health_check.exceptions import ServiceUnavailable, ServiceWarning # noqa: E402
1818

1919

2020
class TestAWS:
@@ -437,6 +437,22 @@ def test_feed_url_format(self):
437437
assert check.feed_url == "https://status.heroku.com/feed"
438438

439439

440+
class TestHetzner:
441+
"""Test Hetzner platform status health check."""
442+
443+
@pytest.mark.asyncio
444+
async def test_feed_url(self):
445+
"""Verify correct feed URL for Hetzner."""
446+
from health_check.contrib.rss import Hetzner
447+
448+
check = Hetzner()
449+
async with httpx.AsyncClient() as client:
450+
response = await client.get(
451+
check.feed_url, headers={"User-Agent": "django-health-check"}
452+
)
453+
assert response.status_code != 404, "Hetzner feed URL is not valid"
454+
455+
440456
class TestAzure:
441457
"""Test Azure platform status health check."""
442458

0 commit comments

Comments
 (0)