kaqing 2.0.41__tar.gz → 2.0.43__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 (181) hide show
  1. {kaqing-2.0.41 → kaqing-2.0.43}/PKG-INFO +1 -1
  2. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/cd.py +2 -1
  3. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/cql_utils.py +1 -1
  4. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/ls.py +3 -8
  5. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/postgres/postgres.py +8 -15
  6. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/postgres/postgres_session.py +0 -8
  7. kaqing-2.0.43/adam/commands/postgres/postgres_utils.py +23 -0
  8. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/preview_table.py +2 -18
  9. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/reaper/reaper_session.py +1 -1
  10. {kaqing-2.0.41 → kaqing-2.0.43}/adam/k8s_utils/statefulsets.py +1 -0
  11. {kaqing-2.0.41 → kaqing-2.0.43}/adam/repl.py +8 -4
  12. kaqing-2.0.43/adam/repl_completer.py +74 -0
  13. kaqing-2.0.43/adam/version.py +5 -0
  14. {kaqing-2.0.41 → kaqing-2.0.43}/kaqing.egg-info/PKG-INFO +1 -1
  15. {kaqing-2.0.41 → kaqing-2.0.43}/kaqing.egg-info/SOURCES.txt +2 -0
  16. {kaqing-2.0.41 → kaqing-2.0.43}/setup.py +1 -1
  17. kaqing-2.0.41/adam/version.py +0 -5
  18. {kaqing-2.0.41 → kaqing-2.0.43}/README +0 -0
  19. {kaqing-2.0.41 → kaqing-2.0.43}/adam/__init__.py +0 -0
  20. {kaqing-2.0.41 → kaqing-2.0.43}/adam/app_session.py +0 -0
  21. {kaqing-2.0.41 → kaqing-2.0.43}/adam/apps.py +0 -0
  22. {kaqing-2.0.41 → kaqing-2.0.43}/adam/batch.py +0 -0
  23. {kaqing-2.0.41 → kaqing-2.0.43}/adam/checks/__init__.py +0 -0
  24. {kaqing-2.0.41 → kaqing-2.0.43}/adam/checks/check.py +0 -0
  25. {kaqing-2.0.41 → kaqing-2.0.43}/adam/checks/check_context.py +0 -0
  26. {kaqing-2.0.41 → kaqing-2.0.43}/adam/checks/check_result.py +0 -0
  27. {kaqing-2.0.41 → kaqing-2.0.43}/adam/checks/check_utils.py +0 -0
  28. {kaqing-2.0.41 → kaqing-2.0.43}/adam/checks/compactionstats.py +0 -0
  29. {kaqing-2.0.41 → kaqing-2.0.43}/adam/checks/cpu.py +0 -0
  30. {kaqing-2.0.41 → kaqing-2.0.43}/adam/checks/disk.py +0 -0
  31. {kaqing-2.0.41 → kaqing-2.0.43}/adam/checks/gossip.py +0 -0
  32. {kaqing-2.0.41 → kaqing-2.0.43}/adam/checks/issue.py +0 -0
  33. {kaqing-2.0.41 → kaqing-2.0.43}/adam/checks/memory.py +0 -0
  34. {kaqing-2.0.41 → kaqing-2.0.43}/adam/checks/status.py +0 -0
  35. {kaqing-2.0.41 → kaqing-2.0.43}/adam/cli.py +0 -0
  36. {kaqing-2.0.41 → kaqing-2.0.43}/adam/cli_group.py +0 -0
  37. {kaqing-2.0.41 → kaqing-2.0.43}/adam/columns/__init__.py +0 -0
  38. {kaqing-2.0.41 → kaqing-2.0.43}/adam/columns/column.py +0 -0
  39. {kaqing-2.0.41 → kaqing-2.0.43}/adam/columns/columns.py +0 -0
  40. {kaqing-2.0.41 → kaqing-2.0.43}/adam/columns/compactions.py +0 -0
  41. {kaqing-2.0.41 → kaqing-2.0.43}/adam/columns/cpu.py +0 -0
  42. {kaqing-2.0.41 → kaqing-2.0.43}/adam/columns/dir_data.py +0 -0
  43. {kaqing-2.0.41 → kaqing-2.0.43}/adam/columns/dir_snapshots.py +0 -0
  44. {kaqing-2.0.41 → kaqing-2.0.43}/adam/columns/gossip.py +0 -0
  45. {kaqing-2.0.41 → kaqing-2.0.43}/adam/columns/host_id.py +0 -0
  46. {kaqing-2.0.41 → kaqing-2.0.43}/adam/columns/memory.py +0 -0
  47. {kaqing-2.0.41 → kaqing-2.0.43}/adam/columns/node_address.py +0 -0
  48. {kaqing-2.0.41 → kaqing-2.0.43}/adam/columns/node_load.py +0 -0
  49. {kaqing-2.0.41 → kaqing-2.0.43}/adam/columns/node_owns.py +0 -0
  50. {kaqing-2.0.41 → kaqing-2.0.43}/adam/columns/node_status.py +0 -0
  51. {kaqing-2.0.41 → kaqing-2.0.43}/adam/columns/node_tokens.py +0 -0
  52. {kaqing-2.0.41 → kaqing-2.0.43}/adam/columns/node_utils.py +0 -0
  53. {kaqing-2.0.41 → kaqing-2.0.43}/adam/columns/pod_name.py +0 -0
  54. {kaqing-2.0.41 → kaqing-2.0.43}/adam/columns/volume_cassandra.py +0 -0
  55. {kaqing-2.0.41 → kaqing-2.0.43}/adam/columns/volume_root.py +0 -0
  56. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/__init__.py +0 -0
  57. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/alter_tables.py +0 -0
  58. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/app.py +0 -0
  59. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/app_ping.py +0 -0
  60. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/bash.py +0 -0
  61. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/check.py +0 -0
  62. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/cli_commands.py +0 -0
  63. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/command.py +0 -0
  64. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/command_helpers.py +0 -0
  65. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/commands_utils.py +0 -0
  66. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/cp.py +0 -0
  67. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/cqlsh.py +0 -0
  68. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/deploy/__init__.py +0 -0
  69. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/deploy/code_start.py +0 -0
  70. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/deploy/code_stop.py +0 -0
  71. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/deploy/code_utils.py +0 -0
  72. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/deploy/deploy.py +0 -0
  73. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/deploy/deploy_frontend.py +0 -0
  74. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/deploy/deploy_pg_agent.py +0 -0
  75. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/deploy/deploy_pod.py +0 -0
  76. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/deploy/deploy_utils.py +0 -0
  77. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/deploy/undeploy.py +0 -0
  78. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/deploy/undeploy_frontend.py +0 -0
  79. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/deploy/undeploy_pg_agent.py +0 -0
  80. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/deploy/undeploy_pod.py +0 -0
  81. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/describe/__init__.py +0 -0
  82. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/describe/describe.py +0 -0
  83. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/describe/describe_keyspace.py +0 -0
  84. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/describe/describe_keyspaces.py +0 -0
  85. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/describe/describe_table.py +0 -0
  86. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/describe/describe_tables.py +0 -0
  87. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/devices.py +0 -0
  88. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/exit.py +0 -0
  89. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/help.py +0 -0
  90. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/issues.py +0 -0
  91. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/login.py +0 -0
  92. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/logs.py +0 -0
  93. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/medusa/__init__.py +0 -0
  94. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/medusa/medusa.py +0 -0
  95. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/medusa/medusa_backup.py +0 -0
  96. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/medusa/medusa_restore.py +0 -0
  97. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/medusa/medusa_show_backupjobs.py +0 -0
  98. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/medusa/medusa_show_restorejobs.py +0 -0
  99. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/nodetool.py +0 -0
  100. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/nodetool_commands.py +0 -0
  101. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/param_get.py +0 -0
  102. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/param_set.py +0 -0
  103. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/postgres/__init__.py +0 -0
  104. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/postgres/postgres_ls.py +0 -0
  105. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/postgres/postgres_preview.py +0 -0
  106. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/pwd.py +0 -0
  107. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/reaper/__init__.py +0 -0
  108. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/reaper/reaper.py +0 -0
  109. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/reaper/reaper_forward.py +0 -0
  110. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/reaper/reaper_forward_stop.py +0 -0
  111. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/reaper/reaper_restart.py +0 -0
  112. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/reaper/reaper_run_abort.py +0 -0
  113. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/reaper/reaper_runs.py +0 -0
  114. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/reaper/reaper_runs_abort.py +0 -0
  115. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/reaper/reaper_schedule_activate.py +0 -0
  116. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/reaper/reaper_schedule_start.py +0 -0
  117. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/reaper/reaper_schedule_stop.py +0 -0
  118. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/reaper/reaper_schedules.py +0 -0
  119. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/reaper/reaper_status.py +0 -0
  120. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/repair/__init__.py +0 -0
  121. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/repair/repair.py +0 -0
  122. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/repair/repair_log.py +0 -0
  123. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/repair/repair_run.py +0 -0
  124. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/repair/repair_scan.py +0 -0
  125. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/repair/repair_stop.py +0 -0
  126. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/report.py +0 -0
  127. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/restart.py +0 -0
  128. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/rollout.py +0 -0
  129. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/shell.py +0 -0
  130. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/show/__init__.py +0 -0
  131. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/show/show.py +0 -0
  132. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/show/show_adam.py +0 -0
  133. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/show/show_app_actions.py +0 -0
  134. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/show/show_app_id.py +0 -0
  135. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/show/show_app_queues.py +0 -0
  136. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/show/show_cassandra_status.py +0 -0
  137. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/show/show_cassandra_version.py +0 -0
  138. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/show/show_commands.py +0 -0
  139. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/show/show_login.py +0 -0
  140. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/show/show_params.py +0 -0
  141. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/show/show_processes.py +0 -0
  142. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/show/show_repairs.py +0 -0
  143. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/show/show_storage.py +0 -0
  144. {kaqing-2.0.41 → kaqing-2.0.43}/adam/commands/watch.py +0 -0
  145. {kaqing-2.0.41 → kaqing-2.0.43}/adam/config.py +0 -0
  146. {kaqing-2.0.41 → kaqing-2.0.43}/adam/embedded_apps.py +0 -0
  147. {kaqing-2.0.41 → kaqing-2.0.43}/adam/embedded_params.py +0 -0
  148. {kaqing-2.0.41 → kaqing-2.0.43}/adam/k8s_utils/__init__.py +0 -0
  149. {kaqing-2.0.41 → kaqing-2.0.43}/adam/k8s_utils/cassandra_clusters.py +0 -0
  150. {kaqing-2.0.41 → kaqing-2.0.43}/adam/k8s_utils/cassandra_nodes.py +0 -0
  151. {kaqing-2.0.41 → kaqing-2.0.43}/adam/k8s_utils/config_maps.py +0 -0
  152. {kaqing-2.0.41 → kaqing-2.0.43}/adam/k8s_utils/custom_resources.py +0 -0
  153. {kaqing-2.0.41 → kaqing-2.0.43}/adam/k8s_utils/deployment.py +0 -0
  154. {kaqing-2.0.41 → kaqing-2.0.43}/adam/k8s_utils/ingresses.py +0 -0
  155. {kaqing-2.0.41 → kaqing-2.0.43}/adam/k8s_utils/jobs.py +0 -0
  156. {kaqing-2.0.41 → kaqing-2.0.43}/adam/k8s_utils/kube_context.py +0 -0
  157. {kaqing-2.0.41 → kaqing-2.0.43}/adam/k8s_utils/pods.py +0 -0
  158. {kaqing-2.0.41 → kaqing-2.0.43}/adam/k8s_utils/secrets.py +0 -0
  159. {kaqing-2.0.41 → kaqing-2.0.43}/adam/k8s_utils/service_accounts.py +0 -0
  160. {kaqing-2.0.41 → kaqing-2.0.43}/adam/k8s_utils/services.py +0 -0
  161. {kaqing-2.0.41 → kaqing-2.0.43}/adam/k8s_utils/volumes.py +0 -0
  162. {kaqing-2.0.41 → kaqing-2.0.43}/adam/log.py +0 -0
  163. {kaqing-2.0.41 → kaqing-2.0.43}/adam/pod_exec_result.py +0 -0
  164. {kaqing-2.0.41 → kaqing-2.0.43}/adam/repl_commands.py +0 -0
  165. {kaqing-2.0.41 → kaqing-2.0.43}/adam/repl_session.py +0 -0
  166. {kaqing-2.0.41 → kaqing-2.0.43}/adam/repl_state.py +0 -0
  167. {kaqing-2.0.41 → kaqing-2.0.43}/adam/sso/__init__.py +0 -0
  168. {kaqing-2.0.41 → kaqing-2.0.43}/adam/sso/authenticator.py +0 -0
  169. {kaqing-2.0.41 → kaqing-2.0.43}/adam/sso/authn_ad.py +0 -0
  170. {kaqing-2.0.41 → kaqing-2.0.43}/adam/sso/authn_okta.py +0 -0
  171. {kaqing-2.0.41 → kaqing-2.0.43}/adam/sso/cred_cache.py +0 -0
  172. {kaqing-2.0.41 → kaqing-2.0.43}/adam/sso/id_token.py +0 -0
  173. {kaqing-2.0.41 → kaqing-2.0.43}/adam/sso/idp.py +0 -0
  174. {kaqing-2.0.41 → kaqing-2.0.43}/adam/sso/idp_login.py +0 -0
  175. {kaqing-2.0.41 → kaqing-2.0.43}/adam/sso/idp_session.py +0 -0
  176. {kaqing-2.0.41 → kaqing-2.0.43}/adam/sso/sso_config.py +0 -0
  177. {kaqing-2.0.41 → kaqing-2.0.43}/adam/utils.py +0 -0
  178. {kaqing-2.0.41 → kaqing-2.0.43}/kaqing.egg-info/dependency_links.txt +0 -0
  179. {kaqing-2.0.41 → kaqing-2.0.43}/kaqing.egg-info/entry_points.txt +0 -0
  180. {kaqing-2.0.41 → kaqing-2.0.43}/kaqing.egg-info/top_level.txt +0 -0
  181. {kaqing-2.0.41 → kaqing-2.0.43}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: kaqing
3
- Version: 2.0.41
3
+ Version: 2.0.43
4
4
  Summary: UNKNOWN
5
5
  Home-page: UNKNOWN
6
6
  License: UNKNOWN
@@ -1,4 +1,5 @@
1
1
  from adam.commands.command import Command
2
+ from adam.commands.postgres.postgres_utils import pg_database_names
2
3
  from adam.commands.postgres.postgres_session import PostgresSession
3
4
  from adam.k8s_utils.cassandra_clusters import CassandraClusters
4
5
  from adam.k8s_utils.kube_context import KubeContext
@@ -91,7 +92,7 @@ class Cd(Command):
91
92
  if pg and pg.db:
92
93
  return {Cd.COMMAND: {'..': None}}
93
94
  elif pg and pg.host:
94
- return {Cd.COMMAND: {'..': None} | {p['name']: None for p in pg.databases()}}
95
+ return {Cd.COMMAND: {'..': None} | {p: None for p in pg_database_names(state.namespace, pg.directory())}}
95
96
  else:
96
97
  return {Cd.COMMAND: {p: None for p in PostgresSession.hosts(state.namespace)}}
97
98
  elif state.device == ReplState.A:
@@ -11,7 +11,7 @@ from adam.utils import log2
11
11
 
12
12
  @functools.lru_cache()
13
13
  def keyspaces(state: ReplState, on_any=False):
14
- Config().wait_log("Inspecting Cassandra Keyspaces...")
14
+ Config().wait_log('Inspecting Cassandra Keyspaces...')
15
15
 
16
16
  r: list[PodExecResult] = run_cql(state, 'describe keyspaces', show_out=False, on_any=on_any)
17
17
  if not r:
@@ -1,15 +1,14 @@
1
1
  import copy
2
- import re
3
2
 
4
3
  from adam.commands.command import Command
5
4
  from adam.commands.commands_utils import show_pods, show_rollout
6
5
  from adam.commands.cqlsh import Cqlsh
6
+ from adam.commands.postgres.postgres_utils import pg_database_names, pg_table_names
7
7
  from adam.commands.postgres.postgres_session import PostgresSession
8
8
  from adam.config import Config
9
9
  from adam.k8s_utils.custom_resources import CustomResources
10
10
  from adam.k8s_utils.ingresses import Ingresses
11
11
  from adam.k8s_utils.kube_context import KubeContext
12
- from adam.k8s_utils.services import Services
13
12
  from adam.k8s_utils.statefulsets import StatefulSets
14
13
  from adam.pod_exec_result import PodExecResult
15
14
  from adam.repl_state import ReplState
