kaqing 2.0.145__py3-none-any.whl → 2.0.189__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 kaqing might be problematic. Click here for more details.

Files changed (209) hide show
  1. adam/__init__.py +0 -2
  2. adam/app_session.py +9 -12
  3. adam/apps.py +18 -4
  4. adam/batch.py +4 -4
  5. adam/checks/check_utils.py +16 -46
  6. adam/checks/cpu.py +7 -1
  7. adam/checks/cpu_metrics.py +52 -0
  8. adam/checks/disk.py +2 -3
  9. adam/columns/columns.py +3 -1
  10. adam/columns/cpu.py +3 -1
  11. adam/columns/cpu_metrics.py +22 -0
  12. adam/columns/memory.py +3 -4
  13. adam/commands/__init__.py +24 -0
  14. adam/commands/alter_tables.py +33 -48
  15. adam/commands/app/__init__.py +0 -0
  16. adam/commands/app/app.py +38 -0
  17. adam/commands/{app_ping.py → app/app_ping.py} +7 -13
  18. adam/commands/app/show_app_actions.py +49 -0
  19. adam/commands/{show → app}/show_app_id.py +8 -11
  20. adam/commands/{show → app}/show_app_queues.py +7 -14
  21. adam/commands/app/utils_app.py +106 -0
  22. adam/commands/audit/audit.py +21 -40
  23. adam/commands/audit/audit_repair_tables.py +14 -19
  24. adam/commands/audit/audit_run.py +14 -22
  25. adam/commands/audit/completions_l.py +15 -0
  26. adam/commands/audit/show_last10.py +4 -19
  27. adam/commands/audit/show_slow10.py +4 -18
  28. adam/commands/audit/show_top10.py +4 -16
  29. adam/commands/audit/utils_show_top10.py +15 -3
  30. adam/commands/bash/__init__.py +5 -0
  31. adam/commands/bash/bash.py +7 -104
  32. adam/commands/bash/utils_bash.py +16 -0
  33. adam/commands/cat.py +7 -27
  34. adam/commands/cd.py +7 -11
  35. adam/commands/check.py +15 -24
  36. adam/commands/cli_commands.py +8 -4
  37. adam/commands/clipboard_copy.py +87 -0
  38. adam/commands/code.py +21 -24
  39. adam/commands/command.py +207 -42
  40. adam/commands/commands_utils.py +25 -27
  41. adam/commands/cql/completions_c.py +28 -0
  42. adam/commands/cql/cqlsh.py +9 -33
  43. adam/commands/cql/{cql_utils.py → utils_cql.py} +111 -15
  44. adam/commands/deploy/code_start.py +7 -10
  45. adam/commands/deploy/code_stop.py +4 -21
  46. adam/commands/deploy/code_utils.py +3 -3
  47. adam/commands/deploy/deploy.py +4 -27
  48. adam/commands/deploy/deploy_frontend.py +14 -17
  49. adam/commands/deploy/deploy_pg_agent.py +3 -6
  50. adam/commands/deploy/deploy_pod.py +64 -68
  51. adam/commands/deploy/undeploy.py +4 -27
  52. adam/commands/deploy/undeploy_frontend.py +4 -7
  53. adam/commands/deploy/undeploy_pg_agent.py +5 -8
  54. adam/commands/deploy/undeploy_pod.py +9 -12
  55. adam/commands/devices/device.py +124 -2
  56. adam/commands/devices/device_app.py +41 -24
  57. adam/commands/devices/device_auit_log.py +10 -4
  58. adam/commands/devices/device_cass.py +48 -14
  59. adam/commands/devices/device_export.py +13 -12
  60. adam/commands/devices/device_postgres.py +105 -54
  61. adam/commands/download_file.py +47 -0
  62. adam/commands/exit.py +1 -4
  63. adam/commands/export/clean_up_all_export_sessions.py +37 -0
  64. adam/commands/export/clean_up_export_sessions.py +9 -10
  65. adam/commands/export/completions_x.py +11 -0
  66. adam/commands/export/download_export_session.py +40 -0
  67. adam/commands/export/drop_export_database.py +7 -26
  68. adam/commands/export/drop_export_databases.py +5 -14
  69. adam/commands/export/export.py +6 -52
  70. adam/commands/export/export_databases.py +108 -32
  71. adam/commands/export/export_select.py +8 -59
  72. adam/commands/export/export_sessions.py +209 -0
  73. adam/commands/export/export_use.py +14 -20
  74. adam/commands/export/export_x_select.py +48 -0
  75. adam/commands/export/exporter.py +135 -167
  76. adam/commands/export/import_files.py +44 -0
  77. adam/commands/export/import_session.py +11 -35
  78. adam/commands/export/importer.py +19 -5
  79. adam/commands/export/importer_athena.py +112 -44
  80. adam/commands/export/importer_sqlite.py +42 -22
  81. adam/commands/export/show_column_counts.py +13 -31
  82. adam/commands/export/show_export_databases.py +7 -7
  83. adam/commands/export/show_export_session.py +8 -20
  84. adam/commands/export/show_export_sessions.py +6 -16
  85. adam/commands/export/utils_export.py +64 -11
  86. adam/commands/find_files.py +51 -0
  87. adam/commands/find_processes.py +76 -0
  88. adam/commands/head.py +36 -0
  89. adam/commands/help.py +2 -2
  90. adam/commands/intermediate_command.py +52 -0
  91. adam/commands/issues.py +11 -43
  92. adam/commands/kubectl.py +3 -6
  93. adam/commands/login.py +22 -24
  94. adam/commands/logs.py +3 -6
  95. adam/commands/ls.py +9 -10
  96. adam/commands/medusa/medusa.py +4 -22
  97. adam/commands/medusa/medusa_backup.py +20 -27
  98. adam/commands/medusa/medusa_restore.py +49 -46
  99. adam/commands/medusa/medusa_show_backupjobs.py +16 -18
  100. adam/commands/medusa/medusa_show_restorejobs.py +13 -18
  101. adam/commands/medusa/utils_medusa.py +15 -0
  102. adam/commands/nodetool.py +7 -21
  103. adam/commands/param_get.py +11 -14
  104. adam/commands/param_set.py +8 -12
  105. adam/commands/postgres/completions_p.py +22 -0
  106. adam/commands/postgres/postgres.py +34 -57
  107. adam/commands/postgres/postgres_databases.py +270 -0
  108. adam/commands/postgres/postgres_ls.py +4 -8
  109. adam/commands/postgres/postgres_preview.py +5 -9
  110. adam/commands/postgres/utils_postgres.py +79 -0
  111. adam/commands/preview_table.py +8 -45
  112. adam/commands/pwd.py +13 -16
  113. adam/commands/reaper/reaper.py +4 -27
  114. adam/commands/reaper/reaper_forward.py +49 -56
  115. adam/commands/reaper/reaper_forward_session.py +6 -0
  116. adam/commands/reaper/reaper_forward_stop.py +10 -16
  117. adam/commands/reaper/reaper_restart.py +7 -14
  118. adam/commands/reaper/reaper_run_abort.py +8 -33
  119. adam/commands/reaper/reaper_runs.py +43 -58
  120. adam/commands/reaper/reaper_runs_abort.py +29 -49
  121. adam/commands/reaper/reaper_schedule_activate.py +14 -33
  122. adam/commands/reaper/reaper_schedule_start.py +9 -33
  123. adam/commands/reaper/reaper_schedule_stop.py +9 -33
  124. adam/commands/reaper/reaper_schedules.py +4 -14
  125. adam/commands/reaper/reaper_status.py +8 -16
  126. adam/commands/reaper/utils_reaper.py +203 -0
  127. adam/commands/repair/repair.py +4 -22
  128. adam/commands/repair/repair_log.py +5 -11
  129. adam/commands/repair/repair_run.py +27 -34
  130. adam/commands/repair/repair_scan.py +32 -40
  131. adam/commands/repair/repair_stop.py +5 -12
  132. adam/commands/report.py +27 -29
  133. adam/commands/restart.py +25 -26
  134. adam/commands/rollout.py +19 -24
  135. adam/commands/shell.py +12 -4
  136. adam/commands/show/show.py +11 -27
  137. adam/commands/show/show_adam.py +3 -3
  138. adam/commands/show/show_cassandra_repairs.py +37 -0
  139. adam/commands/show/show_cassandra_status.py +47 -51
  140. adam/commands/show/show_cassandra_version.py +5 -18
  141. adam/commands/show/show_cli_commands.py +56 -0
  142. adam/commands/show/show_host.py +1 -1
  143. adam/commands/show/show_login.py +20 -27
  144. adam/commands/show/show_params.py +2 -5
  145. adam/commands/show/show_processes.py +18 -21
  146. adam/commands/show/show_storage.py +11 -20
  147. adam/commands/watch.py +26 -29
  148. adam/config.py +5 -16
  149. adam/embedded_params.py +1 -1
  150. adam/log.py +4 -4
  151. adam/pod_exec_result.py +3 -3
  152. adam/repl.py +45 -39
  153. adam/repl_commands.py +26 -19
  154. adam/repl_session.py +8 -1
  155. adam/repl_state.py +85 -36
  156. adam/sql/lark_completer.py +284 -0
  157. adam/sql/lark_parser.py +604 -0
  158. adam/sql/sql_completer.py +4 -6
  159. adam/sql/sql_state_machine.py +29 -16
  160. adam/sso/authn_ad.py +6 -8
  161. adam/sso/authn_okta.py +4 -6
  162. adam/sso/cred_cache.py +3 -5
  163. adam/sso/idp.py +9 -12
  164. adam/utils.py +484 -37
  165. adam/utils_athena.py +19 -19
  166. adam/utils_audits.py +12 -12
  167. adam/utils_issues.py +32 -0
  168. adam/utils_k8s/app_clusters.py +14 -19
  169. adam/utils_k8s/app_pods.py +7 -2
  170. adam/utils_k8s/cassandra_clusters.py +30 -19
  171. adam/utils_k8s/cassandra_nodes.py +2 -2
  172. adam/utils_k8s/custom_resources.py +16 -17
  173. adam/utils_k8s/ingresses.py +2 -2
  174. adam/utils_k8s/jobs.py +7 -11
  175. adam/utils_k8s/k8s.py +96 -0
  176. adam/utils_k8s/kube_context.py +2 -2
  177. adam/utils_k8s/pods.py +37 -81
  178. adam/utils_k8s/secrets.py +4 -4
  179. adam/utils_k8s/service_accounts.py +5 -4
  180. adam/utils_k8s/services.py +2 -2
  181. adam/utils_k8s/statefulsets.py +6 -14
  182. adam/utils_local.py +4 -0
  183. adam/utils_repl/appendable_completer.py +6 -0
  184. adam/utils_repl/repl_completer.py +128 -2
  185. adam/utils_repl/state_machine.py +3 -3
  186. adam/utils_sqlite.py +78 -42
  187. adam/version.py +1 -1
  188. {kaqing-2.0.145.dist-info → kaqing-2.0.189.dist-info}/METADATA +1 -1
  189. kaqing-2.0.189.dist-info/RECORD +253 -0
  190. kaqing-2.0.189.dist-info/top_level.txt +2 -0
  191. teddy/__init__.py +0 -0
  192. teddy/lark_parser.py +436 -0
  193. teddy/lark_parser2.py +618 -0
  194. adam/commands/app.py +0 -67
  195. adam/commands/cp.py +0 -95
  196. adam/commands/cql/cql_completions.py +0 -28
  197. adam/commands/export/clean_up_export_session.py +0 -53
  198. adam/commands/export/export_select_x.py +0 -54
  199. adam/commands/postgres/postgres_context.py +0 -248
  200. adam/commands/postgres/postgres_utils.py +0 -31
  201. adam/commands/postgres/psql_completions.py +0 -10
  202. adam/commands/reaper/reaper_session.py +0 -159
  203. adam/commands/show/show_app_actions.py +0 -56
  204. adam/commands/show/show_commands.py +0 -61
  205. adam/commands/show/show_repairs.py +0 -47
  206. kaqing-2.0.145.dist-info/RECORD +0 -227
  207. kaqing-2.0.145.dist-info/top_level.txt +0 -1
  208. {kaqing-2.0.145.dist-info → kaqing-2.0.189.dist-info}/WHEEL +0 -0
  209. {kaqing-2.0.145.dist-info → kaqing-2.0.189.dist-info}/entry_points.txt +0 -0
@@ -1,14 +1,11 @@
1
- import requests
2
-
3
1
  from adam.commands.command import Command
4
- from .reaper_session import ReaperSession
2
+ from adam.commands.reaper.utils_reaper import reaper
5
3
  from adam.config import Config
6
4
  from adam.repl_state import ReplState, RequiredState
7
- from adam.utils import convert_seconds, epoch, lines_to_tabular, log, log2
5
+ from adam.utils import convert_seconds, epoch, tabulize, log, log2
8
6
 
9
7
  class ReaperRuns(Command):
10
8
  COMMAND = 'reaper show runs'
11
- reaper_login = None
12
9
 
13
10
  # the singleton pattern
14
11
  def __new__(cls, *args, **kwargs):
@@ -29,63 +26,51 @@ class ReaperRuns(Command):
29
26
  if not(args := self.args(cmd)):
30
27
  return super().run(cmd, state)
31
28
 
32
- state, args = self.apply_state(args, state)
33
- if not self.validate_state(state):
34
- return state
35
-
36
- if not(reaper := ReaperSession.create(state)):
37
- return state
38
-
39
- self.show_runs(state, reaper)
40
-
41
- return state
42
-
43
- def show_runs(self, state: ReplState, reaper: ReaperSession):
44
- def body(uri: str, headers: dict[str, str]):
45
- return requests.get(uri, headers=headers, params={
46
- 'cluster_name': 'all',
47
- 'limit': Config().get('reaper.show-runs-batch', 10)
48
- })
49
-
50
- def line(run):
51
- state = run['state']
52
- start_time = run['start_time']
53
- end_time = run['end_time']
54
- duration = '-'
55
- if state == 'DONE' and end_time:
56
- hours, minutes, seconds = convert_seconds(epoch(end_time) - epoch(start_time))
57
- if hours:
58
- duration = f"{hours:2d}h {minutes:2d}m {seconds:2d}s"
59
- elif minutes:
60
- duration = f"{minutes:2d}m {seconds:2d}s"
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
+ tabulize(sorted([line(run) for run in runs], reverse=True), header=header, separator=",")
61
58
  else:
62
- duration = f"{seconds:2d}s"
59
+ log2('No running runs found.')
60
+ log2()
63
61
 
64
- return f"{start_time},{duration},{state},{run['cluster_name']},{run['keyspace_name']},{len(run['column_families'])},{run['segments_repaired']}/{run['total_segments']}"
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
+ })
65
66
 
66
- # PAUSED, RUNNING, ABORTED
67
- response = reaper.port_forwarded(state, 'repair_run?state=RUNNING', body, method='GET')
68
- if not response:
69
- return
70
-
71
- header = 'Start,Duration,State,Cluster,Keyspace,Tables,Repaired'
72
-
73
- runs = response.json()
74
- if runs:
75
- log(lines_to_tabular(sorted([line(run) for run in runs], reverse=True), header, separator=","))
76
- else:
77
- log2('No running runs found.')
78
- log2()
79
-
80
- response = reaper.port_forwarded(state, 'repair_run?state=PAUSED,ABORTED,DONE', body, method='GET')
81
- if not response:
82
- return
67
+ runs = response.json()
68
+ if runs:
69
+ tabulize(sorted([line(run) for run in runs], reverse=True), header=header, separator=",")
70
+ else:
71
+ log2('No runs found.')
83
72
 
84
- runs = response.json()
85
- if runs:
86
- log(lines_to_tabular(sorted([line(run) for run in runs], reverse=True), header, separator=","))
87
- else:
88
- log2('No runs found.')
73
+ return state
89
74
 
