Compare commits

..

3 Commits

Author SHA1 Message Date
Stefan Agner
5d9d33c9fa Wait for Home Assistant Core to start 2025-10-27 12:36:48 +01:00
Stefan Agner
e4959b4f10 Log rejected WebSocket messages to Home Assistant Core 2025-10-27 11:46:04 +01:00
Stefan Agner
78353220de Reject Core Backup if sending backup start WebSocket message fails
If sending the WebSocket message to Home Assistant Core to inform it
about the start of a backup fails, we should reject the backup process
entirely. This prevents taking a backup without Home Assistant Core
being aware of it.

As a side effect, this likely prevents situation where Core does not
learn about the backup progress since we also won't be able to send
WebSocket messages about Job progress updates.
2025-10-27 11:36:25 +01:00
6 changed files with 23 additions and 12 deletions

View File

@@ -320,6 +320,15 @@ jobs:
exit 1
fi
- name: Wait for Home Assistant Core to start
run: |
echo "Waiting for Home Assistant Core to start"
timeout 10m ha supervisor logs -f -n 10000 -b 0 | grep -q "Detect a running Home Assistant instance"
if [ "$?" != "0" ]; then
echo "Home Assistant Core did not start within 10 minutes"
exit 1
fi
- name: Create full backup
id: backup
run: |

View File

@@ -386,7 +386,7 @@ jobs:
-o console_output_style=count \
tests
- name: Upload coverage artifact
uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: coverage
path: .coverage
@@ -417,7 +417,7 @@ jobs:
echo "Failed to restore Python virtual environment from cache"
exit 1
- name: Download all coverage artifacts
uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0
uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0
with:
name: coverage
path: coverage/

View File

@@ -17,7 +17,7 @@ faust-cchardet==2.1.19
gitpython==3.1.45
jinja2==3.1.6
log-rate-limit==1.4.2
orjson==3.11.4
orjson==3.11.3
pulsectl==24.12.0
pyudev==0.24.4
PyYAML==6.0.3

View File

@@ -1562,15 +1562,7 @@ class Addon(AddonModel):
)
break
# Exponential backoff to spread retries over the throttle window
delay = WATCHDOG_RETRY_SECONDS * (1 << max(attempts - 1, 0))
_LOGGER.debug(
"Watchdog will retry addon %s in %s seconds (attempt %s)",
self.name,
delay,
attempts + 1,
)
await asyncio.sleep(delay)
await asyncio.sleep(WATCHDOG_RETRY_SECONDS)
async def container_state_changed(self, event: DockerContainerStateEvent) -> None:
"""Set addon state from container state."""

View File

@@ -371,6 +371,12 @@ class HomeAssistant(FileConfiguration, CoreSysAttributes):
_LOGGER.error,
) from err
if not resp:
raise HomeAssistantBackupError(
"Preparing backup of Home Assistant Core failed. No response from HA Core.",
_LOGGER.error,
)
if resp and not resp.get(ATTR_SUCCESS):
raise HomeAssistantBackupError(
f"Preparing backup of Home Assistant Core failed due to: {resp.get(ATTR_ERROR, {}).get(ATTR_MESSAGE, '')}. Check HA Core logs.",

View File

@@ -225,6 +225,10 @@ class HomeAssistantWebSocket(CoreSysAttributes):
# since it makes a new socket connection and we already have one.
if not connected and not await self.sys_homeassistant.api.check_api_state():
# No core access, don't try.
_LOGGER.debug(
"Home Assistant API is not accessible. Not sending WS message: %s",
message,
)
return False
if not self._client: