mirror of
https://github.com/home-assistant/supervisor.git
synced 2025-11-21 16:57:00 +00:00
Compare commits
3 Commits
handle-sup
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ca7a3af676 | ||
|
|
93272fe4c0 | ||
|
|
79a99cc66d |
13
build.yaml
13
build.yaml
@@ -1,13 +1,10 @@
|
||||
image: ghcr.io/home-assistant/{arch}-hassio-supervisor
|
||||
build_from:
|
||||
aarch64: ghcr.io/home-assistant/aarch64-base-python:3.13-alpine3.22
|
||||
armhf: ghcr.io/home-assistant/armhf-base-python:3.13-alpine3.22
|
||||
armv7: ghcr.io/home-assistant/armv7-base-python:3.13-alpine3.22
|
||||
amd64: ghcr.io/home-assistant/amd64-base-python:3.13-alpine3.22
|
||||
i386: ghcr.io/home-assistant/i386-base-python:3.13-alpine3.22
|
||||
codenotary:
|
||||
signer: notary@home-assistant.io
|
||||
base_image: notary@home-assistant.io
|
||||
aarch64: ghcr.io/home-assistant/aarch64-base-python:3.13-alpine3.22-2025.11.1
|
||||
armhf: ghcr.io/home-assistant/armhf-base-python:3.13-alpine3.22-2025.11.1
|
||||
armv7: ghcr.io/home-assistant/armv7-base-python:3.13-alpine3.22-2025.11.1
|
||||
amd64: ghcr.io/home-assistant/amd64-base-python:3.13-alpine3.22-2025.11.1
|
||||
i386: ghcr.io/home-assistant/i386-base-python:3.13-alpine3.22-2025.11.1
|
||||
cosign:
|
||||
base_identity: https://github.com/home-assistant/docker-base/.*
|
||||
identity: https://github.com/home-assistant/supervisor/.*
|
||||
|
||||
@@ -34,6 +34,7 @@ class JobCondition(StrEnum):
|
||||
PLUGINS_UPDATED = "plugins_updated"
|
||||
RUNNING = "running"
|
||||
SUPERVISOR_UPDATED = "supervisor_updated"
|
||||
ARCHITECTURE_SUPPORTED = "architecture_supported"
|
||||
|
||||
|
||||
class JobConcurrency(StrEnum):
|
||||
|
||||
@@ -441,6 +441,14 @@ class Job(CoreSysAttributes):
|
||||
raise JobConditionException(
|
||||
f"'{method_name}' blocked from execution, supervisor needs to be updated first"
|
||||
)
|
||||
if (
|
||||
JobCondition.ARCHITECTURE_SUPPORTED in used_conditions
|
||||
and UnsupportedReason.SYSTEM_ARCHITECTURE
|
||||
in coresys.sys_resolution.unsupported
|
||||
):
|
||||
raise JobConditionException(
|
||||
f"'{method_name}' blocked from execution, unsupported system architecture"
|
||||
)
|
||||
|
||||
if JobCondition.PLUGINS_UPDATED in used_conditions and (
|
||||
out_of_date := [
|
||||
|
||||
@@ -161,6 +161,7 @@ class Tasks(CoreSysAttributes):
|
||||
JobCondition.INTERNET_HOST,
|
||||
JobCondition.OS_SUPPORTED,
|
||||
JobCondition.RUNNING,
|
||||
JobCondition.ARCHITECTURE_SUPPORTED,
|
||||
],
|
||||
concurrency=JobConcurrency.REJECT,
|
||||
)
|
||||
|
||||
@@ -23,4 +23,5 @@ PLUGIN_UPDATE_CONDITIONS = [
|
||||
JobCondition.HEALTHY,
|
||||
JobCondition.INTERNET_HOST,
|
||||
JobCondition.SUPERVISOR_UPDATED,
|
||||
JobCondition.ARCHITECTURE_SUPPORTED,
|
||||
]
|
||||
|
||||
@@ -58,6 +58,7 @@ class UnsupportedReason(StrEnum):
|
||||
SYSTEMD_JOURNAL = "systemd_journal"
|
||||
SYSTEMD_RESOLVED = "systemd_resolved"
|
||||
VIRTUALIZATION_IMAGE = "virtualization_image"
|
||||
SYSTEM_ARCHITECTURE = "system_architecture"
|
||||
|
||||
|
||||
class UnhealthyReason(StrEnum):
|
||||
|
||||
38
supervisor/resolution/evaluations/system_architecture.py
Normal file
38
supervisor/resolution/evaluations/system_architecture.py
Normal file
@@ -0,0 +1,38 @@
|
||||
"""Evaluation class for system architecture support."""
|
||||
|
||||
from ...const import CoreState
|
||||
from ...coresys import CoreSys
|
||||
from ..const import UnsupportedReason
|
||||
from .base import EvaluateBase
|
||||
|
||||
|
||||
def setup(coresys: CoreSys) -> EvaluateBase:
|
||||
"""Initialize evaluation-setup function."""
|
||||
return EvaluateSystemArchitecture(coresys)
|
||||
|
||||
|
||||
class EvaluateSystemArchitecture(EvaluateBase):
|
||||
"""Evaluate if the current Supervisor architecture is supported."""
|
||||
|
||||
@property
|
||||
def reason(self) -> UnsupportedReason:
|
||||
"""Return a UnsupportedReason enum."""
|
||||
return UnsupportedReason.SYSTEM_ARCHITECTURE
|
||||
|
||||
@property
|
||||
def on_failure(self) -> str:
|
||||
"""Return a string that is printed when self.evaluate is True."""
|
||||
return "System architecture is no longer supported. Move to a supported system architecture."
|
||||
|
||||
@property
|
||||
def states(self) -> list[CoreState]:
|
||||
"""Return a list of valid states when this evaluation can run."""
|
||||
return [CoreState.INITIALIZE]
|
||||
|
||||
async def evaluate(self):
|
||||
"""Run evaluation."""
|
||||
return self.sys_host.info.sys_arch.supervisor in {
|
||||
"i386",
|
||||
"armhf",
|
||||
"armv7",
|
||||
}
|
||||
@@ -242,9 +242,10 @@ class Updater(FileConfiguration, CoreSysAttributes):
|
||||
@Job(
|
||||
name="updater_fetch_data",
|
||||
conditions=[
|
||||
JobCondition.ARCHITECTURE_SUPPORTED,
|
||||
JobCondition.INTERNET_SYSTEM,
|
||||
JobCondition.OS_SUPPORTED,
|
||||
JobCondition.HOME_ASSISTANT_CORE_SUPPORTED,
|
||||
JobCondition.OS_SUPPORTED,
|
||||
],
|
||||
on_condition=UpdaterJobError,
|
||||
throttle_period=timedelta(seconds=30),
|
||||
|
||||
43
tests/resolution/evaluation/test_system_architecture.py
Normal file
43
tests/resolution/evaluation/test_system_architecture.py
Normal file
@@ -0,0 +1,43 @@
|
||||
"""Test evaluation supported system architectures."""
|
||||
|
||||
from unittest.mock import PropertyMock, patch
|
||||
|
||||
import pytest
|
||||
|
||||
from supervisor.const import CoreState
|
||||
from supervisor.coresys import CoreSys
|
||||
from supervisor.resolution.evaluations.system_architecture import (
|
||||
EvaluateSystemArchitecture,
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.parametrize("arch", ["i386", "armhf", "armv7"])
|
||||
async def test_evaluation_unsupported_architectures(
|
||||
coresys: CoreSys,
|
||||
arch: str,
|
||||
):
|
||||
"""Test evaluation of unsupported system architectures."""
|
||||
system_architecture = EvaluateSystemArchitecture(coresys)
|
||||
await coresys.core.set_state(CoreState.INITIALIZE)
|
||||
|
||||
with patch.object(
|
||||
type(coresys.supervisor), "arch", PropertyMock(return_value=arch)
|
||||
):
|
||||
await system_architecture()
|
||||
assert system_architecture.reason in coresys.resolution.unsupported
|
||||
|
||||
|
||||
@pytest.mark.parametrize("arch", ["amd64", "aarch64"])
|
||||
async def test_evaluation_supported_architectures(
|
||||
coresys: CoreSys,
|
||||
arch: str,
|
||||
):
|
||||
"""Test evaluation of supported system architectures."""
|
||||
system_architecture = EvaluateSystemArchitecture(coresys)
|
||||
await coresys.core.set_state(CoreState.INITIALIZE)
|
||||
|
||||
with patch.object(
|
||||
type(coresys.supervisor), "arch", PropertyMock(return_value=arch)
|
||||
):
|
||||
await system_architecture()
|
||||
assert system_architecture.reason not in coresys.resolution.unsupported
|
||||
Reference in New Issue
Block a user