Compare commits

...

2 Commits

Author SHA1 Message Date
Jan Čermák
314758233a Remove intel-nuc machine from image build matrix
The intel-nuc machine has been renamed in HAOS 6 to generic-x86-64. This
is way beyond what needs to be supported, so stop creating the machine
image for this target.
2026-03-24 13:05:41 +01:00
Joakim Sørensen
e6b7ce97f3 Add progress tracking when uploading a cloud backup (#166316) 2026-03-24 12:10:38 +01:00
5 changed files with 73 additions and 16 deletions

View File

@@ -224,7 +224,6 @@ jobs:
matrix:
machine:
- generic-x86-64
- intel-nuc
- khadas-vim3
- odroid-c2
- odroid-c4
@@ -248,10 +247,6 @@ jobs:
- machine: qemux86-64
arch: amd64
runs-on: ubuntu-24.04
# TODO: remove, intel-nuc is a legacy name for x86-64, renamed in 2021
- machine: intel-nuc
arch: amd64
runs-on: ubuntu-24.04
steps:
- name: Checkout the repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

View File

@@ -138,6 +138,7 @@ class CloudBackupAgent(BackupAgent):
base64md5hash=base64md5hash,
metadata=metadata,
size=size,
on_progress=on_progress,
)
break
except CloudApiNonRetryableError as err:

10
machine/intel-nuc generated
View File

@@ -1,10 +0,0 @@
# Automatically generated by hassfest.
#
# To update, run python3 -m script.hassfest -p docker
ARG BUILD_FROM=ghcr.io/home-assistant/amd64-homeassistant:latest
FROM ${BUILD_FROM}
RUN apk --no-cache add \
libva-intel-driver
LABEL io.hass.machine="intel-nuc"

View File

@@ -88,7 +88,6 @@ class _MachineConfig:
_MACHINES = {
"generic-x86-64": _MachineConfig(arch="amd64", packages=("libva-intel-driver",)),
"green": _MachineConfig(arch="aarch64"),
"intel-nuc": _MachineConfig(arch="amd64", packages=("libva-intel-driver",)),
"khadas-vim3": _MachineConfig(arch="aarch64"),
"odroid-c2": _MachineConfig(arch="aarch64"),
"odroid-c4": _MachineConfig(arch="aarch64"),

View File

@@ -12,10 +12,12 @@ from hass_nabucasa.files import FilesError, StorageType
import pytest
from homeassistant.components.backup import (
DATA_MANAGER,
DOMAIN as BACKUP_DOMAIN,
AddonInfo,
AgentBackup,
Folder,
UploadBackupEvent,
)
from homeassistant.components.cloud import DOMAIN
from homeassistant.components.cloud.backup import async_register_backup_agents_listener
@@ -353,6 +355,7 @@ async def test_agents_upload(
base64md5hash=ANY,
metadata=ANY,
size=ANY,
on_progress=ANY,
)
metadata = cloud.files.upload.mock_calls[-1].kwargs["metadata"]
assert metadata["backup_id"] == backup_id
@@ -361,6 +364,75 @@ async def test_agents_upload(
assert f"Uploading backup {backup_id}" in caplog.text
@pytest.mark.usefixtures("cloud_logged_in", "mock_list_files")
async def test_agents_upload_on_progress(
hass: HomeAssistant,
hass_client: ClientSessionGenerator,
cloud: Mock,
) -> None:
"""Test agent upload backup emits UploadBackupEvent via on_progress."""
client = await hass_client()
backup_data = "test"
backup_id = "test-backup"
test_backup = AgentBackup(
addons=[AddonInfo(name="Test", slug="test", version="1.0.0")],
backup_id=backup_id,
database_included=True,
date="1970-01-01T00:00:00.000Z",
extra_metadata={},
folders=[Folder.MEDIA, Folder.SHARE],
homeassistant_included=True,
homeassistant_version="2024.12.0",
name="Test",
protected=True,
size=len(backup_data),
)
async def mock_upload(**kwargs: Any) -> None:
"""Mock upload that calls on_progress."""
on_progress = kwargs["on_progress"]
on_progress(bytes_uploaded=2)
await hass.async_block_till_done()
on_progress(bytes_uploaded=4)
await hass.async_block_till_done()
cloud.files.upload.side_effect = mock_upload
manager = hass.data[DATA_MANAGER]
events: list[UploadBackupEvent] = []
def _collect(event: Any) -> None:
if isinstance(event, UploadBackupEvent):
events.append(event)
unsub = manager.async_subscribe_events(_collect)
with (
patch(
"homeassistant.components.backup.manager.BackupManager.async_get_backup",
) as fetch_backup,
patch(
"homeassistant.components.backup.manager.read_backup",
return_value=test_backup,
),
patch("pathlib.Path.open") as mocked_open,
):
mocked_open.return_value.read = Mock(side_effect=[backup_data.encode(), b""])
fetch_backup.return_value = test_backup
resp = await client.post(
"/api/backup/upload?agent_id=cloud.cloud",
data={"file": StringIO(backup_data)},
)
unsub()
assert resp.status == 201
cloud_events = [e for e in events if e.agent_id == "cloud.cloud"]
assert len(cloud_events) >= 1
assert all(e.total_bytes == len(backup_data) for e in cloud_events)
assert cloud_events[-1].uploaded_bytes == len(backup_data)
@pytest.mark.parametrize("side_effect", [FilesError("Boom!"), CloudError("Boom!")])
@pytest.mark.usefixtures("cloud_logged_in", "mock_list_files")
async def test_agents_upload_fail(