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.
Files changed (78) hide show
  1. naeural_client/__init__.py +13 -0
  2. naeural_client/_ver.py +13 -0
  3. naeural_client/base/__init__.py +6 -0
  4. naeural_client/base/distributed_custom_code_presets.py +44 -0
  5. naeural_client/base/generic_session.py +1763 -0
  6. naeural_client/base/instance.py +616 -0
  7. naeural_client/base/payload/__init__.py +1 -0
  8. naeural_client/base/payload/payload.py +66 -0
  9. naeural_client/base/pipeline.py +1499 -0
  10. naeural_client/base/plugin_template.py +5209 -0
  11. naeural_client/base/responses.py +209 -0
  12. naeural_client/base/transaction.py +157 -0
  13. naeural_client/base_decentra_object.py +143 -0
  14. naeural_client/bc/__init__.py +3 -0
  15. naeural_client/bc/base.py +1046 -0
  16. naeural_client/bc/chain.py +0 -0
  17. naeural_client/bc/ec.py +324 -0
  18. naeural_client/certs/__init__.py +0 -0
  19. naeural_client/certs/r9092118.ala.eu-central-1.emqxsl.com.crt +22 -0
  20. naeural_client/code_cheker/__init__.py +1 -0
  21. naeural_client/code_cheker/base.py +520 -0
  22. naeural_client/code_cheker/checker.py +294 -0
  23. naeural_client/comm/__init__.py +2 -0
  24. naeural_client/comm/amqp_wrapper.py +338 -0
  25. naeural_client/comm/mqtt_wrapper.py +539 -0
  26. naeural_client/const/README.md +3 -0
  27. naeural_client/const/__init__.py +9 -0
  28. naeural_client/const/base.py +101 -0
  29. naeural_client/const/comms.py +80 -0
  30. naeural_client/const/environment.py +26 -0
  31. naeural_client/const/formatter.py +7 -0
  32. naeural_client/const/heartbeat.py +111 -0
  33. naeural_client/const/misc.py +20 -0
  34. naeural_client/const/payload.py +190 -0
  35. naeural_client/default/__init__.py +1 -0
  36. naeural_client/default/instance/__init__.py +4 -0
  37. naeural_client/default/instance/chain_dist_custom_job_01_plugin.py +54 -0
  38. naeural_client/default/instance/custom_web_app_01_plugin.py +118 -0
  39. naeural_client/default/instance/net_mon_01_plugin.py +45 -0
  40. naeural_client/default/instance/view_scene_01_plugin.py +28 -0
  41. naeural_client/default/session/mqtt_session.py +72 -0
  42. naeural_client/io_formatter/__init__.py +2 -0
  43. naeural_client/io_formatter/base/__init__.py +1 -0
  44. naeural_client/io_formatter/base/base_formatter.py +80 -0
  45. naeural_client/io_formatter/default/__init__.py +3 -0
  46. naeural_client/io_formatter/default/a_dummy.py +51 -0
  47. naeural_client/io_formatter/default/aixp1.py +113 -0
  48. naeural_client/io_formatter/default/default.py +22 -0
  49. naeural_client/io_formatter/io_formatter_manager.py +96 -0
  50. naeural_client/logging/__init__.py +1 -0
  51. naeural_client/logging/base_logger.py +2056 -0
  52. naeural_client/logging/logger_mixins/__init__.py +12 -0
  53. naeural_client/logging/logger_mixins/class_instance_mixin.py +92 -0
  54. naeural_client/logging/logger_mixins/computer_vision_mixin.py +443 -0
  55. naeural_client/logging/logger_mixins/datetime_mixin.py +344 -0
  56. naeural_client/logging/logger_mixins/download_mixin.py +421 -0
  57. naeural_client/logging/logger_mixins/general_serialization_mixin.py +242 -0
  58. naeural_client/logging/logger_mixins/json_serialization_mixin.py +481 -0
  59. naeural_client/logging/logger_mixins/pickle_serialization_mixin.py +301 -0
  60. naeural_client/logging/logger_mixins/process_mixin.py +63 -0
  61. naeural_client/logging/logger_mixins/resource_size_mixin.py +81 -0
  62. naeural_client/logging/logger_mixins/timers_mixin.py +501 -0
  63. naeural_client/logging/logger_mixins/upload_mixin.py +260 -0
  64. naeural_client/logging/logger_mixins/utils_mixin.py +675 -0
  65. naeural_client/logging/small_logger.py +93 -0
  66. naeural_client/logging/tzlocal/__init__.py +20 -0
  67. naeural_client/logging/tzlocal/unix.py +231 -0
  68. naeural_client/logging/tzlocal/utils.py +113 -0
  69. naeural_client/logging/tzlocal/win32.py +151 -0
  70. naeural_client/logging/tzlocal/windows_tz.py +718 -0
  71. naeural_client/plugins_manager_mixin.py +273 -0
  72. naeural_client/utils/__init__.py +2 -0
  73. naeural_client/utils/comm_utils.py +44 -0
  74. naeural_client/utils/dotenv.py +75 -0
  75. naeural_client-2.0.0.dist-info/METADATA +365 -0
  76. naeural_client-2.0.0.dist-info/RECORD +78 -0
  77. naeural_client-2.0.0.dist-info/WHEEL +4 -0
  78. 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,7 @@
1
+ class FORMATTER_DATA:
2
+ NAME = 'NAME'
3
+ SIGNATURE = 'SIGNATURE'
4
+ STREAM = 'STREAM'
5
+ ID = 'ID' # ??
6
+ DESCRIPTION = 'DESCRIPTION'
7
+ PLUGIN_INSTANCE_PARAMETER_LIST = 'PLUGIN_INSTANCE_PARAMETER_LIST'
@@ -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,20 @@
1
+ class COLORS:
2
+ DCT = 'g'
3
+ MAIN = None
4
+ TIMERS = 'd'
5
+ STATUS = 'n'
6
+ SERVING = 'm'
7
+ BIZ = 'b'
8
+ COMM = 'y'
9
+ TIMERS = 'd'
10
+
11
+
12
+ WEEKDAYS_SHORT = [
13
+ 'MON',
14
+ 'TUE',
15
+ 'WED',
16
+ 'THU',
17
+ 'FRI',
18
+ 'SAT',
19
+ 'SUN'
20
+ ]
@@ -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,4 @@
1
+ from .net_mon_01_plugin import NetMon01
2
+ from .view_scene_01_plugin import ViewScene01
3
+ from .custom_web_app_01_plugin import CustomWebApp01
4
+ from .chain_dist_custom_job_01_plugin import ChainDistCustomJob01
@@ -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