kaqing 1.77.0__py3-none-any.whl → 2.0.171__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 (308) hide show
  1. adam/__init__.py +1 -0
  2. adam/app_session.py +182 -0
  3. {walker → adam}/apps.py +8 -24
  4. {walker → adam}/batch.py +54 -97
  5. {walker → adam}/checks/check.py +3 -3
  6. {walker → adam}/checks/check_result.py +1 -1
  7. adam/checks/check_utils.py +65 -0
  8. {walker → adam}/checks/compactionstats.py +6 -6
  9. {walker → adam}/checks/cpu.py +14 -8
  10. adam/checks/cpu_metrics.py +52 -0
  11. {walker → adam}/checks/disk.py +6 -6
  12. {walker → adam}/checks/gossip.py +5 -5
  13. {walker → adam}/checks/memory.py +7 -7
  14. {walker → adam}/checks/status.py +5 -5
  15. {walker → adam}/cli.py +3 -3
  16. {walker → adam}/columns/column.py +1 -1
  17. adam/columns/columns.py +45 -0
  18. {walker → adam}/columns/compactions.py +5 -5
  19. {walker → adam}/columns/cpu.py +6 -4
  20. adam/columns/cpu_metrics.py +22 -0
  21. {walker → adam}/columns/dir_data.py +3 -3
  22. {walker → adam}/columns/dir_snapshots.py +3 -3
  23. {walker → adam}/columns/gossip.py +5 -5
  24. {walker → adam}/columns/host_id.py +3 -3
  25. {walker → adam}/columns/memory.py +3 -3
  26. {walker → adam}/columns/node_address.py +3 -3
  27. {walker → adam}/columns/node_load.py +3 -3
  28. {walker → adam}/columns/node_owns.py +3 -3
  29. {walker → adam}/columns/node_status.py +3 -3
  30. {walker → adam}/columns/node_tokens.py +3 -3
  31. {walker → adam}/columns/node_utils.py +2 -2
  32. {walker → adam}/columns/pod_name.py +2 -2
  33. {walker → adam}/columns/volume_cassandra.py +4 -4
  34. {walker → adam}/columns/volume_root.py +3 -3
  35. adam/commands/__init__.py +15 -0
  36. adam/commands/alter_tables.py +81 -0
  37. adam/commands/app_cmd.py +38 -0
  38. {walker → adam}/commands/app_ping.py +10 -16
  39. adam/commands/audit/audit.py +84 -0
  40. adam/commands/audit/audit_repair_tables.py +74 -0
  41. adam/commands/audit/audit_run.py +50 -0
  42. adam/commands/audit/show_last10.py +48 -0
  43. adam/commands/audit/show_slow10.py +47 -0
  44. adam/commands/audit/show_top10.py +45 -0
  45. adam/commands/audit/utils_show_top10.py +59 -0
  46. adam/commands/bash/__init__.py +5 -0
  47. adam/commands/bash/bash.py +36 -0
  48. adam/commands/bash/bash_completer.py +93 -0
  49. adam/commands/bash/utils_bash.py +16 -0
  50. adam/commands/cat.py +50 -0
  51. adam/commands/cd.py +43 -0
  52. adam/commands/check.py +73 -0
  53. {walker → adam}/commands/cli_commands.py +7 -8
  54. adam/commands/code.py +57 -0
  55. adam/commands/command.py +190 -0
  56. {walker → adam}/commands/command_helpers.py +1 -1
  57. {walker → adam}/commands/commands_utils.py +15 -25
  58. adam/commands/cp.py +89 -0
  59. adam/commands/cql/cql_completions.py +33 -0
  60. {walker/commands → adam/commands/cql}/cqlsh.py +20 -35
  61. adam/commands/cql/utils_cql.py +343 -0
  62. {walker/commands/frontend → adam/commands/deploy}/code_start.py +11 -14
  63. adam/commands/deploy/code_stop.py +40 -0
  64. {walker/commands/frontend → adam/commands/deploy}/code_utils.py +7 -9
  65. adam/commands/deploy/deploy.py +25 -0
  66. adam/commands/deploy/deploy_frontend.py +49 -0
  67. adam/commands/deploy/deploy_pg_agent.py +35 -0
  68. adam/commands/deploy/deploy_pod.py +108 -0
  69. adam/commands/deploy/deploy_utils.py +29 -0
  70. adam/commands/deploy/undeploy.py +25 -0
  71. adam/commands/deploy/undeploy_frontend.py +38 -0
  72. adam/commands/deploy/undeploy_pg_agent.py +39 -0
  73. adam/commands/deploy/undeploy_pod.py +48 -0
  74. adam/commands/devices/device.py +118 -0
  75. adam/commands/devices/device_app.py +173 -0
  76. adam/commands/devices/device_auit_log.py +49 -0
  77. adam/commands/devices/device_cass.py +185 -0
  78. adam/commands/devices/device_export.py +86 -0
  79. adam/commands/devices/device_postgres.py +144 -0
  80. adam/commands/devices/devices.py +25 -0
  81. {walker → adam}/commands/exit.py +3 -6
  82. adam/commands/export/clean_up_all_export_sessions.py +37 -0
  83. adam/commands/export/clean_up_export_sessions.py +51 -0
  84. adam/commands/export/drop_export_database.py +55 -0
  85. adam/commands/export/drop_export_databases.py +43 -0
  86. adam/commands/export/export.py +53 -0
  87. adam/commands/export/export_databases.py +170 -0
  88. adam/commands/export/export_handlers.py +71 -0
  89. adam/commands/export/export_select.py +81 -0
  90. adam/commands/export/export_select_x.py +54 -0
  91. adam/commands/export/export_use.py +52 -0
  92. adam/commands/export/exporter.py +352 -0
  93. adam/commands/export/import_session.py +40 -0
  94. adam/commands/export/importer.py +67 -0
  95. adam/commands/export/importer_athena.py +80 -0
  96. adam/commands/export/importer_sqlite.py +47 -0
  97. adam/commands/export/show_column_counts.py +54 -0
  98. adam/commands/export/show_export_databases.py +36 -0
  99. adam/commands/export/show_export_session.py +48 -0
  100. adam/commands/export/show_export_sessions.py +44 -0
  101. adam/commands/export/utils_export.py +314 -0
  102. {walker → adam}/commands/help.py +17 -12
  103. adam/commands/intermediate_command.py +49 -0
  104. adam/commands/issues.py +43 -0
  105. adam/commands/kubectl.py +38 -0
  106. adam/commands/login.py +70 -0
  107. {walker → adam}/commands/logs.py +8 -10
  108. adam/commands/ls.py +41 -0
  109. adam/commands/medusa/medusa.py +27 -0
  110. adam/commands/medusa/medusa_backup.py +57 -0
  111. adam/commands/medusa/medusa_restore.py +83 -0
  112. adam/commands/medusa/medusa_show_backupjobs.py +51 -0
  113. adam/commands/medusa/medusa_show_restorejobs.py +47 -0
  114. {walker → adam}/commands/nodetool.py +17 -21
  115. {walker → adam}/commands/param_get.py +15 -16
  116. adam/commands/param_set.py +43 -0
  117. adam/commands/postgres/postgres.py +104 -0
  118. adam/commands/postgres/postgres_context.py +274 -0
  119. {walker → adam}/commands/postgres/postgres_ls.py +7 -11
  120. {walker → adam}/commands/postgres/postgres_preview.py +8 -13
  121. adam/commands/postgres/psql_completions.py +10 -0
  122. adam/commands/postgres/utils_postgres.py +66 -0
  123. adam/commands/preview_table.py +37 -0
  124. adam/commands/pwd.py +47 -0
  125. adam/commands/reaper/reaper.py +35 -0
  126. adam/commands/reaper/reaper_forward.py +93 -0
  127. adam/commands/reaper/reaper_forward_session.py +6 -0
  128. {walker → adam}/commands/reaper/reaper_forward_stop.py +13 -19
  129. {walker → adam}/commands/reaper/reaper_restart.py +10 -17
  130. adam/commands/reaper/reaper_run_abort.py +46 -0
  131. adam/commands/reaper/reaper_runs.py +82 -0
  132. adam/commands/reaper/reaper_runs_abort.py +63 -0
  133. adam/commands/reaper/reaper_schedule_activate.py +45 -0
  134. adam/commands/reaper/reaper_schedule_start.py +45 -0
  135. adam/commands/reaper/reaper_schedule_stop.py +45 -0
  136. {walker → adam}/commands/reaper/reaper_schedules.py +6 -16
  137. {walker → adam}/commands/reaper/reaper_status.py +11 -19
  138. adam/commands/reaper/utils_reaper.py +196 -0
  139. adam/commands/repair/repair.py +26 -0
  140. {walker → adam}/commands/repair/repair_log.py +7 -10
  141. adam/commands/repair/repair_run.py +70 -0
  142. adam/commands/repair/repair_scan.py +71 -0
  143. {walker → adam}/commands/repair/repair_stop.py +8 -11
  144. adam/commands/report.py +61 -0
  145. adam/commands/restart.py +60 -0
  146. {walker → adam}/commands/rollout.py +25 -30
  147. adam/commands/shell.py +34 -0
  148. adam/commands/show/show.py +39 -0
  149. walker/commands/show/show_version.py → adam/commands/show/show_adam.py +14 -10
  150. adam/commands/show/show_app_actions.py +57 -0
  151. {walker → adam}/commands/show/show_app_id.py +12 -15
  152. {walker → adam}/commands/show/show_app_queues.py +9 -12
  153. adam/commands/show/show_cassandra_repairs.py +38 -0
  154. adam/commands/show/show_cassandra_status.py +124 -0
  155. {walker → adam}/commands/show/show_cassandra_version.py +6 -16
  156. adam/commands/show/show_commands.py +59 -0
  157. walker/commands/show/show_storage.py → adam/commands/show/show_host.py +11 -13
  158. adam/commands/show/show_login.py +62 -0
  159. {walker → adam}/commands/show/show_params.py +4 -4
  160. adam/commands/show/show_processes.py +51 -0
  161. adam/commands/show/show_storage.py +42 -0
  162. adam/commands/watch.py +82 -0
  163. {walker → adam}/config.py +10 -22
  164. {walker → adam}/embedded_apps.py +1 -1
  165. adam/embedded_params.py +2 -0
  166. adam/log.py +47 -0
  167. {walker → adam}/pod_exec_result.py +10 -2
  168. adam/repl.py +182 -0
  169. adam/repl_commands.py +124 -0
  170. adam/repl_state.py +458 -0
  171. adam/sql/__init__.py +0 -0
  172. adam/sql/sql_completer.py +120 -0
  173. adam/sql/sql_state_machine.py +618 -0
  174. adam/sql/term_completer.py +76 -0
  175. adam/sso/__init__.py +0 -0
  176. {walker → adam}/sso/authenticator.py +5 -1
  177. adam/sso/authn_ad.py +170 -0
  178. {walker → adam}/sso/authn_okta.py +39 -22
  179. adam/sso/cred_cache.py +60 -0
  180. adam/sso/id_token.py +23 -0
  181. adam/sso/idp.py +143 -0
  182. adam/sso/idp_login.py +50 -0
  183. adam/sso/idp_session.py +55 -0
  184. adam/sso/sso_config.py +63 -0
  185. adam/utils.py +679 -0
  186. adam/utils_app.py +98 -0
  187. adam/utils_athena.py +145 -0
  188. adam/utils_audits.py +106 -0
  189. adam/utils_issues.py +32 -0
  190. adam/utils_k8s/__init__.py +0 -0
  191. adam/utils_k8s/app_clusters.py +28 -0
  192. adam/utils_k8s/app_pods.py +33 -0
  193. adam/utils_k8s/cassandra_clusters.py +36 -0
  194. adam/utils_k8s/cassandra_nodes.py +33 -0
  195. adam/utils_k8s/config_maps.py +34 -0
  196. {walker/k8s_utils → adam/utils_k8s}/custom_resources.py +7 -2
  197. adam/utils_k8s/deployment.py +56 -0
  198. {walker/k8s_utils → adam/utils_k8s}/ingresses.py +3 -4
  199. {walker/k8s_utils → adam/utils_k8s}/jobs.py +3 -3
  200. adam/utils_k8s/k8s.py +87 -0
  201. {walker/k8s_utils → adam/utils_k8s}/kube_context.py +4 -4
  202. adam/utils_k8s/pods.py +290 -0
  203. {walker/k8s_utils → adam/utils_k8s}/secrets.py +8 -4
  204. adam/utils_k8s/service_accounts.py +170 -0
  205. {walker/k8s_utils → adam/utils_k8s}/services.py +3 -4
  206. {walker/k8s_utils → adam/utils_k8s}/statefulsets.py +6 -16
  207. {walker/k8s_utils → adam/utils_k8s}/volumes.py +10 -1
  208. adam/utils_net.py +24 -0
  209. adam/utils_repl/__init__.py +0 -0
  210. adam/utils_repl/automata_completer.py +48 -0
  211. adam/utils_repl/repl_completer.py +46 -0
  212. adam/utils_repl/state_machine.py +173 -0
  213. adam/utils_sqlite.py +109 -0
  214. adam/version.py +5 -0
  215. {kaqing-1.77.0.dist-info → kaqing-2.0.171.dist-info}/METADATA +1 -1
  216. kaqing-2.0.171.dist-info/RECORD +236 -0
  217. kaqing-2.0.171.dist-info/entry_points.txt +3 -0
  218. kaqing-2.0.171.dist-info/top_level.txt +1 -0
  219. kaqing-1.77.0.dist-info/RECORD +0 -159
  220. kaqing-1.77.0.dist-info/entry_points.txt +0 -3
  221. kaqing-1.77.0.dist-info/top_level.txt +0 -1
  222. walker/__init__.py +0 -3
  223. walker/app_session.py +0 -168
  224. walker/checks/check_utils.py +0 -97
  225. walker/columns/columns.py +0 -43
  226. walker/commands/add_user.py +0 -68
  227. walker/commands/app.py +0 -67
  228. walker/commands/bash.py +0 -87
  229. walker/commands/cd.py +0 -115
  230. walker/commands/check.py +0 -68
  231. walker/commands/command.py +0 -104
  232. walker/commands/cp.py +0 -95
  233. walker/commands/cql_utils.py +0 -53
  234. walker/commands/devices.py +0 -89
  235. walker/commands/frontend/code_stop.py +0 -57
  236. walker/commands/frontend/setup.py +0 -60
  237. walker/commands/frontend/setup_frontend.py +0 -58
  238. walker/commands/frontend/teardown.py +0 -61
  239. walker/commands/frontend/teardown_frontend.py +0 -42
  240. walker/commands/issues.py +0 -69
  241. walker/commands/login.py +0 -72
  242. walker/commands/ls.py +0 -145
  243. walker/commands/medusa/medusa.py +0 -69
  244. walker/commands/medusa/medusa_backup.py +0 -61
  245. walker/commands/medusa/medusa_restore.py +0 -86
  246. walker/commands/medusa/medusa_show_backupjobs.py +0 -52
  247. walker/commands/medusa/medusa_show_restorejobs.py +0 -52
  248. walker/commands/param_set.py +0 -44
  249. walker/commands/postgres/postgres.py +0 -113
  250. walker/commands/postgres/postgres_session.py +0 -225
  251. walker/commands/preview_table.py +0 -98
  252. walker/commands/processes.py +0 -53
  253. walker/commands/pwd.py +0 -64
  254. walker/commands/reaper/reaper.py +0 -78
  255. walker/commands/reaper/reaper_forward.py +0 -100
  256. walker/commands/reaper/reaper_run_abort.py +0 -65
  257. walker/commands/reaper/reaper_runs.py +0 -97
  258. walker/commands/reaper/reaper_runs_abort.py +0 -83
  259. walker/commands/reaper/reaper_schedule_activate.py +0 -64
  260. walker/commands/reaper/reaper_schedule_start.py +0 -64
  261. walker/commands/reaper/reaper_schedule_stop.py +0 -64
  262. walker/commands/reaper/reaper_session.py +0 -159
  263. walker/commands/repair/repair.py +0 -68
  264. walker/commands/repair/repair_run.py +0 -72
  265. walker/commands/repair/repair_scan.py +0 -79
  266. walker/commands/report.py +0 -57
  267. walker/commands/restart.py +0 -61
  268. walker/commands/show/show.py +0 -72
  269. walker/commands/show/show_app_actions.py +0 -53
  270. walker/commands/show/show_cassandra_status.py +0 -35
  271. walker/commands/show/show_commands.py +0 -58
  272. walker/commands/show/show_processes.py +0 -35
  273. walker/commands/show/show_repairs.py +0 -47
  274. walker/commands/status.py +0 -128
  275. walker/commands/storage.py +0 -52
  276. walker/commands/user_entry.py +0 -69
  277. walker/commands/watch.py +0 -85
  278. walker/embedded_params.py +0 -2
  279. walker/k8s_utils/cassandra_clusters.py +0 -48
  280. walker/k8s_utils/cassandra_nodes.py +0 -26
  281. walker/k8s_utils/pods.py +0 -211
  282. walker/repl.py +0 -165
  283. walker/repl_commands.py +0 -58
  284. walker/repl_state.py +0 -211
  285. walker/sso/authn_ad.py +0 -94
  286. walker/sso/idp.py +0 -150
  287. walker/sso/idp_login.py +0 -29
  288. walker/sso/sso_config.py +0 -45
  289. walker/utils.py +0 -194
  290. walker/version.py +0 -5
  291. {walker → adam}/checks/__init__.py +0 -0
  292. {walker → adam}/checks/check_context.py +0 -0
  293. {walker → adam}/checks/issue.py +0 -0
  294. {walker → adam}/cli_group.py +0 -0
  295. {walker → adam}/columns/__init__.py +0 -0
  296. {walker/commands → adam/commands/audit}/__init__.py +0 -0
  297. {walker/commands/frontend → adam/commands/cql}/__init__.py +0 -0
  298. {walker/commands/medusa → adam/commands/deploy}/__init__.py +0 -0
  299. {walker/commands/postgres → adam/commands/devices}/__init__.py +0 -0
  300. {walker/commands/reaper → adam/commands/export}/__init__.py +0 -0
  301. {walker/commands/repair → adam/commands/medusa}/__init__.py +0 -0
  302. {walker → adam}/commands/nodetool_commands.py +0 -0
  303. {walker/commands/show → adam/commands/postgres}/__init__.py +0 -0
  304. {walker/k8s_utils → adam/commands/reaper}/__init__.py +0 -0
  305. {walker/sso → adam/commands/repair}/__init__.py +0 -0
  306. /walker/medusa_show_restorejobs.py → /adam/commands/show/__init__.py +0 -0
  307. {walker → adam}/repl_session.py +0 -0
  308. {kaqing-1.77.0.dist-info → kaqing-2.0.171.dist-info}/WHEEL +0 -0
@@ -1,11 +1,11 @@
1
- from walker.commands.command import Command
2
- from .reaper_session import ReaperSession
3
- from walker.repl_state import ReplState, RequiredState
4
- from walker.utils import log2
1
+ from adam.commands.command import Command
2
+ from adam.commands.reaper.reaper_forward_session import ReaperForwardSession
3
+ from adam.commands.reaper.utils_reaper import Reapers
4
+ from adam.repl_state import ReplState, RequiredState
5
+ from adam.utils import log2
5
6
 
6
7
  class ReaperForwardStop(Command):
7
8
  COMMAND = 'reaper forward stop'
8
- reaper_login = None
9
9
 
10
10
  # the singleton pattern
11
11
  def __new__(cls, *args, **kwargs):
@@ -26,24 +26,18 @@ class ReaperForwardStop(Command):
26
26
  if not(args := self.args(cmd)):
27
27
  return super().run(cmd, state)
28
28
 
29
- state, args = self.apply_state(args, state)
30
- if not self.validate_state(state):
31
- return state
32
-
33
- if not ReaperSession.create(state):
34
- return state
29
+ with self.validate(args, state) as (args, state):
30
+ if not Reapers.pod_name(state):
31
+ return state
35
32
 
36
- ReaperSession.is_forwarding = False
37
- ReaperSession.stopping.set()
38
- log2("Stopped reaper forward session.")
33
+ ReaperForwardSession.is_forwarding = False
34
+ ReaperForwardSession.stopping.set()
35
+ log2("Stopped reaper forward session.")
39
36
 
40
- return state
37
+ return state
41
38
 
42
39
  def completion(self, state: ReplState):
43
- if state.sts:
44
- return super().completion(state)
45
-
46
- return {}
40
+ return super().completion(state)
47
41
 
48
42
  def help(self, _: ReplState):
49
43
  return f'{ReaperForwardStop.COMMAND}\t stop port-forward to reaper'
@@ -1,11 +1,10 @@
1
- from walker.commands.command import Command
2
- from walker.k8s_utils.pods import Pods
3
- from .reaper_session import ReaperSession
4
- from walker.repl_state import ReplState, RequiredState
1
+ from adam.commands.command import Command
2
+ from adam.commands.reaper.utils_reaper import Reapers
3
+ from adam.utils_k8s.pods import Pods
4
+ from adam.repl_state import ReplState, RequiredState
5
5
 
6
6
  class ReaperRestart(Command):
7
7
  COMMAND = 'reaper restart'
8
- reaper_login = None
9
8
 
10
9
  # the singleton pattern
11
10
  def __new__(cls, *args, **kwargs):
@@ -26,22 +25,16 @@ class ReaperRestart(Command):
26
25
  if not(args := self.args(cmd)):
27
26
  return super().run(cmd, state)
28
27
 
29
- state, args = self.apply_state(args, state)
30
- if not self.validate_state(state):
31
- return state
32
-
33
- if not(reaper := ReaperSession.create(state)):
34
- return state
28
+ with self.validate(args, state) as (args, state):
29
+ if not (pod := Reapers.pod_name(state)):
30
+ return state
35
31
 
36
- Pods.delete(reaper.pod, state.namespace)
32
+ Pods.delete(pod, state.namespace)
37
33
 
38
- return state
34
+ return state
39
35
 
40
36
  def completion(self, state: ReplState):
41
- if state.sts:
42
- return super().completion(state)
43
-
44
- return {}
37
+ return super().completion(state)
45
38
 
46
39
  def help(self, _: ReplState):
47
40
  return f'{ReaperRestart.COMMAND}\t restart reaper'
@@ -0,0 +1,46 @@
1
+ from adam.commands.command import Command
2
+ from adam.commands.reaper.utils_reaper import reaper
3
+ from adam.repl_state import ReplState, RequiredState
4
+ from adam.utils import log2
5
+
6
+ class ReaperRunAbort(Command):
7
+ COMMAND = 'reaper abort run'
8
+
9
+ # the singleton pattern
10
+ def __new__(cls, *args, **kwargs):
11
+ if not hasattr(cls, 'instance'): cls.instance = super(ReaperRunAbort, cls).__new__(cls)
12
+
13
+ return cls.instance
14
+
15
+ def __init__(self, successor: Command=None):
16
+ super().__init__(successor)
17
+
18
+ def command(self):
19
+ return ReaperRunAbort.COMMAND
20
+
21
+ def required(self):
22
+ return RequiredState.CLUSTER
23
+
24
+ def run(self, cmd: str, state: ReplState):
25
+ if not(args := self.args(cmd)):
26
+ return super().run(cmd, state)
27
+
28
+ with self.validate(args, state) as (args, state):
29
+ if not args:
30
+ if state.in_repl:
31
+ log2('Specify run id to abort.')
32
+ else:
33
+ Command.display_help()
34
+
35
+ return state
36
+
37
+ with reaper(state) as http:
38
+ http.put(f'repair_run/{args[0]}/state/ABORTED')
39
+
40
+ return state
41
+
42
+ def completion(self, state: ReplState):
43
+ return super().completion(state)
44
+
45
+ def help(self, _: ReplState):
46
+ return f'{ReaperRunAbort.COMMAND} <run-id>\t abort reaper run'
@@ -0,0 +1,82 @@
1
+ from adam.commands.command import Command
2
+ from adam.commands.reaper.utils_reaper import reaper
3
+ from adam.config import Config
4
+ from adam.repl_state import ReplState, RequiredState
5
+ from adam.utils import convert_seconds, epoch, lines_to_tabular, log, log2
6
+
7
+ class ReaperRuns(Command):
8
+ COMMAND = 'reaper show runs'
9
+
10
+ # the singleton pattern
11
+ def __new__(cls, *args, **kwargs):
12
+ if not hasattr(cls, 'instance'): cls.instance = super(ReaperRuns, cls).__new__(cls)
13
+
14
+ return cls.instance
15
+
16
+ def __init__(self, successor: Command=None):
17
+ super().__init__(successor)
18
+
19
+ def command(self):
20
+ return ReaperRuns.COMMAND
21
+
22
+ def required(self):
23
+ return RequiredState.CLUSTER
24
+
25
+ def run(self, cmd: str, state: ReplState):
26
+ if not(args := self.args(cmd)):
27
+ return super().run(cmd, state)
28
+
29
+ with self.validate(args, state) as (args, state):
30
+ header = 'ID,START,DURATION,STATE,CLUSTER,KEYSPACE,TABLES,REPAIRED'
31
+
32
+ def line(run):
33
+ id = run['id']
34
+ state = run['state']
35
+ start_time = run['start_time']
36
+ end_time = run['end_time']
37
+ duration = '-'
38
+ if state == 'DONE' and end_time:
39
+ hours, minutes, seconds = convert_seconds(epoch(end_time) - epoch(start_time))
40
+ if hours:
41
+ duration = f"{hours:2d}h {minutes:2d}m {seconds:2d}s"
42
+ elif minutes:
43
+ duration = f"{minutes:2d}m {seconds:2d}s"
44
+ else:
45
+ duration = f"{seconds:2d}s"
46
+
47
+ return f"{id},{start_time},{duration},{state},{run['cluster_name']},{run['keyspace_name']},{len(run['column_families'])},{run['segments_repaired']}/{run['total_segments']}"
48
+
49
+ with reaper(state) as http:
50
+ response = http.get('repair_run?state=RUNNING', params={
51
+ 'cluster_name': 'all',
52
+ 'limit': Config().get('reaper.show-runs-batch', 10)
53
+ })
54
+
55
+ runs = response.json()
56
+ if runs:
57
+ log(lines_to_tabular(sorted([line(run) for run in runs], reverse=True), header, separator=","))
58
+ else:
59
+ log2('No running runs found.')
60
+ log2()
61
+
62
+ response = http.get('repair_run?state=PAUSED,ABORTED,DONE', params={
63
+ 'cluster_name': 'all',
64
+ 'limit': Config().get('reaper.show-runs-batch', 10)
65
+ })
66
+
67
+ runs = response.json()
68
+ if runs:
69
+ log(lines_to_tabular(sorted([line(run) for run in runs], reverse=True), header, separator=","))
70
+ else:
71
+ log2('No runs found.')
72
+
73
+ return state
74
+
75
+ def completion(self, state: ReplState):
76
+ if state.sts:
77
+ return super().completion(state)
78
+
79
+ return {}
80
+
81
+ def help(self, _: ReplState):
82
+ return f'{ReaperRuns.COMMAND}\t show reaper runs'
@@ -0,0 +1,63 @@
1
+ from adam.commands.command import Command
2
+ from adam.commands.reaper.utils_reaper import reaper
3
+ from adam.config import Config
4
+ from adam.repl_state import ReplState, RequiredState
5
+ from adam.utils import log2
6
+
7
+ class ReaperRunsAbort(Command):
8
+ COMMAND = 'reaper abort runs'
9
+
10
+ # the singleton pattern
11
+ def __new__(cls, *args, **kwargs):
12
+ if not hasattr(cls, 'instance'): cls.instance = super(ReaperRunsAbort, cls).__new__(cls)
13
+
14
+ return cls.instance
15
+
16
+ def __init__(self, successor: Command=None):
17
+ super().__init__(successor)
18
+
19
+ def command(self):
20
+ return ReaperRunsAbort.COMMAND
21
+
22
+ def required(self):
23
+ return RequiredState.CLUSTER
24
+
25
+ def run(self, cmd: str, state: ReplState):
26
+ if not(args := self.args(cmd)):
27
+ return super().run(cmd, state)
28
+
29
+ with self.validate(args, state) as (args, state):
30
+ with reaper(state) as http:
31
+ # PAUSED, RUNNING, ABORTED
32
+ aborted = 0
33
+
34
+ while True == True:
35
+ response = http.get('repair_run?state=RUNNING', params={
36
+ 'cluster_name': 'all',
37
+ 'limit': Config().get('reaper.abort-runs-batch', 10)
38
+ })
39
+ if not response:
40
+ break
41
+
42
+ runs = response.json()
43
+ if not runs:
44
+ break
45
+
46
+ for run in runs:
47
+ run_id = run['id']
48
+ # PUT /repair_run/{id}/state/{state}
49
+ http.put(f'repair_run/{run_id}/state/ABORTED')
50
+ aborted += 1
51
+
52
+ if aborted:
53
+ log2(f'Aborted {aborted} runs in total.')
54
+ else:
55
+ log2('No running repair runs found.')
56
+
57
+ return state
58
+
59
+ def completion(self, state: ReplState):
60
+ return super().completion(state)
61
+
62
+ def help(self, _: ReplState):
63
+ return f'{ReaperRunsAbort.COMMAND}\t abort all running reaper runs'
@@ -0,0 +1,45 @@
1
+ from adam.commands.command import Command
2
+ from adam.commands.reaper.utils_reaper import Reapers, reaper
3
+ from adam.repl_state import ReplState, RequiredState
4
+ from adam.utils import log2
5
+
6
+ class ReaperScheduleActivate(Command):
7
+ COMMAND = 'reaper activate schedule'
8
+
9
+ # the singleton pattern
10
+ def __new__(cls, *args, **kwargs):
11
+ if not hasattr(cls, 'instance'): cls.instance = super(ReaperScheduleActivate, cls).__new__(cls)
12
+
13
+ return cls.instance
14
+
15
+ def __init__(self, successor: Command=None):
16
+ super().__init__(successor)
17
+
18
+ def command(self):
19
+ return ReaperScheduleActivate.COMMAND
20
+
21
+ def required(self):
22
+ return RequiredState.CLUSTER
23
+
24
+ def run(self, cmd: str, state: ReplState):
25
+ if not(args := self.args(cmd)):
26
+ return super().run(cmd, state)
27
+
28
+ with self.validate(args, state) as (args, state):
29
+ if not args:
30
+ log2('Specify schedule to activate.')
31
+
32
+ return state
33
+
34
+ schedule_id = args[0]
35
+ with reaper(state) as http:
36
+ http.put(f'repair_schedule/{schedule_id}?state=ACTIVE')
37
+ Reapers.show_schedule(state, schedule_id)
38
+
39
+ return schedule_id
40
+
41
+ def completion(self, state: ReplState):
42
+ return super().completion(state, lambda: {id: None for id in Reapers.cached_schedule_ids(state)})
43
+
44
+ def help(self, _: ReplState):
45
+ return f'{ReaperScheduleActivate.COMMAND} <schedule-id>\t resume reaper schedule'
@@ -0,0 +1,45 @@
1
+ from adam.commands.command import Command
2
+ from adam.commands.reaper.utils_reaper import Reapers, reaper
3
+ from adam.repl_state import ReplState, RequiredState
4
+ from adam.utils import log2
5
+
6
+ class ReaperScheduleStart(Command):
7
+ COMMAND = 'reaper start schedule'
8
+
9
+ # the singleton pattern
10
+ def __new__(cls, *args, **kwargs):
11
+ if not hasattr(cls, 'instance'): cls.instance = super(ReaperScheduleStart, cls).__new__(cls)
12
+
13
+ return cls.instance
14
+
15
+ def __init__(self, successor: Command=None):
16
+ super().__init__(successor)
17
+
18
+ def command(self):
19
+ return ReaperScheduleStart.COMMAND
20
+
21
+ def required(self):
22
+ return RequiredState.CLUSTER
23
+
24
+ def run(self, cmd: str, state: ReplState):
25
+ if not(args := self.args(cmd)):
26
+ return super().run(cmd, state)
27
+
28
+ with self.validate(args, state) as (args, state):
29
+ if not args:
30
+ log2('Specify schedule to activate.')
31
+
32
+ return state
33
+
34
+ schedule_id = args[0]
35
+ with reaper(state) as http:
36
+ http.post(f'repair_schedule/start/{schedule_id}')
37
+ Reapers.show_schedule(state, schedule_id)
38
+
39
+ return schedule_id
40
+
41
+ def completion(self, state: ReplState):
42
+ return super().completion(state, lambda: {id: None for id in Reapers.cached_schedule_ids(state)})
43
+
44
+ def help(self, _: ReplState):
45
+ return f'{ReaperScheduleStart.COMMAND} <schedule-id>\t start reaper runs for schedule'
@@ -0,0 +1,45 @@
1
+ from adam.commands.command import Command
2
+ from adam.commands.reaper.utils_reaper import Reapers, reaper
3
+ from adam.repl_state import ReplState, RequiredState
4
+ from adam.utils import log2
5
+
6
+ class ReaperScheduleStop(Command):
7
+ COMMAND = 'reaper stop schedule'
8
+
9
+ # the singleton pattern
10
+ def __new__(cls, *args, **kwargs):
11
+ if not hasattr(cls, 'instance'): cls.instance = super(ReaperScheduleStop, cls).__new__(cls)
12
+
13
+ return cls.instance
14
+
15
+ def __init__(self, successor: Command=None):
16
+ super().__init__(successor)
17
+
18
+ def command(self):
19
+ return ReaperScheduleStop.COMMAND
20
+
21
+ def required(self):
22
+ return RequiredState.CLUSTER
23
+
24
+ def run(self, cmd: str, state: ReplState):
25
+ if not(args := self.args(cmd)):
26
+ return super().run(cmd, state)
27
+
28
+ with self.validate(args, state) as (args, state):
29
+ if not args:
30
+ log2('Specify run schedule to stop.')
31
+
32
+ return state
33
+
34
+ with reaper(state) as http:
35
+ schedule_id = args[0]
36
+ http.put(f'repair_schedule/{schedule_id}?state=PAUSED')
37
+ Reapers.show_schedule(state, schedule_id)
38
+
39
+ return schedule_id
40
+
41
+ def completion(self, state: ReplState):
42
+ return super().completion(state, lambda: {id: None for id in Reapers.cached_schedule_ids(state)})
43
+
44
+ def help(self, _: ReplState):
45
+ return f'{ReaperScheduleStop.COMMAND} <schedule-id>\t pause reaper schedule'
@@ -1,10 +1,9 @@
1
- from walker.commands.command import Command
2
- from .reaper_session import ReaperSession
3
- from walker.repl_state import ReplState, RequiredState
1
+ from adam.commands.command import Command
2
+ from adam.commands.reaper.utils_reaper import Reapers
3
+ from adam.repl_state import ReplState, RequiredState
4
4
 
5
5
  class ReaperSchedules(Command):
6
6
  COMMAND = 'reaper show schedules'
7
- reaper_login = None
8
7
 
9
8
  # the singleton pattern
10
9
  def __new__(cls, *args, **kwargs):
@@ -25,22 +24,13 @@ class ReaperSchedules(Command):
25
24
  if not(args := self.args(cmd)):
26
25
  return super().run(cmd, state)
27
26
 
28
- state, args = self.apply_state(args, state)
29
- if not self.validate_state(state):
30
- return state
27
+ with self.validate(args, state) as (args, state):
28
+ Reapers.show_schedules(state)
31
29
 
32
- if not(reaper := ReaperSession.create(state)):
33
30
  return state
34
31
 
35
- reaper.show_schedules(state)
36
-
37
- return state
38
-
39
32
  def completion(self, state: ReplState):
40
- if state.sts:
41
- return super().completion(state)
42
-
43
- return {}
33
+ return super().completion(state)
44
34
 
45
35
  def help(self, _: ReplState):
46
36
  return f'{ReaperSchedules.COMMAND}\t show reaper schedules'
@@ -2,15 +2,13 @@ import re
2
2
  from typing import List, cast
3
3
  from kubernetes import client
4
4
 
5
- from walker.commands.command import Command
6
- from walker.commands.commands_utils import show_pods
7
- from .reaper_session import ReaperSession
8
- from walker.repl_state import ReplState, RequiredState
9
- from walker.utils import lines_to_tabular, log, log2
5
+ from adam.commands.command import Command
6
+ from adam.commands.commands_utils import show_pods
7
+ from adam.commands.reaper.utils_reaper import Reapers
8
+ from adam.repl_state import ReplState, RequiredState
10
9
 
11
10
  class ReaperStatus(Command):
12
11
  COMMAND = 'reaper status'
13
- reaper_login = None
14
12
 
15
13
  # the singleton pattern
16
14
  def __new__(cls, *args, **kwargs):
@@ -31,18 +29,15 @@ class ReaperStatus(Command):
31
29
  if not(args := self.args(cmd)):
32
30
  return super().run(cmd, state)
33
31
 
34
- state, args = self.apply_state(args, state)
35
- if not self.validate_state(state):
36
- return state
37
-
38
- if not(reaper := ReaperSession.create(state)):
39
- return state
32
+ with self.validate(args, state) as (args, state):
33
+ if not Reapers.pod_name(state):
34
+ return state
40
35
 
41
- pods = self.list_pods(state.sts, state.namespace)
36
+ pods = self.list_pods(state.sts, state.namespace)
42
37
 
43
- show_pods(pods, state.namespace, show_host_id=False)
38
+ show_pods(pods, state.namespace, show_host_id=False)
44
39
 
45
- return state
40
+ return state
46
41
 
47
42
  def list_pods(self, sts_name: str, namespace: str) -> List[client.V1Pod]:
48
43
  v1 = client.CoreV1Api()
@@ -55,10 +50,7 @@ class ReaperStatus(Command):
55
50
  return cast(List[client.V1Pod], v1.list_namespaced_pod(namespace, label_selector=label_selector).items)
56
51
 
57
52
  def completion(self, state: ReplState):
58
- if state.sts:
59
- return super().completion(state)
60
-
61
- return {}
53
+ return super().completion(state)
62
54
 
63
55
  def help(self, _: ReplState):
64
56
  return f'{ReaperStatus.COMMAND}\t show reaper status'