kaqing 2.0.33__tar.gz → 2.0.35__tar.gz

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 (179) hide show
  1. {kaqing-2.0.33 → kaqing-2.0.35}/PKG-INFO +1 -1
  2. {kaqing-2.0.33 → kaqing-2.0.35}/adam/batch.py +14 -0
  3. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/command.py +32 -5
  4. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/cqlsh.py +9 -3
  5. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/deploy/deploy.py +2 -21
  6. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/deploy/undeploy.py +2 -21
  7. kaqing-2.0.35/adam/commands/describe/describe.py +46 -0
  8. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/medusa/medusa.py +2 -26
  9. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/medusa/medusa_show_backupjobs.py +1 -1
  10. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/medusa/medusa_show_restorejobs.py +1 -1
  11. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/postgres/postgres.py +31 -32
  12. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/postgres/postgres_session.py +1 -1
  13. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/reaper/reaper.py +4 -27
  14. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/repair/repair.py +2 -26
  15. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/show/show.py +7 -26
  16. {kaqing-2.0.33 → kaqing-2.0.35}/adam/repl_commands.py +3 -2
  17. kaqing-2.0.35/adam/version.py +5 -0
  18. {kaqing-2.0.33 → kaqing-2.0.35}/kaqing.egg-info/PKG-INFO +1 -1
  19. {kaqing-2.0.33 → kaqing-2.0.35}/kaqing.egg-info/SOURCES.txt +1 -0
  20. {kaqing-2.0.33 → kaqing-2.0.35}/setup.py +1 -1
  21. kaqing-2.0.33/adam/version.py +0 -5
  22. {kaqing-2.0.33 → kaqing-2.0.35}/README +0 -0
  23. {kaqing-2.0.33 → kaqing-2.0.35}/adam/__init__.py +0 -0
  24. {kaqing-2.0.33 → kaqing-2.0.35}/adam/app_session.py +0 -0
  25. {kaqing-2.0.33 → kaqing-2.0.35}/adam/apps.py +0 -0
  26. {kaqing-2.0.33 → kaqing-2.0.35}/adam/checks/__init__.py +0 -0
  27. {kaqing-2.0.33 → kaqing-2.0.35}/adam/checks/check.py +0 -0
  28. {kaqing-2.0.33 → kaqing-2.0.35}/adam/checks/check_context.py +0 -0
  29. {kaqing-2.0.33 → kaqing-2.0.35}/adam/checks/check_result.py +0 -0
  30. {kaqing-2.0.33 → kaqing-2.0.35}/adam/checks/check_utils.py +0 -0
  31. {kaqing-2.0.33 → kaqing-2.0.35}/adam/checks/compactionstats.py +0 -0
  32. {kaqing-2.0.33 → kaqing-2.0.35}/adam/checks/cpu.py +0 -0
  33. {kaqing-2.0.33 → kaqing-2.0.35}/adam/checks/disk.py +0 -0
  34. {kaqing-2.0.33 → kaqing-2.0.35}/adam/checks/gossip.py +0 -0
  35. {kaqing-2.0.33 → kaqing-2.0.35}/adam/checks/issue.py +0 -0
  36. {kaqing-2.0.33 → kaqing-2.0.35}/adam/checks/memory.py +0 -0
  37. {kaqing-2.0.33 → kaqing-2.0.35}/adam/checks/status.py +0 -0
  38. {kaqing-2.0.33 → kaqing-2.0.35}/adam/cli.py +0 -0
  39. {kaqing-2.0.33 → kaqing-2.0.35}/adam/cli_group.py +0 -0
  40. {kaqing-2.0.33 → kaqing-2.0.35}/adam/columns/__init__.py +0 -0
  41. {kaqing-2.0.33 → kaqing-2.0.35}/adam/columns/column.py +0 -0
  42. {kaqing-2.0.33 → kaqing-2.0.35}/adam/columns/columns.py +0 -0
  43. {kaqing-2.0.33 → kaqing-2.0.35}/adam/columns/compactions.py +0 -0
  44. {kaqing-2.0.33 → kaqing-2.0.35}/adam/columns/cpu.py +0 -0
  45. {kaqing-2.0.33 → kaqing-2.0.35}/adam/columns/dir_data.py +0 -0
  46. {kaqing-2.0.33 → kaqing-2.0.35}/adam/columns/dir_snapshots.py +0 -0
  47. {kaqing-2.0.33 → kaqing-2.0.35}/adam/columns/gossip.py +0 -0
  48. {kaqing-2.0.33 → kaqing-2.0.35}/adam/columns/host_id.py +0 -0
  49. {kaqing-2.0.33 → kaqing-2.0.35}/adam/columns/memory.py +0 -0
  50. {kaqing-2.0.33 → kaqing-2.0.35}/adam/columns/node_address.py +0 -0
  51. {kaqing-2.0.33 → kaqing-2.0.35}/adam/columns/node_load.py +0 -0
  52. {kaqing-2.0.33 → kaqing-2.0.35}/adam/columns/node_owns.py +0 -0
  53. {kaqing-2.0.33 → kaqing-2.0.35}/adam/columns/node_status.py +0 -0
  54. {kaqing-2.0.33 → kaqing-2.0.35}/adam/columns/node_tokens.py +0 -0
  55. {kaqing-2.0.33 → kaqing-2.0.35}/adam/columns/node_utils.py +0 -0
  56. {kaqing-2.0.33 → kaqing-2.0.35}/adam/columns/pod_name.py +0 -0
  57. {kaqing-2.0.33 → kaqing-2.0.35}/adam/columns/volume_cassandra.py +0 -0
  58. {kaqing-2.0.33 → kaqing-2.0.35}/adam/columns/volume_root.py +0 -0
  59. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/__init__.py +0 -0
  60. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/alter_tables.py +0 -0
  61. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/app.py +0 -0
  62. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/app_ping.py +0 -0
  63. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/bash.py +0 -0
  64. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/cd.py +0 -0
  65. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/check.py +0 -0
  66. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/cli_commands.py +0 -0
  67. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/command_helpers.py +0 -0
  68. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/commands_utils.py +0 -0
  69. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/cp.py +0 -0
  70. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/cql_utils.py +0 -0
  71. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/deploy/__init__.py +0 -0
  72. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/deploy/code_start.py +0 -0
  73. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/deploy/code_stop.py +0 -0
  74. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/deploy/code_utils.py +0 -0
  75. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/deploy/deploy_frontend.py +0 -0
  76. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/deploy/deploy_pg_agent.py +0 -0
  77. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/deploy/deploy_pod.py +0 -0
  78. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/deploy/deploy_utils.py +0 -0
  79. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/deploy/undeploy_frontend.py +0 -0
  80. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/deploy/undeploy_pg_agent.py +0 -0
  81. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/deploy/undeploy_pod.py +0 -0
  82. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/describe/__init__.py +0 -0
  83. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/describe/describe_keyspace.py +0 -0
  84. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/describe/describe_keyspaces.py +0 -0
  85. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/describe/describe_table.py +0 -0
  86. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/describe/describe_tables.py +0 -0
  87. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/devices.py +0 -0
  88. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/exit.py +0 -0
  89. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/help.py +0 -0
  90. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/issues.py +0 -0
  91. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/login.py +0 -0
  92. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/logs.py +0 -0
  93. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/ls.py +0 -0
  94. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/medusa/__init__.py +0 -0
  95. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/medusa/medusa_backup.py +0 -0
  96. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/medusa/medusa_restore.py +0 -0
  97. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/nodetool.py +0 -0
  98. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/nodetool_commands.py +0 -0
  99. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/param_get.py +0 -0
  100. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/param_set.py +0 -0
  101. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/postgres/__init__.py +0 -0
  102. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/postgres/postgres_ls.py +0 -0
  103. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/postgres/postgres_preview.py +0 -0
  104. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/preview_table.py +0 -0
  105. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/pwd.py +0 -0
  106. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/reaper/__init__.py +0 -0
  107. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/reaper/reaper_forward.py +0 -0
  108. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/reaper/reaper_forward_stop.py +0 -0
  109. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/reaper/reaper_restart.py +0 -0
  110. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/reaper/reaper_run_abort.py +0 -0
  111. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/reaper/reaper_runs.py +0 -0
  112. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/reaper/reaper_runs_abort.py +0 -0
  113. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/reaper/reaper_schedule_activate.py +0 -0
  114. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/reaper/reaper_schedule_start.py +0 -0
  115. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/reaper/reaper_schedule_stop.py +0 -0
  116. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/reaper/reaper_schedules.py +0 -0
  117. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/reaper/reaper_session.py +0 -0
  118. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/reaper/reaper_status.py +0 -0
  119. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/repair/__init__.py +0 -0
  120. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/repair/repair_log.py +0 -0
  121. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/repair/repair_run.py +0 -0
  122. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/repair/repair_scan.py +0 -0
  123. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/repair/repair_stop.py +0 -0
  124. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/report.py +0 -0
  125. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/restart.py +0 -0
  126. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/rollout.py +0 -0
  127. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/shell.py +0 -0
  128. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/show/__init__.py +0 -0
  129. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/show/show_adam.py +0 -0
  130. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/show/show_app_actions.py +0 -0
  131. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/show/show_app_id.py +0 -0
  132. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/show/show_app_queues.py +0 -0
  133. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/show/show_cassandra_status.py +0 -0
  134. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/show/show_cassandra_version.py +0 -0
  135. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/show/show_commands.py +0 -0
  136. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/show/show_login.py +0 -0
  137. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/show/show_params.py +0 -0
  138. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/show/show_processes.py +0 -0
  139. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/show/show_repairs.py +0 -0
  140. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/show/show_storage.py +0 -0
  141. {kaqing-2.0.33 → kaqing-2.0.35}/adam/commands/watch.py +0 -0
  142. {kaqing-2.0.33 → kaqing-2.0.35}/adam/config.py +0 -0
  143. {kaqing-2.0.33 → kaqing-2.0.35}/adam/embedded_apps.py +0 -0
  144. {kaqing-2.0.33 → kaqing-2.0.35}/adam/embedded_params.py +0 -0
  145. {kaqing-2.0.33 → kaqing-2.0.35}/adam/k8s_utils/__init__.py +0 -0
  146. {kaqing-2.0.33 → kaqing-2.0.35}/adam/k8s_utils/cassandra_clusters.py +0 -0
  147. {kaqing-2.0.33 → kaqing-2.0.35}/adam/k8s_utils/cassandra_nodes.py +0 -0
  148. {kaqing-2.0.33 → kaqing-2.0.35}/adam/k8s_utils/config_maps.py +0 -0
  149. {kaqing-2.0.33 → kaqing-2.0.35}/adam/k8s_utils/custom_resources.py +0 -0
  150. {kaqing-2.0.33 → kaqing-2.0.35}/adam/k8s_utils/deployment.py +0 -0
  151. {kaqing-2.0.33 → kaqing-2.0.35}/adam/k8s_utils/ingresses.py +0 -0
  152. {kaqing-2.0.33 → kaqing-2.0.35}/adam/k8s_utils/jobs.py +0 -0
  153. {kaqing-2.0.33 → kaqing-2.0.35}/adam/k8s_utils/kube_context.py +0 -0
  154. {kaqing-2.0.33 → kaqing-2.0.35}/adam/k8s_utils/pods.py +0 -0
  155. {kaqing-2.0.33 → kaqing-2.0.35}/adam/k8s_utils/secrets.py +0 -0
  156. {kaqing-2.0.33 → kaqing-2.0.35}/adam/k8s_utils/service_accounts.py +0 -0
  157. {kaqing-2.0.33 → kaqing-2.0.35}/adam/k8s_utils/services.py +0 -0
  158. {kaqing-2.0.33 → kaqing-2.0.35}/adam/k8s_utils/statefulsets.py +0 -0
  159. {kaqing-2.0.33 → kaqing-2.0.35}/adam/k8s_utils/volumes.py +0 -0
  160. {kaqing-2.0.33 → kaqing-2.0.35}/adam/log.py +0 -0
  161. {kaqing-2.0.33 → kaqing-2.0.35}/adam/pod_exec_result.py +0 -0
  162. {kaqing-2.0.33 → kaqing-2.0.35}/adam/repl.py +0 -0
  163. {kaqing-2.0.33 → kaqing-2.0.35}/adam/repl_session.py +0 -0
  164. {kaqing-2.0.33 → kaqing-2.0.35}/adam/repl_state.py +0 -0
  165. {kaqing-2.0.33 → kaqing-2.0.35}/adam/sso/__init__.py +0 -0
  166. {kaqing-2.0.33 → kaqing-2.0.35}/adam/sso/authenticator.py +0 -0
  167. {kaqing-2.0.33 → kaqing-2.0.35}/adam/sso/authn_ad.py +0 -0
  168. {kaqing-2.0.33 → kaqing-2.0.35}/adam/sso/authn_okta.py +0 -0
  169. {kaqing-2.0.33 → kaqing-2.0.35}/adam/sso/cred_cache.py +0 -0
  170. {kaqing-2.0.33 → kaqing-2.0.35}/adam/sso/id_token.py +0 -0
  171. {kaqing-2.0.33 → kaqing-2.0.35}/adam/sso/idp.py +0 -0
  172. {kaqing-2.0.33 → kaqing-2.0.35}/adam/sso/idp_login.py +0 -0
  173. {kaqing-2.0.33 → kaqing-2.0.35}/adam/sso/idp_session.py +0 -0
  174. {kaqing-2.0.33 → kaqing-2.0.35}/adam/sso/sso_config.py +0 -0
  175. {kaqing-2.0.33 → kaqing-2.0.35}/adam/utils.py +0 -0
  176. {kaqing-2.0.33 → kaqing-2.0.35}/kaqing.egg-info/dependency_links.txt +0 -0
  177. {kaqing-2.0.33 → kaqing-2.0.35}/kaqing.egg-info/entry_points.txt +0 -0
  178. {kaqing-2.0.33 → kaqing-2.0.35}/kaqing.egg-info/top_level.txt +0 -0
  179. {kaqing-2.0.33 → kaqing-2.0.35}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: kaqing
3
- Version: 2.0.33
3
+ Version: 2.0.35
4
4
  Summary: UNKNOWN
5
5
  Home-page: UNKNOWN
6
6
  License: UNKNOWN
@@ -8,6 +8,7 @@ from adam.commands.command_helpers import ClusterCommandHelper, ClusterOrPodComm
8
8
  from adam.commands.cqlsh import CqlCommandHelper, Cqlsh
9
9
  from adam.commands.deploy.deploy import Deploy, DeployCommandHelper
10
10
  from adam.commands.deploy.undeploy import Undeploy, UndeployCommandHelper
11
+ from adam.commands.describe.describe import Describe, DescribeCommandHelper
11
12
  from adam.commands.issues import Issues
12
13
  from adam.commands.login import Login
13
14
  from adam.commands.logs import Logs
@@ -86,6 +87,19 @@ def deploy(kubeconfig: str, config: str, param: list[str], namespace: str, extra
86
87
  run_command(Deploy(), kubeconfig, config, param, None, namespace, None, extra_args)
87
88
 
88
89
 
90
+ @cli.command(context_settings=dict(ignore_unknown_options=True, allow_extra_args=True), cls=DescribeCommandHelper, help='Describe keyspace(s) or table(s).')
91
+ @click.option('--kubeconfig', '-k', required=False, metavar='path', help='path to kubeconfig file')
92
+ @click.option('--config', default='params.yaml', metavar='path', help='path to kaqing parameters file')
93
+ @click.option('--param', '-v', multiple=True, metavar='<key>=<value>', help='parameter override')
94
+ @click.option('--cluster', '-c', required=False, metavar='statefulset', help='Kubernetes statefulset name')
95
+ @click.option('--namespace', '-n', required=False, metavar='namespace', help='Kubernetes namespace')
96
+ @click.option('--pod', '-p', required=False, metavar='pod', help='Kubernetes pod name')
97
+ @click.option('--all-nodes', '-a', is_flag=True, help='execute on all Cassandra nodes')
98
+ @click.argument('extra_args', nargs=-1, metavar='<cluster|pod>', type=click.UNPROCESSED)
99
+ def describe(kubeconfig: str, config: str, param: list[str], cluster: str, namespace: str, pod: str, all_nodes: bool, extra_args):
100
+ run_command(Describe(), kubeconfig, config, param, cluster, namespace, pod, ('--all-nodes',) + extra_args if all_nodes else extra_args)
101
+
102
+
89
103
  @cli.command(context_settings=dict(ignore_unknown_options=True, allow_extra_args=True), cls=ClusterOrPodCommandHelper, help="Print Qing's issues.")
90
104
  @click.option('--kubeconfig', '-k', required=False, metavar='path', help='path to kubeconfig file')
91
105
  @click.option('--config', default='params.yaml', metavar='path', help='path to kaqing parameters file')
@@ -2,9 +2,11 @@ from abc import abstractmethod
2
2
  import copy
3
3
  import subprocess
4
4
  import sys
5
+ from typing import Callable
5
6
 
6
- from adam.config import Config
7
+ from adam.commands.command_helpers import ClusterCommandHelper
7
8
  from adam.repl_state import ReplState, RequiredState
9
+ from adam.utils import lines_to_tabular, log, log2
8
10
 
9
11
  repl_cmds: list['Command'] = []
10
12
 
@@ -41,9 +43,8 @@ class Command:
41
43
  def validate_state(self, state: ReplState, pg_required: RequiredState = None, app_required: RequiredState = None):
42
44
  return state.validate(self.required(), pg_required=pg_required, app_required=app_required)
43
45
 
44
- @abstractmethod
45
- def help(self, state: ReplState) -> str:
46
- pass
46
+ def help(self, _: ReplState) -> str:
47
+ return None
47
48
 
48
49
  def args(self, cmd: str):
49
50
  a = list(filter(None, cmd.split(' ')))
@@ -102,4 +103,30 @@ class Command:
102
103
  while s := cmd._successor:
103
104
  print(f'-> {s.command()}', end = '')
104
105
  cmd = s
105
- print()
106
+ print()
107
+
108
+ def intermediate_run(self, cmd: str, state: ReplState, args: list[str], cmds: list['Command'], separator='\t'):
109
+ state, _ = self.apply_state(args, state)
110
+
111
+ if state.in_repl:
112
+ log(lines_to_tabular([c.help(state) for c in cmds], separator=separator))
113
+
114
+ return 'command-missing'
115
+ else:
116
+ # head with the Chain of Responsibility pattern
117
+ cmds = Command.chain(cmds)
118
+ if not cmds.run(cmd, state):
119
+ log2('* Command is missing.')
120
+ Command.display_help()
121
+
122
+ return state
123
+
124
+ def intermediate_help(super_help: str, cmd: str, cmd_list: list['Command'], separator='\t', show_cluster_help=False):
125
+ log(super_help)
126
+ log()
127
+ log('Sub-Commands:')
128
+
129
+ log(lines_to_tabular([c.help(ReplState()).replace(f'{cmd} ', ' ', 1) for c in cmd_list], separator=separator))
130
+ if show_cluster_help:
131
+ log()
132
+ ClusterCommandHelper.cluster_help()
@@ -56,11 +56,17 @@ class Cqlsh(Command):
56
56
  if state.sts or state.pod:
57
57
  ts = table_names(state)
58
58
  return {Cqlsh.COMMAND: None} | {
59
- 'delete': {'from': {t: {'where': None} for t in ts}},
59
+ 'delete': {'from': {t: {'where': {'id': {'=': None}}} for t in ts}},
60
60
  'insert': {'into': {t: {'values': None} for t in ts}},
61
- 'select': {'*': {'from': {t: {'limit': {'1': None}, 'where': None} for t in ts}}},
61
+ 'select': {'*': {'from': {t: {
62
+ 'limit': {'1': None},
63
+ 'where': {'id': {'=': None}}
64
+ } for t in ts}}},
62
65
  'update': {t: {'set': None} for t in ts},
63
- 'describe': {'keyspaces': None, 'table': {t: None for t in ts}, 'tables': None},
66
+ 'describe': {
67
+ 'keyspaces': None,
68
+ 'table': {t: None for t in ts},
69
+ 'tables': None},
64
70
  }
65
71
 
66
72
  return {}
@@ -5,7 +5,6 @@ from adam.commands.deploy.deploy_pg_agent import DeployPgAgent
5
5
  from adam.commands.deploy.deploy_pod import DeployPod
6
6
  from .deploy_frontend import DeployFrontend
7
7
  from adam.repl_state import ReplState
8
- from adam.utils import lines_to_tabular, log, log2
9
8
 
10
9
  class Deploy(Command):
11
10
  COMMAND = 'deploy'
@@ -27,18 +26,7 @@ class Deploy(Command):
27
26
  if not(args := self.args(cmd)):
28
27
  return super().run(cmd, state)
29
28
 
30
- state, args = self.apply_state(args, state)
31
-
32
- if state.in_repl:
33
- log(lines_to_tabular([c.help(ReplState()) for c in Deploy.cmd_list()], separator='\t'))
34
-
35
- return 'command-missing'
36
- else:
37
- # head with the Chain of Responsibility pattern
38
- cmds = Command.chain(Deploy.cmd_list())
39
- if not cmds.run(cmd, state):
40
- log2('* Command is missing.')
41
- Command.display_help()
29
+ return super().intermediate_run(cmd, state, args, Deploy.cmd_list())
42
30
 
43
31
  def cmd_list():
44
32
  return [DeployFrontend(), DeployPod(), DeployPgAgent()]
@@ -49,13 +37,6 @@ class Deploy(Command):
49
37
 
50
38
  return {}
51
39
 
52
- def help(self, _: ReplState):
53
- return None
54
-
55
40
  class DeployCommandHelper(click.Command):
56
41
  def get_help(self, ctx: click.Context):
57
- log(super().get_help(ctx))
58
- log()
59
- log('Sub-Commands:')
60
-
61
- log(lines_to_tabular([c.help(ReplState()).replace(f'{Deploy.COMMAND} ', ' ', 1) for c in Deploy.cmd_list()], separator='\t'))
42
+ Command.intermediate_help(super().get_help(ctx), Deploy.COMMAND, Deploy.cmd_list())
@@ -5,7 +5,6 @@ from adam.commands.deploy.undeploy_frontend import UndeployFrontend
5
5
  from adam.commands.deploy.undeploy_pg_agent import UndeployPgAgent
6
6
  from adam.commands.deploy.undeploy_pod import UndeployPod
7
7
  from adam.repl_state import ReplState
8
- from adam.utils import lines_to_tabular, log, log2
9
8
 
10
9
  class Undeploy(Command):
11
10
  COMMAND = 'undeploy'
@@ -27,18 +26,7 @@ class Undeploy(Command):
27
26
  if not(args := self.args(cmd)):
28
27
  return super().run(cmd, state)
29
28
 
30
- state, args = self.apply_state(args, state)
31
-
32
- if state.in_repl:
33
- log(lines_to_tabular([c.help(ReplState()) for c in Undeploy.cmd_list()], separator='\t'))
34
-
35
- return 'command-missing'
36
- else:
37
- # head with the Chain of Responsibility pattern
38
- cmds = Command.chain(Undeploy.cmd_list())
39
- if not cmds.run(cmd, state):
40
- log2('* Command is missing.')
41
- Command.display_help()
29
+ return super().intermediate_run(cmd, state, args, Undeploy.cmd_list())
42
30
 
43
31
  def cmd_list():
44
32
  return [UndeployFrontend(), UndeployPod(), UndeployPgAgent()]
@@ -49,13 +37,6 @@ class Undeploy(Command):
49
37
 
50
38
  return {}
51
39
 
52
- def help(self, _: ReplState):
53
- return None
54
-
55
40
  class UndeployCommandHelper(click.Command):
56
41
  def get_help(self, ctx: click.Context):
57
- log(super().get_help(ctx))
58
- log()
59
- log('Sub-Commands:')
60
-
61
- log(lines_to_tabular([c.help(ReplState()).replace(f'{Undeploy.COMMAND} ', ' ', 1) for c in Undeploy.cmd_list()], separator='\t'))
42
+ Command.intermediate_help(super().get_help(ctx), Undeploy.COMMAND, Undeploy.cmd_list())
@@ -0,0 +1,46 @@
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_table import DescribeTable
7
+ from adam.commands.describe.describe_tables import DescribeTables
8
+ from adam.repl_state import ReplState, RequiredState
9
+
10
+ class Describe(Command):
11
+ COMMAND = 'describe'
12
+ reaper_login = None
13
+
14
+ # the singleton pattern
15
+ def __new__(cls, *args, **kwargs):
16
+ if not hasattr(cls, 'instance'): cls.instance = super(Describe, cls).__new__(cls)
17
+
18
+ return cls.instance
19
+
20
+ def __init__(self, successor: Command=None):
21
+ super().__init__(successor)
22
+
23
+ def required(self):
24
+ return RequiredState.CLUSTER
25
+
26
+ def command(self):
27
+ return Describe.COMMAND
28
+
29
+ def run(self, cmd: str, state: ReplState):
30
+ if not(args := self.args(cmd)):
31
+ return super().run(cmd, state)
32
+
33
+ return super().intermediate_run(cmd, state, args, Describe.cmd_list())
34
+
35
+ def cmd_list():
36
+ return [DescribeKeyspace(), DescribeKeyspaces(), DescribeTable(), DescribeTables()]
37
+
38
+ def completion(self, state: ReplState):
39
+ if state.sts:
40
+ return super().completion(state)
41
+
42
+ return {}
43
+
44
+ class DescribeCommandHelper(click.Command):
45
+ def get_help(self, ctx: click.Context):
46
+ Command.intermediate_help(super().get_help(ctx), Describe.COMMAND, Describe.cmd_list(), show_cluster_help=True)
@@ -1,13 +1,11 @@
1
1
  import click
2
2
 
3
3
  from adam.commands.command import Command
4
- from adam.commands.command_helpers import ClusterCommandHelper
5
4
  from .medusa_backup import MedusaBackup
6
5
  from .medusa_restore import MedusaRestore
7
6
  from .medusa_show_backupjobs import MedusaShowBackupJobs
8
7
  from .medusa_show_restorejobs import MedusaShowRestoreJobs
9
8
  from adam.repl_state import ReplState, RequiredState
10
- from adam.utils import lines_to_tabular, log, log2
11
9
 
12
10
  class Medusa(Command):
13
11
  COMMAND = 'medusa'
@@ -31,20 +29,7 @@ class Medusa(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 state.in_repl:
39
- log(lines_to_tabular([c.help(ReplState()) for c in Medusa.cmd_list()], separator=':'))
40
-
41
- return 'command-missing'
42
- else:
43
- # head with the Chain of Responsibility pattern
44
- cmds = Command.chain(Medusa.cmd_list())
45
- if not cmds.run(cmd, state):
46
- log2('* Command is missing.')
47
- Command.display_help()
32
+ return super().intermediate_run(cmd, state, args, Medusa.cmd_list())
48
33
 
49
34
  def cmd_list():
50
35
  return [MedusaBackup(), MedusaRestore(), MedusaShowBackupJobs(), MedusaShowRestoreJobs()]
@@ -55,15 +40,6 @@ class Medusa(Command):
55
40
 
56
41
  return {}
57
42
 
58
- def help(self, _: ReplState):
59
- return None
60
-
61
43
  class MedusaCommandHelper(click.Command):
62
44
  def get_help(self, ctx: click.Context):
63
- log(super().get_help(ctx))
64
- log()
65
- log('Sub-Commands:')
66
-
67
- log(lines_to_tabular([c.help(ReplState()).replace(f'{Medusa.COMMAND} ', ' ', 1) for c in Medusa.cmd_list()], separator=':'))
68
- log()
69
- ClusterCommandHelper.cluster_help()
45
+ Command.intermediate_help(super().get_help(ctx), Medusa.COMMAND, Medusa.cmd_list(), show_cluster_help=True)
@@ -49,4 +49,4 @@ class MedusaShowBackupJobs(Command):
49
49
  return {}
50
50
 
51
51
  def help(self, _: ReplState):
52
- return f'{MedusaShowBackupJobs.COMMAND}\t show backups'
52
+ return f'{MedusaShowBackupJobs.COMMAND}\t show Medusa backups'
@@ -49,4 +49,4 @@ class MedusaShowRestoreJobs(Command):
49
49
  return {}
50
50
 
51
51
  def help(self, _: ReplState):
52
- return f'{MedusaShowRestoreJobs.COMMAND}\t show restores'
52
+ return f'{MedusaShowRestoreJobs.COMMAND}\t show Medusa restores'
@@ -1,12 +1,12 @@
1
+ import functools
1
2
  import click
2
3
 
3
4
  from adam.commands.command import Command
4
- from adam.commands.command_helpers import ClusterCommandHelper
5
5
  from .postgres_ls import PostgresLs
6
6
  from .postgres_preview import PostgresPreview
7
7
  from .postgres_session import PostgresSession
8
8
  from adam.repl_state import ReplState
9
- from adam.utils import lines_to_tabular, log, log2
9
+ from adam.utils import log, log2
10
10
 
11
11
  class Postgres(Command):
12
12
  COMMAND = 'pg'
@@ -30,30 +30,22 @@ class Postgres(Command):
30
30
 
31
31
  state, args = self.apply_state(args, state)
32
32
 
33
- if state.in_repl:
34
- if not args:
33
+ if not args:
34
+ if state.in_repl:
35
35
  log2('Please use SQL statement. e.g. pg \l')
36
-
37
- return 'command-missing'
38
36
  else:
39
- self.run_sql(state, args)
40
- else:
41
- if not args:
42
37
  log2('* Command or SQL statements is missing.')
43
38
  Command.display_help()
44
39
 
45
- return 'command-missing'
46
- else:
47
- # head with the Chain of Responsibility pattern
48
- cmds = Command.chain(Postgres.cmd_list())
49
- if not cmds.run(cmd, state) :
50
- if not args:
51
- log2('* Command or SQL statements is missing.')
52
- Command.display_help()
40
+ return 'command-missing'
53
41
 
54
- return 'command-missing'
55
- else:
56
- self.run_sql(state, args)
42
+ if state.in_repl:
43
+ self.run_sql(state, args)
44
+ else:
45
+ # head with the Chain of Responsibility pattern
46
+ cmds = Command.chain(Postgres.cmd_list())
47
+ if not cmds.run(cmd, state) :
48
+ self.run_sql(state, args)
57
49
 
58
50
  return state
59
51
 
@@ -73,16 +65,21 @@ class Postgres(Command):
73
65
 
74
66
  def completion(self, state: ReplState):
75
67
  leaf = {}
76
- if PostgresSession(state.namespace, state.pg_path).db:
68
+ session = PostgresSession(state.namespace, state.pg_path)
69
+ if session.db:
70
+ ts = self.tables(state.namespace, state.pg_path)
77
71
  leaf = {
78
72
  '\h': None,
79
73
  '\d': None,
80
74
  '\dt': None,
81
75
  '\du': None,
82
- 'delete': {'from': None},
83
- 'insert': {'into': None},
84
- 'select': None,
85
- 'update': None,
76
+ 'delete': {'from': {t: {'where': {'id': {'=': None}}} for t in ts}},
77
+ 'insert': {'into': {t: {'values': None} for t in ts}},
78
+ 'select': {'*': {'from': {t: {
79
+ 'limit': {'1': None},
80
+ 'where': {'id': {'=': None}}
81
+ } for t in ts}}},
82
+ 'update': {t: {'set': None} for t in ts},
86
83
  }
87
84
  elif state.pg_path:
88
85
  leaf = {
@@ -95,18 +92,20 @@ class Postgres(Command):
95
92
  else:
96
93
  return {}
97
94
 
95
+ @functools.lru_cache()
96
+ def tables(self, ns: str, pg_path: str):
97
+ session = PostgresSession(ns, pg_path)
98
+ if session.db:
99
+ return [f'{t["schema"]}.{t["name"]}' for t in session.tables()]
100
+
101
+ return []
102
+
98
103
  def help(self, _: ReplState):
99
104
  return f'[{Postgres.COMMAND}] <sql-statements>\t run psql with queries'
100
105
 
101
106
  class PostgresCommandHelper(click.Command):
102
107
  def get_help(self, ctx: click.Context):
103
- log(super().get_help(ctx))
104
- log()
105
- log('Sub-Commands:')
106
-
107
- log(lines_to_tabular([c.help(ReplState()).replace(f'{Postgres.COMMAND} ', ' ', 1) for c in Postgres.cmd_list()], separator='\t'))
108
- log()
109
- ClusterCommandHelper.cluster_help()
108
+ Command.intermediate_help(super().get_help(ctx), Postgres.COMMAND, Postgres.cmd_list(), show_cluster_help=True)
110
109
  log('PG-Name: Kubernetes secret for Postgres credentials')
111
110
  log(' e.g. stgawsscpsr-c3-c3-k8spg-cs-001')
112
111
  log('Database: Postgres database name within a host')
@@ -25,7 +25,7 @@ class PostgresSession:
25
25
  if len(tks) > 1:
26
26
  self.db = tks[1]
27
27
 
28
- # work for databases()
28
+ # works only for databases()
29
29
  def __eq__(self, other: 'PostgresSession'):
30
30
  return self.host == other.host
31
31
 
@@ -1,7 +1,6 @@
1
1
  import click
2
2
 
3
3
  from adam.commands.command import Command
4
- from adam.commands.command_helpers import ClusterCommandHelper
5
4
  from .reaper_forward import ReaperForward
6
5
  from .reaper_forward_stop import ReaperForwardStop
7
6
  from .reaper_restart import ReaperRestart
@@ -14,7 +13,6 @@ from .reaper_schedule_stop import ReaperScheduleStop
14
13
  from .reaper_schedules import ReaperSchedules
15
14
  from .reaper_status import ReaperStatus
16
15
  from adam.repl_state import ReplState, RequiredState
17
- from adam.utils import lines_to_tabular, log, log2
18
16
 
19
17
  class Reaper(Command):
20
18
  COMMAND = 'reaper'
@@ -39,24 +37,12 @@ class Reaper(Command):
39
37
  if not(args := self.args(cmd)):
40
38
  return super().run(cmd, state)
41
39
 
42
- state, args = self.apply_state(args, state)
43
- if not self.validate_state(state):
44
- return state
45
-
46
- if state.in_repl:
47
- log(lines_to_tabular([c.help(ReplState()) for c in Reaper.cmd_list()], separator='\t'))
48
-
49
- return 'command-missing'
50
- else:
51
- # head with the Chain of Responsibility pattern
52
- cmds = Command.chain(Reaper.cmd_list())
53
- if not cmds.run(cmd, state):
54
- log2('* Command is missing.')
55
- Command.display_help()
40
+ return super().intermediate_run(cmd, state, args, Reaper.cmd_list())
56
41
 
57
42
  def cmd_list():
58
43
  return [ReaperSchedules(), ReaperScheduleStop(), ReaperScheduleActivate(), ReaperScheduleStart(),
59
- ReaperForwardStop(), ReaperForward(), ReaperRunAbort(), ReaperRunsAbort(), ReaperRestart(), ReaperRuns(), ReaperStatus()]
44
+ ReaperForwardStop(), ReaperForward(), ReaperRunAbort(), ReaperRunsAbort(), ReaperRestart(),
45
+ ReaperRuns(), ReaperStatus()]
60
46
 
61
47
  def completion(self, state: ReplState):
62
48
  if state.sts:
@@ -64,15 +50,6 @@ class Reaper(Command):
64
50
 
65
51
  return {}
66
52
 
67
- def help(self, _: ReplState):
68
- return None
69
-
70
53
  class ReaperCommandHelper(click.Command):
71
54
  def get_help(self, ctx: click.Context):
72
- log(super().get_help(ctx))
73
- log()
74
- log('Sub-Commands:')
75
-
76
- log(lines_to_tabular([c.help(ReplState()).replace(f'{Reaper.COMMAND} ', ' ', 1) for c in Reaper.cmd_list()], separator='\t'))
77
- log()
78
- ClusterCommandHelper.cluster_help()
55
+ Command.intermediate_help(super().get_help(ctx), Reaper.COMMAND, Reaper.cmd_list(), show_cluster_help=True)
@@ -1,13 +1,11 @@
1
1
  import click
2
2
 
3
3
  from adam.commands.command import Command
4
- from adam.commands.command_helpers import ClusterCommandHelper
5
4
  from .repair_run import RepairRun
6
5
  from .repair_scan import RepairScan
7
6
  from .repair_stop import RepairStop
8
7
  from .repair_log import RepairLog
9
8
  from adam.repl_state import ReplState, RequiredState
10
- from adam.utils import lines_to_tabular, log, log2
11
9
 
12
10
  class Repair(Command):
13
11
  COMMAND = 'repair'
@@ -31,20 +29,7 @@ class Repair(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 state.in_repl:
39
- log(lines_to_tabular([c.help(ReplState()) for c in Repair.cmd_list()], separator='\t'))
40
-
41
- return 'command-missing'
42
- else:
43
- # head with the Chain of Responsibility pattern
44
- cmds = Command.chain(Repair.cmd_list())
45
- if not cmds.run(cmd, state):
46
- log2('* Command is missing.')
47
- Command.display_help()
32
+ return super().intermediate_run(cmd, state, args, Repair.cmd_list())
48
33
 
49
34
  def cmd_list():
50
35
  return [RepairRun(), RepairScan(), RepairStop(), RepairLog()]
@@ -54,15 +39,6 @@ class Repair(Command):
54
39
  return super().completion(state)
55
40
  return {}
56
41
 
57
- def help(self, _: ReplState):
58
- return None
59
-
60
42
  class RepairCommandHelper(click.Command):
61
43
  def get_help(self, ctx: click.Context):
62
- log(super().get_help(ctx))
63
- log()
64
- log('Sub-Commands:')
65
-
66
- log(lines_to_tabular([c.help(ReplState()).replace(f'{Repair.COMMAND} ', ' ', 1) for c in Repair.cmd_list()], separator='\t'))
67
- log()
68
- ClusterCommandHelper.cluster_help()
44
+ Command.intermediate_help(super().get_help(ctx), Repair.COMMAND, Repair.cmd_list(), show_cluster_help=True)
@@ -1,7 +1,8 @@
1
1
  import click
2
2
 
3
3
  from adam.commands.command import Command
4
- from adam.commands.command_helpers import ClusterCommandHelper
4
+ from adam.commands.medusa.medusa_show_backupjobs import MedusaShowBackupJobs
5
+ from adam.commands.medusa.medusa_show_restorejobs import MedusaShowRestoreJobs
5
6
  from adam.commands.show.show_app_actions import ShowAppActions
6
7
  from adam.commands.show.show_app_queues import ShowAppQueues
7
8
  from adam.commands.show.show_login import ShowLogin
@@ -15,7 +16,6 @@ from .show_repairs import ShowRepairs
15
16
  from .show_storage import ShowStorage
16
17
  from .show_adam import ShowAdam
17
18
  from adam.repl_state import ReplState
18
- from adam.utils import lines_to_tabular, log, log2
19
19
 
20
20
  class Show(Command):
21
21
  COMMAND = 'show'
@@ -36,35 +36,16 @@ class Show(Command):
36
36
  if not(args := self.args(cmd)):
37
37
  return super().run(cmd, state)
38
38
 
39
- state, args = self.apply_state(args, state)
40
-
41
- if state.in_repl:
42
- log(lines_to_tabular([c.help(ReplState()) for c in Show.cmd_list()], separator='\t'))
43
-
44
- return 'command-missing'
45
- else:
46
- # head with the Chain of Responsibility pattern
47
- cmds = Command.chain(Show.cmd_list())
48
- if not cmds.run(cmd, state):
49
- log2('* Command is missing.')
50
- Command.display_help()
39
+ return super().intermediate_run(cmd, state, args, Show.cmd_list())
51
40
 
52
41
  def cmd_list():
53
- return [ShowAppActions(), ShowAppId(), ShowAppQueues(), ShowLogin(), ShowKubectlCommands(), ShowParams(), ShowProcesses(), ShowRepairs(),
54
- ShowStorage(), ShowAdam(), ShowCassandraStatus(), ShowCassandraVersion()]
42
+ return [ShowAppActions(), ShowAppId(), ShowAppQueues(), ShowLogin(), ShowKubectlCommands(),
43
+ ShowParams(), ShowProcesses(), ShowRepairs(), ShowStorage(), ShowAdam(),
44
+ ShowCassandraStatus(), ShowCassandraVersion(), MedusaShowRestoreJobs(), MedusaShowBackupJobs()]
55
45
 
56
46
  def completion(self, state: ReplState):
57
47
  return super().completion(state)
58
48
 
59
- def help(self, _: ReplState):
60
- return f"{Show.COMMAND}\t show kubectl commands"
61
-
62
49
  class ShowCommandHelper(click.Command):
63
50
  def get_help(self, ctx: click.Context):
64
- log(super().get_help(ctx))
65
- log()
66
- log('Catogories:')
67
-
68
- log(lines_to_tabular([c.help(ReplState()).replace(f'{Show.COMMAND} ', ' ', 1) for c in Show.cmd_list()], separator=':'))
69
- log()
70
- ClusterCommandHelper.cluster_help()
51
+ Command.intermediate_help(super().get_help(ctx), Show.COMMAND, Show.cmd_list(), show_cluster_help=True)
@@ -11,6 +11,7 @@ from adam.commands.deploy.undeploy import Undeploy
11
11
  from adam.commands.deploy.undeploy_frontend import UndeployFrontend
12
12
  from adam.commands.deploy.undeploy_pg_agent import UndeployPgAgent
13
13
  from adam.commands.deploy.undeploy_pod import UndeployPod
14
+ from adam.commands.describe.describe import Describe
14
15
  from adam.commands.describe.describe_keyspace import DescribeKeyspace
15
16
  from adam.commands.describe.describe_keyspaces import DescribeKeyspaces
16
17
  from adam.commands.describe.describe_table import DescribeTable
@@ -58,7 +59,7 @@ class ReplCommands:
58
59
  cmds: list[Command] = ReplCommands.navigation() + ReplCommands.cassandra_check() + ReplCommands.cassandra_ops() + \
59
60
  ReplCommands.tools() + ReplCommands.app() + ReplCommands.exit()
60
61
 
61
- intermediate_cmds: list[Command] = [App(), Reaper(), Repair(), Deploy(), Show(), Undeploy()]
62
+ intermediate_cmds: list[Command] = [App(), Reaper(), Repair(), Deploy(), Describe(), Show(), Undeploy()]
62
63
  ic = [c.command() for c in intermediate_cmds]
63
64
  # 1. dedup commands
64
65
  deduped = []
@@ -79,7 +80,7 @@ class ReplCommands:
79
80
  GetParam(), SetParam(), ShowParams(), ShowKubectlCommands(), ShowLogin(), ShowAdam()]
80
81
 
81
82
  def cassandra_check() -> list[Command]:
82
- return [DescribeKeyspace(), DescribeKeyspaces(), DescribeTable(), DescribeTables(), ShowCassandraStatus(),
83
+ return Describe.cmd_list() + [ShowCassandraStatus(),
83
84
  ShowCassandraVersion(), ShowRepairs(), ShowStorage(), ShowProcesses(), Check(), Issues(), NodeTool(), Report()]
84
85
 
85
86
  def cassandra_ops() -> list[Command]:
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+
4
+ __version__ = "2.0.35" #: the working version
5
+ __release__ = "1.0.0" #: the release version
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: kaqing
3
- Version: 2.0.33
3
+ Version: 2.0.35
4
4
  Summary: UNKNOWN
5
5
  Home-page: UNKNOWN
6
6
  License: UNKNOWN
@@ -94,6 +94,7 @@ adam/commands/deploy/undeploy_frontend.py
94
94
  adam/commands/deploy/undeploy_pg_agent.py
95
95
  adam/commands/deploy/undeploy_pod.py
96
96
  adam/commands/describe/__init__.py
97
+ adam/commands/describe/describe.py
97
98
  adam/commands/describe/describe_keyspace.py
98
99
  adam/commands/describe/describe_keyspaces.py
99
100
  adam/commands/describe/describe_table.py