diff --git a/homeassistant/components/proxmoxve/coordinator.py b/homeassistant/components/proxmoxve/coordinator.py index 18225e5df12..493a9b91ab0 100644 --- a/homeassistant/components/proxmoxve/coordinator.py +++ b/homeassistant/components/proxmoxve/coordinator.py @@ -37,6 +37,7 @@ from .const import ( CONF_TOKEN_SECRET, DEFAULT_VERIFY_SSL, DOMAIN, + NODE_ONLINE, ) type ProxmoxConfigEntry = ConfigEntry[ProxmoxCoordinator] @@ -240,6 +241,13 @@ class ProxmoxCoordinator(DataUpdateCoordinator[dict[str, ProxmoxNodeData]]): node: dict[str, Any], ) -> tuple[list[dict[str, Any]], list[dict[str, Any]], list[dict[str, Any]]]: """Get vms, containers, and backups for a node.""" + if node.get("status") != NODE_ONLINE: + _LOGGER.debug( + "Node %s is offline, skipping VM/container fetch", + node[CONF_NODE], + ) + return [], [], [] + vms = self.proxmox.nodes(node[CONF_NODE]).qemu.get() or [] containers = self.proxmox.nodes(node[CONF_NODE]).lxc.get() or [] backups = ( diff --git a/tests/components/proxmoxve/conftest.py b/tests/components/proxmoxve/conftest.py index 2031fd60c24..4ed8f7e8816 100644 --- a/tests/components/proxmoxve/conftest.py +++ b/tests/components/proxmoxve/conftest.py @@ -170,6 +170,7 @@ def mock_proxmox_client(): mock_instance.nodes = nodes_mock mock_instance._node_mock = node_mock mock_instance._nodes_mock = nodes_mock + mock_instance._all_nodes = all_nodes yield mock_instance diff --git a/tests/components/proxmoxve/fixtures/nodes/nodes.json b/tests/components/proxmoxve/fixtures/nodes/nodes.json index 17e85c0567a..020c249f90d 100644 --- a/tests/components/proxmoxve/fixtures/nodes/nodes.json +++ b/tests/components/proxmoxve/fixtures/nodes/nodes.json @@ -28,5 +28,20 @@ "maxdisk": 500000000000, "disk": 120000000000, "ssl_fingerprint": "7A:E1:DF:...:AC" + }, + { + "id": "node/pve3", + "node": "pve3", + "status": "offline", + "level": "", + "type": "node", + "maxmem": 0, + "mem": 0, + "maxcpu": 0, + "cpu": 0, + "uptime": 0, + "maxdisk": 0, + "disk": 0, + "ssl_fingerprint": "3F:B9:CC:...:01" } ] diff --git a/tests/components/proxmoxve/test_init.py b/tests/components/proxmoxve/test_init.py index 66734b827b1..205e54f1e33 100644 --- a/tests/components/proxmoxve/test_init.py +++ b/tests/components/proxmoxve/test_init.py @@ -29,6 +29,8 @@ from homeassistant.const import ( CONF_PORT, CONF_USERNAME, CONF_VERIFY_SSL, + STATE_OFF, + STATE_ON, ) from homeassistant.core import DOMAIN as HOMEASSISTANT_DOMAIN, HomeAssistant from homeassistant.helpers import device_registry as dr, entity_registry as er @@ -233,6 +235,24 @@ async def test_migration_v1_to_v3( assert container_entity_after.unique_id == f"{entry.entry_id}_200_status" +async def test_offline_node( + hass: HomeAssistant, + mock_proxmox_client: MagicMock, + mock_config_entry: MockConfigEntry, +) -> None: + """Test that an offline node doesn't cause the entire update to fail.""" + mock_proxmox_client.nodes.get.return_value = mock_proxmox_client._all_nodes + await setup_integration(hass, mock_config_entry) + + assert mock_config_entry.state is ConfigEntryState.LOADED + + state = hass.states.get("binary_sensor.pve1_status") + assert state.state == STATE_ON + + state = hass.states.get("binary_sensor.pve3_status") + assert state.state == STATE_OFF + + async def test_migration_v2_to_v3( hass: HomeAssistant, ) -> None: