kaqing 2.0.25__tar.gz → 2.0.27__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.25 → kaqing-2.0.27}/PKG-INFO +1 -1
  2. kaqing-2.0.27/adam/commands/alter_tables.py +111 -0
  3. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/cql_utils.py +2 -2
  4. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/deploy/deploy.py +2 -2
  5. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/deploy/deploy_frontend.py +1 -1
  6. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/deploy/deploy_pg_agent.py +1 -1
  7. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/deploy/deploy_pod.py +1 -1
  8. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/deploy/undeploy.py +2 -2
  9. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/deploy/undeploy_frontend.py +1 -1
  10. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/deploy/undeploy_pg_agent.py +1 -1
  11. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/deploy/undeploy_pod.py +1 -1
  12. kaqing-2.0.27/adam/embedded_params.py +2 -0
  13. {kaqing-2.0.25 → kaqing-2.0.27}/adam/k8s_utils/cassandra_clusters.py +2 -16
  14. {kaqing-2.0.25 → kaqing-2.0.27}/adam/k8s_utils/pods.py +20 -20
  15. {kaqing-2.0.25 → kaqing-2.0.27}/adam/k8s_utils/statefulsets.py +2 -2
  16. {kaqing-2.0.25 → kaqing-2.0.27}/adam/repl_commands.py +3 -1
  17. {kaqing-2.0.25 → kaqing-2.0.27}/adam/sso/authn_ad.py +1 -1
  18. kaqing-2.0.27/adam/version.py +5 -0
  19. {kaqing-2.0.25 → kaqing-2.0.27}/kaqing.egg-info/PKG-INFO +1 -1
  20. {kaqing-2.0.25 → kaqing-2.0.27}/kaqing.egg-info/SOURCES.txt +1 -0
  21. {kaqing-2.0.25 → kaqing-2.0.27}/setup.py +1 -1
  22. kaqing-2.0.25/adam/embedded_params.py +0 -2
  23. kaqing-2.0.25/adam/version.py +0 -5
  24. {kaqing-2.0.25 → kaqing-2.0.27}/README +0 -0
  25. {kaqing-2.0.25 → kaqing-2.0.27}/adam/__init__.py +0 -0
  26. {kaqing-2.0.25 → kaqing-2.0.27}/adam/app_session.py +0 -0
  27. {kaqing-2.0.25 → kaqing-2.0.27}/adam/apps.py +0 -0
  28. {kaqing-2.0.25 → kaqing-2.0.27}/adam/batch.py +0 -0
  29. {kaqing-2.0.25 → kaqing-2.0.27}/adam/checks/__init__.py +0 -0
  30. {kaqing-2.0.25 → kaqing-2.0.27}/adam/checks/check.py +0 -0
  31. {kaqing-2.0.25 → kaqing-2.0.27}/adam/checks/check_context.py +0 -0
  32. {kaqing-2.0.25 → kaqing-2.0.27}/adam/checks/check_result.py +0 -0
  33. {kaqing-2.0.25 → kaqing-2.0.27}/adam/checks/check_utils.py +0 -0
  34. {kaqing-2.0.25 → kaqing-2.0.27}/adam/checks/compactionstats.py +0 -0
  35. {kaqing-2.0.25 → kaqing-2.0.27}/adam/checks/cpu.py +0 -0
  36. {kaqing-2.0.25 → kaqing-2.0.27}/adam/checks/disk.py +0 -0
  37. {kaqing-2.0.25 → kaqing-2.0.27}/adam/checks/gossip.py +0 -0
  38. {kaqing-2.0.25 → kaqing-2.0.27}/adam/checks/issue.py +0 -0
  39. {kaqing-2.0.25 → kaqing-2.0.27}/adam/checks/memory.py +0 -0
  40. {kaqing-2.0.25 → kaqing-2.0.27}/adam/checks/status.py +0 -0
  41. {kaqing-2.0.25 → kaqing-2.0.27}/adam/cli.py +0 -0
  42. {kaqing-2.0.25 → kaqing-2.0.27}/adam/cli_group.py +0 -0
  43. {kaqing-2.0.25 → kaqing-2.0.27}/adam/columns/__init__.py +0 -0
  44. {kaqing-2.0.25 → kaqing-2.0.27}/adam/columns/column.py +0 -0
  45. {kaqing-2.0.25 → kaqing-2.0.27}/adam/columns/columns.py +0 -0
  46. {kaqing-2.0.25 → kaqing-2.0.27}/adam/columns/compactions.py +0 -0
  47. {kaqing-2.0.25 → kaqing-2.0.27}/adam/columns/cpu.py +0 -0
  48. {kaqing-2.0.25 → kaqing-2.0.27}/adam/columns/dir_data.py +0 -0
  49. {kaqing-2.0.25 → kaqing-2.0.27}/adam/columns/dir_snapshots.py +0 -0
  50. {kaqing-2.0.25 → kaqing-2.0.27}/adam/columns/gossip.py +0 -0
  51. {kaqing-2.0.25 → kaqing-2.0.27}/adam/columns/host_id.py +0 -0
  52. {kaqing-2.0.25 → kaqing-2.0.27}/adam/columns/memory.py +0 -0
  53. {kaqing-2.0.25 → kaqing-2.0.27}/adam/columns/node_address.py +0 -0
  54. {kaqing-2.0.25 → kaqing-2.0.27}/adam/columns/node_load.py +0 -0
  55. {kaqing-2.0.25 → kaqing-2.0.27}/adam/columns/node_owns.py +0 -0
  56. {kaqing-2.0.25 → kaqing-2.0.27}/adam/columns/node_status.py +0 -0
  57. {kaqing-2.0.25 → kaqing-2.0.27}/adam/columns/node_tokens.py +0 -0
  58. {kaqing-2.0.25 → kaqing-2.0.27}/adam/columns/node_utils.py +0 -0
  59. {kaqing-2.0.25 → kaqing-2.0.27}/adam/columns/pod_name.py +0 -0
  60. {kaqing-2.0.25 → kaqing-2.0.27}/adam/columns/volume_cassandra.py +0 -0
  61. {kaqing-2.0.25 → kaqing-2.0.27}/adam/columns/volume_root.py +0 -0
  62. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/__init__.py +0 -0
  63. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/app.py +0 -0
  64. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/app_ping.py +0 -0
  65. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/bash.py +0 -0
  66. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/cd.py +0 -0
  67. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/check.py +0 -0
  68. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/cli_commands.py +0 -0
  69. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/command.py +0 -0
  70. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/command_helpers.py +0 -0
  71. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/commands_utils.py +0 -0
  72. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/cp.py +0 -0
  73. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/cqlsh.py +0 -0
  74. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/deploy/__init__.py +0 -0
  75. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/deploy/code_start.py +0 -0
  76. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/deploy/code_stop.py +0 -0
  77. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/deploy/code_utils.py +0 -0
  78. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/deploy/deploy_utils.py +0 -0
  79. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/devices.py +0 -0
  80. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/exit.py +0 -0
  81. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/help.py +0 -0
  82. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/issues.py +0 -0
  83. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/login.py +0 -0
  84. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/logs.py +0 -0
  85. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/ls.py +0 -0
  86. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/medusa/__init__.py +0 -0
  87. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/medusa/medusa.py +0 -0
  88. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/medusa/medusa_backup.py +0 -0
  89. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/medusa/medusa_restore.py +0 -0
  90. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/medusa/medusa_show_backupjobs.py +0 -0
  91. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/medusa/medusa_show_restorejobs.py +0 -0
  92. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/nodetool.py +0 -0
  93. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/nodetool_commands.py +0 -0
  94. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/param_get.py +0 -0
  95. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/param_set.py +0 -0
  96. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/postgres/__init__.py +0 -0
  97. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/postgres/postgres.py +0 -0
  98. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/postgres/postgres_ls.py +0 -0
  99. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/postgres/postgres_preview.py +0 -0
  100. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/postgres/postgres_session.py +0 -0
  101. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/preview_table.py +0 -0
  102. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/pwd.py +0 -0
  103. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/reaper/__init__.py +0 -0
  104. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/reaper/reaper.py +0 -0
  105. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/reaper/reaper_forward.py +0 -0
  106. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/reaper/reaper_forward_stop.py +0 -0
  107. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/reaper/reaper_restart.py +0 -0
  108. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/reaper/reaper_run_abort.py +0 -0
  109. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/reaper/reaper_runs.py +0 -0
  110. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/reaper/reaper_runs_abort.py +0 -0
  111. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/reaper/reaper_schedule_activate.py +0 -0
  112. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/reaper/reaper_schedule_start.py +0 -0
  113. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/reaper/reaper_schedule_stop.py +0 -0
  114. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/reaper/reaper_schedules.py +0 -0
  115. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/reaper/reaper_session.py +0 -0
  116. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/reaper/reaper_status.py +0 -0
  117. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/repair/__init__.py +0 -0
  118. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/repair/repair.py +0 -0
  119. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/repair/repair_log.py +0 -0
  120. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/repair/repair_run.py +0 -0
  121. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/repair/repair_scan.py +0 -0
  122. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/repair/repair_stop.py +0 -0
  123. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/report.py +0 -0
  124. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/restart.py +0 -0
  125. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/rollout.py +0 -0
  126. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/shell.py +0 -0
  127. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/show/__init__.py +0 -0
  128. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/show/show.py +0 -0
  129. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/show/show_adam.py +0 -0
  130. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/show/show_app_actions.py +0 -0
  131. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/show/show_app_id.py +0 -0
  132. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/show/show_app_queues.py +0 -0
  133. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/show/show_cassandra_status.py +0 -0
  134. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/show/show_cassandra_version.py +0 -0
  135. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/show/show_commands.py +0 -0
  136. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/show/show_login.py +0 -0
  137. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/show/show_params.py +0 -0
  138. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/show/show_processes.py +0 -0
  139. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/show/show_repairs.py +0 -0
  140. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/show/show_storage.py +0 -0
  141. {kaqing-2.0.25 → kaqing-2.0.27}/adam/commands/watch.py +0 -0
  142. {kaqing-2.0.25 → kaqing-2.0.27}/adam/config.py +0 -0
  143. {kaqing-2.0.25 → kaqing-2.0.27}/adam/embedded_apps.py +0 -0
  144. {kaqing-2.0.25 → kaqing-2.0.27}/adam/k8s_utils/__init__.py +0 -0
  145. {kaqing-2.0.25 → kaqing-2.0.27}/adam/k8s_utils/cassandra_nodes.py +0 -0
  146. {kaqing-2.0.25 → kaqing-2.0.27}/adam/k8s_utils/config_maps.py +0 -0
  147. {kaqing-2.0.25 → kaqing-2.0.27}/adam/k8s_utils/custom_resources.py +0 -0
  148. {kaqing-2.0.25 → kaqing-2.0.27}/adam/k8s_utils/deployment.py +0 -0
  149. {kaqing-2.0.25 → kaqing-2.0.27}/adam/k8s_utils/ingresses.py +0 -0
  150. {kaqing-2.0.25 → kaqing-2.0.27}/adam/k8s_utils/jobs.py +0 -0
  151. {kaqing-2.0.25 → kaqing-2.0.27}/adam/k8s_utils/kube_context.py +0 -0
  152. {kaqing-2.0.25 → kaqing-2.0.27}/adam/k8s_utils/secrets.py +0 -0
  153. {kaqing-2.0.25 → kaqing-2.0.27}/adam/k8s_utils/service_accounts.py +0 -0
  154. {kaqing-2.0.25 → kaqing-2.0.27}/adam/k8s_utils/services.py +0 -0
  155. {kaqing-2.0.25 → kaqing-2.0.27}/adam/k8s_utils/volumes.py +0 -0
  156. {kaqing-2.0.25 → kaqing-2.0.27}/adam/log.py +0 -0
  157. {kaqing-2.0.25 → kaqing-2.0.27}/adam/pod_exec_result.py +0 -0
  158. {kaqing-2.0.25 → kaqing-2.0.27}/adam/repl.py +0 -0
  159. {kaqing-2.0.25 → kaqing-2.0.27}/adam/repl_session.py +0 -0
  160. {kaqing-2.0.25 → kaqing-2.0.27}/adam/repl_state.py +0 -0
  161. {kaqing-2.0.25 → kaqing-2.0.27}/adam/sso/__init__.py +0 -0
  162. {kaqing-2.0.25 → kaqing-2.0.27}/adam/sso/authenticator.py +0 -0
  163. {kaqing-2.0.25 → kaqing-2.0.27}/adam/sso/authn_okta.py +0 -0
  164. {kaqing-2.0.25 → kaqing-2.0.27}/adam/sso/cred_cache.py +0 -0
  165. {kaqing-2.0.25 → kaqing-2.0.27}/adam/sso/id_token.py +0 -0
  166. {kaqing-2.0.25 → kaqing-2.0.27}/adam/sso/idp.py +0 -0
  167. {kaqing-2.0.25 → kaqing-2.0.27}/adam/sso/idp_login.py +0 -0
  168. {kaqing-2.0.25 → kaqing-2.0.27}/adam/sso/idp_session.py +0 -0
  169. {kaqing-2.0.25 → kaqing-2.0.27}/adam/sso/sso_config.py +0 -0
  170. {kaqing-2.0.25 → kaqing-2.0.27}/adam/utils.py +0 -0
  171. {kaqing-2.0.25 → kaqing-2.0.27}/kaqing.egg-info/dependency_links.txt +0 -0
  172. {kaqing-2.0.25 → kaqing-2.0.27}/kaqing.egg-info/entry_points.txt +0 -0
  173. {kaqing-2.0.25 → kaqing-2.0.27}/kaqing.egg-info/top_level.txt +0 -0
  174. {kaqing-2.0.25 → kaqing-2.0.27}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: kaqing
3
- Version: 2.0.25
3
+ Version: 2.0.27
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,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
@@ -30,7 +30,7 @@ class Deploy(Command):
30
30
  state, args = self.apply_state(args, state)
31
31
 
32
32
  if state.in_repl:
33
- log(lines_to_tabular([c.help(ReplState()) for c in Deploy.cmd_list()], separator=':'))
33
+ log(lines_to_tabular([c.help(ReplState()) for c in Deploy.cmd_list()], separator='\t'))
34
34
 
35
35
  return 'command-missing'
36
36
  else:
@@ -58,4 +58,4 @@ class DeployCommandHelper(click.Command):
58
58
  log()
59
59
  log('Sub-Commands:')
60
60
 
61
- log(lines_to_tabular([c.help(ReplState()).replace(f'{Deploy.COMMAND} ', ' ', 1) for c in Deploy.cmd_list()], separator=':'))
61
+ log(lines_to_tabular([c.help(ReplState()).replace(f'{Deploy.COMMAND} ', ' ', 1) for c in Deploy.cmd_list()], separator='\t'))
@@ -49,4 +49,4 @@ class DeployFrontend(Command):
49
49
  return super().completion(state)
50
50
 
51
51
  def help(self, _: ReplState):
52
- return f'{DeployFrontend.COMMAND}\t deploy frontend'
52
+ return f'{DeployFrontend.COMMAND}\t deploy Web frontend'
@@ -35,4 +35,4 @@ class DeployPgAgent(Command):
35
35
  return super().completion(state)
36
36
 
37
37
  def help(self, _: ReplState):
38
- return f'{DeployPgAgent.COMMAND}\t deploy postgres agent'
38
+ return f'{DeployPgAgent.COMMAND}\t deploy Postgres agent'
@@ -106,4 +106,4 @@ class DeployPod(Command):
106
106
  return super().completion(state)
107
107
 
108
108
  def help(self, _: ReplState):
109
- return f'{DeployPod.COMMAND}\t deploy pod'
109
+ return f'{DeployPod.COMMAND}\t deploy Ops pod'
@@ -30,7 +30,7 @@ class Undeploy(Command):
30
30
  state, args = self.apply_state(args, state)
31
31
 
32
32
  if state.in_repl:
33
- log(lines_to_tabular([c.help(ReplState()) for c in Undeploy.cmd_list()], separator=':'))
33
+ log(lines_to_tabular([c.help(ReplState()) for c in Undeploy.cmd_list()], separator='\t'))
34
34
 
35
35
  return 'command-missing'
36
36
  else:
@@ -58,4 +58,4 @@ class UndeployCommandHelper(click.Command):
58
58
  log()
59
59
  log('Sub-Commands:')
60
60
 
61
- log(lines_to_tabular([c.help(ReplState()).replace(f'{Undeploy.COMMAND} ', ' ', 1) for c in Undeploy.cmd_list()], separator=':'))
61
+ log(lines_to_tabular([c.help(ReplState()).replace(f'{Undeploy.COMMAND} ', ' ', 1) for c in Undeploy.cmd_list()], separator='\t'))
@@ -38,4 +38,4 @@ class UndeployFrontend(Command):
38
38
  return super().completion(state)
39
39
 
40
40
  def help(self, _: ReplState):
41
- return f'{UndeployFrontend.COMMAND}\t undeploy frontend'
41
+ return f'{UndeployFrontend.COMMAND}\t undeploy Web frontend'
@@ -38,4 +38,4 @@ class UndeployPgAgent(Command):
38
38
  return super().completion(state)
39
39
 
40
40
  def help(self, _: ReplState):
41
- return f'{UndeployPgAgent.COMMAND}\t undeploy postgres agent'
41
+ return f'{UndeployPgAgent.COMMAND}\t undeploy Postgres agent'
@@ -46,4 +46,4 @@ class UndeployPod(Command):
46
46
  return super().completion(state)
47
47
 
48
48
  def help(self, _: ReplState):
49
- return f'{UndeployPod.COMMAND}\t undeploy pod'
49
+ return f'{UndeployPod.COMMAND}\t undeploy Ops pod'
@@ -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,reaper_db,system_distributed,system_views,system,system_schema,system_virtual_schema', 'gc-grace-periods': '3600,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,30 +233,30 @@ 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
236
+ def wait_for_running(namespace: str, pod_name: str, msg: str = None, label_selector: str = None):
237
+ cnt = 2
238
+ while (cnt < 302 and Pods.get_with_selector(namespace, label_selector) if label_selector else Pods.get(namespace, pod_name)).status.phase != 'Running':
239
+ if not msg:
240
+ msg = f'Waiting for the {pod_name} pod to start up.'
238
241
 
239
- cnt = 1
240
- while (Pods.get_with_selector(namespace, label_selector) if label_selector else Pods.get(namespace, pod_name)).status.phase != 'Running':
241
- if not msged:
242
- if not msg:
243
- msg = f'Waiting for the {pod_name} pod to start up.'
244
- log2(msg, nl=False)
245
- msged = True
246
- time.sleep(1)
247
-
248
- max_msg = len(msg) + 3
242
+ max_len = len(msg) + 3
249
243
  mod = cnt % 3
244
+ padded = ''
250
245
  if mod == 0:
251
- log2(f'\r{msg}'.ljust(max_msg), nl=False)
246
+ padded = f'\r{msg}'.ljust(max_len)
252
247
  elif mod == 1:
253
- log2(f'\r{msg}.'.ljust(max_msg), nl=False)
248
+ padded = f'\r{msg}.'.ljust(max_len)
254
249
  else:
255
- log2(f'\r{msg}..'.ljust(max_msg), nl=False)
250
+ padded = f'\r{msg}..'.ljust(max_len)
251
+ log2(padded, nl=False)
256
252
  cnt += 1
253
+ time.sleep(1)
257
254
 
258
- log2(f'\r{msg}..'.ljust(max_msg), nl=False)
259
- log2(' OK')
255
+ log2(f'\r{msg}..'.ljust(max_len), nl=False)
256
+ if cnt < 302:
257
+ log2(' OK')
258
+ else:
259
+ log2(' Timed Out')
260
260
 
261
261
  def completed(namespace: str, pod_name: str):
262
262
  return Pods.get(namespace, pod_name).status.phase in ['Succeeded', 'Failed']
@@ -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.27" #: 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.25
3
+ Version: 2.0.27
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.25',
5
+ version='2.0.27',
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.25" #: 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