90
75
  def completion(self, state: ReplState):
91
76
  if state.sts:
@@ -1,14 +1,11 @@
1
- import requests
2
-
3
1
  from adam.commands.command import Command
4
- from .reaper_session import ReaperSession
2
+ from adam.commands.reaper.utils_reaper import reaper
5
3
  from adam.config import Config
6
4
  from adam.repl_state import ReplState, RequiredState
7
5
  from adam.utils import log2
8
6
 
9
7
  class ReaperRunsAbort(Command):
10
8
  COMMAND = 'reaper abort runs'
11
- reaper_login = None
12
9
 
13
10
  # the singleton pattern
14
11
  def __new__(cls, *args, **kwargs):
@@ -29,55 +26,38 @@ class ReaperRunsAbort(Command):
29
26
  if not(args := self.args(cmd)):
30
27
  return super().run(cmd, state)
31
28
 
32
- state, args = self.apply_state(args, state)
33
- if not self.validate_state(state):
34
- return state
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.')
35
56
 
36
- if not(reaper := ReaperSession.create(state)):
37
57
  return state
38
58
 
39
- self.stop_runs(state, reaper)
40
-
41
- return state
42
-
43
- def stop_runs(self, state: ReplState, reaper: ReaperSession):
44
- def body_list(uri: str, headers: dict[str, str]):
45
- return requests.get(uri, headers=headers, params={
46
- 'cluster_name': 'all',
47
- 'limit': Config().get('reaper.abort-runs-batch', 10)
48
- })
49
-
50
- def body_abort(uri: str, headers: dict[str, str]):
51
- return requests.put(uri, headers=headers)
52
-
53
- # PAUSED, RUNNING, ABORTED
54
- aborted = 0
55
- while True == True:
56
- response = reaper.port_forwarded(state, 'repair_run?state=RUNNING', body_list, method='GET')
57
- if not response:
58
- break
59
-
60
- runs = response.json()
61
- if not runs:
62
- break
63
-
64
- for run in runs:
65
- run_id = run['id']
66
- # PUT /repair_run/{id}/state/{state}
67
- reaper.port_forwarded(state, f'repair_run/{run_id}/state/ABORTED', body_abort, method='PUT')
68
- log2(f'Aborted {len(runs)} runs.')
69
- aborted += 1
70
-
71
- if aborted:
72
- log2(f'Aborted {aborted} runs in total.')
73
- else:
74
- log2('No running repair runs found.')
75
-
76
59
  def completion(self, state: ReplState):
77
- if state.sts:
78
- return super().completion(state)
79
-
80
- return {}
60
+ return super().completion(state)
81
61
 
82
62
  def help(self, _: ReplState):
83
63
  return f'{ReaperRunsAbort.COMMAND}\t abort all running reaper runs'
@@ -1,13 +1,15 @@
1
- import requests
2
-
1
+ from adam.commands import validate_args
3
2
  from adam.commands.command import Command
4
- from .reaper_session import ReaperSession
3
+ from adam.commands.reaper.utils_reaper import Reapers, reaper
5
4
  from adam.repl_state import ReplState, RequiredState
6
- from adam.utils import log2
5
+
6
+ import nest_asyncio
7
+ nest_asyncio.apply()
8
+
9
+ import asyncio
7
10
 
8
11
  class ReaperScheduleActivate(Command):
9
12
  COMMAND = 'reaper activate schedule'
10
- reaper_login = None
11
13
 
12
14
  # the singleton pattern
13
15
  def __new__(cls, *args, **kwargs):
@@ -28,37 +30,16 @@ class ReaperScheduleActivate(Command):
28
30
  if not(args := self.args(cmd)):
29
31
  return super().run(cmd, state)
30
32
 
31
- state, args = self.apply_state(args, state)
32
- if not self.validate_state(state):
33
- return state
34
-
35
- if not args:
36
- log2('Specify schedule to activate.')
37
-
38
- return state
39
-
40
- schedule_id = args[0]
41
- if not(reaper := ReaperSession.create(state)):
42
- return state
33
+ with self.validate(args, state) as (args, state):
34
+ with validate_args(args, state, name='schedule') as schedule_id:
35
+ with reaper(state) as http:
36
+ http.put(f'repair_schedule/{schedule_id}?state=ACTIVE')
37
+ Reapers.show_schedule(state, schedule_id)
43
38
 
44
- self.activate_schedule(state, reaper, schedule_id)
45
-
46
- return schedule_id
47
-
48
- def activate_schedule(self, state: ReplState, reaper: ReaperSession, schedule_id: str):
49
- def body(uri: str, headers: dict[str, str]):
50
- return requests.put(uri, headers=headers)
51
-
52
- reaper.port_forwarded(state, f'repair_schedule/{schedule_id}?state=ACTIVE', body, method='PUT')
53
- reaper.show_schedule(state, schedule_id)
39
+ return schedule_id
54
40
 
55
41
  def completion(self, state: ReplState):
56
- if state.sts:
57
- leaf = {id: None for id in ReaperSession.cached_schedule_ids(state)}
58
-
59
- return super().completion(state, leaf)
60
-
61
- return {}
42
+ return super().completion(state, lambda: {id: None for id in Reapers.cached_schedule_ids(state)}, auto_key='reaper.schedules')
62
43
 
63
44
  def help(self, _: ReplState):
64
45
  return f'{ReaperScheduleActivate.COMMAND} <schedule-id>\t resume reaper schedule'
@@ -1,13 +1,10 @@
1
- import requests
2
-
1
+ from adam.commands import validate_args
3
2
  from adam.commands.command import Command
4
- from .reaper_session import ReaperSession
3
+ from adam.commands.reaper.utils_reaper import Reapers, reaper
5
4
  from adam.repl_state import ReplState, RequiredState
6
- from adam.utils import log2
7
5
 
8
6
  class ReaperScheduleStart(Command):
9
7
  COMMAND = 'reaper start schedule'
10
- reaper_login = None
11
8
 
12
9
  # the singleton pattern
13
10
  def __new__(cls, *args, **kwargs):
@@ -28,37 +25,16 @@ class ReaperScheduleStart(Command):
28
25
  if not(args := self.args(cmd)):
29
26
  return super().run(cmd, state)
30
27
 
31
- state, args = self.apply_state(args, state)
32
- if not self.validate_state(state):
33
- return state
34
-
35
- if not args:
36
- log2('Specify schedule to activate.')
37
-
38
- return state
39
-
40
- schedule_id = args[0]
41
- if not(reaper := ReaperSession.create(state)):
42
- return schedule_id
43
-
44
- self.start_schedule(state, reaper, schedule_id)
28
+ with self.validate(args, state) as (args, state):
29
+ with validate_args(args, state, name='schedule') as schedule_id:
30
+ with reaper(state) as http:
31
+ http.post(f'repair_schedule/start/{schedule_id}')
32
+ Reapers.show_schedule(state, schedule_id)
45
33
 
46
- return schedule_id
47
-
48
- def start_schedule(self, state: ReplState, reaper: ReaperSession, schedule_id: str):
49
- def body(uri: str, headers: dict[str, str]):
50
- return requests.post(uri, headers=headers)
51
-
52
- reaper.port_forwarded(state, f'repair_schedule/start/{schedule_id}', body, method='POST')
53
- reaper.show_schedule(state, schedule_id)
34
+ return schedule_id
54
35
 
55
36
  def completion(self, state: ReplState):
56
- if state.sts:
57
- leaf = {id: None for id in ReaperSession.cached_schedule_ids(state)}
58
-
59
- return super().completion(state, leaf)
60
-
61
- return {}
37
+ return super().completion(state, lambda: {id: None for id in Reapers.cached_schedule_ids(state)}, auto_key='reaper.schedules')
62
38
 
63
39
  def help(self, _: ReplState):
64
40
  return f'{ReaperScheduleStart.COMMAND} <schedule-id>\t start reaper runs for schedule'
@@ -1,13 +1,10 @@
1
- import requests
2
-
1
+ from adam.commands import validate_args
3
2
  from adam.commands.command import Command
4
- from .reaper_session import ReaperSession
3
+ from adam.commands.reaper.utils_reaper import Reapers, reaper
5
4
  from adam.repl_state import ReplState, RequiredState
6
- from adam.utils import log2
7
5
 
8
6
  class ReaperScheduleStop(Command):
9
7
  COMMAND = 'reaper stop schedule'
10
- reaper_login = None
11
8
 
12
9
  # the singleton pattern
13
10
  def __new__(cls, *args, **kwargs):
@@ -28,37 +25,16 @@ class ReaperScheduleStop(Command):
28
25
  if not(args := self.args(cmd)):
29
26
  return super().run(cmd, state)
30
27
 
31
- state, args = self.apply_state(args, state)
32
- if not self.validate_state(state):
33
- return state
34
-
35
- if not args:
36
- log2('Specify run schedule to stop.')
37
-
38
- return state
39
-
40
- schedule_id = args[0]
41
- if not(reaper := ReaperSession.create(state)):
42
- return schedule_id
43
-
44
- self.stop_schedule(state, reaper, schedule_id)
28
+ with self.validate(args, state) as (args, state):
29
+ with validate_args(args, state, name='schedule') as schedule_id:
30
+ with reaper(state) as http:
31
+ http.put(f'repair_schedule/{schedule_id}?state=PAUSED')
32
+ Reapers.show_schedule(state, schedule_id)
45
33
 
46
- return schedule_id
47
-
48
- def stop_schedule(self, state: ReplState, reaper: ReaperSession, schedule_id: str):
49
- def body(uri: str, headers: dict[str, str]):
50
- return requests.put(uri, headers=headers)
51
-
52
- reaper.port_forwarded(state, f'repair_schedule/{schedule_id}?state=PAUSED', body, method='PUT')
53
- reaper.show_schedule(state, schedule_id)
34
+ return schedule_id
54
35
 
55
36
  def completion(self, state: ReplState):
56
- if state.sts:
57
- leaf = {id: None for id in ReaperSession.cached_schedule_ids(state)}
58
-
59
- return super().completion(state, leaf)
60
-
61
- return {}
37
+ return super().completion(state, lambda: {id: None for id in Reapers.cached_schedule_ids(state)}, auto_key='reaper.schedules')
62
38
 
63
39
  def help(self, _: ReplState):
64
40
  return f'{ReaperScheduleStop.COMMAND} <schedule-id>\t pause reaper schedule'
@@ -1,10 +1,9 @@
1
1
  from adam.commands.command import Command
2
- from .reaper_session import ReaperSession
2
+ from adam.commands.reaper.utils_reaper import Reapers
3
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'
@@ -4,13 +4,11 @@ from kubernetes import client
4
4
 
5
5
  from adam.commands.command import Command
6
6
  from adam.commands.commands_utils import show_pods
7
- from .reaper_session import ReaperSession
7
+ from adam.commands.reaper.utils_reaper import Reapers
8
8
  from adam.repl_state import ReplState, RequiredState
9
- from adam.utils import lines_to_tabular, log, log2
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'