Skip to content

Commit 8e33471

Browse files
authored
Add API for /os/config/swap endpoints (#50)
* Add API for /os/config/swap endpoints Add methods for endpoints implemented in home-assistant/supervisor#5770 * Subclass SwapInfo from ResponseData
1 parent b132e64 commit 8e33471

File tree

4 files changed

+65
-0
lines changed

4 files changed

+65
-0
lines changed

aiohasupervisor/models/os.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,3 +124,19 @@ class YellowOptions(Options):
124124
disk_led: bool | None = None
125125
heartbeat_led: bool | None = None
126126
power_led: bool | None = None
127+
128+
129+
@dataclass(frozen=True, slots=True)
130+
class SwapInfo(ResponseData):
131+
"""SwapInfo model."""
132+
133+
swap_size: str | None
134+
swappiness: int | None
135+
136+
137+
@dataclass(frozen=True, slots=True)
138+
class SwapOptions(Options):
139+
"""SwapOptions model."""
140+
141+
swap_size: str | None = None
142+
swappiness: int | None = None

aiohasupervisor/os.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
OSInfo,
1111
OSUpdate,
1212
SetBootSlotOptions,
13+
SwapInfo,
14+
SwapOptions,
1315
YellowInfo,
1416
YellowOptions,
1517
)
@@ -29,6 +31,15 @@ async def update(self, options: OSUpdate | None = None) -> None:
2931
"os/update", json=options.to_dict() if options else None, timeout=None
3032
)
3133

34+
async def swap_info(self) -> SwapInfo:
35+
"""Get swap settings."""
36+
result = await self._client.get("os/config/swap")
37+
return SwapInfo.from_dict(result.data)
38+
39+
async def set_swap_options(self, options: SwapOptions) -> None:
40+
"""Set swap settings."""
41+
await self._client.post("os/config/swap", json=options.to_dict())
42+
3243
async def config_sync(self) -> None:
3344
"""Trigger config reload on OS."""
3445
await self._client.post("os/config/sync")

tests/fixtures/os_config_swap.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"result": "ok",
3+
"data": {
4+
"swappiness": 1,
5+
"swap_size": "1G"
6+
}
7+
}

tests/test_os.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
SetBootSlotOptions,
1616
YellowOptions,
1717
)
18+
from aiohasupervisor.models.os import SwapOptions
1819

1920
from . import load_fixture
2021
from .const import SUPERVISOR_URL
@@ -51,6 +52,36 @@ async def test_os_update(
5152
assert responses.requests.keys() == {("POST", URL(f"{SUPERVISOR_URL}/os/update"))}
5253

5354

55+
async def test_os_swap_info(
56+
responses: aioresponses, supervisor_client: SupervisorClient
57+
) -> None:
58+
"""Test OS config swap API."""
59+
responses.get(
60+
f"{SUPERVISOR_URL}/os/config/swap",
61+
status=200,
62+
body=load_fixture("os_config_swap.json"),
63+
)
64+
info = await supervisor_client.os.swap_info()
65+
assert info.swap_size == "1G"
66+
assert info.swappiness == 1
67+
68+
69+
async def test_os_set_swap_options(
70+
responses: aioresponses, supervisor_client: SupervisorClient
71+
) -> None:
72+
"""Test OS set swap options API."""
73+
responses.post(f"{SUPERVISOR_URL}/os/config/swap", status=200)
74+
assert (
75+
await supervisor_client.os.set_swap_options(
76+
SwapOptions(swap_size="1G", swappiness=20)
77+
)
78+
is None
79+
)
80+
assert responses.requests.keys() == {
81+
("POST", URL(f"{SUPERVISOR_URL}/os/config/swap"))
82+
}
83+
84+
5485
async def test_os_config_sync(
5586
responses: aioresponses, supervisor_client: SupervisorClient
5687
) -> None:

0 commit comments

Comments
 (0)