Skip to content

Commit bd636de

Browse files
committed
Deprecate i386, armhf and armv7 Supervisor architectures
1 parent 1448a33 commit bd636de

File tree

9 files changed

+96
-1
lines changed

9 files changed

+96
-1
lines changed

supervisor/homeassistant/core.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,7 @@ async def install(self) -> None:
222222
JobCondition.INTERNET_HOST,
223223
JobCondition.PLUGINS_UPDATED,
224224
JobCondition.SUPERVISOR_UPDATED,
225+
JobCondition.ARCHITECTURE_SUPPORTED,
225226
],
226227
on_condition=HomeAssistantJobError,
227228
concurrency=JobConcurrency.GROUP_REJECT,

supervisor/jobs/const.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ class JobCondition(StrEnum):
3434
PLUGINS_UPDATED = "plugins_updated"
3535
RUNNING = "running"
3636
SUPERVISOR_UPDATED = "supervisor_updated"
37+
ARCHITECTURE_SUPPORTED = "architecture_supported"
3738

3839

3940
class JobConcurrency(StrEnum):

supervisor/jobs/decorator.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -441,6 +441,14 @@ async def check_conditions(
441441
raise JobConditionException(
442442
f"'{method_name}' blocked from execution, supervisor needs to be updated first"
443443
)
444+
if (
445+
JobCondition.ARCHITECTURE_SUPPORTED in used_conditions
446+
and UnsupportedReason.SYSTEM_ARCHITECTURE
447+
in coresys.sys_resolution.unsupported
448+
):
449+
raise JobConditionException(
450+
f"'{method_name}' blocked from execution, unsupported system architecture"
451+
)
444452

445453
if JobCondition.PLUGINS_UPDATED in used_conditions and (
446454
out_of_date := [

supervisor/misc/tasks.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,7 @@ async def _update_addons(self):
161161
JobCondition.INTERNET_HOST,
162162
JobCondition.OS_SUPPORTED,
163163
JobCondition.RUNNING,
164+
JobCondition.ARCHITECTURE_SUPPORTED,
164165
],
165166
concurrency=JobConcurrency.REJECT,
166167
)

supervisor/plugins/const.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,5 @@
2323
JobCondition.HEALTHY,
2424
JobCondition.INTERNET_HOST,
2525
JobCondition.SUPERVISOR_UPDATED,
26+
JobCondition.ARCHITECTURE_SUPPORTED,
2627
]

supervisor/resolution/const.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ class UnsupportedReason(StrEnum):
5858
SYSTEMD_JOURNAL = "systemd_journal"
5959
SYSTEMD_RESOLVED = "systemd_resolved"
6060
VIRTUALIZATION_IMAGE = "virtualization_image"
61+
SYSTEM_ARCHITECTURE = "system_architecture"
6162

6263

6364
class UnhealthyReason(StrEnum):
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
"""Evaluation class for system architecture support."""
2+
3+
from ...const import CoreState
4+
from ...coresys import CoreSys
5+
from ..const import UnsupportedReason
6+
from .base import EvaluateBase
7+
8+
9+
def setup(coresys: CoreSys) -> EvaluateBase:
10+
"""Initialize evaluation-setup function."""
11+
return EvaluateSystemArchitecture(coresys)
12+
13+
14+
class EvaluateSystemArchitecture(EvaluateBase):
15+
"""Evaluate if the current Supervisor architecture is supported."""
16+
17+
@property
18+
def reason(self) -> UnsupportedReason:
19+
"""Return a UnsupportedReason enum."""
20+
return UnsupportedReason.SYSTEM_ARCHITECTURE
21+
22+
@property
23+
def on_failure(self) -> str:
24+
"""Return a string that is printed when self.evaluate is True."""
25+
return "System architecture is no longer supported. Move to a supported system architecture."
26+
27+
@property
28+
def states(self) -> list[CoreState]:
29+
"""Return a list of valid states when this evaluation can run."""
30+
return [CoreState.INITIALIZE]
31+
32+
async def evaluate(self):
33+
"""Run evaluation."""
34+
return self.sys_host.info.sys_arch.supervisor in {
35+
"i386",
36+
"armhf",
37+
"armv7",
38+
}

supervisor/updater.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,9 +242,10 @@ async def _check_connectivity(self, connectivity: bool):
242242
@Job(
243243
name="updater_fetch_data",
244244
conditions=[
245+
JobCondition.ARCHITECTURE_SUPPORTED,
245246
JobCondition.INTERNET_SYSTEM,
246-
JobCondition.OS_SUPPORTED,
247247
JobCondition.HOME_ASSISTANT_CORE_SUPPORTED,
248+
JobCondition.OS_SUPPORTED,
248249
],
249250
on_condition=UpdaterJobError,
250251
throttle_period=timedelta(seconds=30),
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
"""Test evaluation supported system architectures."""
2+
3+
from unittest.mock import PropertyMock, patch
4+
5+
import pytest
6+
7+
from supervisor.const import CoreState
8+
from supervisor.coresys import CoreSys
9+
from supervisor.resolution.evaluations.system_architecture import (
10+
EvaluateSystemArchitecture,
11+
)
12+
13+
14+
@pytest.mark.parametrize("arch", ["i386", "armhf", "armv7"])
15+
async def test_evaluation_unsupported_architectures(
16+
coresys: CoreSys,
17+
arch: str,
18+
):
19+
"""Test evaluation of unsupported system architectures."""
20+
system_architecture = EvaluateSystemArchitecture(coresys)
21+
coresys.core.state = CoreState.INITIALIZE
22+
23+
with patch.object(
24+
type(coresys.supervisor), "arch", PropertyMock(return_value=arch)
25+
):
26+
await system_architecture()
27+
assert system_architecture.reason in coresys.resolution.unsupported
28+
29+
30+
@pytest.mark.parametrize("arch", ["amd64", "aarch64"])
31+
async def test_evaluation_supported_architectures(
32+
coresys: CoreSys,
33+
arch: str,
34+
):
35+
"""Test evaluation of supported system architectures."""
36+
system_architecture = EvaluateSystemArchitecture(coresys)
37+
coresys.core.state = CoreState.INITIALIZE
38+
39+
with patch.object(
40+
type(coresys.supervisor), "arch", PropertyMock(return_value=arch)
41+
):
42+
await system_architecture()
43+
assert system_architecture.reason not in coresys.resolution.unsupported

0 commit comments

Comments
 (0)