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
@@ -0,0 +1,39 @@
1
+ import click
2
+
3
+ from adam.commands.intermediate_command import IntermediateCommand
4
+ from adam.commands.medusa.medusa_show_backupjobs import MedusaShowBackupJobs
5
+ from adam.commands.medusa.medusa_show_restorejobs import MedusaShowRestoreJobs
6
+ from adam.commands.show.show_app_actions import ShowAppActions
7
+ from adam.commands.show.show_app_queues import ShowAppQueues
8
+ from adam.commands.show.show_host import ShowHost
9
+ from adam.commands.show.show_login import ShowLogin
10
+ from .show_params import ShowParams
11
+ from .show_app_id import ShowAppId
12
+ from .show_cassandra_status import ShowCassandraStatus
13
+ from .show_cassandra_version import ShowCassandraVersion
14
+ from .show_commands import ShowKubectlCommands
15
+ from .show_processes import ShowProcesses
16
+ from .show_cassandra_repairs import ShowCassandraRepairs
17
+ from .show_storage import ShowStorage
18
+ from .show_adam import ShowAdam
19
+
20
+ class Show(IntermediateCommand):
21
+ COMMAND = 'show'
22
+
23
+ # the singleton pattern
24
+ def __new__(cls, *args, **kwargs):
25
+ if not hasattr(cls, 'instance'): cls.instance = super(Show, cls).__new__(cls)
26
+
27
+ return cls.instance
28
+
29
+ def command(self):
30
+ return Show.COMMAND
31
+
32
+ def cmd_list(self):
33
+ return [ShowAppActions(), ShowAppId(), ShowAppQueues(), ShowHost(), ShowLogin(), ShowKubectlCommands(),
34
+ ShowParams(), ShowProcesses(), ShowCassandraRepairs(), ShowStorage(), ShowAdam(),
35
+ ShowCassandraStatus(), ShowCassandraVersion(), MedusaShowRestoreJobs(), MedusaShowBackupJobs()]
36
+
37
+ class ShowCommandHelper(click.Command):
38
+ def get_help(self, ctx: click.Context):
39
+ IntermediateCommand.intermediate_help(super().get_help(ctx), Show.COMMAND, Show().cmd_list(), show_cluster_help=True)
@@ -1,25 +1,24 @@
1
1
  import sys
2
2
  import os
3
3
 
4
- from walker.utils import log2
4
+ from adam.utils import lines_to_tabular, log2
5
5
 
6
6
  current_dir = os.path.dirname(os.path.abspath(__file__))
7
- # sys.path.append(os.path.dirname(current_dir))
8
7
 
9
8
  parent_dir = os.path.dirname(current_dir)
10
9
  grandparent_dir = os.path.dirname(parent_dir)
11
10
  sys.path.append(grandparent_dir)
12
11
 
13
12
  from version import __version__
14
- from walker.commands.command import Command
15
- from walker.repl_state import ReplState
13
+ from adam.commands.command import Command
14
+ from adam.repl_state import ReplState
16
15
 
17
- class ShowVersion(Command):
18
- COMMAND = 'show version'
16
+ class ShowAdam(Command):
17
+ COMMAND = 'show adam'
19
18
 
20
19
  # the singleton pattern
21
20
  def __new__(cls, *args, **kwargs):
22
- if not hasattr(cls, 'instance'): cls.instance = super(ShowVersion, cls).__new__(cls)
21
+ if not hasattr(cls, 'instance'): cls.instance = super(ShowAdam, cls).__new__(cls)
23
22
 
24
23
  return cls.instance
25
24
 
@@ -27,13 +26,18 @@ class ShowVersion(Command):
27
26
  super().__init__(successor)
28
27
 
29
28
  def command(self):
30
- return ShowVersion.COMMAND
29
+ return ShowAdam.COMMAND
31
30
 
32
31
  def run(self, cmd: str, state: ReplState):
33
32
  if not self.args(cmd):
34
33
  return super().run(cmd, state)
35
34
 
36
- log2(__version__)
35
+ package = os.path.dirname(os.path.abspath(__file__))
36
+ package = package.split('/adam/')[0] + '/adam'
37
+ log2(lines_to_tabular([
38
+ f'version\t{__version__}',
39
+ f'source\t{package}'
40
+ ], separator='\t'))
37
41
 
38
42
  return state
39
43
 
@@ -41,4 +45,4 @@ class ShowVersion(Command):
41
45
  return super().completion(state)
42
46
 
43
47
  def help(self, _: ReplState):
44
- return f'{ShowVersion.COMMAND}\t show kaqing version'
48
+ return f'{ShowAdam.COMMAND}\t show kaqing version'
@@ -0,0 +1,57 @@
1
+ from adam.app_session import AppSession
2
+ from adam.apps import AppAction, Apps
3
+ from adam.commands.command import Command
4
+ from adam.config import Config
5
+ from adam.repl_state import ReplState
6
+ from adam.utils import lines_to_tabular, log
7
+
8
+ class ShowAppActions(Command):
9
+ COMMAND = 'show app actions'
10
+
11
+ # the singleton pattern
12
+ def __new__(cls, *args, **kwargs):
13
+ if not hasattr(cls, 'instance'): cls.instance = super(ShowAppActions, cls).__new__(cls)
14
+
15
+ return cls.instance
16
+
17
+ def __init__(self, successor: Command=None):
18
+ super().__init__(successor)
19
+
20
+ def command(self):
21
+ return ShowAppActions.COMMAND
22
+
23
+ def required(self):
24
+ return ReplState.A
25
+
26
+ def run(self, cmd: str, state: ReplState):
27
+ if not (args := self.args(cmd)):
28
+ return super().run(cmd, state)
29
+
30
+ with self.validate(args, state) as (args, state):
31
+ lines = []
32
+ for typ in Apps().app_types():
33
+ for action in typ.actions:
34
+ a: AppAction = action
35
+ args = ','.join(a.arguments())
36
+ if args:
37
+ line = f'{typ.name}.{a.name},{args}'
38
+ else:
39
+ line = f'{typ.name}.{a.name},'
40
+ if a.help:
41
+ line = f'{line},{a.help}'
42
+ lines.append(line)
43
+ log(lines_to_tabular(lines, 'ACTION,ARGS,DESCRIPTION', separator=','))
44
+ log()
45
+
46
+ app_session: AppSession = AppSession.create(state.app_env or 'c3', state.app_app or 'c3')
47
+ endpoint = Config().get('app.console-endpoint', 'https://{host}/{env}/{app}/static/console/index.html')
48
+ endpoint = endpoint.replace('{host}', app_session.host).replace('{env}', app_session.env).replace('{app}', state.app_app or 'c3')
49
+ log(lines_to_tabular([f'CONSOLE:,{endpoint}'], separator=','))
50
+
51
+ return lines
52
+
53
+ def completion(self, state: ReplState):
54
+ return super().completion(state)
55
+
56
+ def help(self, _: ReplState):
57
+ return f"{ShowAppActions.COMMAND}\t show app actions"
@@ -1,7 +1,7 @@
1
- from walker.commands.command import Command
2
- from walker.k8s_utils.custom_resources import CustomResources
3
- from walker.repl_state import ReplState, RequiredState
4
- from walker.utils import log
1
+ from adam.commands.command import Command
2
+ from adam.utils_k8s.custom_resources import CustomResources
3
+ from adam.repl_state import ReplState, RequiredState
4
+ from adam.utils import log
5
5
 
6
6
  class ShowAppId(Command):
7
7
  COMMAND = 'show app id'
@@ -25,20 +25,17 @@ class ShowAppId(Command):
25
25
  if not(args := self.args(cmd)):
26
26
  return super().run(cmd, state)
27
27
 
28
- state, _ = state.apply_args(args)
29
- if not self.validate_state(state):
30
- return state
28
+ with self.validate(args, state) as (args, state):
29
+ c3_app_id = 'Unknown'
31
30
 
32
- c3_app_id = 'Unknown'
31
+ apps = CustomResources.get_app_ids()
32
+ cr_name = CustomResources.get_cr_name(state.sts if state.sts else state.pod, namespace=state.namespace)
33
+ if cr_name in apps:
34
+ c3_app_id = (apps[cr_name])
33
35
 
34
- apps = CustomResources.get_app_ids()
35
- cr_name = CustomResources.get_cr_name(state.sts if state.sts else state.pod, namespace=state.namespace)
36
- if cr_name in apps:
37
- c3_app_id = (apps[cr_name])
36
+ log(c3_app_id)
38
37
 
39
- log(c3_app_id)
40
-
41
- return c3_app_id
38
+ return c3_app_id
42
39
 
43
40
  def completion(self, state: ReplState):
44
41
  return super().completion(state)
@@ -1,6 +1,6 @@
1
- from walker.commands.command import Command
2
- from walker.repl_state import ReplState, RequiredState
3
- from walker.app_session import AppSession
1
+ from adam.commands import app, extract_options
2
+ from adam.commands.command import Command
3
+ from adam.repl_state import ReplState, RequiredState
4
4
 
5
5
  class ShowAppQueues(Command):
6
6
  COMMAND = 'show app queues'
@@ -18,21 +18,18 @@ class ShowAppQueues(Command):
18
18
  return ShowAppQueues.COMMAND
19
19
 
20
20
  def required(self):
21
- return RequiredState.CLUSTER_OR_POD
21
+ return RequiredState.APP_APP
22
22
 
23
23
  def run(self, cmd: str, state: ReplState):
24
24
  if not(args := self.args(cmd)):
25
25
  return super().run(cmd, state)
26
26
 
27
- state, args = self.apply_state(args, state)
28
- if not self.validate_state(state, app_required=RequiredState.APP_APP):
29
- return state
27
+ with self.validate(args, state) as (_, state):
28
+ with extract_options(args, '--force') as (args, forced):
29
+ with app(state) as http:
30
+ http.post(['InvalidationQueue.countAll'], forced=forced)
30
31
 
31
- _, forced = Command.extract_options(args, '--force')
32
-
33
- AppSession.run(state.app_env, state.app_app, state.namespace, 'InvalidationQueue', 'countAll', forced= forced)
34
-
35
- return state
32
+ return state
36
33
 
37
34
  def completion(self, state: ReplState):
38
35
  if state.app_app:
@@ -0,0 +1,38 @@
1
+ from adam.commands.command import Command
2
+ from adam.commands.cql.utils_cql import cassandra
3
+ from adam.repl_state import ReplState, RequiredState
4
+
5
+ class ShowCassandraRepairs(Command):
6
+ COMMAND = 'show cassandra repairs'
7
+
8
+ # the singleton pattern
9
+ def __new__(cls, *args, **kwargs):
10
+ if not hasattr(cls, 'instance'): cls.instance = super(ShowCassandraRepairs, cls).__new__(cls)
11
+
12
+ return cls.instance
13
+
14
+ def __init__(self, successor: Command=None):
15
+ super().__init__(successor)
16
+
17
+ def command(self):
18
+ return ShowCassandraRepairs.COMMAND
19
+
20
+ def required(self):
21
+ return RequiredState.CLUSTER_OR_POD
22
+
23
+ def run(self, cmd: str, state: ReplState):
24
+ if not(args := self.args(cmd)):
25
+ return super().run(cmd, state)
26
+
27
+ with self.validate(args, state) as (args, state):
28
+ with cassandra(state) as pods:
29
+ return pods.nodetool('repair_admin list')
30
+
31
+ def completion(self, state: ReplState):
32
+ if state.sts:
33
+ return super().completion(state)
34
+
35
+ return {}
36
+
37
+ def help(self, _: ReplState):
38
+ return f'{ShowCassandraRepairs.COMMAND}\t show Cassandra repairs'
@@ -0,0 +1,124 @@
1
+ import sys
2
+
3
+ from adam.checks.check_result import CheckResult
4
+ from adam.checks.check_utils import run_checks
5
+ from adam.checks.compactionstats import CompactionStats
6
+ from adam.checks.gossip import Gossip
7
+ from adam.columns.columns import Columns
8
+ from adam.commands import extract_options
9
+ from adam.commands.command import Command
10
+ from adam.commands.cql.utils_cql import cassandra
11
+ from adam.config import Config
12
+ from adam.utils_issues import IssuesUtils
13
+ from adam.utils_k8s.statefulsets import StatefulSets
14
+ from adam.repl_state import ReplState, RequiredState
15
+ from adam.utils import lines_to_tabular, log, log2
16
+ from adam.checks.status import parse_nodetool_status
17
+
18
+ class ShowCassandraStatus(Command):
19
+ COMMAND = 'show cassandra status'
20
+
21
+ # the singleton pattern
22
+ def __new__(cls, *args, **kwargs):
23
+ if not hasattr(cls, 'instance'): cls.instance = super(ShowCassandraStatus, cls).__new__(cls)
24
+
25
+ return cls.instance
26
+
27
+ def __init__(self, successor: Command=None):
28
+ super().__init__(successor)
29
+
30
+ def command(self):
31
+ return ShowCassandraStatus.COMMAND
32
+
33
+ def required(self):
34
+ return RequiredState.CLUSTER_OR_POD
35
+
36
+ def run(self, cmd: str, state: ReplState):
37
+ if not(args := self.args(cmd)):
38
+ return super().run(cmd, state)
39
+
40
+ with self.validate(args, state) as (args, state):
41
+ with extract_options(args, ['-s', '--show']) as (args, show_out):
42
+ if state.namespace and state.pod:
43
+ self.show_single_pod(state, show_out=show_out)
44
+ elif state.namespace and state.sts:
45
+ self.merge(state, Config().get('nodetool.samples', sys.maxsize), show_output=show_out)
46
+
47
+ return state
48
+
49
+ def show_single_pod(self, state: ReplState, show_out = False):
50
+ try:
51
+ with cassandra(state) as pods:
52
+ result = pods.nodetool('status', show_out=False)
53
+ status = parse_nodetool_status(result.stdout)
54
+ check_results = run_checks(cluster=state.sts, namespace=state.namespace, checks=[CompactionStats(), Gossip()], show_out=show_out)
55
+ self.show_table(status, check_results)
56
+ except Exception as e:
57
+ log2(e)
58
+
59
+ def merge(self, state: ReplState, samples: int, show_output=False):
60
+ statuses: list[list[dict]] = []
61
+
62
+ pod_names = StatefulSets.pod_names(state.sts, state.namespace)
63
+ for pod_name in pod_names:
64
+ pod_name = pod_name.split('(')[0]
65
+
66
+ try:
67
+ with cassandra(state, pod=pod_name) as pods:
68
+ result = pods.nodetool('status', show_out=False)
69
+ status = parse_nodetool_status(result.stdout)
70
+ if status:
71
+ statuses.append(status)
72
+ if samples <= len(statuses) and len(pod_names) != len(statuses):
73
+ break
74
+ except Exception as e:
75
+ log2(e)
76
+
77
+ combined_status = self.merge_status(statuses)
78
+ log2(f'Showing merged status from {len(statuses)}/{len(pod_names)} nodes...')
79
+ check_results = run_checks(cluster=state.sts, namespace=state.namespace, checks=[CompactionStats(), Gossip()], show_out=show_output)
80
+ self.show_table(combined_status, check_results)
81
+
82
+ return combined_status
83
+
84
+ def merge_status(self, statuses: list[list[dict]]):
85
+ combined = statuses[0]
86
+
87
+ status_by_host = {}
88
+ for status in statuses[0]:
89
+ status_by_host[status['host_id']] = status
90
+ for status in statuses[1:]:
91
+ for s in status:
92
+ if s['host_id'] in status_by_host:
93
+ c = status_by_host[s['host_id']]
94
+ if c['status'] == 'UN' and s['status'] == 'DN':
95
+ c['status'] = 'DN*'
96
+ else:
97
+ combined.append(s)
98
+
99
+ return combined
100
+
101
+ def show_table(self, status: list[dict[str, any]], check_results: list[CheckResult]):
102
+ cols = Config().get('status.columns', 'status,address,load,tokens,owns,host_id,gossip,compactions')
103
+ header = Config().get('status.header', '--,Address,Load,Tokens,Owns,Host ID,GOSSIP,COMPACTIONS')
104
+ columns = Columns.create_columns(cols)
105
+
106
+ def line(status: dict):
107
+ cells = [c.host_value(check_results, status) for c in columns]
108
+ return ','.join(cells)
109
+
110
+ lines = [line(d) for d in status]
111
+ lines.sort()
112
+
113
+ log(lines_to_tabular(lines, header, separator=','))
114
+
115
+ IssuesUtils.show(check_results)
116
+
117
+ def completion(self, state: ReplState):
118
+ if state.sts:
119
+ return super().completion(state, {'-s': None})
120
+
121
+ return {}
122
+
123
+ def help(self, _: ReplState):
124
+ return f'{ShowCassandraStatus.COMMAND} [-s]\t show merged nodetool status -s show commands on nodes'
@@ -1,8 +1,6 @@
1
- from walker.commands.command import Command
2
- from walker.k8s_utils.cassandra_clusters import CassandraClusters
3
- from walker.k8s_utils.cassandra_nodes import CassandraNodes
4
- from walker.k8s_utils.secrets import Secrets
5
- from walker.repl_state import ReplState, RequiredState
1
+ from adam.commands.command import Command
2
+ from adam.commands.cql.utils_cql import cassandra
3
+ from adam.repl_state import ReplState, RequiredState
6
4
 