@@ -123,14 +122,10 @@ class Ls(Command):
123
122
  log(lines_to_tabular(lines, 'NAME,NAMESPACE,ENDPOINT,USERNAME,PASSWORD', separator=','))
124
123
 
125
124
  def show_pg_databases(self, pg: PostgresSession):
126
- lines = [db["name"] for db in pg.databases() if db["owner"] == PostgresSession.default_owner()]
127
-
128
- log(lines_to_tabular(lines, 'DATABASE', separator=','))
125
+ log(lines_to_tabular(pg_database_names(pg.namespace, pg.directory()), 'DATABASE', separator=','))
129
126
 
130
127
  def show_pg_tables(self, pg: PostgresSession):
131
- lines = [db["name"] for db in pg.tables() if db["schema"] == PostgresSession.default_schema()]
132
-
133
- log(lines_to_tabular(lines, 'NAME', separator=','))
128
+ log(lines_to_tabular(pg_table_names(pg.namespace, pg.directory()), 'NAME', separator=','))
134
129
 
135
130
  def completion(self, state: ReplState):
136
131
  if state.pod:
@@ -2,6 +2,7 @@ import functools
2
2
  import click
3
3
 
4
4
  from adam.commands.command import Command
5
+ from adam.commands.postgres.postgres_utils import pg_table_names
5
6
  from .postgres_ls import PostgresLs
