From a1201a68832de2054cfaead63213bdf52ffb5e1b Mon Sep 17 00:00:00 2001 From: rajasd27 Date: Mon, 9 Jan 2023 12:52:21 -0600 Subject: [PATCH 1/3] updated device class and enums (#19) --- clearblade/cloud/iot_v1/config_manager.py | 72 ++++++++++++++--------- 1 file changed, 43 insertions(+), 29 deletions(-) diff --git a/clearblade/cloud/iot_v1/config_manager.py b/clearblade/cloud/iot_v1/config_manager.py index fb8cd559..8438b0cd 100644 --- a/clearblade/cloud/iot_v1/config_manager.py +++ b/clearblade/cloud/iot_v1/config_manager.py @@ -82,6 +82,11 @@ def _set_admin_clearblade_config(self): self._admin_config = ClearBladeConfig(system_key=system_key, auth_token=auth_token, api_url=api_url, project=project) + def _create_regional_config_from_env(self, systemKey:str = None, serviceAccountToken:str = None, url:str = None, region:str = None)-> ClearBladeConfig : + return ClearBladeConfig(system_key=systemKey, auth_token=serviceAccountToken, api_url=url, + region=region, project=self._admin_config.project) + + def _create_regional_config(self, regional_json: json = None)-> ClearBladeConfig : system_key = regional_json['systemKey'] auth_token = regional_json['serviceAccountToken'] @@ -102,20 +107,25 @@ def _set_regional_config(self, region:str = None, registry:str = None): if not region or not registry: raise Exception("Either location or registry name is not provided") - - sync_client = SyncClient(clearblade_config=self._admin_config) - request_body = {'region':region,'registry':registry, 'project':self._admin_config.project} - response = sync_client.post(api_name="getRegistryCredentials", is_webhook_folder=False, - request_body=request_body) - - if response.status_code != 200: - raise Exception( - f"\n\nRegistry Information not found! Please check if the given registry exists\nProject: {self._admin_config.project}\nRegistry: {registry}\nRegion: {region}" - ) - - response_json = response.json() - response_json['region'] = region - self._regional_config = self._create_regional_config(regional_json=response_json) + + system_key = os.environ.get("REGISTRY_SYSKEY") + registry_token = os.environ.get("REGISTRY_TOKEN") + url = os.environ.get("URL") + if (system_key and registry_token and url) : + self._regional_config = self._create_regional_config_from_env(systemKey=system_key , serviceAccountToken = registry_token, url = url, region = region) + else : + request_body = {'region':region,'registry':registry, 'project':self._admin_config.project} + sync_client = SyncClient(clearblade_config=self._admin_config) + response = sync_client.post(api_name="getRegistryCredentials", is_webhook_folder=False, + request_body=request_body) + if response.status_code != 200: + raise Exception( + f"\n\nRegistry Information not found! Please check if the given registry exists\nProject: {self._admin_config.project}\nRegistry: {registry}\nRegion: {region}" + ) + response_json = response.json() + response_json['region'] = region + self._regional_config = self._create_regional_config(regional_json=response_json) + async def _set_regional_config_async(self, region:str = None, registry:str = None): @@ -126,21 +136,25 @@ async def _set_regional_config_async(self, region:str = None, registry:str = Non if not registry: registry = self.registry_name - - async_client = AsyncClient(clearblade_config=self._admin_config) - request_body = {'region':region,'registry':registry, 'project':self._admin_config.project} - response = await async_client.post(api_name="getRegistryCredentials", - is_webhook_folder=False, - request_body=request_body) - - if response.status_code != 200: - raise Exception( - f"\n\nRegistry Information not found! Please check if the given registry exists\nProject: {self._admin_config.project}\nRegistry: {registry}\nRegion: {region}" - ) - - response_json = response.json() - response_json['region'] = region - self._regional_config = self._create_regional_config(regional_json=response_json) + system_key = os.environ.get("REGISTRY_SYSKEY") + registry_token = os.environ.get("REGISTRY_TOKEN") + url = os.environ.get("URL") + if (system_key and registry_token) : + self._regional_config = self._create_regional_config_from_env(systemKey=system_key , serviceAccountToken = registry_token, url = url, region = region) + else : + async_client = AsyncClient(clearblade_config=self._admin_config) + request_body = {'region':region,'registry':registry, 'project':self._admin_config.project} + response = await async_client.post(api_name="getRegistryCredentials", + is_webhook_folder=False, + request_body=request_body) + + if response.status_code != 200: + raise Exception( + f"\n\nRegistry Information not found! Please check if the given registry exists\nProject: {self._admin_config.project}\nRegistry: {registry}\nRegion: {region}" + ) + response_json = response.json() + response_json['region'] = region + self._regional_config = self._create_regional_config(regional_json=response_json) @property From c57b2ab15e2d2d0e2ec05bf1eb51bdab536768af Mon Sep 17 00:00:00 2001 From: rajasd27 Date: Mon, 9 Jan 2023 12:52:36 -0600 Subject: [PATCH 2/3] updated send_command function to base64 encode payload (#18) --- README.rst | 5 +++++ clearblade/cloud/iot_v1/config_manager.py | 4 ++-- clearblade/cloud/iot_v1/devices.py | 3 +-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/README.rst b/README.rst index 5cf93962..50bf0a61 100644 --- a/README.rst +++ b/README.rst @@ -118,6 +118,11 @@ Note about types of times and binaryData - If this environment variable is not set, or is set to any unexpeced values, then the default types listed previously are used. +- By default calls to some SDK functions cause a REST request to be sent to acquire the Registry API Keys found on the IoTCore UI Registry Details page. Those keys are cached for subsequent operations in order to improve performance. However these caches do not persist if the application is stopped and restarted as would be the case with typical serverless functions (e.g. Google Cloud Functions, AWS Lambda etc.). In order to improve the performance of those functions, the REST call can be prevented by passing the API Keys as environment variables: +1. **REGISTRY_URL**: **string** +2. **REGISTRY_SYSKEY**: **string** +3. **REGISTRY_TOKEN**: **string** + Note about running from source instead of PyPi (pip) module: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - To temporarily use the source code in this repo. instead of the installed PyPi (pip) module do the following: diff --git a/clearblade/cloud/iot_v1/config_manager.py b/clearblade/cloud/iot_v1/config_manager.py index 8438b0cd..4ac94e1b 100644 --- a/clearblade/cloud/iot_v1/config_manager.py +++ b/clearblade/cloud/iot_v1/config_manager.py @@ -110,7 +110,7 @@ def _set_regional_config(self, region:str = None, registry:str = None): system_key = os.environ.get("REGISTRY_SYSKEY") registry_token = os.environ.get("REGISTRY_TOKEN") - url = os.environ.get("URL") + url = os.environ.get("REGISTRY_URL") if (system_key and registry_token and url) : self._regional_config = self._create_regional_config_from_env(systemKey=system_key , serviceAccountToken = registry_token, url = url, region = region) else : @@ -138,7 +138,7 @@ async def _set_regional_config_async(self, region:str = None, registry:str = Non registry = self.registry_name system_key = os.environ.get("REGISTRY_SYSKEY") registry_token = os.environ.get("REGISTRY_TOKEN") - url = os.environ.get("URL") + url = os.environ.get("REGISTRY_URL") if (system_key and registry_token) : self._regional_config = self._create_regional_config_from_env(systemKey=system_key , serviceAccountToken = registry_token, url = url, region = region) else : diff --git a/clearblade/cloud/iot_v1/devices.py b/clearblade/cloud/iot_v1/devices.py index 97633860..08cdcd44 100644 --- a/clearblade/cloud/iot_v1/devices.py +++ b/clearblade/cloud/iot_v1/devices.py @@ -47,7 +47,6 @@ from .http_client import AsyncClient, SyncClient from .pagers import ListDevicesAsyncPager, ListDevicesPager import base64 -from .resources import DeviceCredential class ClearBladeDeviceManager(): @@ -70,7 +69,7 @@ def _prepare_for_send_command(self, if request is None: request = SendCommandToDeviceRequest(name, binary_data, subfolder) params = {'name':request.parent,'method':'sendCommandToDevice'} - body = {'binaryData':base64.b64encode(request.binary_data).decode("utf-8"), 'subfolder':request.sub_folder} + body = {'binaryData':base64.b64encode(request.binary_data).decode("utf-8")} return params,body From fbc2222dcfd77a672b496b56aeb668cbfc18cb2f Mon Sep 17 00:00:00 2001 From: Akash Sharma Date: Tue, 10 Jan 2023 04:38:14 -0800 Subject: [PATCH 3/3] Changed 'cloud_ack_time' to 'cloud_update_time' (#20) --- clearblade/cloud/iot_v1/device_types.py | 2 +- clearblade/cloud/iot_v1/devices.py | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/clearblade/cloud/iot_v1/device_types.py b/clearblade/cloud/iot_v1/device_types.py index dd21121a..a63d3524 100644 --- a/clearblade/cloud/iot_v1/device_types.py +++ b/clearblade/cloud/iot_v1/device_types.py @@ -634,4 +634,4 @@ def from_json(devices_list_json): if 'nextPageToken' in devices_list_json: next_page_token = devices_list_json['nextPageToken'] - return ListDevicesResponse(devices=devices, next_page_token=next_page_token) + return ListDevicesResponse(devices=devices, next_page_token=next_page_token) \ No newline at end of file diff --git a/clearblade/cloud/iot_v1/devices.py b/clearblade/cloud/iot_v1/devices.py index 08cdcd44..244492e9 100644 --- a/clearblade/cloud/iot_v1/devices.py +++ b/clearblade/cloud/iot_v1/devices.py @@ -47,6 +47,7 @@ from .http_client import AsyncClient, SyncClient from .pagers import ListDevicesAsyncPager, ListDevicesPager import base64 +from .resources import DeviceCredential class ClearBladeDeviceManager(): @@ -69,7 +70,7 @@ def _prepare_for_send_command(self, if request is None: request = SendCommandToDeviceRequest(name, binary_data, subfolder) params = {'name':request.parent,'method':'sendCommandToDevice'} - body = {'binaryData':base64.b64encode(request.binary_data).decode("utf-8")} + body = {'binaryData':base64.b64encode(request.binary_data).decode("utf-8"), 'subfolder':request.sub_folder} return params,body @@ -489,4 +490,4 @@ async def config_versions_list_async(self, if response.status_code == 200: return ListDeviceConfigVersionsResponse.from_json(response.json()) - return response + return response \ No newline at end of file