From 0d713809e723dd676edd3334456a2cc8379882d8 Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Sat, 4 Feb 2023 12:33:17 +0100 Subject: [PATCH] Store preferred dataset separately in thread dataset store (#87378) --- .../components/thread/dataset_store.py | 19 +++++++++++-------- .../components/thread/websocket_api.py | 3 ++- tests/components/thread/test_dataset_store.py | 14 +++++++------- 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/homeassistant/components/thread/dataset_store.py b/homeassistant/components/thread/dataset_store.py index d19828d14d8..f3f70f65eef 100644 --- a/homeassistant/components/thread/dataset_store.py +++ b/homeassistant/components/thread/dataset_store.py @@ -24,7 +24,6 @@ SAVE_DELAY = 10 class DatasetEntry: """Dataset store entry.""" - preferred: bool source: str tlv: str @@ -56,7 +55,6 @@ class DatasetEntry: return { "created": self.created.isoformat(), "id": self.id, - "preferred": self.preferred, "source": self.source, "tlv": self.tlv, } @@ -69,7 +67,8 @@ class DatasetStore: """Initialize the dataset store.""" self.hass = hass self.datasets: dict[str, DatasetEntry] = {} - self._store: Store[dict[str, list[dict[str, Any]]]] = Store( + self.preferred_dataset: str | None = None + self._store: Store[dict[str, Any]] = Store( hass, STORAGE_VERSION_MAJOR, STORAGE_KEY, @@ -86,10 +85,11 @@ class DatasetStore: if any(entry for entry in self.datasets.values() if entry.dataset == dataset): return - # Set to preferred if this is the first dataset - preferred = not bool(self.datasets) - entry = DatasetEntry(preferred=preferred, source=source, tlv=tlv) + entry = DatasetEntry(source=source, tlv=tlv) self.datasets[entry.id] = entry + # Set to preferred if there is no preferred dataset + if self.preferred_dataset is None: + self.preferred_dataset = entry.id self.async_schedule_save() @callback @@ -102,6 +102,7 @@ class DatasetStore: data = await self._store.async_load() datasets: dict[str, DatasetEntry] = {} + preferred_dataset: str | None = None if data is not None: for dataset in data["datasets"]: @@ -109,12 +110,13 @@ class DatasetStore: datasets[dataset["id"]] = DatasetEntry( created=created, id=dataset["id"], - preferred=dataset["preferred"], source=dataset["source"], tlv=dataset["tlv"], ) + preferred_dataset = data["preferred_dataset"] self.datasets = datasets + self.preferred_dataset = preferred_dataset @callback def async_schedule_save(self) -> None: @@ -124,8 +126,9 @@ class DatasetStore: @callback def _data_to_save(self) -> dict[str, list[dict[str, str | None]]]: """Return data of datasets to store in a file.""" - data = {} + data: dict[str, Any] = {} data["datasets"] = [dataset.to_json() for dataset in self.datasets.values()] + data["preferred_dataset"] = self.preferred_dataset return data diff --git a/homeassistant/components/thread/websocket_api.py b/homeassistant/components/thread/websocket_api.py index 82ac2a7e4c1..97303f0ea7d 100644 --- a/homeassistant/components/thread/websocket_api.py +++ b/homeassistant/components/thread/websocket_api.py @@ -85,6 +85,7 @@ async def ws_list_datasets( store = await dataset_store.async_get_store(hass) result = [] + preferred_dataset = store.preferred_dataset for dataset in store.datasets.values(): result.append( { @@ -93,7 +94,7 @@ async def ws_list_datasets( "extended_pan_id": dataset.extended_pan_id, "network_name": dataset.network_name, "pan_id": dataset.pan_id, - "preferred": dataset.preferred, + "preferred": dataset.id == preferred_dataset, "source": dataset.source, } ) diff --git a/tests/components/thread/test_dataset_store.py b/tests/components/thread/test_dataset_store.py index 483a3f68080..f79a81e6dd7 100644 --- a/tests/components/thread/test_dataset_store.py +++ b/tests/components/thread/test_dataset_store.py @@ -122,9 +122,7 @@ async def test_load_datasets(hass: HomeAssistant) -> None: if dataset.source == "🎅": dataset_3_store_1 = dataset - assert dataset_1_store_1.preferred - assert not dataset_2_store_1.preferred - assert not dataset_3_store_1.preferred + assert store1.preferred_dataset == dataset_1_store_1.id store2 = dataset_store.DatasetStore(hass) await flush_store(store1._store) @@ -135,12 +133,15 @@ async def test_load_datasets(hass: HomeAssistant) -> None: for dataset in store2.datasets.values(): if dataset.source == "Google": dataset_1_store_2 = dataset + if dataset.source == "Multipan": + dataset_2_store_2 = dataset if dataset.source == "🎅": dataset_3_store_2 = dataset assert list(store1.datasets) == list(store2.datasets) assert dataset_1_store_1 == dataset_1_store_2 + assert dataset_2_store_1 == dataset_2_store_2 assert dataset_3_store_1 == dataset_3_store_2 @@ -154,27 +155,26 @@ async def test_loading_datasets_from_storage(hass: HomeAssistant, hass_storage) { "created": "2023-02-02T09:41:13.746514+00:00", "id": "id1", - "preferred": True, "source": "source_1", "tlv": "DATASET_1", }, { "created": "2023-02-02T09:41:13.746514+00:00", "id": "id2", - "preferred": True, "source": "source_2", "tlv": "DATASET_2", }, { "created": "2023-02-02T09:41:13.746514+00:00", "id": "id3", - "preferred": True, "source": "source_3", "tlv": "DATASET_3", }, - ] + ], + "preferred_dataset": "id1", }, } store = await dataset_store.async_get_store(hass) assert len(store.datasets) == 3 + assert store.preferred_dataset == "id1"