Fix adding OS entities for supervised installations (#69539)
This commit is contained in:
parent
0ad9da9dd0
commit
a5dc95e715
5 changed files with 64 additions and 13 deletions
|
@ -824,7 +824,7 @@ class HassioDataUpdateCoordinator(DataUpdateCoordinator):
|
||||||
self.data = {}
|
self.data = {}
|
||||||
self.entry_id = config_entry.entry_id
|
self.entry_id = config_entry.entry_id
|
||||||
self.dev_reg = dev_reg
|
self.dev_reg = dev_reg
|
||||||
self.is_hass_os = "hassos" in get_info(self.hass)
|
self.is_hass_os = (get_info(self.hass) or {}).get("hassos") is not None
|
||||||
|
|
||||||
async def _async_update_data(self) -> dict[str, Any]:
|
async def _async_update_data(self) -> dict[str, Any]:
|
||||||
"""Update data via library."""
|
"""Update data via library."""
|
||||||
|
@ -891,6 +891,12 @@ class HassioDataUpdateCoordinator(DataUpdateCoordinator):
|
||||||
if stale_addons := supervisor_addon_devices - set(new_data[DATA_KEY_ADDONS]):
|
if stale_addons := supervisor_addon_devices - set(new_data[DATA_KEY_ADDONS]):
|
||||||
async_remove_addons_from_dev_reg(self.dev_reg, stale_addons)
|
async_remove_addons_from_dev_reg(self.dev_reg, stale_addons)
|
||||||
|
|
||||||
|
if not self.is_hass_os and (
|
||||||
|
dev := self.dev_reg.async_get_device({(DOMAIN, "OS")})
|
||||||
|
):
|
||||||
|
# Remove the OS device if it exists and the installation is not hassos
|
||||||
|
self.dev_reg.async_remove_device(dev.id)
|
||||||
|
|
||||||
# If there are new add-ons, we should reload the config entry so we can
|
# If there are new add-ons, we should reload the config entry so we can
|
||||||
# create new devices and entities. We can return an empty dict because
|
# create new devices and entities. We can return an empty dict because
|
||||||
# coordinator will be recreated.
|
# coordinator will be recreated.
|
||||||
|
|
|
@ -24,7 +24,11 @@ def mock_all(aioclient_mock, request):
|
||||||
"http://127.0.0.1/info",
|
"http://127.0.0.1/info",
|
||||||
json={
|
json={
|
||||||
"result": "ok",
|
"result": "ok",
|
||||||
"data": {"supervisor": "222", "homeassistant": "0.110.0", "hassos": None},
|
"data": {
|
||||||
|
"supervisor": "222",
|
||||||
|
"homeassistant": "0.110.0",
|
||||||
|
"hassos": "1.2.3",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
aioclient_mock.get(
|
aioclient_mock.get(
|
||||||
|
|
|
@ -30,7 +30,11 @@ def mock_all(aioclient_mock, request):
|
||||||
"http://127.0.0.1/info",
|
"http://127.0.0.1/info",
|
||||||
json={
|
json={
|
||||||
"result": "ok",
|
"result": "ok",
|
||||||
"data": {"supervisor": "222", "homeassistant": "0.110.0", "hassos": None},
|
"data": {
|
||||||
|
"supervisor": "222",
|
||||||
|
"homeassistant": "0.110.0",
|
||||||
|
"hassos": "1.2.3",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
aioclient_mock.get(
|
aioclient_mock.get(
|
||||||
|
@ -396,14 +400,14 @@ async def test_service_calls(hassio_env, hass, aioclient_mock, caplog):
|
||||||
)
|
)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
assert aioclient_mock.call_count == 8
|
assert aioclient_mock.call_count == 9
|
||||||
assert aioclient_mock.mock_calls[-1][2] == "test"
|
assert aioclient_mock.mock_calls[-1][2] == "test"
|
||||||
|
|
||||||
await hass.services.async_call("hassio", "host_shutdown", {})
|
await hass.services.async_call("hassio", "host_shutdown", {})
|
||||||
await hass.services.async_call("hassio", "host_reboot", {})
|
await hass.services.async_call("hassio", "host_reboot", {})
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
assert aioclient_mock.call_count == 10
|
assert aioclient_mock.call_count == 11
|
||||||
|
|
||||||
await hass.services.async_call("hassio", "backup_full", {})
|
await hass.services.async_call("hassio", "backup_full", {})
|
||||||
await hass.services.async_call(
|
await hass.services.async_call(
|
||||||
|
@ -418,7 +422,7 @@ async def test_service_calls(hassio_env, hass, aioclient_mock, caplog):
|
||||||
)
|
)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
assert aioclient_mock.call_count == 12
|
assert aioclient_mock.call_count == 13
|
||||||
assert aioclient_mock.mock_calls[-1][2] == {
|
assert aioclient_mock.mock_calls[-1][2] == {
|
||||||
"homeassistant": True,
|
"homeassistant": True,
|
||||||
"addons": ["test"],
|
"addons": ["test"],
|
||||||
|
@ -442,7 +446,7 @@ async def test_service_calls(hassio_env, hass, aioclient_mock, caplog):
|
||||||
)
|
)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
assert aioclient_mock.call_count == 14
|
assert aioclient_mock.call_count == 15
|
||||||
assert aioclient_mock.mock_calls[-1][2] == {
|
assert aioclient_mock.mock_calls[-1][2] == {
|
||||||
"addons": ["test"],
|
"addons": ["test"],
|
||||||
"folders": ["ssl"],
|
"folders": ["ssl"],
|
||||||
|
@ -461,12 +465,12 @@ async def test_service_calls_core(hassio_env, hass, aioclient_mock):
|
||||||
await hass.services.async_call("homeassistant", "stop")
|
await hass.services.async_call("homeassistant", "stop")
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
assert aioclient_mock.call_count == 4
|
assert aioclient_mock.call_count == 5
|
||||||
|
|
||||||
await hass.services.async_call("homeassistant", "check_config")
|
await hass.services.async_call("homeassistant", "check_config")
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
assert aioclient_mock.call_count == 4
|
assert aioclient_mock.call_count == 5
|
||||||
|
|
||||||
with patch(
|
with patch(
|
||||||
"homeassistant.config.async_check_ha_config_file", return_value=None
|
"homeassistant.config.async_check_ha_config_file", return_value=None
|
||||||
|
@ -475,7 +479,7 @@ async def test_service_calls_core(hassio_env, hass, aioclient_mock):
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
assert mock_check_config.called
|
assert mock_check_config.called
|
||||||
|
|
||||||
assert aioclient_mock.call_count == 5
|
assert aioclient_mock.call_count == 6
|
||||||
|
|
||||||
|
|
||||||
async def test_entry_load_and_unload(hass):
|
async def test_entry_load_and_unload(hass):
|
||||||
|
@ -628,10 +632,17 @@ async def test_device_registry_calls(hass):
|
||||||
), patch(
|
), patch(
|
||||||
"homeassistant.components.hassio.HassIO.get_os_info",
|
"homeassistant.components.hassio.HassIO.get_os_info",
|
||||||
return_value=os_mock_data,
|
return_value=os_mock_data,
|
||||||
|
), patch(
|
||||||
|
"homeassistant.components.hassio.HassIO.get_info",
|
||||||
|
return_value={
|
||||||
|
"supervisor": "222",
|
||||||
|
"homeassistant": "0.110.0",
|
||||||
|
"hassos": None,
|
||||||
|
},
|
||||||
):
|
):
|
||||||
async_fire_time_changed(hass, dt_util.now() + timedelta(hours=3))
|
async_fire_time_changed(hass, dt_util.now() + timedelta(hours=3))
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
assert len(dev_reg.devices) == 5
|
assert len(dev_reg.devices) == 4
|
||||||
|
|
||||||
|
|
||||||
async def test_coordinator_updates(hass, caplog):
|
async def test_coordinator_updates(hass, caplog):
|
||||||
|
|
|
@ -24,7 +24,11 @@ def mock_all(aioclient_mock, request):
|
||||||
"http://127.0.0.1/info",
|
"http://127.0.0.1/info",
|
||||||
json={
|
json={
|
||||||
"result": "ok",
|
"result": "ok",
|
||||||
"data": {"supervisor": "222", "homeassistant": "0.110.0", "hassos": None},
|
"data": {
|
||||||
|
"supervisor": "222",
|
||||||
|
"homeassistant": "0.110.0",
|
||||||
|
"hassos": "1.2.3",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
aioclient_mock.get(
|
aioclient_mock.get(
|
||||||
|
|
|
@ -25,7 +25,11 @@ def mock_all(aioclient_mock, request):
|
||||||
"http://127.0.0.1/info",
|
"http://127.0.0.1/info",
|
||||||
json={
|
json={
|
||||||
"result": "ok",
|
"result": "ok",
|
||||||
"data": {"supervisor": "222", "homeassistant": "0.110.0", "hassos": None},
|
"data": {
|
||||||
|
"supervisor": "222",
|
||||||
|
"homeassistant": "0.110.0",
|
||||||
|
"hassos": "1.2.3",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
aioclient_mock.get(
|
aioclient_mock.get(
|
||||||
|
@ -483,3 +487,25 @@ async def test_not_release_notes(hass, aioclient_mock, hass_ws_client):
|
||||||
)
|
)
|
||||||
result = await client.receive_json()
|
result = await client.receive_json()
|
||||||
assert result["result"] is None
|
assert result["result"] is None
|
||||||
|
|
||||||
|
|
||||||
|
async def test_no_os_entity(hass):
|
||||||
|
"""Test handling where there is no os entity."""
|
||||||
|
with patch.dict(os.environ, MOCK_ENVIRON), patch(
|
||||||
|
"homeassistant.components.hassio.HassIO.get_info",
|
||||||
|
return_value={
|
||||||
|
"supervisor": "222",
|
||||||
|
"homeassistant": "0.110.0",
|
||||||
|
"hassos": None,
|
||||||
|
},
|
||||||
|
):
|
||||||
|
result = await async_setup_component(
|
||||||
|
hass,
|
||||||
|
"hassio",
|
||||||
|
{"http": {"server_port": 9999, "server_host": "127.0.0.1"}, "hassio": {}},
|
||||||
|
)
|
||||||
|
assert result
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
|
# Verify that the entity does not exist
|
||||||
|
assert not hass.states.get("update.home_assistant_operating_system_update")
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue