mirror of
https://github.com/home-assistant/core.git
synced 2025-08-01 17:48:26 +00:00
Also merge config entries
This commit is contained in:
parent
8d06baf0a5
commit
d77c4cda0c
@ -1146,12 +1146,14 @@ class DeviceRegistry(BaseRegistry[dict[str, list[dict[str, Any]]]]):
|
|||||||
# device in the set
|
# device in the set
|
||||||
main_device = self.devices[next(iter(device_ids))]
|
main_device = self.devices[next(iter(device_ids))]
|
||||||
|
|
||||||
|
merged_config_entries = set()
|
||||||
merged_connections = set()
|
merged_connections = set()
|
||||||
merged_identifiers = set()
|
merged_identifiers = set()
|
||||||
|
|
||||||
# Disable other devices, and clear their connections and identifiers
|
# Disable other devices, and clear their connections and identifiers
|
||||||
for device_id in device_ids:
|
for device_id in device_ids:
|
||||||
device = self.devices[device_id]
|
device = self.devices[device_id]
|
||||||
|
merged_config_entries |= device.config_entries
|
||||||
merged_connections |= device.connections
|
merged_connections |= device.connections
|
||||||
merged_identifiers |= device.identifiers
|
merged_identifiers |= device.identifiers
|
||||||
|
|
||||||
@ -1170,6 +1172,11 @@ class DeviceRegistry(BaseRegistry[dict[str, list[dict[str, Any]]]]):
|
|||||||
new_connections=merged_connections,
|
new_connections=merged_connections,
|
||||||
new_identifiers=merged_identifiers,
|
new_identifiers=merged_identifiers,
|
||||||
)
|
)
|
||||||
|
for config_entry_id in merged_config_entries:
|
||||||
|
self.async_update_device(
|
||||||
|
main_device.id,
|
||||||
|
add_config_entry_id=config_entry_id,
|
||||||
|
)
|
||||||
|
|
||||||
return main_device
|
return main_device
|
||||||
|
|
||||||
|
@ -2829,17 +2829,19 @@ async def test_device_registry_connections_collision(
|
|||||||
hass: HomeAssistant, device_registry: dr.DeviceRegistry
|
hass: HomeAssistant, device_registry: dr.DeviceRegistry
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Test connection collisions in the device registry."""
|
"""Test connection collisions in the device registry."""
|
||||||
config_entry = MockConfigEntry()
|
config_entry_1 = MockConfigEntry()
|
||||||
config_entry.add_to_hass(hass)
|
config_entry_1.add_to_hass(hass)
|
||||||
|
config_entry_2 = MockConfigEntry()
|
||||||
|
config_entry_2.add_to_hass(hass)
|
||||||
|
|
||||||
device1 = device_registry.async_get_or_create(
|
device1 = device_registry.async_get_or_create(
|
||||||
config_entry_id=config_entry.entry_id,
|
config_entry_id=config_entry_1.entry_id,
|
||||||
connections={(dr.CONNECTION_NETWORK_MAC, "none")},
|
connections={(dr.CONNECTION_NETWORK_MAC, "none")},
|
||||||
manufacturer="manufacturer",
|
manufacturer="manufacturer",
|
||||||
model="model",
|
model="model",
|
||||||
)
|
)
|
||||||
device2 = device_registry.async_get_or_create(
|
device2 = device_registry.async_get_or_create(
|
||||||
config_entry_id=config_entry.entry_id,
|
config_entry_id=config_entry_1.entry_id,
|
||||||
connections={(dr.CONNECTION_NETWORK_MAC, "none")},
|
connections={(dr.CONNECTION_NETWORK_MAC, "none")},
|
||||||
manufacturer="manufacturer",
|
manufacturer="manufacturer",
|
||||||
model="model",
|
model="model",
|
||||||
@ -2848,7 +2850,7 @@ async def test_device_registry_connections_collision(
|
|||||||
assert device1.id == device2.id
|
assert device1.id == device2.id
|
||||||
|
|
||||||
device3 = device_registry.async_get_or_create(
|
device3 = device_registry.async_get_or_create(
|
||||||
config_entry_id=config_entry.entry_id,
|
config_entry_id=config_entry_2.entry_id,
|
||||||
identifiers={("bridgeid", "0123")},
|
identifiers={("bridgeid", "0123")},
|
||||||
manufacturer="manufacturer",
|
manufacturer="manufacturer",
|
||||||
model="model",
|
model="model",
|
||||||
@ -2898,7 +2900,7 @@ async def test_device_registry_connections_collision(
|
|||||||
# Attempt to implicitly merge connection for device3 with the same
|
# Attempt to implicitly merge connection for device3 with the same
|
||||||
# connection that already exists in device1
|
# connection that already exists in device1
|
||||||
device4 = device_registry.async_get_or_create(
|
device4 = device_registry.async_get_or_create(
|
||||||
config_entry_id=config_entry.entry_id,
|
config_entry_id=config_entry_2.entry_id,
|
||||||
identifiers={("bridgeid", "0123")},
|
identifiers={("bridgeid", "0123")},
|
||||||
connections={
|
connections={
|
||||||
(dr.CONNECTION_NETWORK_MAC, "EE:EE:EE:EE:EE:EE"),
|
(dr.CONNECTION_NETWORK_MAC, "EE:EE:EE:EE:EE:EE"),
|
||||||
@ -2924,8 +2926,16 @@ async def test_device_registry_connections_collision(
|
|||||||
|
|
||||||
assert duplicate_device.disabled_by is dr.DeviceEntryDisabler.DUPLICATE
|
assert duplicate_device.disabled_by is dr.DeviceEntryDisabler.DUPLICATE
|
||||||
assert main_device.disabled_by is None
|
assert main_device.disabled_by is None
|
||||||
|
assert duplicate_device.config_entries in (
|
||||||
|
{config_entry_1.entry_id},
|
||||||
|
{config_entry_2.entry_id},
|
||||||
|
)
|
||||||
assert duplicate_device.connections == set()
|
assert duplicate_device.connections == set()
|
||||||
assert duplicate_device.identifiers == {("homeassistant", duplicate_device.id)}
|
assert duplicate_device.identifiers == {("homeassistant", duplicate_device.id)}
|
||||||
|
assert main_device.config_entries == {
|
||||||
|
config_entry_1.entry_id,
|
||||||
|
config_entry_2.entry_id,
|
||||||
|
}
|
||||||
assert main_device.connections == {
|
assert main_device.connections == {
|
||||||
(dr.CONNECTION_NETWORK_MAC, "ee:ee:ee:ee:ee:ee"),
|
(dr.CONNECTION_NETWORK_MAC, "ee:ee:ee:ee:ee:ee"),
|
||||||
(dr.CONNECTION_NETWORK_MAC, "none"),
|
(dr.CONNECTION_NETWORK_MAC, "none"),
|
||||||
@ -2937,17 +2947,19 @@ async def test_device_registry_identifiers_collision(
|
|||||||
hass: HomeAssistant, device_registry: dr.DeviceRegistry
|
hass: HomeAssistant, device_registry: dr.DeviceRegistry
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Test identifiers collisions in the device registry."""
|
"""Test identifiers collisions in the device registry."""
|
||||||
config_entry = MockConfigEntry()
|
config_entry_1 = MockConfigEntry()
|
||||||
config_entry.add_to_hass(hass)
|
config_entry_1.add_to_hass(hass)
|
||||||
|
config_entry_2 = MockConfigEntry()
|
||||||
|
config_entry_2.add_to_hass(hass)
|
||||||
|
|
||||||
device1 = device_registry.async_get_or_create(
|
device1 = device_registry.async_get_or_create(
|
||||||
config_entry_id=config_entry.entry_id,
|
config_entry_id=config_entry_1.entry_id,
|
||||||
identifiers={("bridgeid", "0123")},
|
identifiers={("bridgeid", "0123")},
|
||||||
manufacturer="manufacturer",
|
manufacturer="manufacturer",
|
||||||
model="model",
|
model="model",
|
||||||
)
|
)
|
||||||
device2 = device_registry.async_get_or_create(
|
device2 = device_registry.async_get_or_create(
|
||||||
config_entry_id=config_entry.entry_id,
|
config_entry_id=config_entry_1.entry_id,
|
||||||
identifiers={("bridgeid", "0123")},
|
identifiers={("bridgeid", "0123")},
|
||||||
manufacturer="manufacturer",
|
manufacturer="manufacturer",
|
||||||
model="model",
|
model="model",
|
||||||
@ -2956,7 +2968,7 @@ async def test_device_registry_identifiers_collision(
|
|||||||
assert device1.id == device2.id
|
assert device1.id == device2.id
|
||||||
|
|
||||||
device3 = device_registry.async_get_or_create(
|
device3 = device_registry.async_get_or_create(
|
||||||
config_entry_id=config_entry.entry_id,
|
config_entry_id=config_entry_2.entry_id,
|
||||||
identifiers={("bridgeid", "4567")},
|
identifiers={("bridgeid", "4567")},
|
||||||
manufacturer="manufacturer",
|
manufacturer="manufacturer",
|
||||||
model="model",
|
model="model",
|
||||||
@ -2998,7 +3010,7 @@ async def test_device_registry_identifiers_collision(
|
|||||||
# Attempt to implicitly merge identifiers for device3 with the same
|
# Attempt to implicitly merge identifiers for device3 with the same
|
||||||
# connection that already exists in device1
|
# connection that already exists in device1
|
||||||
device4 = device_registry.async_get_or_create(
|
device4 = device_registry.async_get_or_create(
|
||||||
config_entry_id=config_entry.entry_id,
|
config_entry_id=config_entry_2.entry_id,
|
||||||
identifiers={("bridgeid", "4567"), ("bridgeid", "0123")},
|
identifiers={("bridgeid", "4567"), ("bridgeid", "0123")},
|
||||||
)
|
)
|
||||||
assert len(device_registry.devices) == 2
|
assert len(device_registry.devices) == 2
|
||||||
@ -3020,8 +3032,16 @@ async def test_device_registry_identifiers_collision(
|
|||||||
|
|
||||||
assert duplicate_device.disabled_by is dr.DeviceEntryDisabler.DUPLICATE
|
assert duplicate_device.disabled_by is dr.DeviceEntryDisabler.DUPLICATE
|
||||||
assert main_device.disabled_by is None
|
assert main_device.disabled_by is None
|
||||||
|
assert duplicate_device.config_entries in (
|
||||||
|
{config_entry_1.entry_id},
|
||||||
|
{config_entry_2.entry_id},
|
||||||
|
)
|
||||||
assert duplicate_device.connections == set()
|
assert duplicate_device.connections == set()
|
||||||
assert duplicate_device.identifiers == {("homeassistant", duplicate_device.id)}
|
assert duplicate_device.identifiers == {("homeassistant", duplicate_device.id)}
|
||||||
|
assert main_device.config_entries == {
|
||||||
|
config_entry_1.entry_id,
|
||||||
|
config_entry_2.entry_id,
|
||||||
|
}
|
||||||
assert main_device.connections == set()
|
assert main_device.connections == set()
|
||||||
assert main_device.identifiers == {("bridgeid", "0123"), ("bridgeid", "4567")}
|
assert main_device.identifiers == {("bridgeid", "0123"), ("bridgeid", "4567")}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user