naeural-client 2.0.0__py3-none-any.whl
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.
- naeural_client/__init__.py +13 -0
- naeural_client/_ver.py +13 -0
- naeural_client/base/__init__.py +6 -0
- naeural_client/base/distributed_custom_code_presets.py +44 -0
- naeural_client/base/generic_session.py +1763 -0
- naeural_client/base/instance.py +616 -0
- naeural_client/base/payload/__init__.py +1 -0
- naeural_client/base/payload/payload.py +66 -0
- naeural_client/base/pipeline.py +1499 -0
- naeural_client/base/plugin_template.py +5209 -0
- naeural_client/base/responses.py +209 -0
- naeural_client/base/transaction.py +157 -0
- naeural_client/base_decentra_object.py +143 -0
- naeural_client/bc/__init__.py +3 -0
- naeural_client/bc/base.py +1046 -0
- naeural_client/bc/chain.py +0 -0
- naeural_client/bc/ec.py +324 -0
- naeural_client/certs/__init__.py +0 -0
- naeural_client/certs/r9092118.ala.eu-central-1.emqxsl.com.crt +22 -0
- naeural_client/code_cheker/__init__.py +1 -0
- naeural_client/code_cheker/base.py +520 -0
- naeural_client/code_cheker/checker.py +294 -0
- naeural_client/comm/__init__.py +2 -0
- naeural_client/comm/amqp_wrapper.py +338 -0
- naeural_client/comm/mqtt_wrapper.py +539 -0
- naeural_client/const/README.md +3 -0
- naeural_client/const/__init__.py +9 -0
- naeural_client/const/base.py +101 -0
- naeural_client/const/comms.py +80 -0
- naeural_client/const/environment.py +26 -0
- naeural_client/const/formatter.py +7 -0
- naeural_client/const/heartbeat.py +111 -0
- naeural_client/const/misc.py +20 -0
- naeural_client/const/payload.py +190 -0
- naeural_client/default/__init__.py +1 -0
- naeural_client/default/instance/__init__.py +4 -0
- naeural_client/default/instance/chain_dist_custom_job_01_plugin.py +54 -0
- naeural_client/default/instance/custom_web_app_01_plugin.py +118 -0
- naeural_client/default/instance/net_mon_01_plugin.py +45 -0
- naeural_client/default/instance/view_scene_01_plugin.py +28 -0
- naeural_client/default/session/mqtt_session.py +72 -0
- naeural_client/io_formatter/__init__.py +2 -0
- naeural_client/io_formatter/base/__init__.py +1 -0
- naeural_client/io_formatter/base/base_formatter.py +80 -0
- naeural_client/io_formatter/default/__init__.py +3 -0
- naeural_client/io_formatter/default/a_dummy.py +51 -0
- naeural_client/io_formatter/default/aixp1.py +113 -0
- naeural_client/io_formatter/default/default.py +22 -0
- naeural_client/io_formatter/io_formatter_manager.py +96 -0
- naeural_client/logging/__init__.py +1 -0
- naeural_client/logging/base_logger.py +2056 -0
- naeural_client/logging/logger_mixins/__init__.py +12 -0
- naeural_client/logging/logger_mixins/class_instance_mixin.py +92 -0
- naeural_client/logging/logger_mixins/computer_vision_mixin.py +443 -0
- naeural_client/logging/logger_mixins/datetime_mixin.py +344 -0
- naeural_client/logging/logger_mixins/download_mixin.py +421 -0
- naeural_client/logging/logger_mixins/general_serialization_mixin.py +242 -0
- naeural_client/logging/logger_mixins/json_serialization_mixin.py +481 -0
- naeural_client/logging/logger_mixins/pickle_serialization_mixin.py +301 -0
- naeural_client/logging/logger_mixins/process_mixin.py +63 -0
- naeural_client/logging/logger_mixins/resource_size_mixin.py +81 -0
- naeural_client/logging/logger_mixins/timers_mixin.py +501 -0
- naeural_client/logging/logger_mixins/upload_mixin.py +260 -0
- naeural_client/logging/logger_mixins/utils_mixin.py +675 -0
- naeural_client/logging/small_logger.py +93 -0
- naeural_client/logging/tzlocal/__init__.py +20 -0
- naeural_client/logging/tzlocal/unix.py +231 -0
- naeural_client/logging/tzlocal/utils.py +113 -0
- naeural_client/logging/tzlocal/win32.py +151 -0
- naeural_client/logging/tzlocal/windows_tz.py +718 -0
- naeural_client/plugins_manager_mixin.py +273 -0
- naeural_client/utils/__init__.py +2 -0
- naeural_client/utils/comm_utils.py +44 -0
- naeural_client/utils/dotenv.py +75 -0
- naeural_client-2.0.0.dist-info/METADATA +365 -0
- naeural_client-2.0.0.dist-info/RECORD +78 -0
- naeural_client-2.0.0.dist-info/WHEEL +4 -0
- naeural_client-2.0.0.dist-info/licenses/LICENSE +201 -0
@@ -0,0 +1,80 @@
|
|
1
|
+
from . import base as BASE_CT
|
2
|
+
# BC Consts:
|
3
|
+
from ..bc.base import BCct as BC_CT
|
4
|
+
|
5
|
+
SB_ID = BASE_CT.SB_ID
|
6
|
+
EE_ID = BASE_CT.EE_ID
|
7
|
+
EE_ADDR = 'EE_ADDR'
|
8
|
+
|
9
|
+
HOST = 'HOST'
|
10
|
+
TOPIC = 'TOPIC'
|
11
|
+
BROKER = 'BROKER'
|
12
|
+
PORT = 'PORT'
|
13
|
+
USER = 'USER'
|
14
|
+
PASS = 'PASS'
|
15
|
+
CERT_PATH = 'CERT_PATH'
|
16
|
+
VHOST = 'VHOST'
|
17
|
+
DEVICE_ID = 'DEVICE_ID'
|
18
|
+
ROUTING_KEY = 'ROUTING_KEY'
|
19
|
+
QOS = 'QOS'
|
20
|
+
SECURED = 'SECURED'
|
21
|
+
|
22
|
+
EXCHANGE = 'EXCHANGE'
|
23
|
+
EXCHANGE_TYPE = 'EXCHANGE_TYPE'
|
24
|
+
QUEUE = 'QUEUE'
|
25
|
+
QUEUE_DURABLE = 'QUEUE_DURABLE'
|
26
|
+
QUEUE_EXCLUSIVE = 'QUEUE_EXCLUSIVE'
|
27
|
+
QUEUE_DEVICE_SPECIFIC = 'QUEUE_DEVICE_SPECIFIC'
|
28
|
+
|
29
|
+
COMMUNICATION_CONFIG_CHANNEL = 'CONFIG_CHANNEL'
|
30
|
+
COMMUNICATION_PAYLOADS_CHANNEL = 'PAYLOADS_CHANNEL'
|
31
|
+
COMMUNICATION_CTRL_CHANNEL = 'CTRL_CHANNEL'
|
32
|
+
COMMUNICATION_NOTIF_CHANNEL = 'NOTIF_CHANNEL'
|
33
|
+
COMMUNICATION_VALID_CHANNELS = [
|
34
|
+
COMMUNICATION_CONFIG_CHANNEL, COMMUNICATION_PAYLOADS_CHANNEL,
|
35
|
+
COMMUNICATION_CTRL_CHANNEL, COMMUNICATION_NOTIF_CHANNEL
|
36
|
+
]
|
37
|
+
COMMUNICATION_DEFAULT = 'DEFAULT'
|
38
|
+
COMMUNICATION_COMMAND_AND_CONTROL = 'COMMANDCONTROL'
|
39
|
+
COMMUNICATION_HEARTBEATS = 'HEARTBEATS'
|
40
|
+
COMMUNICATION_NOTIFICATIONS = 'NOTIFICATIONS'
|
41
|
+
COMMUNICATION_VALID_TYPES = [
|
42
|
+
COMMUNICATION_DEFAULT, COMMUNICATION_COMMAND_AND_CONTROL,
|
43
|
+
COMMUNICATION_HEARTBEATS, COMMUNICATION_NOTIFICATIONS
|
44
|
+
]
|
45
|
+
|
46
|
+
|
47
|
+
class TIMERS:
|
48
|
+
TIMER_SEND_BUFFER_PAYLOAD = 'send_buffer_payload'
|
49
|
+
|
50
|
+
|
51
|
+
class COMM_SEND_MESSAGE:
|
52
|
+
K_ACTION = 'ACTION'
|
53
|
+
K_PAYLOAD = 'PAYLOAD'
|
54
|
+
K_EE_ID = EE_ID
|
55
|
+
K_INITIATOR_ID = 'INITIATOR_ID'
|
56
|
+
K_SESSION_ID = 'SESSION_ID'
|
57
|
+
K_SENDER_ADDR = BC_CT.SENDER
|
58
|
+
K_TIME = 'TIME'
|
59
|
+
K_EE_IS_ENCRYPTED = "EE_IS_ENCRYPTED"
|
60
|
+
K_EE_ENCRYPTED_DATA = "EE_ENCRYPTED_DATA"
|
61
|
+
|
62
|
+
ACTION_VALUE_PAYLOAD = K_PAYLOAD
|
63
|
+
|
64
|
+
|
65
|
+
class COMM_RECV_MESSAGE:
|
66
|
+
K_ACTION = COMM_SEND_MESSAGE.K_ACTION
|
67
|
+
K_PAYLOAD = COMM_SEND_MESSAGE.K_PAYLOAD
|
68
|
+
K_EE_ID = COMM_SEND_MESSAGE.K_EE_ID
|
69
|
+
K_INITIATOR_ID = COMM_SEND_MESSAGE.K_INITIATOR_ID
|
70
|
+
K_SESSION_ID = COMM_SEND_MESSAGE.K_SESSION_ID
|
71
|
+
K_SENDER_ADDR = COMM_SEND_MESSAGE.K_SENDER_ADDR
|
72
|
+
K_EE_IS_ENCRYPTED = COMM_SEND_MESSAGE.K_EE_IS_ENCRYPTED
|
73
|
+
K_EE_ENCRYPTED_DATA = COMM_SEND_MESSAGE.K_EE_ENCRYPTED_DATA
|
74
|
+
|
75
|
+
K_VALIDATED = 'VALIDATED' # this is a flag to indicate if the message was validated or not
|
76
|
+
|
77
|
+
|
78
|
+
COMM_SEND_BUFFER = 100
|
79
|
+
COMM_RECV_BUFFER = 100
|
80
|
+
COMM_SECS_SHOW_INFO = 180
|
@@ -0,0 +1,26 @@
|
|
1
|
+
class ENVIRONMENT:
|
2
|
+
AIXP_USERNAME = 'AIXP_USERNAME'
|
3
|
+
AIXP_USER = 'AIXP_USER'
|
4
|
+
EE_USERNAME = 'EE_USERNAME'
|
5
|
+
EE_USER = 'EE_USER'
|
6
|
+
|
7
|
+
AIXP_PASSWORD = 'AIXP_PASSWORD'
|
8
|
+
AIXP_PASS = 'AIXP_PASS'
|
9
|
+
AIXP_PWD = 'AIXP_PWD'
|
10
|
+
EE_PASSWORD = 'EE_PASSWORD'
|
11
|
+
EE_PASS = 'EE_PASS'
|
12
|
+
EE_PWD = 'EE_PWD'
|
13
|
+
|
14
|
+
AIXP_HOSTNAME = 'AIXP_HOSTNAME'
|
15
|
+
AIXP_HOST = 'AIXP_HOST'
|
16
|
+
EE_HOSTNAME = 'EE_HOSTNAME'
|
17
|
+
EE_HOST = 'EE_HOST'
|
18
|
+
|
19
|
+
AIXP_PORT = 'AIXP_PORT'
|
20
|
+
EE_PORT = 'EE_PORT'
|
21
|
+
|
22
|
+
AIXP_CERT_PATH = 'AIXP_CERT_PATH'
|
23
|
+
EE_CERT_PATH = 'EE_CERT_PATH'
|
24
|
+
|
25
|
+
EE_SECURED = 'EE_SECURED'
|
26
|
+
AIXP_SECURED = 'AIXP_SECURED'
|
@@ -0,0 +1,111 @@
|
|
1
|
+
"""
|
2
|
+
This is the inter-repo portable constant file for heartbeats
|
3
|
+
"""
|
4
|
+
|
5
|
+
HEARTBEAT_VERSION = 'HEARTBEAT_VERSION'
|
6
|
+
V1 = 'v1'
|
7
|
+
V2 = 'v2'
|
8
|
+
|
9
|
+
# ALERTS
|
10
|
+
IS_ALERT_RAM = 'IS_ALERT_RAM'
|
11
|
+
|
12
|
+
# End ALERTS
|
13
|
+
|
14
|
+
TIMESTAMP_FORMAT = "%Y-%m-%d %H:%M:%S.%f"
|
15
|
+
TIMESTAMP_FORMAT_SHORT = "%Y-%m-%d %H:%M:%S"
|
16
|
+
|
17
|
+
ENCODED_DATA = 'ENCODED_DATA'
|
18
|
+
|
19
|
+
INITIATOR_ID = 'INITIATOR_ID'
|
20
|
+
|
21
|
+
EE_HB_TIME = 'EE_HB_TIME'
|
22
|
+
EE_ADDR = 'EE_ADDR'
|
23
|
+
EE_WHITELIST = 'EE_WHITELIST'
|
24
|
+
EE_IS_SUPER = 'EE_IS_SUPER'
|
25
|
+
EE_FORMATTER = 'EE_FORMATTER'
|
26
|
+
|
27
|
+
SECURED = 'SECURED'
|
28
|
+
|
29
|
+
DEVICE_STATUS = 'DEVICE_STATUS'
|
30
|
+
MACHINE_IP = 'MACHINE_IP'
|
31
|
+
MACHINE_MEMORY = 'MACHINE_MEMORY'
|
32
|
+
AVAILABLE_MEMORY = 'AVAILABLE_MEMORY'
|
33
|
+
PROCESS_MEMORY = 'PROCESS_MEMORY'
|
34
|
+
CPU_USED = 'CPU_USED'
|
35
|
+
GPUS = 'GPUS'
|
36
|
+
GPU_INFO = 'GPU_INFO'
|
37
|
+
DEFAULT_CUDA = 'DEFAULT_CUDA'
|
38
|
+
CPU = 'CPU'
|
39
|
+
TIMESTAMP = 'TIMESTAMP'
|
40
|
+
CURRENT_TIME = 'CURRENT_TIME'
|
41
|
+
RECEIVED_TIME = 'RECEIVED_TIME'
|
42
|
+
UPTIME = 'UPTIME'
|
43
|
+
VERSION = 'VERSION'
|
44
|
+
TOTAL_DISK = 'TOTAL_DISK'
|
45
|
+
AVAILABLE_DISK = 'AVAILABLE_DISK'
|
46
|
+
ACTIVE_PLUGINS = 'ACTIVE_PLUGINS'
|
47
|
+
NR_INFERENCES = 'NR_INFERENCES'
|
48
|
+
NR_PAYLOADS = 'NR_PAYLOADS'
|
49
|
+
NR_STREAMS_DATA = 'NR_STREAMS_DATA'
|
50
|
+
GIT_BRANCH = 'GIT_BRANCH'
|
51
|
+
CONDA_ENV = 'CONDA_ENV'
|
52
|
+
SERVING_PIDS = 'SERVING_PIDS'
|
53
|
+
DCT_STATS = 'DCT_STATS'
|
54
|
+
COMM_STATS = 'COMM_STATS'
|
55
|
+
|
56
|
+
STOP_LOG = 'STOP_LOG'
|
57
|
+
|
58
|
+
TIMERS = 'TIMERS'
|
59
|
+
CONFIG_STREAMS = 'CONFIG_STREAMS'
|
60
|
+
PIPELINES = CONFIG_STREAMS
|
61
|
+
LOOPS_TIMINGS = 'LOOPS_TIMINGS'
|
62
|
+
DEVICE_LOG = 'DEVICE_LOG'
|
63
|
+
ERROR_LOG = 'ERROR_LOG'
|
64
|
+
|
65
|
+
LOGGER_VERSION = 'LOGGER_VERSION'
|
66
|
+
PY_VER = 'PY_VER'
|
67
|
+
|
68
|
+
TEMPERATURE_INFO = 'TEMPERATURE_INFO'
|
69
|
+
|
70
|
+
|
71
|
+
class COMM_INFO:
|
72
|
+
IN_KB = 'IN_KB'
|
73
|
+
OUT_KB = 'OUT_KB'
|
74
|
+
|
75
|
+
|
76
|
+
class ACTIVE_PLUGINS_INFO:
|
77
|
+
STREAM_ID = "STREAM_ID"
|
78
|
+
SIGNATURE = "SIGNATURE"
|
79
|
+
INSTANCE_ID = "INSTANCE_ID"
|
80
|
+
FREQUENCY = "FREQUENCY"
|
81
|
+
INIT_TIMESTAMP = "INIT_TIMESTAMP"
|
82
|
+
EXEC_TIMESTAMP = "EXEC_TIMESTAMP"
|
83
|
+
PROCESS_DELAY = "PROCESS_DELAY"
|
84
|
+
LAST_CONFIG_TIMESTAMP = "LAST_CONFIG_TIMESTAMP"
|
85
|
+
FIRST_ERROR_TIME = "FIRST_ERROR_TIME"
|
86
|
+
LAST_ERROR_TIME = "LAST_ERROR_TIME"
|
87
|
+
OUTSIDE_WORKING_HOURS = "OUTSIDE_WORKING_HOURS"
|
88
|
+
CURRENT_PROCESS_ITERATION = "CURRENT_PROCESS_ITERATION"
|
89
|
+
CURRENT_EXEC_ITERATION = "CURRENT_EXEC_ITERATION"
|
90
|
+
LAST_PAYLOAD_TIME = "LAST_PAYLOAD_TIME"
|
91
|
+
TOTAL_PAYLOAD_COUNT = "TOTAL_PAYLOAD_COUNT"
|
92
|
+
INFO = "INFO"
|
93
|
+
|
94
|
+
ACTIVE_PLUGINS_FIELDS = [
|
95
|
+
STREAM_ID,
|
96
|
+
SIGNATURE,
|
97
|
+
INSTANCE_ID,
|
98
|
+
|
99
|
+
FREQUENCY,
|
100
|
+
INIT_TIMESTAMP,
|
101
|
+
EXEC_TIMESTAMP,
|
102
|
+
LAST_CONFIG_TIMESTAMP,
|
103
|
+
FIRST_ERROR_TIME,
|
104
|
+
LAST_ERROR_TIME,
|
105
|
+
OUTSIDE_WORKING_HOURS,
|
106
|
+
CURRENT_PROCESS_ITERATION,
|
107
|
+
CURRENT_EXEC_ITERATION,
|
108
|
+
LAST_PAYLOAD_TIME,
|
109
|
+
TOTAL_PAYLOAD_COUNT,
|
110
|
+
INFO,
|
111
|
+
]
|
@@ -0,0 +1,190 @@
|
|
1
|
+
# BC Consts:
|
2
|
+
from ..bc.base import BCct as BC_CT
|
3
|
+
|
4
|
+
TLBR_POS = 'TLBR_POS'
|
5
|
+
PROB_PRC = 'PROB_PRC'
|
6
|
+
TYPE = 'TYPE'
|
7
|
+
|
8
|
+
NOTIFICATION_TYPE = 'NOTIFICATION_TYPE'
|
9
|
+
STATUS_TYPE_KEY = NOTIFICATION_TYPE
|
10
|
+
|
11
|
+
# Notification types
|
12
|
+
|
13
|
+
|
14
|
+
class STATUS_TYPE:
|
15
|
+
NOTIFICATION_TYPE = NOTIFICATION_TYPE
|
16
|
+
STATUS_NORMAL = 'NORMAL'
|
17
|
+
STATUS_EXCEPTION = 'EXCEPTION'
|
18
|
+
STATUS_EMAIL = 'EMAIL'
|
19
|
+
STATUS_ABNORMAL_FUNCTIONING = 'ABNORMAL FUNCTIONING'
|
20
|
+
|
21
|
+
|
22
|
+
class NOTIFICATION_CODES:
|
23
|
+
# pipelines from 1 to 99
|
24
|
+
PIPELINE_OK = 1 # basic config is ok
|
25
|
+
PIPELINE_FAILED = -PIPELINE_OK
|
26
|
+
|
27
|
+
PIPELINE_DATA_OK = PIPELINE_OK + 1 # data seems to flow
|
28
|
+
PIPELINE_DATA_FAILED = -PIPELINE_DATA_OK
|
29
|
+
|
30
|
+
PIPELINE_DCT_CONFIG_OK = PIPELINE_DATA_OK + 1 # dct config is ok
|
31
|
+
PIPELINE_DCT_CONFIG_FAILED = -PIPELINE_DCT_CONFIG_OK
|
32
|
+
|
33
|
+
PIPELINE_ARCHIVE_OK = PIPELINE_DCT_CONFIG_OK + 1 # archiving is ok
|
34
|
+
PIPELINE_ARCHIVE_FAILED = -PIPELINE_ARCHIVE_OK
|
35
|
+
|
36
|
+
# plugins from 100 to 999
|
37
|
+
PLUGIN_CONFIG_OK = 100
|
38
|
+
PLUGIN_CONFIG_FAILED = -PLUGIN_CONFIG_OK
|
39
|
+
|
40
|
+
PLUGIN_INSTANCE_COMMAND_OK = 101
|
41
|
+
PLUGIN_INSTANCE_COMMAND_FAILED = -PLUGIN_INSTANCE_COMMAND_OK
|
42
|
+
|
43
|
+
PLUGIN_PAUSE_OK = 110
|
44
|
+
PLUGIN_PAUSE_FAILED = -PLUGIN_PAUSE_OK
|
45
|
+
|
46
|
+
PLUGIN_RESUME_OK = 111
|
47
|
+
PLUGIN_RESUME_FAILED = -PLUGIN_RESUME_OK
|
48
|
+
|
49
|
+
PLUGIN_WORKING_HOURS_SHIFT_START = 112
|
50
|
+
PLUGIN_WORKING_HOURS_SHIFT_START_FAILED = -PLUGIN_WORKING_HOURS_SHIFT_START
|
51
|
+
|
52
|
+
PLUGIN_WORKING_HOURS_SHIFT_END = 113
|
53
|
+
PLUGIN_WORKING_HOURS_SHIFT_END_FAILED = -PLUGIN_WORKING_HOURS_SHIFT_END
|
54
|
+
|
55
|
+
PLUGIN_CONFIG_IN_PAUSE_OK = 120
|
56
|
+
PLUGIN_CONFIG_IN_PAUSE_FAILED = -PLUGIN_CONFIG_IN_PAUSE_OK
|
57
|
+
|
58
|
+
# BUSINESS NOTIFICATIONS FROM 500 to 899
|
59
|
+
|
60
|
+
# Example:
|
61
|
+
# PLUGIN_SOMETHING_OK = 610
|
62
|
+
# PLUGIN_SOMETHING_FAILED = -PLUGIN_SOMETHING_OK
|
63
|
+
|
64
|
+
# END BUSINESS NOTIFICATIONS FROM 500 to 899
|
65
|
+
|
66
|
+
PLUGIN_DELAYED = -999
|
67
|
+
|
68
|
+
# comms from 1000
|
69
|
+
COMMS_OK = 1000
|
70
|
+
|
71
|
+
COMM_RECEIVED_BAD_COMMAND = -5000
|
72
|
+
|
73
|
+
# serving from 10000
|
74
|
+
SERVING_START_OK = 10000
|
75
|
+
SERVING_START_FAILED = -SERVING_START_OK
|
76
|
+
SERVING_START_FATAL_FAIL = -99999
|
77
|
+
|
78
|
+
|
79
|
+
|
80
|
+
|
81
|
+
TAGS = {
|
82
|
+
PIPELINE_OK: "PIPELINE_OK",
|
83
|
+
PIPELINE_FAILED: "PIPELINE_FAILED",
|
84
|
+
PIPELINE_DATA_OK: "PIPELINE_DATA_OK",
|
85
|
+
PIPELINE_DATA_FAILED: "PIPELINE_DATA_FAILED",
|
86
|
+
PIPELINE_DCT_CONFIG_OK: "PIPELINE_DCT_CONFIG_OK",
|
87
|
+
PIPELINE_DCT_CONFIG_FAILED: "PIPELINE_DCT_CONFIG_FAILED",
|
88
|
+
PIPELINE_ARCHIVE_OK: "PIPELINE_ARCHIVE_OK",
|
89
|
+
PIPELINE_ARCHIVE_FAILED: "PIPELINE_ARCHIVE_FAILED",
|
90
|
+
|
91
|
+
PLUGIN_CONFIG_OK: "PLUGIN_CONFIG_OK",
|
92
|
+
PLUGIN_CONFIG_FAILED: "PLUGIN_CONFIG_FAILED",
|
93
|
+
PLUGIN_INSTANCE_COMMAND_OK: "PLUGIN_INSTANCE_COMMAND_OK",
|
94
|
+
PLUGIN_INSTANCE_COMMAND_FAILED: "PLUGIN_INSTANCE_COMMAND_FAILED",
|
95
|
+
PLUGIN_PAUSE_OK: "PLUGIN_PAUSE_OK",
|
96
|
+
PLUGIN_PAUSE_FAILED: "PLUGIN_PAUSE_FAILED",
|
97
|
+
PLUGIN_RESUME_OK: "PLUGIN_RESUME_OK",
|
98
|
+
PLUGIN_RESUME_FAILED: "PLUGIN_RESUME_FAILED",
|
99
|
+
PLUGIN_DELAYED: "PLUGIN_DELAYED",
|
100
|
+
PLUGIN_WORKING_HOURS_SHIFT_START: "PLUGIN_WORKING_HOURS_SHIFT_START",
|
101
|
+
PLUGIN_WORKING_HOURS_SHIFT_START_FAILED: "PLUGIN_WORKING_HOURS_SHIFT_START_FAILED",
|
102
|
+
PLUGIN_WORKING_HOURS_SHIFT_END: "PLUGIN_WORKING_HOURS_SHIFT_END",
|
103
|
+
PLUGIN_WORKING_HOURS_SHIFT_END_FAILED: "PLUGIN_WORKING_HOURS_SHIFT_END_FAILED",
|
104
|
+
|
105
|
+
PLUGIN_CONFIG_IN_PAUSE_OK: "PLUGIN_CONFIG_IN_PAUSE_OK",
|
106
|
+
PLUGIN_CONFIG_IN_PAUSE_FAILED: "PLUGIN_CONFIG_IN_PAUSE_FAILED",
|
107
|
+
|
108
|
+
SERVING_START_OK: "SERVING_START_OK",
|
109
|
+
SERVING_START_FAILED: "SERVING_START_FAILED",
|
110
|
+
SERVING_START_FATAL_FAIL: "SERVING_START_FATAL_FAIL",
|
111
|
+
|
112
|
+
COMM_RECEIVED_BAD_COMMAND: "COMM_RECEIVED_BAD_COMMAND",
|
113
|
+
|
114
|
+
}
|
115
|
+
CODES = {v: k for k, v in TAGS.items()}
|
116
|
+
|
117
|
+
# next section could be missing
|
118
|
+
PIPELINE_OK_TAG = TAGS[PIPELINE_OK]
|
119
|
+
PIPELINE_FAILED_TAG = TAGS[PIPELINE_FAILED]
|
120
|
+
|
121
|
+
PLUGIN_CONFIG_OK_TAG = TAGS[PLUGIN_CONFIG_OK]
|
122
|
+
PLUGIN_CONFIG_FAILED_TAG = TAGS[PLUGIN_CONFIG_FAILED]
|
123
|
+
|
124
|
+
|
125
|
+
class COMMANDS:
|
126
|
+
COMMANDS = 'COMMANDS'
|
127
|
+
RESTART = 'RESTART'
|
128
|
+
STATUS = 'STATUS'
|
129
|
+
STOP = 'STOP'
|
130
|
+
UPDATE_CONFIG = 'UPDATE_CONFIG'
|
131
|
+
DELETE_CONFIG = 'DELETE_CONFIG'
|
132
|
+
UPDATE_PIPELINE_INSTANCE = 'UPDATE_PIPELINE_INSTANCE'
|
133
|
+
BATCH_UPDATE_PIPELINE_INSTANCE = 'BATCH_UPDATE_PIPELINE_INSTANCE'
|
134
|
+
PIPELINE_COMMAND = 'PIPELINE_COMMAND'
|
135
|
+
ARCHIVE_CONFIG = 'ARCHIVE_CONFIG'
|
136
|
+
DELETE_CONFIG_ALL = 'DELETE_CONFIG_ALL'
|
137
|
+
ARCHIVE_CONFIG_ALL = 'ARCHIVE_CONFIG_ALL'
|
138
|
+
ACTIVE_PLUGINS = 'ACTIVE_PLUGINS'
|
139
|
+
RELOAD_CONFIG_FROM_DISK = 'RELOAD_CONFIG_FROM_DISK'
|
140
|
+
FULL_HEARTBEAT = 'FULL_HEARTBEAT'
|
141
|
+
TIMERS_ONLY_HEARTBEAT = 'TIMERS_ONLY_HEARTBEAT'
|
142
|
+
SIMPLE_HEARTBEAT = 'SIMPLE_HEARTBEAT'
|
143
|
+
INSTANCE_COMMAND = 'INSTANCE_COMMAND'
|
144
|
+
COMMAND_PARAMS = 'COMMAND_PARAMS'
|
145
|
+
|
146
|
+
FINISH_ACQUISITION = 'FINISH_ACQUISITION'
|
147
|
+
|
148
|
+
|
149
|
+
class PAYLOAD_DATA:
|
150
|
+
EE_ENCRYPTED_DATA = 'EE_ENCRYPTED_DATA'
|
151
|
+
EE_IS_ENCRYPTED = 'EE_IS_ENCRYPTED'
|
152
|
+
INITIATOR_ID = 'INITIATOR_ID'
|
153
|
+
INITIATOR_ADDR = 'INITIATOR_ADDR'
|
154
|
+
MODIFIED_BY_ID = 'MODIFIED_BY_ID'
|
155
|
+
MODIFIED_BY_ADDR = 'MODIFIED_BY_ADDR'
|
156
|
+
SESSION_ID = 'SESSION_ID'
|
157
|
+
STREAM_NAME = 'STREAM_NAME'
|
158
|
+
NAME = 'NAME'
|
159
|
+
INSTANCE_CONFIG = 'INSTANCE_CONFIG'
|
160
|
+
SIGNATURE = 'SIGNATURE'
|
161
|
+
INSTANCE_ID = 'INSTANCE_ID'
|
162
|
+
TIME = 'TIME'
|
163
|
+
EE_TIMESTAMP = 'EE_TIMESTAMP'
|
164
|
+
EE_TIMEZONE = 'EE_TIMEZONE'
|
165
|
+
EE_TZ = 'EE_TZ'
|
166
|
+
SB_TIMESTAMP = EE_TIMESTAMP
|
167
|
+
EE_MESSAGE_ID = 'EE_MESSAGE_ID'
|
168
|
+
EE_MESSAGE_SEQ = 'EE_MESSAGE_SEQ'
|
169
|
+
SB_MESSAGE_ID = EE_MESSAGE_ID
|
170
|
+
EE_TOTAL_MESSAGES = 'EE_TOTAL_MESSAGES'
|
171
|
+
SB_TOTAL_MESSAGES = EE_TOTAL_MESSAGES
|
172
|
+
EE_FORMATTER = 'EE_FORMATTER'
|
173
|
+
SB_IMPLEMENTATION = 'SB_IMPLEMENTATION'
|
174
|
+
EE_EVENT_TYPE = 'EE_EVENT_TYPE'
|
175
|
+
SB_EVENT_TYPE = 'SB_EVENT_TYPE'
|
176
|
+
EE_PAYLOAD_PATH = 'EE_PAYLOAD_PATH'
|
177
|
+
EE_PAYLOAD_INFO = 'EE_PAYLOAD_INFO'
|
178
|
+
EE_VERSION = 'EE_VERSION'
|
179
|
+
EE_ID = 'EE_ID'
|
180
|
+
EE_PIPELINE_NAME = 'EE_PIPELINE_NAME'
|
181
|
+
EE_SENDER = BC_CT.SENDER
|
182
|
+
EE_HASH = BC_CT.HASH
|
183
|
+
EE_SIGN = BC_CT.SIGN
|
184
|
+
|
185
|
+
NOTIFICATION = 'NOTIFICATION'
|
186
|
+
INFO = 'INFO'
|
187
|
+
|
188
|
+
TAGS = 'TAGS'
|
189
|
+
|
190
|
+
ID_TAGS = 'ID_TAGS'
|
@@ -0,0 +1 @@
|
|
1
|
+
from .session.mqtt_session import MqttSession
|
@@ -0,0 +1,54 @@
|
|
1
|
+
from ...base import Instance
|
2
|
+
|
3
|
+
|
4
|
+
class ChainDistCustomJob01(Instance):
|
5
|
+
signature = "PROCESS_REAL_TIME_COLLECTED_DATA_CUSTOM_EXEC_CHAIN_DIST"
|
6
|
+
|
7
|
+
def add_custom_code_callbacks(
|
8
|
+
self,
|
9
|
+
main_node_process_real_time_collected_data: callable,
|
10
|
+
main_node_finish_condition: callable,
|
11
|
+
main_node_finish_condition_kwargs: dict,
|
12
|
+
main_node_aggregate_collected_data: callable,
|
13
|
+
worker_node_code: callable,
|
14
|
+
):
|
15
|
+
self.update_instance_config(
|
16
|
+
config={
|
17
|
+
"CUSTOM_CODE_PROCESS_REAL_TIME_COLLECTED_DATA": self.pipeline._get_base64_code(main_node_process_real_time_collected_data),
|
18
|
+
"CUSTOM_CODE_FINISH_CONDITION": self.pipeline._get_base64_code(main_node_finish_condition),
|
19
|
+
"CUSTOM_CODE_AGGREGATE_COLLECTED_DATA": self.pipeline._get_base64_code(main_node_aggregate_collected_data),
|
20
|
+
"CUSTOM_CODE_REMOTE_NODE": self.pipeline._get_base64_code(worker_node_code),
|
21
|
+
"FINISH_CONDITION_KWARGS": main_node_finish_condition_kwargs
|
22
|
+
}
|
23
|
+
)
|
24
|
+
return
|
25
|
+
|
26
|
+
def add_worker_node_configuration(
|
27
|
+
self,
|
28
|
+
worker_node_pipeline_config: dict = None,
|
29
|
+
worker_node_plugin_config: dict = None,
|
30
|
+
):
|
31
|
+
self.update_instance_config(
|
32
|
+
config={
|
33
|
+
"NODE_PIPELINE_CONFIG": worker_node_pipeline_config or {'stream_type': "Void", },
|
34
|
+
"NODE_PLUGIN_CONFIG": worker_node_plugin_config or {},
|
35
|
+
}
|
36
|
+
)
|
37
|
+
return
|
38
|
+
|
39
|
+
def add_main_node_configuration(
|
40
|
+
self,
|
41
|
+
nr_worker_nodes: int,
|
42
|
+
specific_worker_nodes: list = None,
|
43
|
+
worker_node_timeout: int = 150,
|
44
|
+
cancel_all_jobs_on_exception: bool = False,
|
45
|
+
):
|
46
|
+
self.update_instance_config(
|
47
|
+
config={
|
48
|
+
"NR_REMOTE_NODES": nr_worker_nodes,
|
49
|
+
"SPECIFIC_REMOTE_NODES": specific_worker_nodes,
|
50
|
+
"REMOTE_NODE_TIMEOUT": worker_node_timeout,
|
51
|
+
"CANCEL_ALL_JOBS_ON_EXCEPTION": cancel_all_jobs_on_exception,
|
52
|
+
}
|
53
|
+
)
|
54
|
+
return
|
@@ -0,0 +1,118 @@
|
|
1
|
+
from ...base import Instance, Pipeline
|
2
|
+
|
3
|
+
|
4
|
+
class CustomWebApp01(Instance):
|
5
|
+
signature = "CUSTOM_CODE_FASTAPI_01"
|
6
|
+
|
7
|
+
def get_proposed_endpoints(self):
|
8
|
+
from copy import deepcopy
|
9
|
+
proposed_config = self._get_proposed_config_dictionary(full=True)
|
10
|
+
if "ENDPOINTS" in proposed_config:
|
11
|
+
return deepcopy(proposed_config["ENDPOINTS"])
|
12
|
+
return deepcopy(self.config.get("ENDPOINTS", []))
|
13
|
+
|
14
|
+
def get_endpoint_fields(self, method: callable):
|
15
|
+
import inspect
|
16
|
+
|
17
|
+
name = method.__name__
|
18
|
+
args = list(map(str, inspect.signature(method).parameters.values()))[1:]
|
19
|
+
base64_code = self.pipeline._get_base64_code(method)
|
20
|
+
|
21
|
+
return name, args, base64_code
|
22
|
+
|
23
|
+
def add_new_endpoint(self, function, method="get"):
|
24
|
+
name, args, base64_code = self.get_endpoint_fields(function)
|
25
|
+
dct_endpoint = {
|
26
|
+
"NAME": name
|
27
|
+
}
|
28
|
+
|
29
|
+
proposed_endpoints = self.get_proposed_endpoints()
|
30
|
+
lst_pos = [pos for pos, endpoint in enumerate(proposed_endpoints) if endpoint["NAME"] == name]
|
31
|
+
|
32
|
+
if len(lst_pos) > 0:
|
33
|
+
dct_endpoint = proposed_endpoints[lst_pos[0]]
|
34
|
+
else:
|
35
|
+
proposed_endpoints.append(dct_endpoint)
|
36
|
+
# endif
|
37
|
+
|
38
|
+
dct_endpoint["CODE"] = base64_code
|
39
|
+
dct_endpoint["METHOD"] = method
|
40
|
+
dct_endpoint["ARGS"] = args
|
41
|
+
|
42
|
+
self.update_instance_config(config={"ENDPOINTS": proposed_endpoints})
|
43
|
+
|
44
|
+
def get_proposed_assets(self):
|
45
|
+
from copy import deepcopy
|
46
|
+
proposed_config = self._get_proposed_config_dictionary(full=True)
|
47
|
+
if "ASSETS" in proposed_config:
|
48
|
+
return deepcopy(proposed_config["ASSETS"])
|
49
|
+
return deepcopy(self.config.get("ASSETS", {}))
|
50
|
+
|
51
|
+
def get_proposed_jinja_args(self):
|
52
|
+
from copy import deepcopy
|
53
|
+
proposed_config = self._get_proposed_config_dictionary(full=True)
|
54
|
+
if "JINJA_ARGS" in proposed_config:
|
55
|
+
return deepcopy(proposed_config["JINJA_ARGS"])
|
56
|
+
return deepcopy(self.config.get("JINJA_ARGS", {}))
|
57
|
+
|
58
|
+
def add_new_file_endpoint(self, str_code, file_name, endpoint_name):
|
59
|
+
raise NotImplementedError("This method is not implemented yet.")
|
60
|
+
|
61
|
+
def add_new_html_endpoint(self, html_path, web_app_file_name, endpoint_route):
|
62
|
+
str_code = None
|
63
|
+
with open(html_path, "r") as file:
|
64
|
+
str_code = file.read()
|
65
|
+
|
66
|
+
if str_code is None:
|
67
|
+
raise ValueError(f"Could not read the file {html_path}")
|
68
|
+
self.pipeline: Pipeline
|
69
|
+
base64_html = self.pipeline.str_to_base64(str_code, compress=True)
|
70
|
+
|
71
|
+
proposed_assets = self.get_proposed_assets()
|
72
|
+
proposed_jinja_args = self.get_proposed_jinja_args()
|
73
|
+
|
74
|
+
if isinstance(proposed_assets, str):
|
75
|
+
proposed_assets = {
|
76
|
+
"url": [],
|
77
|
+
"operation": "decode",
|
78
|
+
}
|
79
|
+
elif isinstance(proposed_assets, dict):
|
80
|
+
if proposed_assets.get("operation") != "decode":
|
81
|
+
proposed_assets["operation"] = "decode"
|
82
|
+
proposed_assets["url"] = []
|
83
|
+
|
84
|
+
lst_pos = [pos
|
85
|
+
for pos, code_name_pair
|
86
|
+
in enumerate(proposed_assets["url"])
|
87
|
+
if code_name_pair[1] == 'assets/' + web_app_file_name]
|
88
|
+
|
89
|
+
if len(lst_pos) > 0:
|
90
|
+
proposed_assets["url"][lst_pos[0]][0] = base64_html
|
91
|
+
else:
|
92
|
+
proposed_assets["url"].append([base64_html, 'assets/' + web_app_file_name])
|
93
|
+
# endif
|
94
|
+
|
95
|
+
if proposed_jinja_args is None:
|
96
|
+
proposed_jinja_args = {
|
97
|
+
'html_files': [],
|
98
|
+
}
|
99
|
+
elif proposed_jinja_args.get('html_files') is None:
|
100
|
+
proposed_jinja_args['html_files'] = []
|
101
|
+
|
102
|
+
lst_pos = [pos
|
103
|
+
for pos, dict_name_route_method,
|
104
|
+
in enumerate(proposed_jinja_args['html_files'])
|
105
|
+
if dict_name_route_method['name'] == web_app_file_name]
|
106
|
+
|
107
|
+
dict_name_route_method = {
|
108
|
+
"name": web_app_file_name,
|
109
|
+
"method": "get"
|
110
|
+
}
|
111
|
+
if len(lst_pos) > 0:
|
112
|
+
dict_name_route_method = proposed_jinja_args['html_files'][lst_pos[0]]
|
113
|
+
else:
|
114
|
+
proposed_jinja_args['html_files'].append(dict_name_route_method)
|
115
|
+
|
116
|
+
dict_name_route_method["route"] = endpoint_route
|
117
|
+
|
118
|
+
self.update_instance_config(config={"ASSETS": proposed_assets, "JINJA_ARGS": proposed_jinja_args})
|
@@ -0,0 +1,45 @@
|
|
1
|
+
from ...base import Instance
|
2
|
+
|
3
|
+
|
4
|
+
class NetMon01(Instance):
|
5
|
+
signature = "NET_MON_01"
|
6
|
+
|
7
|
+
def get_node_history(self, node_id=None, node_addr=None, time_window_hours=1, steps=20):
|
8
|
+
"""
|
9
|
+
Get the performance history of a node.
|
10
|
+
|
11
|
+
Parameters
|
12
|
+
----------
|
13
|
+
node_id : str, optional
|
14
|
+
The node id, by default None
|
15
|
+
node_addr : str, optional
|
16
|
+
The node address, by default None
|
17
|
+
time_window_hours: int, optional
|
18
|
+
The time window in hours to retrieve, by default 1
|
19
|
+
steps : int, optional
|
20
|
+
Retrieve only each `steps` data point from the time window, by default 20
|
21
|
+
|
22
|
+
Returns
|
23
|
+
-------
|
24
|
+
"""
|
25
|
+
result = None
|
26
|
+
|
27
|
+
if node_id is None:
|
28
|
+
node_id = self.pipeline.node_id
|
29
|
+
|
30
|
+
if node_addr is None:
|
31
|
+
node_addr = self.pipeline.node_addr
|
32
|
+
|
33
|
+
command = {
|
34
|
+
"node": node_id,
|
35
|
+
"addr": node_addr,
|
36
|
+
"options": {"step": steps, "time_window_hours": time_window_hours},
|
37
|
+
"request": "history",
|
38
|
+
}
|
39
|
+
|
40
|
+
result_payload = self.send_instance_command_and_wait_for_response_payload(command)
|
41
|
+
|
42
|
+
if result_payload is not None:
|
43
|
+
result = result_payload.get("NODE_HISTORY", None)
|
44
|
+
|
45
|
+
return result
|
@@ -0,0 +1,28 @@
|
|
1
|
+
from ...base import Instance
|
2
|
+
|
3
|
+
|
4
|
+
class ViewScene01(Instance):
|
5
|
+
signature = "VIEW_SCENE_01"
|
6
|
+
|
7
|
+
def get_last_witness(self, response_params_key="COMMAND_PARAMS"):
|
8
|
+
"""
|
9
|
+
Get the performance history of a node.
|
10
|
+
|
11
|
+
Parameters
|
12
|
+
----------
|
13
|
+
response_params_key : str
|
14
|
+
The key in the response payload that contains the command parameters
|
15
|
+
Returns
|
16
|
+
-------
|
17
|
+
"""
|
18
|
+
images = []
|
19
|
+
|
20
|
+
result_payload = self.send_instance_command_and_wait_for_response_payload(
|
21
|
+
command="GET_LAST_WITNESS",
|
22
|
+
response_params_key=response_params_key,
|
23
|
+
)
|
24
|
+
|
25
|
+
if result_payload is not None:
|
26
|
+
images = result_payload.get_images_as_PIL()
|
27
|
+
|
28
|
+
return images
|