kaqing 2.0.98__py3-none-any.whl → 2.0.203__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 (254) 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 +11 -25
  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 +37 -63
  15. adam/commands/app/app.py +38 -0
  16. adam/commands/{app_ping.py → app/app_ping.py} +8 -14
  17. adam/commands/app/show_app_actions.py +49 -0
  18. adam/commands/{show → app}/show_app_id.py +8 -11
  19. adam/commands/{show → app}/show_app_queues.py +8 -14
  20. adam/commands/app/utils_app.py +106 -0
  21. adam/commands/audit/audit.py +31 -35
  22. adam/commands/audit/audit_repair_tables.py +26 -48
  23. adam/commands/audit/audit_run.py +50 -0
  24. adam/commands/audit/completions_l.py +15 -0
  25. adam/commands/audit/show_last10.py +36 -0
  26. adam/commands/audit/show_slow10.py +36 -0
  27. adam/commands/audit/show_top10.py +36 -0
  28. adam/commands/audit/utils_show_top10.py +71 -0
  29. adam/commands/bash/__init__.py +5 -0
  30. adam/commands/bash/bash.py +36 -0
  31. adam/commands/bash/bash_completer.py +93 -0
  32. adam/commands/bash/utils_bash.py +16 -0
  33. adam/commands/cassandra/__init__.py +0 -0
  34. adam/commands/cassandra/download_cassandra_log.py +45 -0
  35. adam/commands/cassandra/nodetool.py +64 -0
  36. adam/commands/cassandra/nodetool_commands.py +120 -0
  37. adam/commands/{restart.py → cassandra/restart_cluster.py} +12 -26
  38. adam/commands/cassandra/restart_node.py +51 -0
  39. adam/commands/cassandra/restart_nodes.py +47 -0
  40. adam/commands/cassandra/rollout.py +88 -0
  41. adam/commands/cat.py +36 -0
  42. adam/commands/cd.py +14 -92
  43. adam/commands/check.py +18 -21
  44. adam/commands/cli_commands.py +8 -4
  45. adam/commands/clipboard_copy.py +87 -0
  46. adam/commands/code.py +57 -0
  47. adam/commands/command.py +212 -39
  48. adam/commands/commands_utils.py +20 -28
  49. adam/commands/cql/alter_tables.py +66 -0
  50. adam/commands/cql/completions_c.py +29 -0
  51. adam/commands/cql/cqlsh.py +10 -29
  52. adam/commands/cql/utils_cql.py +305 -0
  53. adam/commands/debug/__init__.py +0 -0
  54. adam/commands/debug/debug.py +22 -0
  55. adam/commands/debug/debug_completes.py +35 -0
  56. adam/commands/debug/debug_timings.py +35 -0
  57. adam/commands/deploy/code_start.py +7 -10
  58. adam/commands/deploy/code_stop.py +4 -21
  59. adam/commands/deploy/code_utils.py +3 -3
  60. adam/commands/deploy/deploy.py +4 -21
  61. adam/commands/deploy/deploy_frontend.py +14 -17
  62. adam/commands/deploy/deploy_pg_agent.py +3 -6
  63. adam/commands/deploy/deploy_pod.py +65 -73
  64. adam/commands/deploy/deploy_utils.py +14 -24
  65. adam/commands/deploy/undeploy.py +4 -21
  66. adam/commands/deploy/undeploy_frontend.py +4 -7
  67. adam/commands/deploy/undeploy_pg_agent.py +6 -8
  68. adam/commands/deploy/undeploy_pod.py +11 -12
  69. adam/commands/devices/__init__.py +0 -0
  70. adam/commands/devices/device.py +149 -0
  71. adam/commands/devices/device_app.py +163 -0
  72. adam/commands/devices/device_auit_log.py +49 -0
  73. adam/commands/devices/device_cass.py +179 -0
  74. adam/commands/devices/device_export.py +87 -0
  75. adam/commands/devices/device_postgres.py +160 -0
  76. adam/commands/devices/devices.py +25 -0
  77. adam/commands/download_cassandra_log.py +45 -0
  78. adam/commands/download_file.py +47 -0
  79. adam/commands/exit.py +1 -4
  80. adam/commands/export/__init__.py +0 -0
  81. adam/commands/export/clean_up_all_export_sessions.py +37 -0
  82. adam/commands/export/clean_up_export_sessions.py +39 -0
  83. adam/commands/export/completions_x.py +11 -0
  84. adam/commands/export/download_export_session.py +40 -0
  85. adam/commands/export/drop_export_database.py +39 -0
  86. adam/commands/export/drop_export_databases.py +37 -0
  87. adam/commands/export/export.py +37 -0
  88. adam/commands/export/export_databases.py +247 -0
  89. adam/commands/export/export_select.py +34 -0
  90. adam/commands/export/export_sessions.py +211 -0
  91. adam/commands/export/export_use.py +49 -0
  92. adam/commands/export/export_x_select.py +48 -0
  93. adam/commands/export/exporter.py +361 -0
  94. adam/commands/export/import_files.py +44 -0
  95. adam/commands/export/import_session.py +44 -0
  96. adam/commands/export/importer.py +82 -0
  97. adam/commands/export/importer_athena.py +150 -0
  98. adam/commands/export/importer_sqlite.py +69 -0
  99. adam/commands/export/show_column_counts.py +45 -0
  100. adam/commands/export/show_export_databases.py +39 -0
  101. adam/commands/export/show_export_session.py +39 -0
  102. adam/commands/export/show_export_sessions.py +37 -0
  103. adam/commands/export/utils_export.py +366 -0
  104. adam/commands/find_files.py +51 -0
  105. adam/commands/find_processes.py +76 -0
  106. adam/commands/generate_report.py +52 -0
  107. adam/commands/head.py +36 -0
  108. adam/commands/help.py +12 -8
  109. adam/commands/intermediate_command.py +52 -0
  110. adam/commands/issues.py +14 -40
  111. adam/commands/kubectl.py +38 -0
  112. adam/commands/login.py +26 -25
  113. adam/commands/ls.py +11 -116
  114. adam/commands/medusa/medusa.py +4 -22
  115. adam/commands/medusa/medusa_backup.py +20 -27
  116. adam/commands/medusa/medusa_restore.py +35 -48
  117. adam/commands/medusa/medusa_show_backupjobs.py +17 -18
  118. adam/commands/medusa/medusa_show_restorejobs.py +13 -18
  119. adam/commands/medusa/utils_medusa.py +15 -0
  120. adam/commands/nodetool.py +8 -19
  121. adam/commands/os/__init__.py +0 -0
  122. adam/commands/os/cat.py +36 -0
  123. adam/commands/os/download_file.py +47 -0
  124. adam/commands/os/find_files.py +51 -0
  125. adam/commands/os/find_processes.py +76 -0
  126. adam/commands/os/head.py +36 -0
  127. adam/commands/os/shell.py +41 -0
  128. adam/commands/param_get.py +11 -14
  129. adam/commands/param_set.py +8 -12
  130. adam/commands/postgres/completions_p.py +22 -0
  131. adam/commands/postgres/postgres.py +47 -55
  132. adam/commands/postgres/postgres_databases.py +269 -0
  133. adam/commands/postgres/postgres_ls.py +4 -8
  134. adam/commands/postgres/postgres_preview.py +5 -9
  135. adam/commands/postgres/utils_postgres.py +79 -0
  136. adam/commands/preview_table.py +10 -61
  137. adam/commands/pwd.py +14 -46
  138. adam/commands/reaper/reaper.py +4 -24
  139. adam/commands/reaper/reaper_forward.py +49 -56
  140. adam/commands/reaper/reaper_forward_session.py +6 -0
  141. adam/commands/reaper/reaper_forward_stop.py +10 -16
  142. adam/commands/reaper/reaper_restart.py +7 -14
  143. adam/commands/reaper/reaper_run_abort.py +8 -33
  144. adam/commands/reaper/reaper_runs.py +43 -58
  145. adam/commands/reaper/reaper_runs_abort.py +29 -49
  146. adam/commands/reaper/reaper_schedule_activate.py +14 -33
  147. adam/commands/reaper/reaper_schedule_start.py +9 -33
  148. adam/commands/reaper/reaper_schedule_stop.py +9 -33
  149. adam/commands/reaper/reaper_schedules.py +4 -14
  150. adam/commands/reaper/reaper_status.py +8 -16
  151. adam/commands/reaper/utils_reaper.py +203 -0
  152. adam/commands/repair/repair.py +4 -22
  153. adam/commands/repair/repair_log.py +5 -11
  154. adam/commands/repair/repair_run.py +27 -34
  155. adam/commands/repair/repair_scan.py +32 -40
  156. adam/commands/repair/repair_stop.py +5 -12
  157. adam/commands/restart_cluster.py +47 -0
  158. adam/commands/restart_node.py +51 -0
  159. adam/commands/restart_nodes.py +47 -0
  160. adam/commands/rollout.py +19 -24
  161. adam/commands/shell.py +12 -4
  162. adam/commands/show/show.py +10 -23
  163. adam/commands/show/show_adam.py +3 -3
  164. adam/commands/show/show_cassandra_repairs.py +37 -0
  165. adam/commands/show/show_cassandra_status.py +47 -51
  166. adam/commands/show/show_cassandra_version.py +5 -18
  167. adam/commands/show/show_cli_commands.py +56 -0
  168. adam/commands/show/show_host.py +1 -1
  169. adam/commands/show/show_login.py +23 -27
  170. adam/commands/show/show_params.py +2 -5
  171. adam/commands/show/show_processes.py +18 -21
  172. adam/commands/show/show_storage.py +11 -20
  173. adam/commands/watch.py +26 -29
  174. adam/config.py +5 -15
  175. adam/embedded_params.py +1 -1
  176. adam/log.py +4 -4
  177. adam/repl.py +105 -133
  178. adam/repl_commands.py +68 -28
  179. adam/repl_session.py +9 -1
  180. adam/repl_state.py +300 -62
  181. adam/sql/async_executor.py +44 -0
  182. adam/sql/lark_completer.py +286 -0
  183. adam/sql/lark_parser.py +604 -0
  184. adam/sql/qingl.lark +1076 -0
  185. adam/sql/sql_completer.py +104 -64
  186. adam/sql/sql_state_machine.py +630 -0
  187. adam/sql/term_completer.py +3 -0
  188. adam/sso/authn_ad.py +6 -8
  189. adam/sso/authn_okta.py +4 -6
  190. adam/sso/cred_cache.py +3 -5
  191. adam/sso/idp.py +9 -12
  192. adam/utils.py +640 -10
  193. adam/utils_athena.py +140 -87
  194. adam/utils_audits.py +102 -0
  195. adam/utils_issues.py +32 -0
  196. adam/utils_k8s/app_clusters.py +28 -0
  197. adam/utils_k8s/app_pods.py +35 -0
  198. adam/utils_k8s/cassandra_clusters.py +34 -21
  199. adam/utils_k8s/cassandra_nodes.py +9 -6
  200. adam/utils_k8s/custom_resources.py +16 -17
  201. adam/utils_k8s/ingresses.py +2 -2
  202. adam/utils_k8s/jobs.py +7 -11
  203. adam/utils_k8s/k8s.py +96 -0
  204. adam/utils_k8s/kube_context.py +3 -6
  205. adam/{pod_exec_result.py → utils_k8s/pod_exec_result.py} +11 -5
  206. adam/utils_k8s/pods.py +146 -75
  207. adam/utils_k8s/secrets.py +4 -4
  208. adam/utils_k8s/service_accounts.py +5 -4
  209. adam/utils_k8s/services.py +2 -2
  210. adam/utils_k8s/statefulsets.py +6 -14
  211. adam/utils_local.py +42 -0
  212. adam/utils_net.py +4 -4
  213. adam/utils_repl/__init__.py +0 -0
  214. adam/utils_repl/appendable_completer.py +6 -0
  215. adam/utils_repl/automata_completer.py +48 -0
  216. adam/utils_repl/repl_completer.py +89 -0
  217. adam/utils_repl/state_machine.py +173 -0
  218. adam/utils_sqlite.py +137 -0
  219. adam/version.py +1 -1
  220. {kaqing-2.0.98.dist-info → kaqing-2.0.203.dist-info}/METADATA +1 -1
  221. kaqing-2.0.203.dist-info/RECORD +277 -0
  222. kaqing-2.0.203.dist-info/top_level.txt +2 -0
  223. teddy/__init__.py +0 -0
  224. teddy/lark_parser.py +436 -0
  225. teddy/lark_parser2.py +618 -0
  226. adam/commands/app.py +0 -67
  227. adam/commands/bash.py +0 -92
  228. adam/commands/cp.py +0 -95
  229. adam/commands/cql/cql_completions.py +0 -11
  230. adam/commands/cql/cql_table_completer.py +0 -8
  231. adam/commands/cql/cql_utils.py +0 -115
  232. adam/commands/describe/describe.py +0 -47
  233. adam/commands/describe/describe_keyspace.py +0 -60
  234. adam/commands/describe/describe_keyspaces.py +0 -49
  235. adam/commands/describe/describe_schema.py +0 -49
  236. adam/commands/describe/describe_table.py +0 -60
  237. adam/commands/describe/describe_tables.py +0 -49
  238. adam/commands/devices.py +0 -118
  239. adam/commands/logs.py +0 -39
  240. adam/commands/postgres/postgres_session.py +0 -240
  241. adam/commands/postgres/postgres_utils.py +0 -31
  242. adam/commands/postgres/psql_completions.py +0 -10
  243. adam/commands/postgres/psql_table_completer.py +0 -11
  244. adam/commands/reaper/reaper_session.py +0 -159
  245. adam/commands/report.py +0 -57
  246. adam/commands/show/show_app_actions.py +0 -53
  247. adam/commands/show/show_commands.py +0 -61
  248. adam/commands/show/show_repairs.py +0 -47
  249. adam/sql/state_machine.py +0 -460
  250. kaqing-2.0.98.dist-info/RECORD +0 -191
  251. kaqing-2.0.98.dist-info/top_level.txt +0 -1
  252. /adam/commands/{describe → app}/__init__.py +0 -0
  253. {kaqing-2.0.98.dist-info → kaqing-2.0.203.dist-info}/WHEEL +0 -0
  254. {kaqing-2.0.98.dist-info → kaqing-2.0.203.dist-info}/entry_points.txt +0 -0
adam/commands/bash.py DELETED
@@ -1,92 +0,0 @@
1
- from adam.commands.command import Command
2
- from adam.utils_k8s.cassandra_clusters import CassandraClusters
3
- from adam.utils_k8s.cassandra_nodes import CassandraNodes
4
- from adam.pod_exec_result import PodExecResult
5
- from adam.repl_state import BashSession, ReplState, RequiredState
6
-
7
- class Bash(Command):
8
- COMMAND = 'bash'
9
-
10
- # the singleton pattern
11
- def __new__(cls, *args, **kwargs):
12
- if not hasattr(cls, 'instance'): cls.instance = super(Bash, 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 Bash.COMMAND
21
-
22
- def required(self):
23
- return RequiredState.CLUSTER_OR_POD
24
-
25
- def run(self, cmd: str, s0: ReplState):
26
- if not(args := self.args(cmd)):
27
- return super().run(cmd, s0)
28
-
29
- state, args = self.apply_state(args, s0, args_to_check=2)
30
- if not self.validate_state(state):
31
- return state
32
-
33
- if state.in_repl:
34
- if s0.sts != state.sts or s0.pod != state.pod:
35
- r = self.exec_with_dir(state, args)
36
- else:
37
- r = self.exec_with_dir(s0, args)
38
-
39
- if not r:
40
- state.exit_bash()
41
-
42
- return 'inconsistent pwd'
43
-
44
- return r
45
- else:
46
- command = ' '.join(args)
47
-
48
- if state.pod:
49
- CassandraNodes.exec(state.pod, state.namespace, command, show_out=True)
50
- elif state.sts:
51
- CassandraClusters.exec(state.sts, state.namespace, command, action='bash', show_out=True)
52
-
53
- return state
54
-
55
- def exec_with_dir(self, state: ReplState, args: list[str]) -> list[PodExecResult]:
56
- session_just_created = False
57
- if not args:
58
- session_just_created = True
59
- session = BashSession(state.device)
60
- state.enter_bash(session)
61
-
62
- if state.bash_session:
63
- if args != ['pwd']:
64
- if args:
65
- args.append('&&')
66
- args.extend(['pwd', '>', f'/tmp/.qing-{state.bash_session.session_id}'])
67
-
68
- if not session_just_created:
69
- if pwd := state.bash_session.pwd(state):
70
- args = ['cd', pwd, '&&'] + args
71
-
72
- command = ' '.join(args)
73
-
74
- rs = []
75
-
76
- if state.pod:
77
- rs = [CassandraNodes.exec(state.pod, state.namespace, command,
78
- show_out=not session_just_created, shell='bash')]
79
- elif state.sts:
80
- rs = CassandraClusters.exec(state.sts, state.namespace, command, action='bash',
81
- show_out=not session_just_created, shell='bash')
82
-
83
- return rs
84
-
85
- def completion(self, state: ReplState):
86
- if state.pod or state.sts:
87
- return {Bash.COMMAND: None}
88
-
89
- return {}
90
-
91
- def help(self, _: ReplState):
92
- return f'{Bash.COMMAND} [bash-commands]\t run bash on the Cassandra nodes'
adam/commands/cp.py DELETED
@@ -1,95 +0,0 @@
1
- import click
2
- import pyperclip
3
-
4
- from adam.commands.command import Command
5
- from adam.commands.command_helpers import ClusterOrPodCommandHelper
6
- from adam.commands.cli_commands import CliCommands
7
- from adam.repl_state import ReplState, RequiredState
8
- from adam.utils import lines_to_tabular, log, log2
9
-
10
- class ClipboardCopy(Command):
11
- COMMAND = 'cp'
12
-
13
- # the singleton pattern
14
- def __new__(cls, *args, **kwargs):
15
- if not hasattr(cls, 'instance'): cls.instance = super(ClipboardCopy, cls).__new__(cls)
16
-
17
- return cls.instance
18
-
19
- def __init__(self, successor: Command=None):
20
- super().__init__(successor)
21
-
22
- def command(self):
23
- return ClipboardCopy.COMMAND
24
-
25
- def required(self):
26
- return RequiredState.CLUSTER_OR_POD
27
-
28
- def run(self, cmd: str, state: ReplState):
29
- if not(args := self.args(cmd)):
30
- return super().run(cmd, state)
31
-
32
- state, args = self.apply_state(args, state)
33
- if not self.validate_state(state):
34
- return state
35
-
36
- if len(args) < 1:
37
- if state.in_repl:
38
- log2('Key is required.')
39
- log2()
40
- log2('Keys:')
41
- log2(lines_to_tabular([f'{k},{v}' for k, v in CliCommands.values(state, collapse=True).items()], separator=','))
42
- else:
43
- log2('* Key is missing.')
44
- Command.display_help()
45
-
46
- return 'command-missing'
47
-
48
- key = args[0]
49
- if not key in CliCommands.values(state):
50
- if state.in_repl:
51
- log2('Key is required.')
52
- log2()
53
- log2('Keys:')
54
- log2(lines_to_tabular([f'{k},{v}' for k, v in CliCommands.values(state, collapse=True).items()], separator=','))
55
- else:
56
- log2('* Invalid key')
57
- Command.display_help()
58
-
59
- return 'command-invalid'
60
-
61
- value = CliCommands.values(state)[key]
62
- pyperclip.copy(value)
63
- log2('The following line has been copied to clipboard. Use <Ctrl-V> to use it.')
64
- log2(f' {value}')
65
-
66
- return 'value-copied'
67
-
68
- def completion(self, state: ReplState):
69
- if state.sts:
70
- return {ClipboardCopy.COMMAND: {key: None for key in CliCommands.values(state).keys()}}
71
-
72
- return {}
73
-
74
- def help(self, _: ReplState):
75
- return f"{ClipboardCopy.COMMAND} <key>\t copy a value to clipboard for conveninence"
76
-
77
- class CopyCommandHelper(click.Command):
78
- def lines(self):
79
- return [
80
- 'node-exec-?: kubectl exec command to the Cassandra pod',
81
- 'reaper-exec: kubectl exec command to the Reaper pod',
82
- 'reaper-forward: kubectl port-forward command to the Reaper pod',
83
- 'reaper-ui: uri to Reaper ui',
84
- 'reaper-username: Reaper user name',
85
- 'reaper-password: Reaper password',
86
- ]
87
-
88
- def get_help(self, ctx: click.Context):
89
- log(super().get_help(ctx))
90
- log()
91
- log('Keys:')
92
-
93
- log(lines_to_tabular(self.lines(), separator=':'))
94
- log()
95
- ClusterOrPodCommandHelper.cluter_or_pod_help()
@@ -1,11 +0,0 @@
1
- from adam.commands.cql.cql_utils import table_names
2
- from adam.repl_state import ReplState
3
- from adam.sql.sql_completer import SqlCompleter
4
-
5
- def cql_completions(state: ReplState) -> dict[str, any]:
6
- return {
7
- 'describe': {
8
- 'keyspaces': None,
9
- 'table': {t: None for t in table_names(state)},
10
- 'tables': None},
11
- } | SqlCompleter.completions(lambda: table_names(state))
@@ -1,8 +0,0 @@
1
- from adam.sql.term_completer import TermCompleter
2
-
3
- class CqlTableNameCompleter(TermCompleter):
4
- def __init__(self, tables: list[str], ignore_case: bool = True):
5
- super().__init__(tables, ignore_case=ignore_case)
6
-
7
- def __repr__(self) -> str:
8
- return "CqlTableCompleter(%r)" % (len(self.words))
@@ -1,115 +0,0 @@
1
- import functools
2
- import re
3
-
4
- from adam.config import Config
5
- from adam.utils_k8s.cassandra_clusters import CassandraClusters
6
- from adam.utils_k8s.cassandra_nodes import CassandraNodes
7
- from adam.utils_k8s.secrets import Secrets
8
- from adam.pod_exec_result import PodExecResult
9
- from adam.repl_state import ReplState
10
- from adam.utils import log2
11
-
12
- @functools.lru_cache()
13
- def keyspaces(state: ReplState, on_any=False):
14
- if state.pod:
15
- Config().wait_log(f'Inspecting Cassandra Keyspaces on {state.pod}...')
16
- else:
17
- Config().wait_log(f'Inspecting Cassandra Keyspaces...')
18
-
19
- r: list[PodExecResult] = run_cql(state, 'describe keyspaces', show_out=False, on_any=on_any)
20
- if not r:
21
- log2('No pod is available')
22
- return []
23
-
24
- return parse_cql_desc_keyspaces(r.stdout if state.pod else r[0].stdout)
25
-
26
- def table_names(state: ReplState):
27
- return [f'{k}.{t}' for k, ts in tables(state, on_any=True).items() for t in ts]
28
-
29
- @functools.lru_cache()
30
- def tables(state: ReplState, on_any=False):
31
- r: list[PodExecResult] = run_cql(state, 'describe tables', show_out=False, on_any=on_any)
32
- if not r:
33
- log2('No pod is available')
34
- return []
35
-
36
- return parse_cql_desc_tables(r.stdout if state.pod else r[0].stdout)
37
-
38
- def run_cql(state: ReplState, cql: str, opts: list = [], show_out = False, use_single_quotes = False, on_any = False):
39
- user, pw = Secrets.get_user_pass(state.sts if state.sts else state.pod, state.namespace, secret_path='cql.secret')
40
- if use_single_quotes:
41
- command = f"cqlsh -u {user} -p {pw} {' '.join(opts)} -e '{cql}'"
42
- else:
43
- command = f'cqlsh -u {user} -p {pw} {" ".join(opts)} -e "{cql}"'
44
-
45
- if not on_any:
46
- command = f'{command} &'
47
-
48
- if state.pod:
49
- return CassandraNodes.exec(state.pod, state.namespace, command, show_out=show_out)
50
- else:
51
- return CassandraClusters.exec(state.sts, state.namespace, command, show_out=show_out, action='cql', on_any=on_any)
52
-
53
- def parse_cql_desc_tables(out: str):
54
- # Keyspace data_endpoint_auth
55
- # ---------------------------
56
- # "token"
57
-
58
- # Keyspace reaper_db
59
- # ------------------
60
- # repair_run schema_migration
61
- # repair_run_by_cluster schema_migration_leader
62
-
63
- # Keyspace system
64
- tables_by_keyspace: dict[str, list[str]] = {}
65
- keyspace = None
66
- state = 's0'
67
- for line in out.split('\n'):
68
- if state == 's0':
69
- groups = re.match(r'^Keyspace (.*)$', line)
70
- if groups:
71
- keyspace = groups[1].strip(' \r')
72
- state = 's1'
73
- elif state == 's1':
74
- if line.startswith('---'):
75
- state = 's2'
76
- elif state == 's2':
77
- if not line.strip(' \r'):
78
- state = 's0'
79
- else:
80
- for table in line.split(' '):
81
- if t := table.strip(' \r'):
82
- if not keyspace in tables_by_keyspace:
83
- tables_by_keyspace[keyspace] = []
84
- tables_by_keyspace[keyspace].append(t)
85
-
86
- return tables_by_keyspace
87
-
88
- def parse_cql_desc_keyspaces(out: str) -> list[str]:
89
- #
90
- # Warning: Cannot create directory at `/home/cassandra/.cassandra`. Command history will not be saved. Please check what was the environment property CQL_HISTORY set to.
91
- #
92
- #
93
- # Warning: Using a password on the command line interface can be insecure.
94
- # Recommendation: use the credentials file to securely provide the password.
95
- #
96
- #
97
- # azops88_db system_auth system_traces
98
- # reaper_db system_distributed system_views
99
- # system system_schema system_virtual_schema
100
- #
101
- kses = []
102
- for line in out.split('\n'):
103
- line = line.strip(' \r')
104
- if not line:
105
- continue
106
- if line.startswith('Warning:'):
107
- continue
108
- if line.startswith('Recommendation:'):
109
- continue
110
-
111
- for ks in line.split(' '):
112
- if s := ks.strip(' \r\t'):
113
- kses.append(s)
114
-
115
- return kses
@@ -1,47 +0,0 @@
1
- import click
2
-
3
- from adam.commands.command import Command
4
- from adam.commands.describe.describe_keyspace import DescribeKeyspace
5
- from adam.commands.describe.describe_keyspaces import DescribeKeyspaces
6
- from adam.commands.describe.describe_schema import DescribeSchema
7
- from adam.commands.describe.describe_table import DescribeTable
8
- from adam.commands.describe.describe_tables import DescribeTables
9
- from adam.repl_state import ReplState, RequiredState
10
-
11
- class Describe(Command):
12
- COMMAND = 'describe'
13
- reaper_login = None
14
-
15
- # the singleton pattern
16
- def __new__(cls, *args, **kwargs):
17
- if not hasattr(cls, 'instance'): cls.instance = super(Describe, cls).__new__(cls)
18
-
19
- return cls.instance
20
-
21
- def __init__(self, successor: Command=None):
22
- super().__init__(successor)
23
-
24
- def required(self):
25
- return RequiredState.CLUSTER
26
-
27
- def command(self):
28
- return Describe.COMMAND
29
-
30
- def run(self, cmd: str, state: ReplState):
31
- if not(args := self.args(cmd)):
32
- return super().run(cmd, state)
33
-
34
- return super().intermediate_run(cmd, state, args, Describe.cmd_list())
35
-
36
- def cmd_list():
37
- return [DescribeKeyspace(), DescribeKeyspaces(), DescribeSchema(), DescribeTable(), DescribeTables()]
38
-
39
- def completion(self, state: ReplState):
40
- if state.sts:
41
- return super().completion(state)
42
-
43
- return {}
44
-
45
- class DescribeCommandHelper(click.Command):
46
- def get_help(self, ctx: click.Context):
47
- Command.intermediate_help(super().get_help(ctx), Describe.COMMAND, Describe.cmd_list(), show_cluster_help=True)
@@ -1,60 +0,0 @@
1
- from adam.commands.command import Command
2
- from adam.commands.cql.cql_utils import keyspaces, run_cql
3
- from adam.pod_exec_result import PodExecResult
4
- from adam.repl_state import ReplState, RequiredState
5
- from adam.utils import log2
6
-
7
- class DescribeKeyspace(Command):
8
- COMMAND = 'describe keyspace'
9
-
10
- # the singleton pattern
11
- def __new__(cls, *args, **kwargs):
12
- if not hasattr(cls, 'instance'): cls.instance = super(DescribeKeyspace, cls).__new__(cls)
13
-
14
- return cls.instance
15
-
16
- def __init__(self, successor: Command=None):
17
- super().__init__(successor)
18
-
19
- def required(self):
20
- return RequiredState.CLUSTER
21
-
22
- def command(self):
23
- return DescribeKeyspace.COMMAND
24
-
25
- def run(self, cmd: str, state: ReplState):
26
- if not(args := self.args(cmd)):
27
- return super().run(cmd, state)
28
-
29
- state, args = self.apply_state(args, state)
30
- if not self.validate_state(state):
31
- return state
32
-
33
- args, all_nodes = Command.extract_options(args, '&')
34
-
35
- if not args:
36
- if state.in_repl:
37
- log2('Please enter keyspace name')
38
- else:
39
- log2('* keyspace name is missing.')
40
- log2()
41
- Command.display_help()
42
-
43
- return 'missing-keyspace'
44
-
45
- r: list[PodExecResult] = run_cql(state, f'describe keyspace {args[0]}', show_out=True, on_any=not all_nodes)
46
- if not r:
47
- log2('No pod is available')
48
- return 'no-pod'
49
-
50
- # do not continue to cql route
51
- return state
52
-
53
- def completion(self, state: ReplState) -> dict[str, any]:
54
- if state.sts:
55
- return super().completion(state, {ks: {'&': None} for ks in keyspaces(state, on_any=True)})
56
-
57
- return {}
58
-
59
- def help(self, _: ReplState) -> str:
60
- return f'{DescribeKeyspace.COMMAND} <keyspace-name> [&]\t describe Cassandra keyspace'
@@ -1,49 +0,0 @@
1
- from adam.commands.command import Command
2
- from adam.commands.cql.cql_utils import run_cql
3
- from adam.pod_exec_result import PodExecResult
4
- from adam.repl_state import ReplState, RequiredState
5
- from adam.utils import log2
6
-
7
- class DescribeKeyspaces(Command):
8
- COMMAND = 'describe keyspaces'
9
-
10
- # the singleton pattern
11
- def __new__(cls, *args, **kwargs):
12
- if not hasattr(cls, 'instance'): cls.instance = super(DescribeKeyspaces, cls).__new__(cls)
13
-
14
- return cls.instance
15
-
16
- def __init__(self, successor: Command=None):
17
- super().__init__(successor)
18
-
19
- def required(self):
20
- return RequiredState.CLUSTER
21
-
22
- def command(self):
23
- return DescribeKeyspaces.COMMAND
24
-
25
- def run(self, cmd: str, state: ReplState):
26
- if not(args := self.args(cmd)):
27
- return super().run(cmd, state)
28
-
29
- state, args = self.apply_state(args, state)
30
- if not self.validate_state(state):
31
- return state
32
-
33
- args, all_nodes = Command.extract_options(args, '&')
34
- r: list[PodExecResult] = run_cql(state, f'{DescribeKeyspaces.COMMAND} {" ".join(args)}', show_out=True, on_any=not all_nodes)
35
- if not r:
36
- log2('No pod is available')
37
- return 'no-pod'
38
-
39
- # do not continue to cql route
40
- return state
41
-
42
- def completion(self, state: ReplState) -> dict[str, any]:
43
- if state.sts:
44
- return super().completion(state, {'&': None})
45
-
46
- return {}
47
-
48
- def help(self, _: ReplState) -> str:
49
- return f'{DescribeKeyspaces.COMMAND} [&]\t describe Cassandra keyspaces'
@@ -1,49 +0,0 @@
1
- from adam.commands.command import Command
2
- from adam.commands.cql.cql_utils import run_cql
3
- from adam.pod_exec_result import PodExecResult
4
- from adam.repl_state import ReplState, RequiredState
5
- from adam.utils import log2
6
-
7
- class DescribeSchema(Command):
8
- COMMAND = 'describe schema'
9
-
10
- # the singleton pattern
11
- def __new__(cls, *args, **kwargs):
12
- if not hasattr(cls, 'instance'): cls.instance = super(DescribeSchema, cls).__new__(cls)
13
-
14
- return cls.instance
15
-
16
- def __init__(self, successor: Command=None):
17
- super().__init__(successor)
18
-
19
- def required(self):
20
- return RequiredState.CLUSTER
21
-
22
- def command(self):
23
- return DescribeSchema.COMMAND
24
-
25
- def run(self, cmd: str, state: ReplState):
26
- if not(args := self.args(cmd)):
27
- return super().run(cmd, state)
28
-
29
- state, args = self.apply_state(args, state)
30
- if not self.validate_state(state):
31
- return state
32
-
33
- args, all_nodes = Command.extract_options(args, '&')
34
- r: list[PodExecResult] = run_cql(state, f'{DescribeSchema.COMMAND} {" ".join(args)}', show_out=True, on_any=not all_nodes)
35
- if not r:
36
- log2('No pod is available')
37
- return 'no-pod'
38
-
39
- # do not continue to cql route
40
- return state
41
-
42
- def completion(self, state: ReplState) -> dict[str, any]:
43
- if state.sts:
44
- return super().completion(state, {'&': None})
45
-
46
- return {}
47
-
48
- def help(self, _: ReplState) -> str:
49
- return f'{DescribeSchema.COMMAND} [&]\t describe Cassandra tables'
@@ -1,60 +0,0 @@
1
- from adam.commands.command import Command
2
- from adam.commands.cql.cql_utils import run_cql, table_names
3
- from adam.pod_exec_result import PodExecResult
4
- from adam.repl_state import ReplState, RequiredState
5
- from adam.utils import log2
6
-
7
- class DescribeTable(Command):
8
- COMMAND = 'describe table'
9
-
10
- # the singleton pattern
11
- def __new__(cls, *args, **kwargs):
12
- if not hasattr(cls, 'instance'): cls.instance = super(DescribeTable, cls).__new__(cls)
13
-
14
- return cls.instance
15
-
16
- def __init__(self, successor: Command=None):
17
- super().__init__(successor)
18
-
19
- def required(self):
20
- return RequiredState.CLUSTER
21
-
22
- def command(self):
23
- return DescribeTable.COMMAND
24
-
25
- def run(self, cmd: str, state: ReplState):
26
- if not(args := self.args(cmd)):
27
- return super().run(cmd, state)
28
-
29
- state, args = self.apply_state(args, state)
30
- if not self.validate_state(state):
31
- return state
32
-
33
- args, all_nodes = Command.extract_options(args, '--all-nodes')
34
-
35
- if not args:
36
- if state.in_repl:
37
- log2('Please enter table name')
38
- else:
39
- log2('* table name is missing.')
40
- log2()
41
- Command.display_help()
42
-
43
- return 'missing-table'
44
-
45
- r: list[PodExecResult] = run_cql(state, f'describe table {args[0]}', show_out=True, on_any=not all_nodes)
46
- if not r:
47
- log2('No pod is available')
48
- return 'no-pod'
49
-
50
- # do not continue to cql route
51
- return state
52
-
53
- def completion(self, state: ReplState) -> dict[str, any]:
54
- if state.sts:
55
- return super().completion(state, {t: {'&': None} for t in table_names(state)})
56
-
57
- return {}
58
-
59
- def help(self, _: ReplState) -> str:
60
- return f'{DescribeTable.COMMAND} <table-name> [&]\t describe Cassandra table'
@@ -1,49 +0,0 @@
1
- from adam.commands.command import Command
2
- from adam.commands.cql.cql_utils import run_cql
3
- from adam.pod_exec_result import PodExecResult
4
- from adam.repl_state import ReplState, RequiredState
5
- from adam.utils import log2
6
-
7
- class DescribeTables(Command):
8
- COMMAND = 'describe tables'
9
-
10
- # the singleton pattern
11
- def __new__(cls, *args, **kwargs):
12
- if not hasattr(cls, 'instance'): cls.instance = super(DescribeTables, cls).__new__(cls)
13
-
14
- return cls.instance
15
-
16
- def __init__(self, successor: Command=None):
17
- super().__init__(successor)
18
-
19
- def required(self):
20
- return RequiredState.CLUSTER
21
-
22
- def command(self):
23
- return DescribeTables.COMMAND
24
-
25
- def run(self, cmd: str, state: ReplState):
26
- if not(args := self.args(cmd)):
27
- return super().run(cmd, state)
28
-
29
- state, args = self.apply_state(args, state)
30
- if not self.validate_state(state):
31
- return state
32
-
33
- args, all_nodes = Command.extract_options(args, '&')
34
- r: list[PodExecResult] = run_cql(state, f'{DescribeTables.COMMAND} {" ".join(args)}', show_out=True, on_any=not all_nodes)
35
- if not r:
36
- log2('No pod is available')
37
- return 'no-pod'
38
-
39
- # do not continue to cql route
40
- return state
41
-
42
- def completion(self, state: ReplState) -> dict[str, any]:
43
- if state.sts:
44
- return super().completion(state, {'&': None})
45
-
46
- return {}
47
-
48
- def help(self, _: ReplState) -> str:
49
- return f'{DescribeTables.COMMAND} [&]\t describe Cassandra tables'