kaqing 2.0.26__tar.gz → 2.0.28__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 (174) hide show
  1. {kaqing-2.0.26 → kaqing-2.0.28}/PKG-INFO +1 -1
  2. kaqing-2.0.28/adam/commands/alter_tables.py +111 -0
  3. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/cql_utils.py +2 -2
  4. kaqing-2.0.28/adam/embedded_params.py +2 -0
  5. {kaqing-2.0.26 → kaqing-2.0.28}/adam/k8s_utils/cassandra_clusters.py +2 -16
  6. {kaqing-2.0.26 → kaqing-2.0.28}/adam/k8s_utils/pods.py +5 -7
  7. {kaqing-2.0.26 → kaqing-2.0.28}/adam/k8s_utils/statefulsets.py +2 -2
  8. {kaqing-2.0.26 → kaqing-2.0.28}/adam/repl_commands.py +3 -1
  9. {kaqing-2.0.26 → kaqing-2.0.28}/adam/sso/authn_ad.py +1 -1
  10. kaqing-2.0.28/adam/version.py +5 -0
  11. {kaqing-2.0.26 → kaqing-2.0.28}/kaqing.egg-info/PKG-INFO +1 -1
  12. {kaqing-2.0.26 → kaqing-2.0.28}/kaqing.egg-info/SOURCES.txt +1 -0
  13. {kaqing-2.0.26 → kaqing-2.0.28}/setup.py +1 -1
  14. kaqing-2.0.26/adam/embedded_params.py +0 -2
  15. kaqing-2.0.26/adam/version.py +0 -5
  16. {kaqing-2.0.26 → kaqing-2.0.28}/README +0 -0
  17. {kaqing-2.0.26 → kaqing-2.0.28}/adam/__init__.py +0 -0
  18. {kaqing-2.0.26 → kaqing-2.0.28}/adam/app_session.py +0 -0
  19. {kaqing-2.0.26 → kaqing-2.0.28}/adam/apps.py +0 -0
  20. {kaqing-2.0.26 → kaqing-2.0.28}/adam/batch.py +0 -0
  21. {kaqing-2.0.26 → kaqing-2.0.28}/adam/checks/__init__.py +0 -0
  22. {kaqing-2.0.26 → kaqing-2.0.28}/adam/checks/check.py +0 -0
  23. {kaqing-2.0.26 → kaqing-2.0.28}/adam/checks/check_context.py +0 -0
  24. {kaqing-2.0.26 → kaqing-2.0.28}/adam/checks/check_result.py +0 -0
  25. {kaqing-2.0.26 → kaqing-2.0.28}/adam/checks/check_utils.py +0 -0
  26. {kaqing-2.0.26 → kaqing-2.0.28}/adam/checks/compactionstats.py +0 -0
  27. {kaqing-2.0.26 → kaqing-2.0.28}/adam/checks/cpu.py +0 -0
  28. {kaqing-2.0.26 → kaqing-2.0.28}/adam/checks/disk.py +0 -0
  29. {kaqing-2.0.26 → kaqing-2.0.28}/adam/checks/gossip.py +0 -0
  30. {kaqing-2.0.26 → kaqing-2.0.28}/adam/checks/issue.py +0 -0
  31. {kaqing-2.0.26 → kaqing-2.0.28}/adam/checks/memory.py +0 -0
  32. {kaqing-2.0.26 → kaqing-2.0.28}/adam/checks/status.py +0 -0
  33. {kaqing-2.0.26 → kaqing-2.0.28}/adam/cli.py +0 -0
  34. {kaqing-2.0.26 → kaqing-2.0.28}/adam/cli_group.py +0 -0
  35. {kaqing-2.0.26 → kaqing-2.0.28}/adam/columns/__init__.py +0 -0
  36. {kaqing-2.0.26 → kaqing-2.0.28}/adam/columns/column.py +0 -0
  37. {kaqing-2.0.26 → kaqing-2.0.28}/adam/columns/columns.py +0 -0
  38. {kaqing-2.0.26 → kaqing-2.0.28}/adam/columns/compactions.py +0 -0
  39. {kaqing-2.0.26 → kaqing-2.0.28}/adam/columns/cpu.py +0 -0
  40. {kaqing-2.0.26 → kaqing-2.0.28}/adam/columns/dir_data.py +0 -0
  41. {kaqing-2.0.26 → kaqing-2.0.28}/adam/columns/dir_snapshots.py +0 -0
  42. {kaqing-2.0.26 → kaqing-2.0.28}/adam/columns/gossip.py +0 -0
  43. {kaqing-2.0.26 → kaqing-2.0.28}/adam/columns/host_id.py +0 -0
  44. {kaqing-2.0.26 → kaqing-2.0.28}/adam/columns/memory.py +0 -0
  45. {kaqing-2.0.26 → kaqing-2.0.28}/adam/columns/node_address.py +0 -0
  46. {kaqing-2.0.26 → kaqing-2.0.28}/adam/columns/node_load.py +0 -0
  47. {kaqing-2.0.26 → kaqing-2.0.28}/adam/columns/node_owns.py +0 -0
  48. {kaqing-2.0.26 → kaqing-2.0.28}/adam/columns/node_status.py +0 -0
  49. {kaqing-2.0.26 → kaqing-2.0.28}/adam/columns/node_tokens.py +0 -0
  50. {kaqing-2.0.26 → kaqing-2.0.28}/adam/columns/node_utils.py +0 -0
  51. {kaqing-2.0.26 → kaqing-2.0.28}/adam/columns/pod_name.py +0 -0
  52. {kaqing-2.0.26 → kaqing-2.0.28}/adam/columns/volume_cassandra.py +0 -0
  53. {kaqing-2.0.26 → kaqing-2.0.28}/adam/columns/volume_root.py +0 -0
  54. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/__init__.py +0 -0
  55. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/app.py +0 -0
  56. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/app_ping.py +0 -0
  57. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/bash.py +0 -0
  58. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/cd.py +0 -0
  59. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/check.py +0 -0
  60. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/cli_commands.py +0 -0
  61. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/command.py +0 -0
  62. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/command_helpers.py +0 -0
  63. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/commands_utils.py +0 -0
  64. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/cp.py +0 -0
  65. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/cqlsh.py +0 -0
  66. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/deploy/__init__.py +0 -0
  67. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/deploy/code_start.py +0 -0
  68. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/deploy/code_stop.py +0 -0
  69. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/deploy/code_utils.py +0 -0
  70. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/deploy/deploy.py +0 -0
  71. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/deploy/deploy_frontend.py +0 -0
  72. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/deploy/deploy_pg_agent.py +0 -0
  73. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/deploy/deploy_pod.py +0 -0
  74. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/deploy/deploy_utils.py +0 -0
  75. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/deploy/undeploy.py +0 -0
  76. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/deploy/undeploy_frontend.py +0 -0
  77. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/deploy/undeploy_pg_agent.py +0 -0
  78. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/deploy/undeploy_pod.py +0 -0
  79. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/devices.py +0 -0
  80. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/exit.py +0 -0
  81. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/help.py +0 -0
  82. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/issues.py +0 -0
  83. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/login.py +0 -0
  84. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/logs.py +0 -0
  85. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/ls.py +0 -0
  86. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/medusa/__init__.py +0 -0
  87. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/medusa/medusa.py +0 -0
  88. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/medusa/medusa_backup.py +0 -0
  89. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/medusa/medusa_restore.py +0 -0
  90. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/medusa/medusa_show_backupjobs.py +0 -0
  91. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/medusa/medusa_show_restorejobs.py +0 -0
  92. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/nodetool.py +0 -0
  93. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/nodetool_commands.py +0 -0
  94. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/param_get.py +0 -0
  95. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/param_set.py +0 -0
  96. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/postgres/__init__.py +0 -0
  97. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/postgres/postgres.py +0 -0
  98. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/postgres/postgres_ls.py +0 -0
  99. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/postgres/postgres_preview.py +0 -0
  100. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/postgres/postgres_session.py +0 -0
  101. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/preview_table.py +0 -0
  102. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/pwd.py +0 -0
  103. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/reaper/__init__.py +0 -0
  104. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/reaper/reaper.py +0 -0
  105. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/reaper/reaper_forward.py +0 -0
  106. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/reaper/reaper_forward_stop.py +0 -0
  107. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/reaper/reaper_restart.py +0 -0
  108. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/reaper/reaper_run_abort.py +0 -0
  109. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/reaper/reaper_runs.py +0 -0
  110. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/reaper/reaper_runs_abort.py +0 -0
  111. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/reaper/reaper_schedule_activate.py +0 -0
  112. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/reaper/reaper_schedule_start.py +0 -0
  113. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/reaper/reaper_schedule_stop.py +0 -0
  114. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/reaper/reaper_schedules.py +0 -0
  115. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/reaper/reaper_session.py +0 -0
  116. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/reaper/reaper_status.py +0 -0
  117. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/repair/__init__.py +0 -0
  118. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/repair/repair.py +0 -0
  119. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/repair/repair_log.py +0 -0
  120. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/repair/repair_run.py +0 -0
  121. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/repair/repair_scan.py +0 -0
  122. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/repair/repair_stop.py +0 -0
  123. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/report.py +0 -0
  124. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/restart.py +0 -0
  125. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/rollout.py +0 -0
  126. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/shell.py +0 -0
  127. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/show/__init__.py +0 -0
  128. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/show/show.py +0 -0
  129. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/show/show_adam.py +0 -0
  130. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/show/show_app_actions.py +0 -0
  131. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/show/show_app_id.py +0 -0
  132. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/show/show_app_queues.py +0 -0
  133. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/show/show_cassandra_status.py +0 -0
  134. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/show/show_cassandra_version.py +0 -0
  135. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/show/show_commands.py +0 -0
  136. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/show/show_login.py +0 -0
  137. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/show/show_params.py +0 -0
  138. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/show/show_processes.py +0 -0
  139. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/show/show_repairs.py +0 -0
  140. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/show/show_storage.py +0 -0
  141. {kaqing-2.0.26 → kaqing-2.0.28}/adam/commands/watch.py +0 -0
  142. {kaqing-2.0.26 → kaqing-2.0.28}/adam/config.py +0 -0
  143. {kaqing-2.0.26 → kaqing-2.0.28}/adam/embedded_apps.py +0 -0
  144. {kaqing-2.0.26 → kaqing-2.0.28}/adam/k8s_utils/__init__.py +0 -0
  145. {kaqing-2.0.26 → kaqing-2.0.28}/adam/k8s_utils/cassandra_nodes.py +0 -0
  146. {kaqing-2.0.26 → kaqing-2.0.28}/adam/k8s_utils/config_maps.py +0 -0
  147. {kaqing-2.0.26 → kaqing-2.0.28}/adam/k8s_utils/custom_resources.py +0 -0
  148. {kaqing-2.0.26 → kaqing-2.0.28}/adam/k8s_utils/deployment.py +0 -0
  149. {kaqing-2.0.26 → kaqing-2.0.28}/adam/k8s_utils/ingresses.py +0 -0
  150. {kaqing-2.0.26 → kaqing-2.0.28}/adam/k8s_utils/jobs.py +0 -0
  151. {kaqing-2.0.26 → kaqing-2.0.28}/adam/k8s_utils/kube_context.py +0 -0
  152. {kaqing-2.0.26 → kaqing-2.0.28}/adam/k8s_utils/secrets.py +0 -0
  153. {kaqing-2.0.26 → kaqing-2.0.28}/adam/k8s_utils/service_accounts.py +0 -0
  154. {kaqing-2.0.26 → kaqing-2.0.28}/adam/k8s_utils/services.py +0 -0
  155. {kaqing-2.0.26 → kaqing-2.0.28}/adam/k8s_utils/volumes.py +0 -0
  156. {kaqing-2.0.26 → kaqing-2.0.28}/adam/log.py +0 -0
  157. {kaqing-2.0.26 → kaqing-2.0.28}/adam/pod_exec_result.py +0 -0
  158. {kaqing-2.0.26 → kaqing-2.0.28}/adam/repl.py +0 -0
  159. {kaqing-2.0.26 → kaqing-2.0.28}/adam/repl_session.py +0 -0
  160. {kaqing-2.0.26 → kaqing-2.0.28}/adam/repl_state.py +0 -0
  161. {kaqing-2.0.26 → kaqing-2.0.28}/adam/sso/__init__.py +0 -0
  162. {kaqing-2.0.26 → kaqing-2.0.28}/adam/sso/authenticator.py +0 -0
  163. {kaqing-2.0.26 → kaqing-2.0.28}/adam/sso/authn_okta.py +0 -0
  164. {kaqing-2.0.26 → kaqing-2.0.28}/adam/sso/cred_cache.py +0 -0
  165. {kaqing-2.0.26 → kaqing-2.0.28}/adam/sso/id_token.py +0 -0
  166. {kaqing-2.0.26 → kaqing-2.0.28}/adam/sso/idp.py +0 -0
  167. {kaqing-2.0.26 → kaqing-2.0.28}/adam/sso/idp_login.py +0 -0
  168. {kaqing-2.0.26 → kaqing-2.0.28}/adam/sso/idp_session.py +0 -0
  169. {kaqing-2.0.26 → kaqing-2.0.28}/adam/sso/sso_config.py +0 -0
  170. {kaqing-2.0.26 → kaqing-2.0.28}/adam/utils.py +0 -0
  171. {kaqing-2.0.26 → kaqing-2.0.28}/kaqing.egg-info/dependency_links.txt +0 -0
  172. {kaqing-2.0.26 → kaqing-2.0.28}/kaqing.egg-info/entry_points.txt +0 -0
  173. {kaqing-2.0.26 → kaqing-2.0.28}/kaqing.egg-info/top_level.txt +0 -0
  174. {kaqing-2.0.26 → kaqing-2.0.28}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: kaqing
3
- Version: 2.0.26
3
+ Version: 2.0.28
4
4
  Summary: UNKNOWN
5
5
  Home-page: UNKNOWN
6
6
  License: UNKNOWN
@@ -0,0 +1,111 @@
1
+ import click
2
+
3
+ from adam.commands.command import Command
4
+ from adam.commands.command_helpers import ClusterOrPodCommandHelper
5
+ from adam.commands.cql_utils import parse_cql_desc_tables, run_cql
6
+ from adam.config import Config
7
+ from adam.pod_exec_result import PodExecResult
8
+ from adam.repl_state import ReplState, RequiredState
9
+ from adam.utils import log, log2
10
+
11
+ class AlterTables(Command):
12
+ COMMAND = 'alter tables with'
13
+
14
+ # the singleton pattern
15
+ def __new__(cls, *args, **kwargs):
16
+ if not hasattr(cls, 'instance'): cls.instance = super(AlterTables, 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 AlterTables.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
+ state, args = self.apply_state(args, state)
34
+ if not self.validate_state(state):
35
+ return state
36
+
37
+ if not args:
38
+ if state.in_repl:
39
+ log2('Please enter gc grace in seconds. e.g. alter gc-grace-seconds 3600')
40
+ else:
41
+ log2('* gc grace second is missing.')
42
+ log2()
43
+ Command.display_help()
44
+
45
+ return 'missing-arg'
46
+
47
+ args, include_reaper = Command.extract_options(args, '--include-reaper')
48
+ arg_str = ' '.join(args)
49
+
50
+ r: list[PodExecResult] = run_cql(state, 'describe tables', show_out=False, on_any=True)
51
+ if not r:
52
+ log2('No pod is available')
53
+ return 'no-pod'
54
+
55
+ excludes = [e.strip(' \r\n') for e in Config().get(
56
+ 'cql.alter-tables.excludes',
57
+ 'system_auth,system_traces,system_distributed,system_views,system,system_schema,system_virtual_schema').split(',')]
58
+ batching = Config().get('cql.alter-tables.batching', True)
59
+ tables = parse_cql_desc_tables(r[0].stdout)
60
+ for k, v in tables.items():
61
+ if k not in excludes or k == 'reaper_db' and include_reaper:
62
+ if batching:
63
+ # alter table <table_name> with GC_GRACE_SECONDS = <timeout>;
64
+ cql = ';\n'.join([f'alter table {k}.{t} with {arg_str}' for t in v])
65
+ try:
66
+ run_cql(state, cql, [], show_out=Config().get('debug.show-out', False), on_any=True)
67
+ except Exception as e:
68
+ log2(e)
69
+ continue
70
+ else:
71
+ for t in v:
72
+ try:
73
+ # alter table <table_name> with GC_GRACE_SECONDS = <timeout>;
74
+ cql = f'alter table {k}.{t} with {arg_str}'
75
+ run_cql(state, cql, [], show_out=Config().get('debug.show-out', False), on_any=True)
76
+ except Exception as e:
77
+ log2(e)
78
+ continue
79
+
80
+ log2(f'{len(v)} tables altered in {k}.')
81
+
82
+ # do not continue to cql route
83
+ return state
84
+
85
+ def completion(self, state: ReplState) -> dict[str, any]:
86
+ if state.sts:
87
+ ps = Config().get('cql.alter-tables.gc-grace-periods', '3600,86400,864000,7776000').split(',')
88
+ return super().completion(state, {
89
+ 'GC_GRACE_SECONDS': {'=': {p.strip(' \r\n'): {'--include-reaper': None} for p in ps}},
90
+ })
91
+
92
+ return {}
93
+
94
+ def help(self, _: ReplState) -> str:
95
+ return f'[{AlterTables.COMMAND}] <param = value> [--include-reaper] \t alter on all tables'
96
+
97
+ class CqlCommandHelper(click.Command):
98
+ def get_help(self, ctx: click.Context):
99
+ log(super().get_help(ctx))
100
+ log()
101
+ log(' e.g. qing cql <cluster or pod> select host_id from system.local')
102
+ log()
103
+ log('Advanced Usages:')
104
+ log(' 1. Use -- to specify what arguments are passed to the cqlsh.')
105
+ log(' 2. Use "" to avoid expansion on shell variables.')
106
+ log(' 3. Use ; to use multiple CQL statements')
107
+ log()
108
+ log(' e.g. qing cql <cluster or pod> -- "consistency quorum; select * from system.local" --request-timeout=3600')
109
+ log()
110
+
111
+ ClusterOrPodCommandHelper.cluter_or_pod_help()
@@ -5,7 +5,7 @@ from adam.k8s_utils.cassandra_nodes import CassandraNodes
5
5
  from adam.k8s_utils.secrets import Secrets
6
6
  from adam.repl_state import ReplState
7
7
 
8
- def run_cql(state: ReplState, cql: str, opts: list = [], show_out = False, use_single_quotes = False):
8
+ def run_cql(state: ReplState, cql: str, opts: list = [], show_out = False, use_single_quotes = False, on_any = False):
9
9
  user, pw = Secrets.get_user_pass(state.sts if state.sts else state.pod, state.namespace, secret_path='cql.secret')
10
10
  if use_single_quotes:
11
11
  command = f"cqlsh -u {user} -p {pw} {' '.join(opts)} -e '{cql}'"
@@ -15,7 +15,7 @@ def run_cql(state: ReplState, cql: str, opts: list = [], show_out = False, use_s
15
15
  if state.pod:
16
16
  return CassandraNodes.exec(state.pod, state.namespace, command, show_out=show_out)
17
17
  else:
18
- return CassandraClusters.exec(state.sts, state.namespace, command, action='cql')
18
+ return CassandraClusters.exec(state.sts, state.namespace, command, show_out=show_out, action='cql', on_any=on_any)
19
19
 
20
20
  def parse_cql_desc_tables(out: str):
21
21
  # Keyspace data_endpoint_auth
@@ -0,0 +1,2 @@
1
+ def config():
2
+ return {'app': {'console-endpoint': 'https://{host}/{env}/{app}/static/console/index.html', 'cr': {'cluster-regex': '(.*?-.*?)-.*', 'group': 'ops.c3.ai', 'v': 'v2', 'plural': 'c3cassandras'}, 'label': 'c3__app_id-0', 'login': {'admin-group': '{host}/C3.ClusterAdmin', 'ingress': '{app_id}-k8singr-appleader-001', 'timeout': 5, 'session-check-url': 'https://{host}/{env}/{app}/api/8/C3/userSessionToken', 'cache-creds': True, 'cache-username': True, 'url': 'https://{host}/{env}/{app}', 'another': "You're logged in to {has}. However, for this app, you need to log in to {need}.", 'token-server-url': 'http://localhost:{port}', 'password-max-length': 128}, 'strip': '0'}, 'bash': {'workers': 32}, 'cassandra': {'service-name': 'all-pods-service'}, 'cql': {'workers': 32, 'samples': 3, 'secret': {'cluster-regex': '(.*?-.*?)-.*', 'name': '{cluster}-superuser', 'password-item': 'password'}, 'alter-tables': {'excludes': 'system_auth,system_traces,system_distributed,system_views,system,system_schema,system_virtual_schema', 'gc-grace-periods': '3600,86400,864000,7776000', 'batching': True}}, 'checks': {'compactions-threshold': 250, 'cpu-busy-threshold': 98.0, 'cpu-threshold': 0.0, 'cassandra-data-path': '/c3/cassandra', 'root-disk-threshold': 50, 'cassandra-disk-threshold': 50, 'snapshot-size-cmd': "ls /c3/cassandra/data/data/*/*/snapshots | grep snapshots | sed 's/:$//g' | xargs -I {} du -sk {} | awk '{print $1}' | awk '{s+=$1} END {print s}'", 'snapshot-size-threshold': '40G', 'table-sizes-cmd': "ls -Al /c3/cassandra/data/data/ | awk '{print $9}' | sed 's/\\^r//g' | xargs -I {} du -sk /c3/cassandra/data/data/{}"}, 'get-host-id': {'workers': 32}, 'idps': {'ad': {'email-pattern': '.*@c3.ai', 'uri': 'https://login.microsoftonline.com/53ad779a-93e7-485c-ba20-ac8290d7252b/oauth2/v2.0/authorize?response_type=id_token&response_mode=form_post&client_id=00ff94a8-6b0a-4715-98e0-95490012d818&scope=openid+email+profile&redirect_uri=https%3A%2F%2Fplat.c3ci.cloud%2Fc3%2Fc3%2Foidc%2Flogin&nonce={nonce}&state=EMPTY', 'jwks-uri': 'https://login.microsoftonline.com/common/discovery/keys', 'contact': 'Please contact ted.tran@c3.ai.', 'whitelist-file': '/kaqing/members'}, 'okta': {'default': True, 'email-pattern': '.*@c3iot.com', 'uri': 'https://c3energy.okta.com/oauth2/v1/authorize?response_type=id_token&response_mode=form_post&client_id={client_id}&scope=openid+email+profile+groups&redirect_uri=https%3A%2F%2F{host}%2Fc3%2Fc3%2Foidc%2Flogin&nonce={nonce}&state=EMPTY', 'jwks-uri': 'https://c3energy.okta.com/oauth2/v1/keys'}}, 'issues': {'workers': 32}, 'logs': {'path': '/c3/cassandra/logs/system.log'}, 'medusa': {'restore-auto-complete': False}, 'nodetool': {'workers': 32, 'samples': 3, 'commands_in_line': 40}, 'pg': {'name-pattern': '^{namespace}.*-k8spg-.*', 'excludes': '.helm., -admin-secret', 'agent': {'name': 'ops-pg-agent', 'just-in-time': False, 'timeout': 86400, 'image': 'seanahnsf/kaqing'}, 'default-db': 'postgres', 'default-schema': 'postgres', 'secret': {'endpoint-key': 'postgres-db-endpoint', 'port-key': 'postgres-db-port', 'username-key': 'postgres-admin-username', 'password-key': 'postgres-admin-password'}}, 'pod': {'name': 'ops', 'image': 'seanahnsf/kaqing-cloud', 'sa': {'name': 'ops', 'proto': 'c3', 'additional-cluster-roles': 'c3aiops-k8ssandra-operator'}, 'label-selector': 'run=ops'}, 'preview': {'rows': 10}, 'processes': {'columns': 'pod,cpu,mem', 'header': 'POD_NAME,CPU,MEM/LIMIT'}, 'reaper': {'service-name': 'reaper-service', 'port-forward': {'timeout': 86400, 'local-port': 9001}, 'abort-runs-batch': 10, 'show-runs-batch': 100, 'pod': {'cluster-regex': '(.*?-.*?-.*?-.*?)-.*', 'label-selector': 'k8ssandra.io/reaper={cluster}-reaper'}, 'secret': {'cluster-regex': '(.*?-.*?)-.*', 'name': '{cluster}-reaper-ui', 'password-item': 'password'}}, 'repair': {'log-path': '/home/cassrepair/logs/', 'image': 'ci-registry.c3iot.io/cloudops/cassrepair:2.0.14', 'secret': 'ciregistryc3iotio', 'env': {'interval': 24, 'timeout': 60, 'pr': False, 'runs': 1}}, 'repl': {'start-drive': 'a', 'auto-enter-app': 'c3/c3', 'auto-enter-only-cluster': True}, 'status': {'columns': 'status,address,load,tokens,owns,host_id,gossip,compactions', 'header': '--,Address,Load,Tokens,Owns,Host ID,GOSSIP,COMPACTIONS'}, 'storage': {'columns': 'pod,volume_root,volume_cassandra,snapshots,data,compactions', 'header': 'POD_NAME,VOLUME /,VOLUME CASS,SNAPSHOTS,DATA,COMPACTIONS'}, 'watch': {'auto': 'rollout', 'timeout': 3600, 'interval': 10}, 'debug': {'timings': False, 'exit-on-error': False, 'show-parallelism': False, 'show-out': False}}
@@ -14,7 +14,7 @@ T = TypeVar('T')
14
14
 
15
15
  # utility collection on cassandra clusters; methods are all static
16
16
  class CassandraClusters:
17
- def exec(statefulset: str, namespace: str, command: str, action: str = 'action', max_workers=0, show_out=True) -> list[PodExecResult]:
17
+ def exec(statefulset: str, namespace: str, command: str, action: str = 'action', max_workers=0, show_out=True, on_any = False) -> list[PodExecResult]:
18
18
  def body(executor: ThreadPoolExecutor, pod: str, namespace: str, show_out: bool):
19
19
  if executor:
20
20
  return executor.submit(CassandraNodes.exec, pod, namespace, command, False, False,)
@@ -31,18 +31,4 @@ class CassandraClusters:
31
31
 
32
32
  return result
33
33
 
34
- return StatefulSets.on_cluster(statefulset, namespace, body, post=post, action=action, max_workers=max_workers, show_out=show_out)
35
-
36
- def on_cluster(statefulset: str,
37
- namespace: str,
38
- body: Callable[[ThreadPoolExecutor, str, str, bool], T],
39
- post: Callable[[T], T] = None,
40
- action: str = 'action', max_workers=0, show_out=True) -> list[T]:
41
- pods = StatefulSets.pod_names(statefulset, namespace)
42
-
43
- return Pods.on_pods(pods, namespace, body, post=post, action=action, max_workers=max_workers, show_out=show_out)
44
-
45
- def pod_names_by_host_id(ss: str, ns: str):
46
- pods = StatefulSets.pods(ss, ns)
47
-
48
- return {CassandraNodes.get_host_id(pod.metadata.name, ns): pod.metadata.name for pod in pods}
34
+ return StatefulSets.on_cluster(statefulset, namespace, body, post=post, action=action, max_workers=max_workers, show_out=show_out, on_any=on_any)
@@ -42,12 +42,12 @@ class Pods:
42
42
  namespace: str,
43
43
  body: Callable[[ThreadPoolExecutor, str, str, bool], T],
44
44
  post: Callable[[T], T] = None,
45
- action: str = 'action', max_workers=0, show_out=True) -> list[T]:
45
+ action: str = 'action', max_workers=0, show_out=True, on_any = False) -> list[T]:
46
46
  show_out = KubeContext.show_out(show_out)
47
47
 
48
48
  if not max_workers:
49
49
  max_workers = Config().action_workers(action, 0)
50
- if max_workers > 0:
50
+ if not on_any and max_workers > 0:
51
51
  # if parallel, node sampling is suppressed
52
52
  if KubeContext.show_parallelism():
53
53
  log2(f'Executing on all nodes from statefulset in parallel...')
@@ -70,7 +70,7 @@ class Pods:
70
70
  else:
71
71
  results: list[T] = []
72
72
 
73
- samples = Config().action_node_samples(action, sys.maxsize)
73
+ samples = 1 if on_any else Config().action_node_samples(action, sys.maxsize)
74
74
  l = min(len(pods), samples)
75
75
  adj = 'all'
76
76
  if l < len(pods):
@@ -233,9 +233,7 @@ class Pods:
233
233
  ))
234
234
  )
235
235
 
236
- def wait_for_running(namespace: str, pod_name: str, msg: str=None, label_selector: str = None):
237
- msged = False
238
-
236
+ def wait_for_running(namespace: str, pod_name: str, msg: str = None, label_selector: str = None):
239
237
  cnt = 2
240
238
  while (cnt < 302 and Pods.get_with_selector(namespace, label_selector) if label_selector else Pods.get(namespace, pod_name)).status.phase != 'Running':
241
239
  if not msg:
@@ -255,7 +253,7 @@ class Pods:
255
253
  time.sleep(1)
256
254
 
257
255
  log2(f'\r{msg}..'.ljust(max_len), nl=False)
258
- if cnt < 300:
256
+ if cnt < 302:
259
257
  log2(' OK')
260
258
  else:
261
259
  log2(' Timed Out')
@@ -61,10 +61,10 @@ class StatefulSets:
61
61
  namespace: str,
62
62
  body: Callable[[ThreadPoolExecutor, str, str, bool], T],
63
63
  post: Callable[[T], T] = None,
64
- action: str = 'action', max_workers=0, show_out=True) -> list[T]:
64
+ action: str = 'action', max_workers=0, show_out=True, on_any = False) -> list[T]:
65
65
  pods = StatefulSets.pod_names(statefulset, namespace)
66
66
 
67
- return Pods.on_pods(pods, namespace, body, post=post, action=action, max_workers=max_workers, show_out=show_out)
67
+ return Pods.on_pods(pods, namespace, body, post=post, action=action, max_workers=max_workers, show_out=show_out, on_any=on_any)
68
68
 
69
69
  @functools.lru_cache()
70
70
  def pod_names(ss: str, ns: str):
@@ -1,3 +1,4 @@
1
+ from adam.commands.alter_tables import AlterTables
1
2
  from adam.commands.app import App
2
3
  from adam.commands.app_ping import AppPing
3
4
  from adam.commands.deploy.code_start import CodeStart
@@ -77,7 +78,8 @@ class ReplCommands:
77
78
  return [ShowCassandraStatus(), ShowCassandraVersion(), ShowRepairs(), ShowStorage(), ShowProcesses(), Check(), Issues(), NodeTool(), Report()]
78
79
 
79
80
  def cassandra_ops() -> list[Command]:
80
- return Medusa.cmd_list() + [Restart(), RollOut(), Watch()] + Reaper.cmd_list() + Repair.cmd_list()
81
+ # return Medusa.cmd_list() + [Restart(), RollOut(), Watch()] + Reaper.cmd_list() + Repair.cmd_list()
82
+ return [AlterTables()] + Medusa.cmd_list() + [Restart(), RollOut(), Watch()] + Reaper.cmd_list() + Repair.cmd_list()
81
83
 
82
84
  def tools() -> list[Command]:
83
85
  return [Cqlsh(), Postgres(), Bash(), Shell(), CodeStart(), CodeStop(), DeployFrontend(), UndeployFrontend(), DeployPod(), UndeployPod(), DeployPgAgent(), UndeployPgAgent()]
@@ -137,7 +137,7 @@ class AdAuthenticator(Authenticator):
137
137
  return []
138
138
 
139
139
  def parse_id_token(self, id_token: str) -> IdToken:
140
- jwks_url = Config().get('idps.ad.jwks-uri', 'https://login.microsoftonline.com/common/discovery/keys')
140
+ jwks_url = Config().get('idps.ad.jwks-uri', '')
141
141
  try:
142
142
  jwks_client = jwt.PyJWKClient(jwks_url, cache_jwk_set=True, lifespan=360)
143
143
  signing_key = jwks_client.get_signing_key_from_jwt(id_token)
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+
4
+ __version__ = "2.0.28" #: 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.26
3
+ Version: 2.0.28
4
4
  Summary: UNKNOWN
5
5
  Home-page: UNKNOWN
6
6
  License: UNKNOWN
@@ -49,6 +49,7 @@ adam/columns/pod_name.py
49
49
  adam/columns/volume_cassandra.py
50
50
  adam/columns/volume_root.py
51
51
  adam/commands/__init__.py
52
+ adam/commands/alter_tables.py
52
53
  adam/commands/app.py
53
54
  adam/commands/app_ping.py
54
55
  adam/commands/bash.py
@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
2
2
 
3
3
  setup(
4
4
  name='kaqing',
5
- version='2.0.26',
5
+ version='2.0.28',
6
6
  packages=find_packages(),
7
7
  entry_points={
8
8
  'console_scripts': [
@@ -1,2 +0,0 @@
1
- def config():
2
- return {'app': {'console-endpoint': 'https://{host}/{env}/{app}/static/console/index.html', 'cr': {'cluster-regex': '(.*?-.*?)-.*', 'group': 'ops.c3.ai', 'v': 'v2', 'plural': 'c3cassandras'}, 'label': 'c3__app_id-0', 'login': {'admin-group': '{host}/C3.ClusterAdmin', 'ingress': '{app_id}-k8singr-appleader-001', 'timeout': 5, 'session-check-url': 'https://{host}/{env}/{app}/api/8/C3/userSessionToken', 'cache-creds': True, 'cache-username': True, 'url': 'https://{host}/{env}/{app}', 'another': "You're logged in to {has}. However, for this app, you need to log in to {need}.", 'token-server-url': 'http://localhost:{port}', 'password-max-length': 128}, 'strip': '0'}, 'bash': {'workers': 32}, 'cassandra': {'service-name': 'all-pods-service'}, 'cql': {'workers': 32, 'samples': 3, 'secret': {'cluster-regex': '(.*?-.*?)-.*', 'name': '{cluster}-superuser', 'password-item': 'password'}}, 'checks': {'compactions-threshold': 250, 'cpu-busy-threshold': 98.0, 'cpu-threshold': 0.0, 'cassandra-data-path': '/c3/cassandra', 'root-disk-threshold': 50, 'cassandra-disk-threshold': 50, 'snapshot-size-cmd': "ls /c3/cassandra/data/data/*/*/snapshots | grep snapshots | sed 's/:$//g' | xargs -I {} du -sk {} | awk '{print $1}' | awk '{s+=$1} END {print s}'", 'snapshot-size-threshold': '40G', 'table-sizes-cmd': "ls -Al /c3/cassandra/data/data/ | awk '{print $9}' | sed 's/\\^r//g' | xargs -I {} du -sk /c3/cassandra/data/data/{}"}, 'get-host-id': {'workers': 32}, 'idps': {'ad': {'email-pattern': '.*@c3.ai', 'uri': 'https://login.microsoftonline.com/53ad779a-93e7-485c-ba20-ac8290d7252b/oauth2/v2.0/authorize?response_type=id_token&response_mode=form_post&client_id=00ff94a8-6b0a-4715-98e0-95490012d818&scope=openid+email+profile&redirect_uri=https%3A%2F%2Fplat.c3ci.cloud%2Fc3%2Fc3%2Foidc%2Flogin&nonce={nonce}&state=EMPTY', 'jwks-uri': 'https://login.microsoftonline.com/common/discovery/keys', 'contact': 'Please contact ted.tran@c3.ai.', 'whitelist-file': '/kaqing/members'}, 'okta': {'default': True, 'email-pattern': '.*@c3iot.com', 'uri': 'https://c3energy.okta.com/oauth2/v1/authorize?response_type=id_token&response_mode=form_post&client_id={client_id}&scope=openid+email+profile+groups&redirect_uri=https%3A%2F%2F{host}%2Fc3%2Fc3%2Foidc%2Flogin&nonce={nonce}&state=EMPTY', 'jwks-uri': 'https://c3energy.okta.com/oauth2/v1/keys'}}, 'issues': {'workers': 32}, 'logs': {'path': '/c3/cassandra/logs/system.log'}, 'medusa': {'restore-auto-complete': False}, 'nodetool': {'workers': 32, 'samples': 3, 'commands_in_line': 40}, 'pg': {'name-pattern': '^{namespace}.*-k8spg-.*', 'excludes': '.helm., -admin-secret', 'agent': {'name': 'ops-pg-agent', 'just-in-time': False, 'timeout': 86400, 'image': 'seanahnsf/kaqing'}, 'default-db': 'postgres', 'default-schema': 'postgres', 'secret': {'endpoint-key': 'postgres-db-endpoint', 'port-key': 'postgres-db-port', 'username-key': 'postgres-admin-username', 'password-key': 'postgres-admin-password'}}, 'pod': {'name': 'ops', 'image': 'seanahnsf/kaqing-cloud', 'sa': {'name': 'ops', 'proto': 'c3', 'additional-cluster-roles': 'c3aiops-k8ssandra-operator'}, 'label-selector': 'run=ops'}, 'preview': {'rows': 10}, 'processes': {'columns': 'pod,cpu,mem', 'header': 'POD_NAME,CPU,MEM/LIMIT'}, 'reaper': {'service-name': 'reaper-service', 'port-forward': {'timeout': 86400, 'local-port': 9001}, 'abort-runs-batch': 10, 'show-runs-batch': 100, 'pod': {'cluster-regex': '(.*?-.*?-.*?-.*?)-.*', 'label-selector': 'k8ssandra.io/reaper={cluster}-reaper'}, 'secret': {'cluster-regex': '(.*?-.*?)-.*', 'name': '{cluster}-reaper-ui', 'password-item': 'password'}}, 'repair': {'log-path': '/home/cassrepair/logs/', 'image': 'ci-registry.c3iot.io/cloudops/cassrepair:2.0.14', 'secret': 'ciregistryc3iotio', 'env': {'interval': 24, 'timeout': 60, 'pr': False, 'runs': 1}}, 'repl': {'start-drive': 'a', 'auto-enter-app': 'c3/c3', 'auto-enter-only-cluster': True}, 'status': {'columns': 'status,address,load,tokens,owns,host_id,gossip,compactions', 'header': '--,Address,Load,Tokens,Owns,Host ID,GOSSIP,COMPACTIONS'}, 'storage': {'columns': 'pod,volume_root,volume_cassandra,snapshots,data,compactions', 'header': 'POD_NAME,VOLUME /,VOLUME CASS,SNAPSHOTS,DATA,COMPACTIONS'}, 'watch': {'auto': 'rollout', 'timeout': 3600, 'interval': 10}, 'debug': {'timings': False, 'exit-on-error': False, 'show-parallelism': False, 'show-out': False}}
@@ -1,5 +0,0 @@
1
- #!/usr/bin/env python
2
- # -*- coding: utf-8 -*-
3
-
4
- __version__ = "2.0.26" #: 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