jaseci 1.4.2.6__py3-none-any.whl → 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.

Potentially problematic release.


This version of jaseci might be problematic. Click here for more details.

Files changed (187) hide show
  1. jaseci/__init__.py +3 -37
  2. jaseci-2.0.0.dist-info/METADATA +65 -0
  3. jaseci-2.0.0.dist-info/RECORD +4 -0
  4. {jaseci-1.4.2.6.dist-info → jaseci-2.0.0.dist-info}/WHEEL +1 -2
  5. jaseci/VERSION +0 -1
  6. jaseci/cli_tools/__init__.py +0 -0
  7. jaseci/cli_tools/book_tools.py +0 -457
  8. jaseci/cli_tools/jsctl.py +0 -500
  9. jaseci/cli_tools/tests/__init__.py +0 -0
  10. jaseci/cli_tools/tests/test_jsctl.py +0 -556
  11. jaseci/extens/__init__.py +0 -0
  12. jaseci/extens/act_lib/__init__.py +0 -0
  13. jaseci/extens/act_lib/date.py +0 -118
  14. jaseci/extens/act_lib/elastic.py +0 -87
  15. jaseci/extens/act_lib/file.py +0 -77
  16. jaseci/extens/act_lib/file_handler.py +0 -190
  17. jaseci/extens/act_lib/internal.py +0 -19
  18. jaseci/extens/act_lib/jaseci.py +0 -62
  19. jaseci/extens/act_lib/mail.py +0 -10
  20. jaseci/extens/act_lib/maths.py +0 -168
  21. jaseci/extens/act_lib/net.py +0 -192
  22. jaseci/extens/act_lib/rand.py +0 -83
  23. jaseci/extens/act_lib/regex.py +0 -85
  24. jaseci/extens/act_lib/request.py +0 -170
  25. jaseci/extens/act_lib/std.py +0 -236
  26. jaseci/extens/act_lib/storage.py +0 -53
  27. jaseci/extens/act_lib/stripe.py +0 -338
  28. jaseci/extens/act_lib/task.py +0 -14
  29. jaseci/extens/act_lib/tests/__init__.py +0 -0
  30. jaseci/extens/act_lib/tests/std_test_code.py +0 -37
  31. jaseci/extens/act_lib/tests/test_date.py +0 -26
  32. jaseci/extens/act_lib/tests/test_elastic.py +0 -159
  33. jaseci/extens/act_lib/tests/test_file.py +0 -116
  34. jaseci/extens/act_lib/tests/test_file_lib.py +0 -40
  35. jaseci/extens/act_lib/tests/test_mail_lib.py +0 -33
  36. jaseci/extens/act_lib/tests/test_maths.py +0 -147
  37. jaseci/extens/act_lib/tests/test_net_lib.py +0 -62
  38. jaseci/extens/act_lib/tests/test_regex.py +0 -61
  39. jaseci/extens/act_lib/tests/test_std.py +0 -51
  40. jaseci/extens/act_lib/tests/test_std_lib.py +0 -36
  41. jaseci/extens/act_lib/tests/test_url.py +0 -32
  42. jaseci/extens/act_lib/tests/test_vector.py +0 -36
  43. jaseci/extens/act_lib/tests/test_webtool.py +0 -44
  44. jaseci/extens/act_lib/tests/test_zlib.py +0 -24
  45. jaseci/extens/act_lib/url.py +0 -80
  46. jaseci/extens/act_lib/vector.py +0 -158
  47. jaseci/extens/act_lib/webtool.py +0 -29
  48. jaseci/extens/act_lib/zip.py +0 -34
  49. jaseci/extens/api/__init__.py +0 -0
  50. jaseci/extens/api/actions_api.py +0 -171
  51. jaseci/extens/api/alias_api.py +0 -140
  52. jaseci/extens/api/architype_api.py +0 -197
  53. jaseci/extens/api/config_api.py +0 -129
  54. jaseci/extens/api/global_api.py +0 -85
  55. jaseci/extens/api/graph_api.py +0 -168
  56. jaseci/extens/api/health_api.py +0 -21
  57. jaseci/extens/api/interface.py +0 -269
  58. jaseci/extens/api/jac_api.py +0 -172
  59. jaseci/extens/api/jsorc_api.py +0 -317
  60. jaseci/extens/api/logger_api.py +0 -90
  61. jaseci/extens/api/master_api.py +0 -134
  62. jaseci/extens/api/object_api.py +0 -102
  63. jaseci/extens/api/prometheus_api.py +0 -75
  64. jaseci/extens/api/queue_api.py +0 -141
  65. jaseci/extens/api/sentinel_api.py +0 -271
  66. jaseci/extens/api/share_api.py +0 -64
  67. jaseci/extens/api/super_api.py +0 -65
  68. jaseci/extens/api/tests/__init__.py +0 -0
  69. jaseci/extens/api/tests/test_architype_api.py +0 -66
  70. jaseci/extens/api/tests/test_global_api.py +0 -179
  71. jaseci/extens/api/tests/test_graph_api.py +0 -64
  72. jaseci/extens/api/tests/test_logger_api.py +0 -43
  73. jaseci/extens/api/tests/test_object_api.py +0 -20
  74. jaseci/extens/api/tests/test_sentinel_api.py +0 -66
  75. jaseci/extens/api/tests/test_uncommon.py +0 -107
  76. jaseci/extens/api/tests/test_user_api.py +0 -32
  77. jaseci/extens/api/tests/test_walker_api.py +0 -316
  78. jaseci/extens/api/user_api.py +0 -166
  79. jaseci/extens/api/walker_api.py +0 -299
  80. jaseci/extens/api/webhook_api.py +0 -77
  81. jaseci/extens/svc/__init__.py +0 -0
  82. jaseci/extens/svc/elastic_svc.py +0 -366
  83. jaseci/extens/svc/kube_svc.py +0 -432
  84. jaseci/extens/svc/mail_svc.py +0 -156
  85. jaseci/extens/svc/prome_svc.py +0 -378
  86. jaseci/extens/svc/redis_svc.py +0 -63
  87. jaseci/extens/svc/storage_svc.py +0 -193
  88. jaseci/extens/svc/stripe_svc.py +0 -51
  89. jaseci/extens/svc/task_svc.py +0 -155
  90. jaseci/extens/svc/tasks.py +0 -302
  91. jaseci/jac/__init__.py +0 -0
  92. jaseci/jac/interpreter/__init__.py +0 -0
  93. jaseci/jac/interpreter/architype_interp.py +0 -219
  94. jaseci/jac/interpreter/interp.py +0 -1784
  95. jaseci/jac/interpreter/sentinel_interp.py +0 -260
  96. jaseci/jac/interpreter/tests/__init__.py +0 -0
  97. jaseci/jac/interpreter/tests/test_interp.py +0 -42
  98. jaseci/jac/interpreter/walker_interp.py +0 -249
  99. jaseci/jac/ir/__init__.py +0 -0
  100. jaseci/jac/ir/ast.py +0 -73
  101. jaseci/jac/ir/ast_builder.py +0 -249
  102. jaseci/jac/ir/jac_code.py +0 -151
  103. jaseci/jac/ir/passes/__init__.py +0 -6
  104. jaseci/jac/ir/passes/ast_prune_pass.py +0 -9
  105. jaseci/jac/ir/passes/codegen_pass.py +0 -244
  106. jaseci/jac/ir/passes/ir_pass.py +0 -29
  107. jaseci/jac/ir/passes/printer_pass.py +0 -23
  108. jaseci/jac/ir/passes/pt_prune_pass.py +0 -29
  109. jaseci/jac/ir/passes/schedule.py +0 -23
  110. jaseci/jac/ir/passes/stats_pass.py +0 -16
  111. jaseci/jac/jac.g4 +0 -450
  112. jaseci/jac/jac_parse/__init__.py +0 -0
  113. jaseci/jac/jac_parse/jacLexer.py +0 -809
  114. jaseci/jac/jac_parse/jacListener.py +0 -853
  115. jaseci/jac/jac_parse/jacParser.py +0 -9192
  116. jaseci/jac/jac_set.py +0 -120
  117. jaseci/jac/jsci_vm/__init__.py +0 -0
  118. jaseci/jac/jsci_vm/disasm.py +0 -94
  119. jaseci/jac/jsci_vm/inst_ptr.py +0 -31
  120. jaseci/jac/jsci_vm/machine.py +0 -188
  121. jaseci/jac/jsci_vm/op_codes.py +0 -82
  122. jaseci/jac/jsci_vm/tests/__init__.py +0 -0
  123. jaseci/jac/jsci_vm/tests/test_codegen.py +0 -31
  124. jaseci/jac/machine/__init__.py +0 -0
  125. jaseci/jac/machine/jac_scope.py +0 -86
  126. jaseci/jac/machine/jac_value.py +0 -227
  127. jaseci/jac/machine/machine_state.py +0 -386
  128. jaseci/jac/tests/__init__.py +0 -0
  129. jaseci/jac/tests/book_code.py +0 -624
  130. jaseci/jac/tests/test_book.py +0 -380
  131. jaseci/jac/tests/test_lang_14.py +0 -49
  132. jaseci/jsorc/__init__.py +0 -7
  133. jaseci/jsorc/jsorc.py +0 -642
  134. jaseci/jsorc/jsorc_settings.py +0 -211
  135. jaseci/jsorc/jsorc_utils.py +0 -298
  136. jaseci/jsorc/live_actions.py +0 -365
  137. jaseci/jsorc/manifests/__init__.py +0 -0
  138. jaseci/jsorc/manifests/database.yaml +0 -109
  139. jaseci/jsorc/manifests/elastic.yaml +0 -6029
  140. jaseci/jsorc/manifests/prometheus.yaml +0 -1383
  141. jaseci/jsorc/manifests/redis.yaml +0 -64
  142. jaseci/jsorc/memory.py +0 -258
  143. jaseci/jsorc/redis.py +0 -140
  144. jaseci/jsorc/remote_actions.py +0 -158
  145. jaseci/jsorc/tests/__init__.py +0 -0
  146. jaseci/jsorc/tests/test_actions.py +0 -542
  147. jaseci/jsorc/tests/test_jsorc.py +0 -112
  148. jaseci/prim/__init__.py +0 -0
  149. jaseci/prim/ability.py +0 -94
  150. jaseci/prim/architype.py +0 -90
  151. jaseci/prim/edge.py +0 -173
  152. jaseci/prim/element.py +0 -233
  153. jaseci/prim/graph.py +0 -27
  154. jaseci/prim/master.py +0 -67
  155. jaseci/prim/node.py +0 -533
  156. jaseci/prim/obj_mixins.py +0 -238
  157. jaseci/prim/sentinel.py +0 -282
  158. jaseci/prim/super_master.py +0 -31
  159. jaseci/prim/walker.py +0 -261
  160. jaseci/svc/__init__.py +0 -0
  161. jaseci/tests/__init__.py +0 -0
  162. jaseci/tests/infer.py +0 -39
  163. jaseci/tests/jac_test_code.py +0 -1293
  164. jaseci/tests/jac_test_progs.py +0 -774
  165. jaseci/tests/test_core.py +0 -153
  166. jaseci/tests/test_jac.py +0 -824
  167. jaseci/tests/test_node.py +0 -89
  168. jaseci/tests/test_progs.py +0 -702
  169. jaseci/tests/test_stack.py +0 -220
  170. jaseci/tests/test_stripe.py +0 -225
  171. jaseci/utils/__init__.py +0 -0
  172. jaseci/utils/actions/__init__.py +0 -0
  173. jaseci/utils/actions/actions_manager.py +0 -254
  174. jaseci/utils/actions/actions_optimizer.py +0 -517
  175. jaseci/utils/actions/actions_state.py +0 -95
  176. jaseci/utils/file_handler.py +0 -171
  177. jaseci/utils/gprof2dot.py +0 -3786
  178. jaseci/utils/id_list.py +0 -169
  179. jaseci/utils/json_handler.py +0 -70
  180. jaseci/utils/log_utils.py +0 -57
  181. jaseci/utils/test_core.py +0 -62
  182. jaseci/utils/utils.py +0 -387
  183. jaseci-1.4.2.6.dist-info/LICENSE +0 -21
  184. jaseci-1.4.2.6.dist-info/METADATA +0 -39
  185. jaseci-1.4.2.6.dist-info/RECORD +0 -185
  186. jaseci-1.4.2.6.dist-info/entry_points.txt +0 -3
  187. jaseci-1.4.2.6.dist-info/top_level.txt +0 -1