7
5
  class ShowCassandraVersion(Command):
8
6
  COMMAND = 'show cassandra version'
@@ -26,17 +24,9 @@ class ShowCassandraVersion(Command):
26
24
  if not(args := self.args(cmd)):
27
25
  return super().run(cmd, state)
28
26
 
29
- state, _ = state.apply_args(args)
30
- if not self.validate_state(state):
31
- return state
32
-
33
- user, pw = Secrets.get_user_pass(state.sts if state.sts else state.pod, state.namespace, secret_path='cql.secret')
34
- command = f'cqlsh -u {user} -p {pw} -e "show version"'
35
-
36
- if state.pod:
37
- return CassandraNodes.exec(state.pod, state.namespace, command)
38
- else:
39
- return CassandraClusters.exec(state.sts, state.namespace, command, action='cql')
27
+ with self.validate(args, state) as (_, state):
28
+ with cassandra(state) as pods:
29
+ return pods.cql('show version', show_out=True, on_any=True)
40
30
 
41
31
  def completion(self, state: ReplState):
42
32
  if state.sts:
@@ -0,0 +1,59 @@
1
+ from adam.commands.command import Command
2
+ from adam.commands.cli_commands import CliCommands
3
+ from adam.repl_state import ReplState, RequiredState
4
+ from adam.utils import lines_to_tabular, log
5
+
6
+ class ShowKubectlCommands(Command):
7
+ COMMAND = 'show cli-commands'
8
+
9
+ # the singleton pattern
10
+ def __new__(cls, *args, **kwargs):
11
+ if not hasattr(cls, 'instance'): cls.instance = super(ShowKubectlCommands, 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 ShowKubectlCommands.COMMAND
20
+
21
+ def required(self):
22
+ return RequiredState.CLUSTER_OR_POD
23
+
24
+ def run(self, cmd: str, state: ReplState):
25
+ if not self.args(cmd):
26
+ return super().run(cmd, state)
27
+
28
+ with self.validate(args, state) as (args, state):
29
+ v = CliCommands.values(state, collapse=True)
30
+ # node-exec-?, nodetool-?, cql-?, reaper-exec, reaper-forward, reaper-ui, reaper-username, reaper-password
31
+ cmds = [
32
+ f'bash,{v["node-exec-?"]}',
33
+ f'nodetool,{v["nodetool-?"]}',
34
+ f'cql,{v["cql-?"]}',
35
+ ]
36
+
37
+ if 'reaper-exec' in v:
38
+ cmds += [
39
+ f'reaper,{v["reaper-exec"]}',
40
+ f',{v["reaper-forward"]} * should be run from your laptop',
41
+ f',{v["reaper-ui"]}',
42
+ f',{v["reaper-username"]}',
43
+ f',{v["reaper-password"]}',
44
+ ]
45
+
46
+ cmds += [f'{k},{v0}' for k, v0 in v.items() if k.startswith('pg-')]
47
+
48
+ log(lines_to_tabular(cmds, separator=','))
49
+
50
+ return cmds
51
+
52
+ def completion(self, state: ReplState):
53
+ if not state.sts:
54
+ return {}
55
+
56
+ return super().completion(state)
57
+
58
+ def help(self, _: ReplState):
59
+ return f"{ShowKubectlCommands.COMMAND}\t show kubectl commands"
@@ -1,13 +1,14 @@
1
- from walker.commands.storage import Storage
2
- from walker.commands.command import Command
3
- from walker.repl_state import ReplState
1
+ from adam.commands.command import Command
2
+ from adam.repl_state import ReplState
3
+ from adam.utils import log
4
+ from adam.utils_net import get_my_host
4
5
 
5
- class ShowStorage(Command):
6
- COMMAND = 'show storage'
6
+ class ShowHost(Command):
7
+ COMMAND = 'show host'
7
8
 
8
9
  # the singleton pattern
9
10
  def __new__(cls, *args, **kwargs):
10
- if not hasattr(cls, 'instance'): cls.instance = super(ShowStorage, cls).__new__(cls)
11
+ if not hasattr(cls, 'instance'): cls.instance = super(ShowHost, cls).__new__(cls)
11
12
 
12
13
  return cls.instance
13
14
 
@@ -15,21 +16,18 @@ class ShowStorage(Command):
15
16
  super().__init__(successor)
16
17
 
17
18
  def command(self):
18
- return ShowStorage.COMMAND
19
+ return ShowHost.COMMAND
19
20
 
20
21
  def run(self, cmd: str, state: ReplState):
21
22
  if not self.args(cmd):
22
23
  return super().run(cmd, state)
23
24
 
24
- Storage().run(Storage.COMMAND, state)
25
+ log(get_my_host())
25
26
 
26
27
  return state
27
28
 
28
29
  def completion(self, state: ReplState):
29
- if state.sts:
30
- return super().completion(state)
31
-
32
- return {}
30
+ return super().completion(state)
33
31
 
34
32
  def help(self, _: ReplState):
35
- return f'{ShowStorage.COMMAND} [-s]\t show storage overview -s show commands on nodes'
33
+ return f'{ShowHost.COMMAND}\t show host'
@@ -0,0 +1,62 @@
1
+ import time
2
+ import traceback
3
+
4
+ from adam.apps import Apps
5
+ from adam.config import Config
6
+ from adam.sso.idp import Idp
7
+ from adam.sso.idp_login import IdpLogin
8
+ from adam.commands.command import Command
9
+ from adam.repl_state import ReplState
10
+ from adam.utils import duration, lines_to_tabular, log, log2
11
+
12
+ class ShowLogin(Command):
13
+ COMMAND = 'show login'
14
+
15
+ # the singleton pattern
16
+ def __new__(cls, *args, **kwargs):
17
+ if not hasattr(cls, 'instance'): cls.instance = super(ShowLogin, cls).__new__(cls)
18
+
19
+ return cls.instance
20
+
21
+ def __init__(self, successor: Command=None):
22
+ super().__init__(successor)
23
+
24
+ def command(self):
25
+ return ShowLogin.COMMAND
26
+
27
+ def required(self):
28
+ return ReplState.NON_L
29
+
30
+ def run(self, cmd: str, state: ReplState):
31
+ if not(args := self.args(cmd)):
32
+ return super().run(cmd, state)
33
+
34
+ with self.validate(args, state) as (args, state):
35
+ login: IdpLogin = None
36
+ try:
37
+ if not(host := Apps.app_host('c3', 'c3', state.namespace)):
38
+ log2('Cannot locate ingress for app.')
39
+ return state
40
+
41
+ login = Idp.login(host, use_token_from_env=True)
42
+ if login and login.id_token_obj:
43
+ it = login.id_token_obj
44
+ lines = [
45
+ f'email\t{it.email}',
46
+ f'user\t{it.username}',
47
+ f'IDP expires in\t{duration(time.time(), it.exp)}',
48
+ f'IDP Groups\t{",".join(it.groups)}'
49
+ ]
50
+ log(lines_to_tabular(lines, separator='\t'))
51
+ except Exception as e:
52
+ log2(e)
53
+ if Config().is_debug():
54
+ log2(traceback.format_exc())
55
+
56
+ return state
57
+
58
+ def completion(self, state: ReplState):
59
+ return super().completion(state)
60
+
61
+ def help(self, _: ReplState):
62
+ return f'{ShowLogin.COMMAND}\t show login details'
@@ -1,7 +1,7 @@
1
- from walker.commands.command import Command
2
- from walker.config import Config
3
- from walker.repl_state import ReplState
4
- from walker.utils import lines_to_tabular, log
1
+ from adam.commands.command import Command
2
+ from adam.config import Config
3
+ from adam.repl_state import ReplState
4
+ from adam.utils import lines_to_tabular, log
5
5
 
6
6
  class ShowParams(Command):
7
7
  COMMAND = 'show params'
@@ -0,0 +1,51 @@
1
+ from adam.commands import extract_options
2
+ from adam.commands.command import Command
3
+ from adam.commands.commands_utils import show_table
4
+ from adam.commands.cql.utils_cql import cassandra
5
+ from adam.config import Config
6
+ from adam.utils_k8s.statefulsets import StatefulSets
7
+ from adam.repl_state import ReplState, RequiredState
8
+
9
+ class ShowProcesses(Command):
10
+ COMMAND = 'show processes'
11
+
12
+ # the singleton pattern
13
+ def __new__(cls, *args, **kwargs):
14
+ if not hasattr(cls, 'instance'): cls.instance = super(ShowProcesses, cls).__new__(cls)
15
+
16
+ return cls.instance
17
+
18
+ def __init__(self, successor: Command=None):
19
+ super().__init__(successor)
20
+
21
+ def command(self):
22
+ return ShowProcesses.COMMAND
23
+
24
+ def required(self):
25
+ return RequiredState.CLUSTER_OR_POD
26
+
27
+ def run(self, cmd: str, state: ReplState):
28
+ if not(args := self.args(cmd)):
29
+ return super().run(cmd, state)
30
+
31
+ with self.validate(args, state) as (args, state):
32
+ with extract_options(args, ['-s', '--show']) as (args, show_out):
33
+ cols = Config().get('processes.columns', 'pod,cpu-metrics,mem')
34
+ header = Config().get('processes.header', 'POD_NAME,M_CPU(USAGE/LIMIT),MEM/LIMIT')
35
+
36
+ qing_args = ['qing', 'recipe', 'with']
37
+ args, _, recipe_qing = Command.extract_options(args, options=qing_args)
38
+ if set(recipe_qing) == set(qing_args):
39
+ cols = Config().get('processes-qing.columns', 'pod,cpu,mem')
40
+ header = Config().get('processes-qing.header', 'POD_NAME,Q_CPU/TOTAL,MEM/LIMIT')
41
+
42
+ with cassandra(state) as pods:
43
+ pods.show_table(cols, header, show_out=show_out)
44
+
45
+ return state
46
+
47
+ def completion(self, state: ReplState):
48
+ return super().completion(state, {'with': {'recipe': {'metrics': {'-s': None}, 'qing': {'-s': None}}}, '-s': None})
49
+
50
+ def help(self, _: ReplState):
51
+ return f'{ShowProcesses.COMMAND} [with recipe qing|metrics] [-s]\t show process overview -s show commands on nodes'