mirror of
https://github.com/home-assistant/supervisor.git
synced 2025-07-13 12:16:29 +00:00
Add safe mode option to core rebuild (#5120)
* Add safe mode option to core rebuild * Adding logging for increased traceability
This commit is contained in:
parent
09166e3867
commit
ab78d87304
@ -182,9 +182,13 @@ class APIHomeAssistant(CoreSysAttributes):
|
|||||||
)
|
)
|
||||||
|
|
||||||
@api_process
|
@api_process
|
||||||
def rebuild(self, request: web.Request) -> Awaitable[None]:
|
async def rebuild(self, request: web.Request) -> None:
|
||||||
"""Rebuild Home Assistant."""
|
"""Rebuild Home Assistant."""
|
||||||
return asyncio.shield(self.sys_homeassistant.core.rebuild())
|
body = await api_validate(SCHEMA_RESTART, request)
|
||||||
|
|
||||||
|
await asyncio.shield(
|
||||||
|
self.sys_homeassistant.core.rebuild(safe_mode=body[ATTR_SAFE_MODE])
|
||||||
|
)
|
||||||
|
|
||||||
@api_process
|
@api_process
|
||||||
async def check(self, request: web.Request) -> None:
|
async def check(self, request: web.Request) -> None:
|
||||||
|
@ -367,6 +367,7 @@ class HomeAssistantCore(JobGroup):
|
|||||||
"""Restart Home Assistant Docker."""
|
"""Restart Home Assistant Docker."""
|
||||||
# Create safe mode marker file if necessary
|
# Create safe mode marker file if necessary
|
||||||
if safe_mode:
|
if safe_mode:
|
||||||
|
_LOGGER.debug("Creating safe mode marker file.")
|
||||||
await self.sys_run_in_executor(
|
await self.sys_run_in_executor(
|
||||||
(self.sys_config.path_homeassistant / SAFE_MODE_FILENAME).touch
|
(self.sys_config.path_homeassistant / SAFE_MODE_FILENAME).touch
|
||||||
)
|
)
|
||||||
@ -383,8 +384,15 @@ class HomeAssistantCore(JobGroup):
|
|||||||
limit=JobExecutionLimit.GROUP_ONCE,
|
limit=JobExecutionLimit.GROUP_ONCE,
|
||||||
on_condition=HomeAssistantJobError,
|
on_condition=HomeAssistantJobError,
|
||||||
)
|
)
|
||||||
async def rebuild(self) -> None:
|
async def rebuild(self, *, safe_mode: bool = False) -> None:
|
||||||
"""Rebuild Home Assistant Docker container."""
|
"""Rebuild Home Assistant Docker container."""
|
||||||
|
# Create safe mode marker file if necessary
|
||||||
|
if safe_mode:
|
||||||
|
_LOGGER.debug("Creating safe mode marker file.")
|
||||||
|
await self.sys_run_in_executor(
|
||||||
|
(self.sys_config.path_homeassistant / SAFE_MODE_FILENAME).touch
|
||||||
|
)
|
||||||
|
|
||||||
with suppress(DockerError):
|
with suppress(DockerError):
|
||||||
await self.instance.stop()
|
await self.instance.stop()
|
||||||
await self.start()
|
await self.start()
|
||||||
|
@ -4,6 +4,7 @@ from pathlib import Path
|
|||||||
from unittest.mock import MagicMock, patch
|
from unittest.mock import MagicMock, patch
|
||||||
|
|
||||||
from aiohttp.test_utils import TestClient
|
from aiohttp.test_utils import TestClient
|
||||||
|
from awesomeversion import AwesomeVersion
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from supervisor.coresys import CoreSys
|
from supervisor.coresys import CoreSys
|
||||||
@ -115,3 +116,29 @@ async def test_api_restart(
|
|||||||
|
|
||||||
assert container.restart.call_count == 2
|
assert container.restart.call_count == 2
|
||||||
assert safe_mode_marker.exists()
|
assert safe_mode_marker.exists()
|
||||||
|
|
||||||
|
|
||||||
|
async def test_api_rebuild(
|
||||||
|
api_client: TestClient,
|
||||||
|
coresys: CoreSys,
|
||||||
|
container: MagicMock,
|
||||||
|
tmp_supervisor_data: Path,
|
||||||
|
path_extern,
|
||||||
|
):
|
||||||
|
"""Test rebuilding homeassistant."""
|
||||||
|
coresys.homeassistant.version = AwesomeVersion("2023.09.0")
|
||||||
|
safe_mode_marker = tmp_supervisor_data / "homeassistant" / "safe-mode"
|
||||||
|
|
||||||
|
with patch.object(HomeAssistantCore, "_block_till_run"):
|
||||||
|
await api_client.post("/homeassistant/rebuild")
|
||||||
|
|
||||||
|
assert container.remove.call_count == 2
|
||||||
|
container.start.assert_called_once()
|
||||||
|
assert not safe_mode_marker.exists()
|
||||||
|
|
||||||
|
with patch.object(HomeAssistantCore, "_block_till_run"):
|
||||||
|
await api_client.post("/homeassistant/rebuild", json={"safe_mode": True})
|
||||||
|
|
||||||
|
assert container.remove.call_count == 4
|
||||||
|
assert container.start.call_count == 2
|
||||||
|
assert safe_mode_marker.exists()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user