@@ -1,366 +0,0 @@
1
- import re
2
- from jaseci.jsorc.jsorc import JsOrc
3
- from jaseci.jsorc.jsorc_settings import JsOrcSettings
4
- from jaseci.extens.svc.kube_svc import KubeService
5
- from jaseci.utils.utils import logger, app_logger
6
- from requests import get, post, put
7
- from datetime import datetime
8
- from copy import copy
9
- from base64 import b64encode
10
- import multiprocessing
11
- import logging.handlers
12
-
13
- LOG_QUEUES = {}
14
-
15
-
16
- def format_elastic_record(record):
17
- # Strip out color code from message before sending to elastic
18
- msg = record.getMessage()
19
- msg = re.sub(r"\033\[[0-9]*m", "", msg)
20
- ts = "%s.%03d" % (
21
- logging.Formatter().formatTime(record, "%Y-%m-%dT%H:%M:%S"),
22
- record.msecs,
23
- )
24
-
25
- elastic_record = {
26
- "@timestamp": ts,
27
- "message": msg,
28
- "level": record.levelname,
29
- }
30
- extra_fields = record.__dict__.get("extra_fields", [])
31
- elastic_record.update(dict([(k, record.__dict__[k]) for k in extra_fields]))
32
- return elastic_record
33
-
34
-
35
- #################################################
36
- # ELASTIC APP #
37
- #################################################
38
-
39
-
40
- @JsOrc.service(name="elastic", config="ELASTIC_CONFIG", manifest="ELASTIC_MANIFEST")
41
- class ElasticService(JsOrc.CommonService):
42
- ###################################################
43
- # BUILDER #
44
- ###################################################
45
-
46
- def run(self):
47
- kube = JsOrc.svc("kube", KubeService)
48
- if kube.is_running():
49
- elasticsearches = kube.resolve_manifest(
50
- self.manifest, *JsOrc.overrided_namespace("elastic", self.manifest_type)
51
- ).get("Elasticsearch", [])
52
-
53
- if elasticsearches:
54
- metadata: dict = elasticsearches["jaseci"]["metadata"]
55
-
56
- cert = kube.get_secret(
57
- f'{metadata.get("name")}-es-http-certs-internal',
58
- "ca.crt",
59
- metadata.get("namespace"),
60
- )
61
-
62
- if cert:
63
- with open("elastic-certificate.crt", "w") as cert_file:
64
- cert_file.write(cert)
65
- self.config["verifier"] = "elastic-certificate.crt"
66
-
67
- if not self.config.get("auth"):
68
- auth = kube.get_secret(
69
- f'{metadata.get("name")}-es-elastic-user',
70
- "elastic",
71
- metadata.get("namespace"),
72
- )
73
- self.config["auth"] = (
74
- f'basic {b64encode(f"elastic:{auth}".encode()).decode()}'
75
- )
76
-
77
- self.app = Elastic(self.config)
78
- self.app.health("timeout=1s")
79
-
80
- def post_run(self):
81
- if multiprocessing.current_process().name == "MainProcess":
82
- under_test = self.config.get("under_test", False)
83
- if not under_test:
84
- self.configure_elastic()
85
- LOG_QUEUES["core"] = self.add_elastic_log_handler(
86
- logger, self.config.get("core_log_index") or "core", under_test
87
- )
88
- LOG_QUEUES["app"] = self.add_elastic_log_handler(
89
- app_logger, self.config.get("app_log_index") or "app", under_test
90
- )
91
-
92
- def configure_elastic(self):
93
- """
94
- Configure elastic logging with desired configuration
95
- - Data stream for core* and app* index pattern
96
- - Index template with the data-streams-mappings component mapping rules
97
- - @timestamp is converted to date field type
98
- - text fields are converted as keywords for search
99
- - An index lifecycle management (ILM) policy
100
- - hot index for 7 days or 5GB max size
101
- - delete indices older than 30 days
102
- """
103
- # Create the ILM policy
104
- self.app.create_ilm_policy(
105
- policy_name=self.config.get(
106
- "ilm_policy_name", JsOrcSettings.ELASTIC_ILM_POLICY_NAME
107
- ),
108
- policy_config=self.config.get(
109
- "ilm_policy", JsOrcSettings.ELASTIC_ILM_POLICY
110
- ),
111
- overwrite=False,
112
- )
113
-
114
- # Create index template and attach ILM policy
115
- self.app.create_index_template(
116
- template_name=self.config.get(
117
- "index_template_name", JsOrcSettings.ELASTIC_INDEX_TEMPLATE_NAME
118
- ),
119
- template_config=self.config.get(
120
- "index_template", JsOrcSettings.ELASTIC_INDEX_TEMPLATE
121
- ),
122
- overwrite=False,
123
- )
124
-
125
- def add_elastic_log_handler(self, logger_instance, index, under_test=False):
126
- has_queue_handler = any(
127
- isinstance(h, logging.handlers.QueueHandler)
128
- for h in logger_instance.handlers
129
- )
130
- if not has_queue_handler:
131
- log_queue = multiprocessing.Queue()
132
- queue_handler = logging.handlers.QueueHandler(log_queue)
133
- logger_instance.addHandler(queue_handler)
134
-
135
- def elastic_log_worker(elastic_index):
136
- while True:
137
- try:
138
- record = log_queue.get()
139
- if record is None:
140
- # This is temporary
141
- # for debugging purposes
142
- from datetime import datetime
143
-
144
- self.app.doc(
145
- {
146
- "@timestamp": datetime.now().strftime(
147
- "%Y-%m-%dT%H:%M:%S"
148
- ),
149
- "message": f"Stopping process for {elastic_index}",
150
- "level": "SYSTEM",
151
- },
152
- index=elastic_index,
153
- )
154
- # end of temporary code
155
- break
156
- elastic_record = format_elastic_record(record)
157
- self.app.doc(log=elastic_record, index=elastic_index)
158
- except Exception:
159
- pass
160
-
161
- # if under test, don't spawn the log worker process. Tests will validate two things:
162
- # 1. logs are added to the log queue
163
- # 2. format_elastic_record process the log properly and create the record for elastic
164
- if not under_test:
165
- worker_proc = multiprocessing.Process(
166
- target=elastic_log_worker, args=(index,)
167
- )
168
- worker_proc.start()
169
-
170
- return log_queue
171
-
172
-
173
- class Elastic:
174
- def __init__(self, config: dict):
175
- if not config.get("url"):
176
- raise Exception("URL is required!")
177
- self.url = config["url"]
178
-
179
- if not config.get("common_index"):
180
- raise Exception("Common Index is required!")
181
- self.common_index = config["common_index"]
182
-
183
- if not config.get("activity_index"):
184
- raise Exception("Activity Index is required!")
185
- self.activity_index = config["activity_index"]
186
-
187
- self.headers = {"Content-Type": "application/json"}
188
-
189
- if config["auth"]:
190
- self.headers["Authorization"] = config["auth"]
191
-
192
- self.verifier = config.get("verifier")
193
-
194
- def _get(self, url: str, json: dict = None):
195
- return get(
196
- f"{self.url}{url}",
197
- json=json,
198
- headers=self.headers,
199
- verify=self.verifier,
200
- ).json()
201
-
202
- def _post(self, url: str, json: dict = None):
203
- return post(
204
- f"{self.url}{url}",
205
- json=json,
206
- headers=self.headers,
207
- verify=self.verifier,
208
- ).json()
209
-
210
- def post(self, url: str, body: dict, index: str = "", suffix: str = ""):
211
- return self._post(f"/{index or self.common_index}{suffix}{url}", body)
212
-
213
- def post_act(self, url: str, body: dict, suffix: str = ""):
214
- return self.post(url, body, self.activity_index, suffix)
215
-
216
- def get(self, url: str, body: dict, index: str = "", suffix: str = ""):
217
- return self._get(f"/{index or self.common_index}{suffix}{url}", body)
218
-
219
- def get_act(self, url: str, body: dict, suffix: str = ""):
220
- return self.get(url, body, self.activity_index, suffix)
221
-
222
- def doc(self, log: dict, query: str = "", index: str = "", suffix: str = ""):
223
- return self.post(f"/_doc?{query}", log, index, suffix)
224
-
225
- def doc_activity(self, log: dict, query: str = "", suffix: str = ""):
226
- return self.doc(log, query, self.activity_index, suffix)
227
-
228
- def search(self, body: dict, query: str = "", index: str = "", suffix: str = ""):
229
- return self.get(f"/_search?{query}", body, index, suffix)
230
-
231
- def search_activity(self, body: dict, query: str = "", suffix: str = ""):
232
- return self.search(body, query, self.activity_index, suffix)
233
-
234
- def mapping(self, query: str = "", index: str = "", suffix: str = ""):
235
- return self.get(f"/_mapping?{query}", None, index, suffix)
236
-
237
- def mapping_activity(self, query: str = "", suffix: str = ""):
238
- return self.mapping(query, self.activity_index, suffix)
239
-
240
- def refresh(self, index: str = "", suffix: str = ""):
241
- return self.get(f"/_refresh", None, index, suffix)
242
-
243
- def refresh_activity(self, suffix: str = ""):
244
- return self.refresh(self.activity_index, suffix)
245
-
246
- def aliases(self, query: str = "pretty=true"):
247
- return self._get(f"/_aliases?{query}")
248
-
249
- def reindex(self, body: dict, query: str = "pretty"):
250
- return self._post(f"/_reindex?{query}", body)
251
-
252
- def create_ilm_policy(
253
- self, policy_name: str, policy_config: dict, overwrite: bool = False
254
- ):
255
- if not overwrite:
256
- res = get(
257
- f"{self.url}/_ilm/policy/{policy_name}",
258
- headers=self.headers,
259
- verify=self.verifier,
260
- )
261
- if res.status_code == 200 and policy_name in res.json():
262
- # policy already exists
263
- return False
264
- res = put(
265
- f"{self.url}/_ilm/policy/{policy_name}",
266
- headers=self.headers,
267
- json=policy_config,
268
- verify=self.verifier,
269
- )
270
- if res.status_code == 200:
271
- return res.json()
272
- else:
273
- return False
274
-
275
- def create_index_template(
276
- self, template_name: str, template_config: dict, overwrite: bool = False
277
- ):
278
- if not overwrite:
279
- res = get(
280
- f"{self.url}/_index_template/{template_name}",
281
- headers=self.headers,
282
- verify=self.verifier,
283
- )
284
- if res.status_code == 200 and template_name in res.json():
285
- # policy already exists
286
- return False
287
- res = put(
288
- f"{self.url}/_index_template/{template_name}",
289
- headers=self.headers,
290
- json=template_config,
291
- verify=self.verifier,
292
- )
293
- if res.status_code == 200:
294
- return res.json()
295
- else:
296
- return False
297
-
298
- # standard methods
299
- def generate_from_meta(self, meta: dict, override: dict, action: str = None):
300
- scope = meta["scope"].local_scope
301
-
302
- walker = scope["visitor"]
303
- node = walker.current_node
304
-
305
- override_misc = override.get("misc")
306
- override["misc"] = {
307
- "report": copy(walker.report),
308
- "node": node.serialize(detailed=False),
309
- }
310
-
311
- if override_misc and isinstance(override_misc, dict):
312
- override["misc"].update(override_misc)
313
-
314
- master = meta["h"].get_obj(meta["m_id"], meta["m_id"]).master_self(True)
315
-
316
- headers = walker.request_context.get("headers", {})
317
- if headers.get("Authorization"):
318
- del headers["Authorization"]
319
-
320
- activity = {
321
- "datetime": datetime.utcnow().isoformat(),
322
- "activity_action": action or walker.name.replace("_", " ").title(),
323
- "activity_type": walker.name,
324
- "activity_point": node.name,
325
- "walker_id": walker.jid,
326
- "node_id": node.jid,
327
- "master_id": master["jid"],
328
- "user": master.get("__meta__") or {"email": master["name"]},
329
- "request_context": walker.request_context,
330
- "data": walker.context,
331
- }
332
-
333
- activity.update(override)
334
-
335
- return activity
336
-
337
- def generate_from_request(self, request):
338
- headers = dict(request.headers)
339
- if headers.get("Authorization"):
340
- del headers["Authorization"]
341
-
342
- data = request.data.dict() if type(request.data) is not dict else request.data
343
- password = data.get("password")
344
- if password:
345
- data["password"] = len(password) * "*"
346
-
347
- user = request.user
348
-
349
- return {
350
- "datetime": datetime.utcnow().isoformat(),
351
- "activity_action": "User Manage",
352
- "activity_type": "user_manage",
353
- "master_id": user.master.urn,
354
- "user": {"email": user.email},
355
- "request_context": {
356
- "method": request.method,
357
- "headers": headers,
358
- "query": request.GET.dict(),
359
- "body": data,
360
- },
361
- "data": data,
362
- }
363
-
364
- def health(self, query: str = ""):
365
- if self._get(f"/_cluster/health?{query}").get("timed_out", True):
366
- raise Exception("Cannot connect on elastic service!")