splight-lib 4.0.0.dev5__tar.gz → 4.0.0.dev6__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/PKG-INFO +1 -1
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/setup.py +1 -1
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/component/abstract.py +25 -14
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/execution.py +39 -11
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib.egg-info/PKG-INFO +1 -1
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/LICENSE.txt +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/README.md +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/pyproject.toml +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/setup.cfg +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/__init__.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/abstract/__init__.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/abstract/client.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/auth/__init__.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/auth/exceptions.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/auth/mac_auth.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/auth/token.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/client/__init__.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/client/communication/__init__.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/client/communication/abstract.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/client/communication/classmap.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/client/communication/exceptions.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/client/communication/local_client.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/client/communication/remote_client.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/client/database/__init__.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/client/database/abstract.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/client/database/builder.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/client/database/classmap.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/client/database/local_client.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/client/database/remote_client.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/client/datalake/__init__.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/client/datalake/abstract.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/client/datalake/builder.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/client/datalake/local_client.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/client/datalake/remote_client.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/client/exceptions.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/client/file_handler.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/client/filter.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/client/hub/__init__.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/client/hub/abstract.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/client/hub/client.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/communication/__init__.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/communication/event_handler.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/component/__init__.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/component/exceptions.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/component/spec.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/constants.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/encryption.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/logging/__init__.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/logging/_internal.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/logging/component.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/logging/constants.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/logging/logging.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/models/__init__.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/models/alert.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/models/asset.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/models/attribute.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/models/base.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/models/communication.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/models/component.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/models/dashboard.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/models/data_address.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/models/event.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/models/exceptions.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/models/file.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/models/hub.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/models/native.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/models/pipeline.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/models/query.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/models/secret.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/models/setpoint.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/restclient/__init__.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/restclient/client.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/restclient/exceptions.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/restclient/types.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/settings.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/testing/__init__.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/utils/__init__.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/utils/custom_model.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/utils/hub.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/version.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/webhook.py +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib.egg-info/SOURCES.txt +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib.egg-info/dependency_links.txt +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib.egg-info/not-zip-safe +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib.egg-info/requires.txt +0 -0
- {splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib.egg-info/top_level.txt +0 -0
|
@@ -1,16 +1,13 @@
|
|
|
1
|
+
from abc import abstractmethod
|
|
1
2
|
import os
|
|
2
3
|
import sys
|
|
3
|
-
import traceback
|
|
4
4
|
from functools import partial
|
|
5
5
|
from tempfile import NamedTemporaryFile
|
|
6
6
|
from time import sleep
|
|
7
7
|
from typing import Dict, List, Optional, Type
|
|
8
8
|
|
|
9
|
-
from furl import furl
|
|
10
9
|
from pydantic import BaseModel, create_model
|
|
11
|
-
from retry import retry
|
|
12
10
|
|
|
13
|
-
from splight_lib.auth import SplightAuthToken
|
|
14
11
|
from splight_lib.client.communication import RemoteCommunicationClient
|
|
15
12
|
from splight_lib.communication.event_handler import (
|
|
16
13
|
command_event_handler,
|
|
@@ -18,7 +15,6 @@ from splight_lib.communication.event_handler import (
|
|
|
18
15
|
setpoint_event_handler,
|
|
19
16
|
)
|
|
20
17
|
from splight_lib.component.exceptions import (
|
|
21
|
-
DuplicatedComponentException,
|
|
22
18
|
InvalidBidingObject,
|
|
23
19
|
MissingBindingCallback,
|
|
24
20
|
MissingCommandCallback,
|
|
@@ -44,7 +40,6 @@ from splight_lib.models.setpoint import SetPoint
|
|
|
44
40
|
from splight_lib.restclient import (
|
|
45
41
|
ConnectError,
|
|
46
42
|
HTTPError,
|
|
47
|
-
SplightRestClient,
|
|
48
43
|
Timeout,
|
|
49
44
|
)
|
|
50
45
|
from splight_lib.settings import settings
|
|
@@ -83,16 +78,16 @@ class HealthCheckProcessor:
|
|
|
83
78
|
if not is_alive:
|
|
84
79
|
exc = self._engine.get_last_exception()
|
|
85
80
|
self._log_exception(exc)
|
|
86
|
-
self._logger.
|
|
87
|
-
"Healthcheck
|
|
81
|
+
self._logger.info(
|
|
82
|
+
"Healthcheck finished", tags=LogTags.RUNTIME
|
|
88
83
|
)
|
|
89
84
|
self._health_file.close()
|
|
90
|
-
self._logger.
|
|
85
|
+
self._logger.info(
|
|
91
86
|
"Healthcheck file removed: %s",
|
|
92
87
|
self._health_file,
|
|
93
88
|
tags=LogTags.RUNTIME,
|
|
94
89
|
)
|
|
95
|
-
|
|
90
|
+
break
|
|
96
91
|
sleep(self._HEALTHCHECK_INTERVAL)
|
|
97
92
|
|
|
98
93
|
def stop(self):
|
|
@@ -121,9 +116,9 @@ class SplightBaseComponent:
|
|
|
121
116
|
instance_id=component_id,
|
|
122
117
|
)
|
|
123
118
|
self._execution_engine = ExecutionClient()
|
|
124
|
-
|
|
119
|
+
self._health_check = HealthCheckProcessor(self._execution_engine)
|
|
125
120
|
self._health_check_thread = Thread(
|
|
126
|
-
target=
|
|
121
|
+
target=self._health_check.start, args=(), daemon=False
|
|
127
122
|
)
|
|
128
123
|
# We can't add the healthcheck thread into the execution engine
|
|
129
124
|
# because that thread should stop if any of the registered threads
|
|
@@ -184,6 +179,12 @@ class SplightBaseComponent:
|
|
|
184
179
|
def execution_engine(self) -> ExecutionClient:
|
|
185
180
|
return self._execution_engine
|
|
186
181
|
|
|
182
|
+
def _register_exit(self):
|
|
183
|
+
if self._execution_engine.get_last_exception():
|
|
184
|
+
sys.exit(1)
|
|
185
|
+
else:
|
|
186
|
+
sys.exit(0)
|
|
187
|
+
|
|
187
188
|
def _get_custom_type_model(
|
|
188
189
|
self, component_object: Dict[str, Type[ComponentObjectInstance]]
|
|
189
190
|
) -> BaseModel:
|
|
@@ -300,9 +301,19 @@ class SplightBaseComponent:
|
|
|
300
301
|
)
|
|
301
302
|
|
|
302
303
|
def start(self):
|
|
303
|
-
|
|
304
|
+
self.run_component()
|
|
305
|
+
|
|
306
|
+
# The following it for waiting for all threads to finish
|
|
307
|
+
for thread in self._execution_engine.threads:
|
|
308
|
+
thread.join()
|
|
309
|
+
|
|
310
|
+
self._health_check_thread.join()
|
|
311
|
+
self._register_exit()
|
|
304
312
|
|
|
305
313
|
def stop(self):
|
|
306
|
-
self._execution_engine.stop(self._health_check_thread)
|
|
307
314
|
self._execution_engine.terminate_all()
|
|
308
315
|
sys.exit(1)
|
|
316
|
+
|
|
317
|
+
@abstractmethod
|
|
318
|
+
def run_component(self) -> None:
|
|
319
|
+
raise NotImplementedError()
|
|
@@ -294,21 +294,38 @@ class ExecutionClient(AbstractClient):
|
|
|
294
294
|
self._register_exit_functions()
|
|
295
295
|
super(ExecutionClient, self).__init__(*args, **kwargs)
|
|
296
296
|
logger.info("Execution client initialized.", tags=LogTags.RUNTIME)
|
|
297
|
+
self._exc = None
|
|
298
|
+
self._thread_exc = None
|
|
297
299
|
|
|
298
300
|
def _register_exit_functions(self) -> None:
|
|
299
301
|
excepthook = sys.excepthook
|
|
302
|
+
thread_exchook = threading.excepthook
|
|
300
303
|
|
|
301
304
|
def wrap_excepthook(type, value, traceback):
|
|
305
|
+
self._exc = (type, value, traceback)
|
|
302
306
|
self.terminate_all()
|
|
303
307
|
excepthook(type, value, traceback)
|
|
304
308
|
|
|
305
|
-
|
|
309
|
+
def wrap_thread_excepthook(args):
|
|
310
|
+
self._thread_exc = (
|
|
311
|
+
args.exc_type,
|
|
312
|
+
args.exc_value,
|
|
313
|
+
args.exc_traceback,
|
|
314
|
+
)
|
|
315
|
+
self.terminate_all()
|
|
316
|
+
thread_exchook(args)
|
|
317
|
+
|
|
318
|
+
# atexit.register(self.terminate_all)
|
|
306
319
|
sys.excepthook = wrap_excepthook
|
|
320
|
+
threading.excepthook = wrap_thread_excepthook
|
|
307
321
|
|
|
308
322
|
def __del__(self) -> None:
|
|
309
323
|
self.terminate_all()
|
|
310
324
|
|
|
311
325
|
def terminate_all(self) -> None:
|
|
326
|
+
if hasattr(self, "_scheduler"):
|
|
327
|
+
self._scheduler.stop()
|
|
328
|
+
|
|
312
329
|
for p in self.processes:
|
|
313
330
|
p.terminate()
|
|
314
331
|
|
|
@@ -360,15 +377,19 @@ class ExecutionClient(AbstractClient):
|
|
|
360
377
|
# not using the execution client explicitly and is doing some
|
|
361
378
|
# processing directly in the main thread so the healtcheck should
|
|
362
379
|
# say the component is healthy.
|
|
363
|
-
main_thread = threading.main_thread()
|
|
380
|
+
# main_thread = threading.main_thread()
|
|
381
|
+
# threads_status = [
|
|
382
|
+
# p.is_alive() or p.exit_ok() for p in self.processes + self.threads
|
|
383
|
+
# ]
|
|
364
384
|
threads_status = [
|
|
365
|
-
p.is_alive()
|
|
385
|
+
p.is_alive() for p in self.processes + self.threads
|
|
366
386
|
]
|
|
367
|
-
return (
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
)
|
|
387
|
+
return all(threads_status)
|
|
388
|
+
# (
|
|
389
|
+
# main_thread.is_alive() or all(threads_status)
|
|
390
|
+
# if threads_status
|
|
391
|
+
# else main_thread.is_alive()
|
|
392
|
+
# )
|
|
372
393
|
|
|
373
394
|
def healthcheck(self) -> Tuple[bool, ComponentStatus]:
|
|
374
395
|
"""Check if the component is alive and return the status.
|
|
@@ -395,7 +416,14 @@ class ExecutionClient(AbstractClient):
|
|
|
395
416
|
It assumes that there is only one thread that crashed
|
|
396
417
|
Also, only works for the thread not the processes.
|
|
397
418
|
"""
|
|
398
|
-
broken_thread = [x.exc for x in self.threads if x.exc]
|
|
399
|
-
if
|
|
400
|
-
return
|
|
419
|
+
# broken_thread = [x.exc for x in self.threads if x.exc]
|
|
420
|
+
if self._exc:
|
|
421
|
+
return self._exc[1]
|
|
422
|
+
if self._thread_exc:
|
|
423
|
+
return self._thread_exc[1]
|
|
424
|
+
# if broken_thread:
|
|
425
|
+
# print("THREAD EXC")
|
|
426
|
+
# print(self._thread_exc)
|
|
427
|
+
# print()
|
|
428
|
+
# return broken_thread[0]
|
|
401
429
|
return None
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/client/communication/__init__.py
RENAMED
|
File without changes
|
{splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/client/communication/abstract.py
RENAMED
|
File without changes
|
{splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/client/communication/classmap.py
RENAMED
|
File without changes
|
{splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/client/communication/exceptions.py
RENAMED
|
File without changes
|
{splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/client/communication/local_client.py
RENAMED
|
File without changes
|
{splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/client/communication/remote_client.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/client/database/local_client.py
RENAMED
|
File without changes
|
{splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/client/database/remote_client.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/client/datalake/local_client.py
RENAMED
|
File without changes
|
{splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/client/datalake/remote_client.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{splight-lib-4.0.0.dev5 → splight-lib-4.0.0.dev6}/splight_lib/communication/event_handler.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|