|
43 | 43 | NodeNotExists,
|
44 | 44 | NodeNotReady,
|
45 | 45 | NodeNotResolving,
|
| 46 | + UpdateCheckError, |
| 47 | + UpdateError, |
46 | 48 | )
|
47 | 49 | from ..common.helpers.api import api_command
|
48 | 50 | from ..common.helpers.json import JSON_DECODE_EXCEPTIONS, json_loads
|
@@ -921,19 +923,15 @@ async def update_node(self, node_id: int, software_version: int) -> dict | None:
|
921 | 923 |
|
922 | 924 | update = await self._check_node_update(node_id, software_version)
|
923 | 925 | if update is None:
|
924 |
| - logging.error( |
925 |
| - "Software version %d is not available for node %d", |
926 |
| - software_version, |
927 |
| - node_id, |
| 926 | + raise UpdateCheckError( |
| 927 | + f"Software version {software_version} is not available for node {node_id}." |
928 | 928 | )
|
929 |
| - return None |
930 | 929 |
|
931 | 930 | if self.chip_controller is None:
|
932 | 931 | raise RuntimeError("Device Controller not initialized.")
|
933 | 932 |
|
934 | 933 | if not self._ota_provider:
|
935 |
| - LOGGER.warning("No OTA provider found, updates not possible.") |
936 |
| - return None |
| 934 | + raise UpdateError("No OTA provider found, updates not possible.") |
937 | 935 |
|
938 | 936 | # Add update to the OTA provider
|
939 | 937 | await self._ota_provider.download_update(update)
|
@@ -1011,26 +1009,33 @@ async def update_node(self, node_id: int, software_version: int) -> dict | None:
|
1011 | 1009 | )
|
1012 | 1010 | )
|
1013 | 1011 | if write_result[0].Status != Status.Success:
|
1014 |
| - logging.error("Failed writing adjusted OTA Provider App ACL.") |
| 1012 | + logging.error( |
| 1013 | + "Failed writing adjusted OTA Provider App ACL: Status %s.", |
| 1014 | + str(write_result[0].Status), |
| 1015 | + ) |
1015 | 1016 | await self.remove_node(ota_provider_node_id)
|
1016 |
| - return None |
| 1017 | + raise UpdateError("Error while setting up OTA Provider.") |
1017 | 1018 | except ChipStackError as ex:
|
1018 | 1019 | logging.exception("Failed adjusting OTA Provider App ACL.", exc_info=ex)
|
1019 | 1020 | await self.remove_node(ota_provider_node_id)
|
1020 |
| - else: |
1021 |
| - self._ota_provider.set_node_id(ota_provider_node_id) |
| 1021 | + raise UpdateError("Error while setting up OTA Provider.") from ex |
| 1022 | + |
| 1023 | + self._ota_provider.set_node_id(ota_provider_node_id) |
1022 | 1024 |
|
1023 | 1025 | # Notify node about the new update!
|
1024 |
| - await self.chip_controller.SendCommand( |
1025 |
| - nodeid=node_id, |
1026 |
| - endpoint=0, |
1027 |
| - payload=Clusters.OtaSoftwareUpdateRequestor.Commands.AnnounceOTAProvider( |
1028 |
| - providerNodeID=ota_provider_node_id, |
1029 |
| - vendorID=0, # TODO: Use Server Vendor ID |
1030 |
| - announcementReason=Clusters.OtaSoftwareUpdateRequestor.Enums.AnnouncementReasonEnum.kUpdateAvailable, |
| 1026 | + try: |
| 1027 | + await self.chip_controller.SendCommand( |
| 1028 | + nodeid=node_id, |
1031 | 1029 | endpoint=0,
|
1032 |
| - ), |
1033 |
| - ) |
| 1030 | + payload=Clusters.OtaSoftwareUpdateRequestor.Commands.AnnounceOTAProvider( |
| 1031 | + providerNodeID=ota_provider_node_id, |
| 1032 | + vendorID=self.server.vendor_id, |
| 1033 | + announcementReason=Clusters.OtaSoftwareUpdateRequestor.Enums.AnnouncementReasonEnum.kUpdateAvailable, |
| 1034 | + endpoint=ExternalOtaProvider.ENDPOINT_ID, |
| 1035 | + ), |
| 1036 | + ) |
| 1037 | + except ChipStackError as ex: |
| 1038 | + raise UpdateError("Error while announcing OTA Provider to node.") from ex |
1034 | 1039 |
|
1035 | 1040 | return update
|
1036 | 1041 |
|
@@ -1062,8 +1067,7 @@ async def _check_node_update(
|
1062 | 1067 | return None
|
1063 | 1068 |
|
1064 | 1069 | if "otaUrl" not in update:
|
1065 |
| - node_logger.warning("Update found, but no OTA URL provided.") |
1066 |
| - return None |
| 1070 | + raise UpdateCheckError("Update found, but no OTA URL provided.") |
1067 | 1071 |
|
1068 | 1072 | node_logger.info(
|
1069 | 1073 | "New software update found: %s (current %s).",
|
|
0 commit comments