Skip to content

Commit 5d02b09

Browse files
agnersclaude
andauthored
Fix addon options reset to defaults (#6397)
Co-authored-by: Claude <[email protected]>
1 parent 6f12d2c commit 5d02b09

File tree

2 files changed

+32
-7
lines changed

2 files changed

+32
-7
lines changed

supervisor/api/addons.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -307,13 +307,17 @@ async def options(self, request: web.Request) -> None:
307307
# Validate/Process Body
308308
body = await api_validate(SCHEMA_OPTIONS, request)
309309
if ATTR_OPTIONS in body:
310-
try:
311-
addon.options = addon.schema(body[ATTR_OPTIONS])
312-
except vol.Invalid as ex:
313-
raise AddonConfigurationInvalidError(
314-
addon=addon.slug,
315-
validation_error=humanize_error(body[ATTR_OPTIONS], ex),
316-
) from None
310+
# None resets options to defaults, otherwise validate the options
311+
if body[ATTR_OPTIONS] is None:
312+
addon.options = None
313+
else:
314+
try:
315+
addon.options = addon.schema(body[ATTR_OPTIONS])
316+
except vol.Invalid as ex:
317+
raise AddonConfigurationInvalidError(
318+
addon=addon.slug,
319+
validation_error=humanize_error(body[ATTR_OPTIONS], ex),
320+
) from None
317321
if ATTR_BOOT in body:
318322
if addon.boot_config == AddonBootConfig.MANUAL_ONLY:
319323
raise AddonBootConfigCannotChangeError(

tests/api/test_addons.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -562,6 +562,27 @@ async def test_addon_set_options(api_client: TestClient, install_addon_example:
562562
assert install_addon_example.options == {"message": "test"}
563563

564564

565+
async def test_addon_reset_options(
566+
api_client: TestClient, install_addon_example: Addon
567+
):
568+
"""Test resetting options for an addon to defaults.
569+
570+
Fixes SUPERVISOR-171F.
571+
"""
572+
# First set some custom options
573+
install_addon_example.options = {"message": "custom"}
574+
assert install_addon_example.persist["options"] == {"message": "custom"}
575+
576+
# Reset to defaults by sending null
577+
resp = await api_client.post(
578+
"/addons/local_example/options", json={"options": None}
579+
)
580+
assert resp.status == 200
581+
582+
# Persisted options should be empty (meaning defaults will be used)
583+
assert install_addon_example.persist["options"] == {}
584+
585+
565586
async def test_addon_set_options_error(
566587
api_client: TestClient, install_addon_example: Addon
567588
):

0 commit comments

Comments
 (0)