6
7
  from .postgres_preview import PostgresPreview
7
8
  from .postgres_session import PostgresSession
@@ -67,19 +68,20 @@ class Postgres(Command):
67
68
  leaf = {}
68
69
  session = PostgresSession(state.namespace, state.pg_path)
69
70
  if session.db:
70
- ts = self.tables(state.namespace, state.pg_path)
71
+ if pg_table_names(state.namespace, state.pg_path):
72
+ ts = f'<pg_tables:{state.namespace}:{state.pg_path}>'
71
73
  leaf = {
72
74
  '\h': None,
73
75
  '\d': None,
74
76
  '\dt': None,
75
77
  '\du': 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: {
78
+ 'delete': {'from': {ts: {'where': {'id': {'=': None}}}}},
79
+ 'insert': {'into': {ts: {'values': None}}},
80
+ 'select': {'*': {'from': {ts: {
79
81
  'limit': {'1': None},
80
82
  'where': {'id': {'=': None}}
81
- } for t in ts}}},
82
- 'update': {t: {'set': None} for t in ts},
83
+ }}}},
84
+ 'update': {ts: {'set': None}},
83
85
  }
84
86
  elif state.pg_path:
85
87
  leaf = {
@@ -92,15 +94,6 @@ class Postgres(Command):
92
94
  else:
93
95
  return {}
94
96
 
95
- # TODO fix cache
96
- # @functools.lru_cache()
97
- def tables(self, ns: str, pg_path: str):
98
- session = PostgresSession(ns, pg_path)
99
- if session.db:
100
- return [f'{t["schema"]}.{t["name"]}' for t in session.tables()]
101
-
102
- return []
103
-
104
97
  def help(self, _: ReplState):
105
98
  return f'[{Postgres.COMMAND}] <sql-statements>\t run psql with queries'
106
99
 
@@ -25,13 +25,6 @@ class PostgresSession:
25
25
  if len(tks) > 1:
26
26
  self.db = tks[1]
27
27
 
28
- # works only for databases()
29
- def __eq__(self, other: 'PostgresSession'):
30
- return self.host == other.host
31
-
32
- def __hash__(self):
33
- return hash(self.host)
34
-
35
28
  def find_namespace(self, arg: str):
36
29
  if arg:
37
30
  tks = arg.split('@')
@@ -82,7 +75,6 @@ class PostgresSession:
82
75
 
83
76
  return [s for s in ss if not excludes(s)]
84
77
 
85
- @functools.lru_cache()
86
78
  def databases(self):
87
79
  dbs = []
88
80
  # List of databases
@@ -0,0 +1,23 @@
1
+ import functools
2
+
3
+ from adam.commands.postgres.postgres_session import PostgresSession
4
+ from adam.config import Config
5
+
6
+ @functools.lru_cache()
7
+ def pg_database_names(ns: str, pg_path: str):
8
+ Config().wait_log('Inspecting Postgres Databases...')
9
+
10
+ pg = PostgresSession(ns, pg_path)
11
+ return [db['name'] for db in pg.databases() if db['owner'] == PostgresSession.default_owner()]
12
+
13
+ @functools.lru_cache()
14
+ def pg_table_names(ns: str, pg_path: str):
15
+ Config().wait_log('Inspecting Postgres Database...')
16
+ return [table['name'] for table in pg_tables(ns, pg_path) if table['schema'] == PostgresSession.default_schema()]
17
+
18
+ def pg_tables(ns: str, pg_path: str):
19
+ pg = PostgresSession(ns, pg_path)
20
+ if pg.db:
21
+ return pg.tables()
22
+
23
+ return []
@@ -4,7 +4,6 @@ from adam.commands.command import Command
4
4
  from adam.commands.cql_utils import run_cql, tables
5
5
  from adam.commands.postgres.postgres_session import PostgresSession
6
6
  from adam.config import Config
7
- from adam.pod_exec_result import PodExecResult
8
7
  from adam.repl_state import ReplState, RequiredState
9
8
  from adam.utils import lines_to_tabular, log, log2
10
9
 
@@ -72,8 +71,7 @@ class PreviewTable(Command):
72
71
 
73
72
  def completion(self, state: ReplState):
74
73
  if state.device == ReplState.P:
75
- if tables := PreviewTable.pg_tables(state.namespace, state.pg_path):
76
- return {PreviewTable.COMMAND: {db["name"]: None for db in tables if db["schema"] == PostgresSession.default_schema()}}
74
+ return {PreviewTable.COMMAND: {f'<pg_tables:{state.namespace}:{state.pg_path}>': None}}
77
75
  elif state.sts:
78
76
  tables = PreviewTable.cql_tables(state)
79
77
  return {PreviewTable.COMMAND: {f'{k}.{t}': None for k, ts in tables.items() for t in ts}}
@@ -88,18 +86,4 @@ class PreviewTable(Command):
88
86
  if state.pod:
89
87
  return tables(state)
90
88
 
91
- return tables(state, on_any=True)
92
-
93
- # r: list[PodExecResult] = run_cql(state, 'describe tables', show_out=False, on_any=True)
94
- # if not r:
95
- # return []
96
-
97
- # return parse_cql_desc_tables(r[0].stdout)
98
-
99
- @functools.lru_cache()
100
- def pg_tables(ns: str, pg_path: str):
101
- pg = PostgresSession(ns, pg_path)
102
- if pg.db:
103
- return pg.tables()
104
-
105
- return None
89
+ return tables(state, on_any=True)
@@ -149,7 +149,7 @@ class ReaperSession:
149
149
  return ReaperSession.schedules_ids_by_cluster[state.sts]
150
150
 
151
151
  if reaper := ReaperSession.create(state):
152
- Config().wait_log("Inspecting Cassandra Reaper...")
152
+ Config().wait_log('Inspecting Cassandra Reaper...')
153
153
 
154
154
  schedules = reaper.schedule_ids(state, show_output = False)
155
155
  ReaperSession.schedules_ids_by_cluster[state.sts] = schedules
@@ -24,6 +24,7 @@ class StatefulSets:
24
24
 
25
25
  return statefulsets.items
26
26
 
27
+ @functools.lru_cache()
27
28
  def list_sts_name_and_ns():
28
29
  return [(statefulset.metadata.name, statefulset.metadata.namespace) for statefulset in StatefulSets.list_sts()]
29
30
 
@@ -1,3 +1,4 @@
1
+ import json
1
2
  import os
2
3
  import re
3
4
  import time
@@ -16,6 +17,7 @@ from adam.k8s_utils.kube_context import KubeContext
16
17
  from adam.k8s_utils.statefulsets import StatefulSets
17
18
  from adam.log import Log
18
19
  from adam.repl_commands import ReplCommands
20
+ from adam.repl_completer import CompleterContext, ReplCompleter
19
21
  from adam.repl_session import ReplSession
20
22
  from adam.repl_state import ReplState
21
23
  from adam.utils import deep_merge_dicts, deep_sort_dict, lines_to_tabular, log2
@@ -92,7 +94,7 @@ def enter_repl(state: ReplState):
92
94
  sorted_cmds = sorted(cmd_list, key=lambda cmd: cmd.command())
93
95
  while True:
94
96
  try:
95
- completer = NestedCompleter.from_nested_dict({})
97
+ completer = ReplCompleter.from_nested_dict({})
96
98
  if not state.bash_session:
97
99
  completions = {}
98
100
  # app commands are available only on a: drive
@@ -105,9 +107,10 @@ def enter_repl(state: ReplState):
105
107
  completions = deep_sort_dict(deep_merge_dicts(completions, cmd.completion(state)))
106
108
  finally:
107
109
  if Config().get('debugs.timings', False):
108
- Config().debug('Timing completion calc', cmd.command(), f'{time.time() - s1:.2f}')
110
+ log2(f'Timing auto-completion-calc {cmd.command()}: {time.time() - s1:.2f}')
109
111
 
110
- completer = NestedCompleter.from_nested_dict(completions)
112
+ # print(json.dumps(completions, indent=4))
113
+ completer = ReplCompleter.from_nested_dict(completions)
111
114
 
112
115
  cmd = session.prompt(prompt_msg(), completer=completer, key_bindings=kb)
113
116
  s0 = time.time()
@@ -151,9 +154,10 @@ def enter_repl(state: ReplState):
151
154
  log2(e)
152
155
  Config().debug(traceback.format_exc())
153
156
  finally:
157
+ CompleterContext().reset()
154
158
  Config().clear_wait_log_flag()
155
159
  if Config().get('debugs.timings', False) and 'cmd' in locals() and 's0' in locals():
156
- print('Timing command', cmd, f'{time.time() - s0:.2f}')
160
+ log2(f'Timing command {cmd}: {time.time() - s0:.2f}')
157
161
 
158
162
  @cli.command(context_settings=dict(ignore_unknown_options=True, allow_extra_args=True), cls=ClusterCommandHelper, help="Enter interactive shell.")
159
163
  @click.option('--kubeconfig', '-k', required=False, metavar='path', help='path to kubeconfig file')
@@ -0,0 +1,74 @@
1
+ import re
2
+
3
+ from typing import Iterable
4
+ from prompt_toolkit.completion import CompleteEvent, Completion, NestedCompleter, WordCompleter
5
+ from prompt_toolkit.document import Document
6
+
7
+ from adam.commands.postgres.postgres_utils import pg_table_names
8
+
9
+ class CompleterContext:
10
+ # the singleton pattern
11
+ def __new__(cls, *args, **kwargs):
12
+ if not hasattr(cls, 'instance'): cls.instance = super(CompleterContext, cls).__new__(cls)
13
+
14
+ return cls.instance
15
+
16
+ def __init__(self):
17
+ if not hasattr(self, 'table_resolver'):
18
+ self.table_resolver = None
19
+ self.tables = []
20
+
21
+ def produce(self, word: str):
22
+ if match := re.match(r'^<pg_tables:(.*?):(.*?)>$', word):
23
+ self.table_resolver = word
24
+ self.tables = pg_table_names(match.group(1), match.group(2))
25
+
26
+ return self.tables
27
+
28
+ return None
29
+
30
+ def is_table(self, word: str):
31
+ if word in self.tables and self.table_resolver:
32
+ return self.table_resolver
33
+
34
+ return None
35
+
36
+ def reset(self):
37
+ self.table_resolver = None
38
+ self.tables = []
39
+
40
+
41
+ class ReplCompleter(NestedCompleter):
42
+ def get_completions(
43
+ self, document: Document, complete_event: CompleteEvent
44
+ ) -> Iterable[Completion]:
45
+ text = document.text_before_cursor.lstrip()
46
+ stripped_len = len(document.text_before_cursor) - len(text)
47
+
48
+ if " " in text:
49
+ first_term = text.split()[0]
50
+ completer = self.options.get(first_term)
51
+ if table_resolver := CompleterContext().is_table(first_term):
52
+ completer = self.options.get(table_resolver)
53
+
54
+ if completer is not None:
55
+ remaining_text = text[len(first_term) :].lstrip()
56
+ move_cursor = len(text) - len(remaining_text) + stripped_len
57
+
58
+ new_document = Document(
59
+ remaining_text,
60
+ cursor_position=document.cursor_position - move_cursor,
61
+ )
62
+
63
+ for c in completer.get_completions(new_document, complete_event):
64
+ if words := CompleterContext().produce(c.text):
65
+ for w in words:
66
+ yield Completion(w)
67
+ else:
68
+ yield c
69
+ else:
70
+ completer = WordCompleter(
71
+ list(self.options.keys()), ignore_case=self.ignore_case
72
+ )
73
+ for c in completer.get_completions(document, complete_event):
74
+ yield c
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+
4
+ __version__ = "2.0.43" #: 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.41
3
+ Version: 2.0.43
4
4
  Summary: UNKNOWN
5
5
  Home-page: UNKNOWN
6
6
  License: UNKNOWN
@@ -13,6 +13,7 @@ adam/log.py
13
13
  adam/pod_exec_result.py
14
14
  adam/repl.py
15
15
  adam/repl_commands.py
16
+ adam/repl_completer.py
16
17
  adam/repl_session.py
17
18
  adam/repl_state.py
18
19
  adam/utils.py
@@ -110,6 +111,7 @@ adam/commands/postgres/postgres.py
110
111
  adam/commands/postgres/postgres_ls.py
111
112
  adam/commands/postgres/postgres_preview.py
112
113
  adam/commands/postgres/postgres_session.py
114
+ adam/commands/postgres/postgres_utils.py
113
115
  adam/commands/reaper/__init__.py
114
116
  adam/commands/reaper/reaper.py
115
117
  adam/commands/reaper/reaper_forward.py
@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
2
2
 
3
3
  setup(
4
4
  name='kaqing',
5
- version='2.0.41',
5
+ version='2.0.43',
6
6
  packages=find_packages(),
7
7
  entry_points={
8
8
  'console_scripts': [
@@ -1,5 +0,0 @@
1
- #!/usr/bin/env python
2
- # -*- coding: utf-8 -*-
3
-
4
- __version__ = "2.0.41" #: the working version
5
- __release__ = "1.0.0" #: the release version
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes