kaqing 1.77.0__py3-none-any.whl → 2.0.171__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- adam/__init__.py +1 -0
- adam/app_session.py +182 -0
- {walker → adam}/apps.py +8 -24
- {walker → adam}/batch.py +54 -97
- {walker → adam}/checks/check.py +3 -3
- {walker → adam}/checks/check_result.py +1 -1
- adam/checks/check_utils.py +65 -0
- {walker → adam}/checks/compactionstats.py +6 -6
- {walker → adam}/checks/cpu.py +14 -8
- adam/checks/cpu_metrics.py +52 -0
- {walker → adam}/checks/disk.py +6 -6
- {walker → adam}/checks/gossip.py +5 -5
- {walker → adam}/checks/memory.py +7 -7
- {walker → adam}/checks/status.py +5 -5
- {walker → adam}/cli.py +3 -3
- {walker → adam}/columns/column.py +1 -1
- adam/columns/columns.py +45 -0
- {walker → adam}/columns/compactions.py +5 -5
- {walker → adam}/columns/cpu.py +6 -4
- adam/columns/cpu_metrics.py +22 -0
- {walker → adam}/columns/dir_data.py +3 -3
- {walker → adam}/columns/dir_snapshots.py +3 -3
- {walker → adam}/columns/gossip.py +5 -5
- {walker → adam}/columns/host_id.py +3 -3
- {walker → adam}/columns/memory.py +3 -3
- {walker → adam}/columns/node_address.py +3 -3
- {walker → adam}/columns/node_load.py +3 -3
- {walker → adam}/columns/node_owns.py +3 -3
- {walker → adam}/columns/node_status.py +3 -3
- {walker → adam}/columns/node_tokens.py +3 -3
- {walker → adam}/columns/node_utils.py +2 -2
- {walker → adam}/columns/pod_name.py +2 -2
- {walker → adam}/columns/volume_cassandra.py +4 -4
- {walker → adam}/columns/volume_root.py +3 -3
- adam/commands/__init__.py +15 -0
- adam/commands/alter_tables.py +81 -0
- adam/commands/app_cmd.py +38 -0
- {walker → adam}/commands/app_ping.py +10 -16
- adam/commands/audit/audit.py +84 -0
- adam/commands/audit/audit_repair_tables.py +74 -0
- adam/commands/audit/audit_run.py +50 -0
- adam/commands/audit/show_last10.py +48 -0
- adam/commands/audit/show_slow10.py +47 -0
- adam/commands/audit/show_top10.py +45 -0
- adam/commands/audit/utils_show_top10.py +59 -0
- adam/commands/bash/__init__.py +5 -0
- adam/commands/bash/bash.py +36 -0
- adam/commands/bash/bash_completer.py +93 -0
- adam/commands/bash/utils_bash.py +16 -0
- adam/commands/cat.py +50 -0
- adam/commands/cd.py +43 -0
- adam/commands/check.py +73 -0
- {walker → adam}/commands/cli_commands.py +7 -8
- adam/commands/code.py +57 -0
- adam/commands/command.py +190 -0
- {walker → adam}/commands/command_helpers.py +1 -1
- {walker → adam}/commands/commands_utils.py +15 -25
- adam/commands/cp.py +89 -0
- adam/commands/cql/cql_completions.py +33 -0
- {walker/commands → adam/commands/cql}/cqlsh.py +20 -35
- adam/commands/cql/utils_cql.py +343 -0
- {walker/commands/frontend → adam/commands/deploy}/code_start.py +11 -14
- adam/commands/deploy/code_stop.py +40 -0
- {walker/commands/frontend → adam/commands/deploy}/code_utils.py +7 -9
- adam/commands/deploy/deploy.py +25 -0
- adam/commands/deploy/deploy_frontend.py +49 -0
- adam/commands/deploy/deploy_pg_agent.py +35 -0
- adam/commands/deploy/deploy_pod.py +108 -0
- adam/commands/deploy/deploy_utils.py +29 -0
- adam/commands/deploy/undeploy.py +25 -0
- adam/commands/deploy/undeploy_frontend.py +38 -0
- adam/commands/deploy/undeploy_pg_agent.py +39 -0
- adam/commands/deploy/undeploy_pod.py +48 -0
- adam/commands/devices/device.py +118 -0
- adam/commands/devices/device_app.py +173 -0
- adam/commands/devices/device_auit_log.py +49 -0
- adam/commands/devices/device_cass.py +185 -0
- adam/commands/devices/device_export.py +86 -0
- adam/commands/devices/device_postgres.py +144 -0
- adam/commands/devices/devices.py +25 -0
- {walker → adam}/commands/exit.py +3 -6
- adam/commands/export/clean_up_all_export_sessions.py +37 -0
- adam/commands/export/clean_up_export_sessions.py +51 -0
- adam/commands/export/drop_export_database.py +55 -0
- adam/commands/export/drop_export_databases.py +43 -0
- adam/commands/export/export.py +53 -0
- adam/commands/export/export_databases.py +170 -0
- adam/commands/export/export_handlers.py +71 -0
- adam/commands/export/export_select.py +81 -0
- adam/commands/export/export_select_x.py +54 -0
- adam/commands/export/export_use.py +52 -0
- adam/commands/export/exporter.py +352 -0
- adam/commands/export/import_session.py +40 -0
- adam/commands/export/importer.py +67 -0
- adam/commands/export/importer_athena.py +80 -0
- adam/commands/export/importer_sqlite.py +47 -0
- adam/commands/export/show_column_counts.py +54 -0
- adam/commands/export/show_export_databases.py +36 -0
- adam/commands/export/show_export_session.py +48 -0
- adam/commands/export/show_export_sessions.py +44 -0
- adam/commands/export/utils_export.py +314 -0
- {walker → adam}/commands/help.py +17 -12
- adam/commands/intermediate_command.py +49 -0
- adam/commands/issues.py +43 -0
- adam/commands/kubectl.py +38 -0
- adam/commands/login.py +70 -0
- {walker → adam}/commands/logs.py +8 -10
- adam/commands/ls.py +41 -0
- adam/commands/medusa/medusa.py +27 -0
- adam/commands/medusa/medusa_backup.py +57 -0
- adam/commands/medusa/medusa_restore.py +83 -0
- adam/commands/medusa/medusa_show_backupjobs.py +51 -0
- adam/commands/medusa/medusa_show_restorejobs.py +47 -0
- {walker → adam}/commands/nodetool.py +17 -21
- {walker → adam}/commands/param_get.py +15 -16
- adam/commands/param_set.py +43 -0
- adam/commands/postgres/postgres.py +104 -0
- adam/commands/postgres/postgres_context.py +274 -0
- {walker → adam}/commands/postgres/postgres_ls.py +7 -11
- {walker → adam}/commands/postgres/postgres_preview.py +8 -13
- adam/commands/postgres/psql_completions.py +10 -0
- adam/commands/postgres/utils_postgres.py +66 -0
- adam/commands/preview_table.py +37 -0
- adam/commands/pwd.py +47 -0
- adam/commands/reaper/reaper.py +35 -0
- adam/commands/reaper/reaper_forward.py +93 -0
- adam/commands/reaper/reaper_forward_session.py +6 -0
- {walker → adam}/commands/reaper/reaper_forward_stop.py +13 -19
- {walker → adam}/commands/reaper/reaper_restart.py +10 -17
- adam/commands/reaper/reaper_run_abort.py +46 -0
- adam/commands/reaper/reaper_runs.py +82 -0
- adam/commands/reaper/reaper_runs_abort.py +63 -0
- adam/commands/reaper/reaper_schedule_activate.py +45 -0
- adam/commands/reaper/reaper_schedule_start.py +45 -0
- adam/commands/reaper/reaper_schedule_stop.py +45 -0
- {walker → adam}/commands/reaper/reaper_schedules.py +6 -16
- {walker → adam}/commands/reaper/reaper_status.py +11 -19
- adam/commands/reaper/utils_reaper.py +196 -0
- adam/commands/repair/repair.py +26 -0
- {walker → adam}/commands/repair/repair_log.py +7 -10
- adam/commands/repair/repair_run.py +70 -0
- adam/commands/repair/repair_scan.py +71 -0
- {walker → adam}/commands/repair/repair_stop.py +8 -11
- adam/commands/report.py +61 -0
- adam/commands/restart.py +60 -0
- {walker → adam}/commands/rollout.py +25 -30
- adam/commands/shell.py +34 -0
- adam/commands/show/show.py +39 -0
- walker/commands/show/show_version.py → adam/commands/show/show_adam.py +14 -10
- adam/commands/show/show_app_actions.py +57 -0
- {walker → adam}/commands/show/show_app_id.py +12 -15
- {walker → adam}/commands/show/show_app_queues.py +9 -12
- adam/commands/show/show_cassandra_repairs.py +38 -0
- adam/commands/show/show_cassandra_status.py +124 -0
- {walker → adam}/commands/show/show_cassandra_version.py +6 -16
- adam/commands/show/show_commands.py +59 -0
- walker/commands/show/show_storage.py → adam/commands/show/show_host.py +11 -13
- adam/commands/show/show_login.py +62 -0
- {walker → adam}/commands/show/show_params.py +4 -4
- adam/commands/show/show_processes.py +51 -0
- adam/commands/show/show_storage.py +42 -0
- adam/commands/watch.py +82 -0
- {walker → adam}/config.py +10 -22
- {walker → adam}/embedded_apps.py +1 -1
- adam/embedded_params.py +2 -0
- adam/log.py +47 -0
- {walker → adam}/pod_exec_result.py +10 -2
- adam/repl.py +182 -0
- adam/repl_commands.py +124 -0
- adam/repl_state.py +458 -0
- adam/sql/__init__.py +0 -0
- adam/sql/sql_completer.py +120 -0
- adam/sql/sql_state_machine.py +618 -0
- adam/sql/term_completer.py +76 -0
- adam/sso/__init__.py +0 -0
- {walker → adam}/sso/authenticator.py +5 -1
- adam/sso/authn_ad.py +170 -0
- {walker → adam}/sso/authn_okta.py +39 -22
- adam/sso/cred_cache.py +60 -0
- adam/sso/id_token.py +23 -0
- adam/sso/idp.py +143 -0
- adam/sso/idp_login.py +50 -0
- adam/sso/idp_session.py +55 -0
- adam/sso/sso_config.py +63 -0
- adam/utils.py +679 -0
- adam/utils_app.py +98 -0
- adam/utils_athena.py +145 -0
- adam/utils_audits.py +106 -0
- adam/utils_issues.py +32 -0
- adam/utils_k8s/__init__.py +0 -0
- adam/utils_k8s/app_clusters.py +28 -0
- adam/utils_k8s/app_pods.py +33 -0
- adam/utils_k8s/cassandra_clusters.py +36 -0
- adam/utils_k8s/cassandra_nodes.py +33 -0
- adam/utils_k8s/config_maps.py +34 -0
- {walker/k8s_utils → adam/utils_k8s}/custom_resources.py +7 -2
- adam/utils_k8s/deployment.py +56 -0
- {walker/k8s_utils → adam/utils_k8s}/ingresses.py +3 -4
- {walker/k8s_utils → adam/utils_k8s}/jobs.py +3 -3
- adam/utils_k8s/k8s.py +87 -0
- {walker/k8s_utils → adam/utils_k8s}/kube_context.py +4 -4
- adam/utils_k8s/pods.py +290 -0
- {walker/k8s_utils → adam/utils_k8s}/secrets.py +8 -4
- adam/utils_k8s/service_accounts.py +170 -0
- {walker/k8s_utils → adam/utils_k8s}/services.py +3 -4
- {walker/k8s_utils → adam/utils_k8s}/statefulsets.py +6 -16
- {walker/k8s_utils → adam/utils_k8s}/volumes.py +10 -1
- adam/utils_net.py +24 -0
- adam/utils_repl/__init__.py +0 -0
- adam/utils_repl/automata_completer.py +48 -0
- adam/utils_repl/repl_completer.py +46 -0
- adam/utils_repl/state_machine.py +173 -0
- adam/utils_sqlite.py +109 -0
- adam/version.py +5 -0
- {kaqing-1.77.0.dist-info → kaqing-2.0.171.dist-info}/METADATA +1 -1
- kaqing-2.0.171.dist-info/RECORD +236 -0
- kaqing-2.0.171.dist-info/entry_points.txt +3 -0
- kaqing-2.0.171.dist-info/top_level.txt +1 -0
- kaqing-1.77.0.dist-info/RECORD +0 -159
- kaqing-1.77.0.dist-info/entry_points.txt +0 -3
- kaqing-1.77.0.dist-info/top_level.txt +0 -1
- walker/__init__.py +0 -3
- walker/app_session.py +0 -168
- walker/checks/check_utils.py +0 -97
- walker/columns/columns.py +0 -43
- walker/commands/add_user.py +0 -68
- walker/commands/app.py +0 -67
- walker/commands/bash.py +0 -87
- walker/commands/cd.py +0 -115
- walker/commands/check.py +0 -68
- walker/commands/command.py +0 -104
- walker/commands/cp.py +0 -95
- walker/commands/cql_utils.py +0 -53
- walker/commands/devices.py +0 -89
- walker/commands/frontend/code_stop.py +0 -57
- walker/commands/frontend/setup.py +0 -60
- walker/commands/frontend/setup_frontend.py +0 -58
- walker/commands/frontend/teardown.py +0 -61
- walker/commands/frontend/teardown_frontend.py +0 -42
- walker/commands/issues.py +0 -69
- walker/commands/login.py +0 -72
- walker/commands/ls.py +0 -145
- walker/commands/medusa/medusa.py +0 -69
- walker/commands/medusa/medusa_backup.py +0 -61
- walker/commands/medusa/medusa_restore.py +0 -86
- walker/commands/medusa/medusa_show_backupjobs.py +0 -52
- walker/commands/medusa/medusa_show_restorejobs.py +0 -52
- walker/commands/param_set.py +0 -44
- walker/commands/postgres/postgres.py +0 -113
- walker/commands/postgres/postgres_session.py +0 -225
- walker/commands/preview_table.py +0 -98
- walker/commands/processes.py +0 -53
- walker/commands/pwd.py +0 -64
- walker/commands/reaper/reaper.py +0 -78
- walker/commands/reaper/reaper_forward.py +0 -100
- walker/commands/reaper/reaper_run_abort.py +0 -65
- walker/commands/reaper/reaper_runs.py +0 -97
- walker/commands/reaper/reaper_runs_abort.py +0 -83
- walker/commands/reaper/reaper_schedule_activate.py +0 -64
- walker/commands/reaper/reaper_schedule_start.py +0 -64
- walker/commands/reaper/reaper_schedule_stop.py +0 -64
- walker/commands/reaper/reaper_session.py +0 -159
- walker/commands/repair/repair.py +0 -68
- walker/commands/repair/repair_run.py +0 -72
- walker/commands/repair/repair_scan.py +0 -79
- walker/commands/report.py +0 -57
- walker/commands/restart.py +0 -61
- walker/commands/show/show.py +0 -72
- walker/commands/show/show_app_actions.py +0 -53
- walker/commands/show/show_cassandra_status.py +0 -35
- walker/commands/show/show_commands.py +0 -58
- walker/commands/show/show_processes.py +0 -35
- walker/commands/show/show_repairs.py +0 -47
- walker/commands/status.py +0 -128
- walker/commands/storage.py +0 -52
- walker/commands/user_entry.py +0 -69
- walker/commands/watch.py +0 -85
- walker/embedded_params.py +0 -2
- walker/k8s_utils/cassandra_clusters.py +0 -48
- walker/k8s_utils/cassandra_nodes.py +0 -26
- walker/k8s_utils/pods.py +0 -211
- walker/repl.py +0 -165
- walker/repl_commands.py +0 -58
- walker/repl_state.py +0 -211
- walker/sso/authn_ad.py +0 -94
- walker/sso/idp.py +0 -150
- walker/sso/idp_login.py +0 -29
- walker/sso/sso_config.py +0 -45
- walker/utils.py +0 -194
- walker/version.py +0 -5
- {walker → adam}/checks/__init__.py +0 -0
- {walker → adam}/checks/check_context.py +0 -0
- {walker → adam}/checks/issue.py +0 -0
- {walker → adam}/cli_group.py +0 -0
- {walker → adam}/columns/__init__.py +0 -0
- {walker/commands → adam/commands/audit}/__init__.py +0 -0
- {walker/commands/frontend → adam/commands/cql}/__init__.py +0 -0
- {walker/commands/medusa → adam/commands/deploy}/__init__.py +0 -0
- {walker/commands/postgres → adam/commands/devices}/__init__.py +0 -0
- {walker/commands/reaper → adam/commands/export}/__init__.py +0 -0
- {walker/commands/repair → adam/commands/medusa}/__init__.py +0 -0
- {walker → adam}/commands/nodetool_commands.py +0 -0
- {walker/commands/show → adam/commands/postgres}/__init__.py +0 -0
- {walker/k8s_utils → adam/commands/reaper}/__init__.py +0 -0
- {walker/sso → adam/commands/repair}/__init__.py +0 -0
- /walker/medusa_show_restorejobs.py → /adam/commands/show/__init__.py +0 -0
- {walker → adam}/repl_session.py +0 -0
- {kaqing-1.77.0.dist-info → kaqing-2.0.171.dist-info}/WHEEL +0 -0
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
from
|
|
2
|
-
from .
|
|
3
|
-
from
|
|
4
|
-
from
|
|
1
|
+
from adam.commands.command import Command
|
|
2
|
+
from adam.commands.reaper.reaper_forward_session import ReaperForwardSession
|
|
3
|
+
from adam.commands.reaper.utils_reaper import Reapers
|
|
4
|
+
from adam.repl_state import ReplState, RequiredState
|
|
5
|
+
from adam.utils import log2
|
|
5
6
|
|
|
6
7
|
class ReaperForwardStop(Command):
|
|
7
8
|
COMMAND = 'reaper forward stop'
|
|
8
|
-
reaper_login = None
|
|
9
9
|
|
|
10
10
|
# the singleton pattern
|
|
11
11
|
def __new__(cls, *args, **kwargs):
|
|
@@ -26,24 +26,18 @@ class ReaperForwardStop(Command):
|
|
|
26
26
|
if not(args := self.args(cmd)):
|
|
27
27
|
return super().run(cmd, state)
|
|
28
28
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
if not ReaperSession.create(state):
|
|
34
|
-
return state
|
|
29
|
+
with self.validate(args, state) as (args, state):
|
|
30
|
+
if not Reapers.pod_name(state):
|
|
31
|
+
return state
|
|
35
32
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
33
|
+
ReaperForwardSession.is_forwarding = False
|
|
34
|
+
ReaperForwardSession.stopping.set()
|
|
35
|
+
log2("Stopped reaper forward session.")
|
|
39
36
|
|
|
40
|
-
|
|
37
|
+
return state
|
|
41
38
|
|
|
42
39
|
def completion(self, state: ReplState):
|
|
43
|
-
|
|
44
|
-
return super().completion(state)
|
|
45
|
-
|
|
46
|
-
return {}
|
|
40
|
+
return super().completion(state)
|
|
47
41
|
|
|
48
42
|
def help(self, _: ReplState):
|
|
49
43
|
return f'{ReaperForwardStop.COMMAND}\t stop port-forward to reaper'
|
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
from
|
|
2
|
-
from
|
|
3
|
-
from .
|
|
4
|
-
from
|
|
1
|
+
from adam.commands.command import Command
|
|
2
|
+
from adam.commands.reaper.utils_reaper import Reapers
|
|
3
|
+
from adam.utils_k8s.pods import Pods
|
|
4
|
+
from adam.repl_state import ReplState, RequiredState
|
|
5
5
|
|
|
6
6
|
class ReaperRestart(Command):
|
|
7
7
|
COMMAND = 'reaper restart'
|
|
8
|
-
reaper_login = None
|
|
9
8
|
|
|
10
9
|
# the singleton pattern
|
|
11
10
|
def __new__(cls, *args, **kwargs):
|
|
@@ -26,22 +25,16 @@ class ReaperRestart(Command):
|
|
|
26
25
|
if not(args := self.args(cmd)):
|
|
27
26
|
return super().run(cmd, state)
|
|
28
27
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
if not(reaper := ReaperSession.create(state)):
|
|
34
|
-
return state
|
|
28
|
+
with self.validate(args, state) as (args, state):
|
|
29
|
+
if not (pod := Reapers.pod_name(state)):
|
|
30
|
+
return state
|
|
35
31
|
|
|
36
|
-
|
|
32
|
+
Pods.delete(pod, state.namespace)
|
|
37
33
|
|
|
38
|
-
|
|
34
|
+
return state
|
|
39
35
|
|
|
40
36
|
def completion(self, state: ReplState):
|
|
41
|
-
|
|
42
|
-
return super().completion(state)
|
|
43
|
-
|
|
44
|
-
return {}
|
|
37
|
+
return super().completion(state)
|
|
45
38
|
|
|
46
39
|
def help(self, _: ReplState):
|
|
47
40
|
return f'{ReaperRestart.COMMAND}\t restart reaper'
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
from adam.commands.command import Command
|
|
2
|
+
from adam.commands.reaper.utils_reaper import reaper
|
|
3
|
+
from adam.repl_state import ReplState, RequiredState
|
|
4
|
+
from adam.utils import log2
|
|
5
|
+
|
|
6
|
+
class ReaperRunAbort(Command):
|
|
7
|
+
COMMAND = 'reaper abort run'
|
|
8
|
+
|
|
9
|
+
# the singleton pattern
|
|
10
|
+
def __new__(cls, *args, **kwargs):
|
|
11
|
+
if not hasattr(cls, 'instance'): cls.instance = super(ReaperRunAbort, cls).__new__(cls)
|
|
12
|
+
|
|
13
|
+
return cls.instance
|
|
14
|
+
|
|
15
|
+
def __init__(self, successor: Command=None):
|
|
16
|
+
super().__init__(successor)
|
|
17
|
+
|
|
18
|
+
def command(self):
|
|
19
|
+
return ReaperRunAbort.COMMAND
|
|
20
|
+
|
|
21
|
+
def required(self):
|
|
22
|
+
return RequiredState.CLUSTER
|
|
23
|
+
|
|
24
|
+
def run(self, cmd: str, state: ReplState):
|
|
25
|
+
if not(args := self.args(cmd)):
|
|
26
|
+
return super().run(cmd, state)
|
|
27
|
+
|
|
28
|
+
with self.validate(args, state) as (args, state):
|
|
29
|
+
if not args:
|
|
30
|
+
if state.in_repl:
|
|
31
|
+
log2('Specify run id to abort.')
|
|
32
|
+
else:
|
|
33
|
+
Command.display_help()
|
|
34
|
+
|
|
35
|
+
return state
|
|
36
|
+
|
|
37
|
+
with reaper(state) as http:
|
|
38
|
+
http.put(f'repair_run/{args[0]}/state/ABORTED')
|
|
39
|
+
|
|
40
|
+
return state
|
|
41
|
+
|
|
42
|
+
def completion(self, state: ReplState):
|
|
43
|
+
return super().completion(state)
|
|
44
|
+
|
|
45
|
+
def help(self, _: ReplState):
|
|
46
|
+
return f'{ReaperRunAbort.COMMAND} <run-id>\t abort reaper run'
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
from adam.commands.command import Command
|
|
2
|
+
from adam.commands.reaper.utils_reaper import reaper
|
|
3
|
+
from adam.config import Config
|
|
4
|
+
from adam.repl_state import ReplState, RequiredState
|
|
5
|
+
from adam.utils import convert_seconds, epoch, lines_to_tabular, log, log2
|
|
6
|
+
|
|
7
|
+
class ReaperRuns(Command):
|
|
8
|
+
COMMAND = 'reaper show runs'
|
|
9
|
+
|
|
10
|
+
# the singleton pattern
|
|
11
|
+
def __new__(cls, *args, **kwargs):
|
|
12
|
+
if not hasattr(cls, 'instance'): cls.instance = super(ReaperRuns, cls).__new__(cls)
|
|
13
|
+
|
|
14
|
+
return cls.instance
|
|
15
|
+
|
|
16
|
+
def __init__(self, successor: Command=None):
|
|
17
|
+
super().__init__(successor)
|
|
18
|
+
|
|
19
|
+
def command(self):
|
|
20
|
+
return ReaperRuns.COMMAND
|
|
21
|
+
|
|
22
|
+
def required(self):
|
|
23
|
+
return RequiredState.CLUSTER
|
|
24
|
+
|
|
25
|
+
def run(self, cmd: str, state: ReplState):
|
|
26
|
+
if not(args := self.args(cmd)):
|
|
27
|
+
return super().run(cmd, state)
|
|
28
|
+
|
|
29
|
+
with self.validate(args, state) as (args, state):
|
|
30
|
+
header = 'ID,START,DURATION,STATE,CLUSTER,KEYSPACE,TABLES,REPAIRED'
|
|
31
|
+
|
|
32
|
+
def line(run):
|
|
33
|
+
id = run['id']
|
|
34
|
+
state = run['state']
|
|
35
|
+
start_time = run['start_time']
|
|
36
|
+
end_time = run['end_time']
|
|
37
|
+
duration = '-'
|
|
38
|
+
if state == 'DONE' and end_time:
|
|
39
|
+
hours, minutes, seconds = convert_seconds(epoch(end_time) - epoch(start_time))
|
|
40
|
+
if hours:
|
|
41
|
+
duration = f"{hours:2d}h {minutes:2d}m {seconds:2d}s"
|
|
42
|
+
elif minutes:
|
|
43
|
+
duration = f"{minutes:2d}m {seconds:2d}s"
|
|
44
|
+
else:
|
|
45
|
+
duration = f"{seconds:2d}s"
|
|
46
|
+
|
|
47
|
+
return f"{id},{start_time},{duration},{state},{run['cluster_name']},{run['keyspace_name']},{len(run['column_families'])},{run['segments_repaired']}/{run['total_segments']}"
|
|
48
|
+
|
|
49
|
+
with reaper(state) as http:
|
|
50
|
+
response = http.get('repair_run?state=RUNNING', params={
|
|
51
|
+
'cluster_name': 'all',
|
|
52
|
+
'limit': Config().get('reaper.show-runs-batch', 10)
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
runs = response.json()
|
|
56
|
+
if runs:
|
|
57
|
+
log(lines_to_tabular(sorted([line(run) for run in runs], reverse=True), header, separator=","))
|
|
58
|
+
else:
|
|
59
|
+
log2('No running runs found.')
|
|
60
|
+
log2()
|
|
61
|
+
|
|
62
|
+
response = http.get('repair_run?state=PAUSED,ABORTED,DONE', params={
|
|
63
|
+
'cluster_name': 'all',
|
|
64
|
+
'limit': Config().get('reaper.show-runs-batch', 10)
|
|
65
|
+
})
|
|
66
|
+
|
|
67
|
+
runs = response.json()
|
|
68
|
+
if runs:
|
|
69
|
+
log(lines_to_tabular(sorted([line(run) for run in runs], reverse=True), header, separator=","))
|
|
70
|
+
else:
|
|
71
|
+
log2('No runs found.')
|
|
72
|
+
|
|
73
|
+
return state
|
|
74
|
+
|
|
75
|
+
def completion(self, state: ReplState):
|
|
76
|
+
if state.sts:
|
|
77
|
+
return super().completion(state)
|
|
78
|
+
|
|
79
|
+
return {}
|
|
80
|
+
|
|
81
|
+
def help(self, _: ReplState):
|
|
82
|
+
return f'{ReaperRuns.COMMAND}\t show reaper runs'
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
from adam.commands.command import Command
|
|
2
|
+
from adam.commands.reaper.utils_reaper import reaper
|
|
3
|
+
from adam.config import Config
|
|
4
|
+
from adam.repl_state import ReplState, RequiredState
|
|
5
|
+
from adam.utils import log2
|
|
6
|
+
|
|
7
|
+
class ReaperRunsAbort(Command):
|
|
8
|
+
COMMAND = 'reaper abort runs'
|
|
9
|
+
|
|
10
|
+
# the singleton pattern
|
|
11
|
+
def __new__(cls, *args, **kwargs):
|
|
12
|
+
if not hasattr(cls, 'instance'): cls.instance = super(ReaperRunsAbort, cls).__new__(cls)
|
|
13
|
+
|
|
14
|
+
return cls.instance
|
|
15
|
+
|
|
16
|
+
def __init__(self, successor: Command=None):
|
|
17
|
+
super().__init__(successor)
|
|
18
|
+
|
|
19
|
+
def command(self):
|
|
20
|
+
return ReaperRunsAbort.COMMAND
|
|
21
|
+
|
|
22
|
+
def required(self):
|
|
23
|
+
return RequiredState.CLUSTER
|
|
24
|
+
|
|
25
|
+
def run(self, cmd: str, state: ReplState):
|
|
26
|
+
if not(args := self.args(cmd)):
|
|
27
|
+
return super().run(cmd, state)
|
|
28
|
+
|
|
29
|
+
with self.validate(args, state) as (args, state):
|
|
30
|
+
with reaper(state) as http:
|
|
31
|
+
# PAUSED, RUNNING, ABORTED
|
|
32
|
+
aborted = 0
|
|
33
|
+
|
|
34
|
+
while True == True:
|
|
35
|
+
response = http.get('repair_run?state=RUNNING', params={
|
|
36
|
+
'cluster_name': 'all',
|
|
37
|
+
'limit': Config().get('reaper.abort-runs-batch', 10)
|
|
38
|
+
})
|
|
39
|
+
if not response:
|
|
40
|
+
break
|
|
41
|
+
|
|
42
|
+
runs = response.json()
|
|
43
|
+
if not runs:
|
|
44
|
+
break
|
|
45
|
+
|
|
46
|
+
for run in runs:
|
|
47
|
+
run_id = run['id']
|
|
48
|
+
# PUT /repair_run/{id}/state/{state}
|
|
49
|
+
http.put(f'repair_run/{run_id}/state/ABORTED')
|
|
50
|
+
aborted += 1
|
|
51
|
+
|
|
52
|
+
if aborted:
|
|
53
|
+
log2(f'Aborted {aborted} runs in total.')
|
|
54
|
+
else:
|
|
55
|
+
log2('No running repair runs found.')
|
|
56
|
+
|
|
57
|
+
return state
|
|
58
|
+
|
|
59
|
+
def completion(self, state: ReplState):
|
|
60
|
+
return super().completion(state)
|
|
61
|
+
|
|
62
|
+
def help(self, _: ReplState):
|
|
63
|
+
return f'{ReaperRunsAbort.COMMAND}\t abort all running reaper runs'
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
from adam.commands.command import Command
|
|
2
|
+
from adam.commands.reaper.utils_reaper import Reapers, reaper
|
|
3
|
+
from adam.repl_state import ReplState, RequiredState
|
|
4
|
+
from adam.utils import log2
|
|
5
|
+
|
|
6
|
+
class ReaperScheduleActivate(Command):
|
|
7
|
+
COMMAND = 'reaper activate schedule'
|
|
8
|
+
|
|
9
|
+
# the singleton pattern
|
|
10
|
+
def __new__(cls, *args, **kwargs):
|
|
11
|
+
if not hasattr(cls, 'instance'): cls.instance = super(ReaperScheduleActivate, cls).__new__(cls)
|
|
12
|
+
|
|
13
|
+
return cls.instance
|
|
14
|
+
|
|
15
|
+
def __init__(self, successor: Command=None):
|
|
16
|
+
super().__init__(successor)
|
|
17
|
+
|
|
18
|
+
def command(self):
|
|
19
|
+
return ReaperScheduleActivate.COMMAND
|
|
20
|
+
|
|
21
|
+
def required(self):
|
|
22
|
+
return RequiredState.CLUSTER
|
|
23
|
+
|
|
24
|
+
def run(self, cmd: str, state: ReplState):
|
|
25
|
+
if not(args := self.args(cmd)):
|
|
26
|
+
return super().run(cmd, state)
|
|
27
|
+
|
|
28
|
+
with self.validate(args, state) as (args, state):
|
|
29
|
+
if not args:
|
|
30
|
+
log2('Specify schedule to activate.')
|
|
31
|
+
|
|
32
|
+
return state
|
|
33
|
+
|
|
34
|
+
schedule_id = args[0]
|
|
35
|
+
with reaper(state) as http:
|
|
36
|
+
http.put(f'repair_schedule/{schedule_id}?state=ACTIVE')
|
|
37
|
+
Reapers.show_schedule(state, schedule_id)
|
|
38
|
+
|
|
39
|
+
return schedule_id
|
|
40
|
+
|
|
41
|
+
def completion(self, state: ReplState):
|
|
42
|
+
return super().completion(state, lambda: {id: None for id in Reapers.cached_schedule_ids(state)})
|
|
43
|
+
|
|
44
|
+
def help(self, _: ReplState):
|
|
45
|
+
return f'{ReaperScheduleActivate.COMMAND} <schedule-id>\t resume reaper schedule'
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
from adam.commands.command import Command
|
|
2
|
+
from adam.commands.reaper.utils_reaper import Reapers, reaper
|
|
3
|
+
from adam.repl_state import ReplState, RequiredState
|
|
4
|
+
from adam.utils import log2
|
|
5
|
+
|
|
6
|
+
class ReaperScheduleStart(Command):
|
|
7
|
+
COMMAND = 'reaper start schedule'
|
|
8
|
+
|
|
9
|
+
# the singleton pattern
|
|
10
|
+
def __new__(cls, *args, **kwargs):
|
|
11
|
+
if not hasattr(cls, 'instance'): cls.instance = super(ReaperScheduleStart, cls).__new__(cls)
|
|
12
|
+
|
|
13
|
+
return cls.instance
|
|
14
|
+
|
|
15
|
+
def __init__(self, successor: Command=None):
|
|
16
|
+
super().__init__(successor)
|
|
17
|
+
|
|
18
|
+
def command(self):
|
|
19
|
+
return ReaperScheduleStart.COMMAND
|
|
20
|
+
|
|
21
|
+
def required(self):
|
|
22
|
+
return RequiredState.CLUSTER
|
|
23
|
+
|
|
24
|
+
def run(self, cmd: str, state: ReplState):
|
|
25
|
+
if not(args := self.args(cmd)):
|
|
26
|
+
return super().run(cmd, state)
|
|
27
|
+
|
|
28
|
+
with self.validate(args, state) as (args, state):
|
|
29
|
+
if not args:
|
|
30
|
+
log2('Specify schedule to activate.')
|
|
31
|
+
|
|
32
|
+
return state
|
|
33
|
+
|
|
34
|
+
schedule_id = args[0]
|
|
35
|
+
with reaper(state) as http:
|
|
36
|
+
http.post(f'repair_schedule/start/{schedule_id}')
|
|
37
|
+
Reapers.show_schedule(state, schedule_id)
|
|
38
|
+
|
|
39
|
+
return schedule_id
|
|
40
|
+
|
|
41
|
+
def completion(self, state: ReplState):
|
|
42
|
+
return super().completion(state, lambda: {id: None for id in Reapers.cached_schedule_ids(state)})
|
|
43
|
+
|
|
44
|
+
def help(self, _: ReplState):
|
|
45
|
+
return f'{ReaperScheduleStart.COMMAND} <schedule-id>\t start reaper runs for schedule'
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
from adam.commands.command import Command
|
|
2
|
+
from adam.commands.reaper.utils_reaper import Reapers, reaper
|
|
3
|
+
from adam.repl_state import ReplState, RequiredState
|
|
4
|
+
from adam.utils import log2
|
|
5
|
+
|
|
6
|
+
class ReaperScheduleStop(Command):
|
|
7
|
+
COMMAND = 'reaper stop schedule'
|
|
8
|
+
|
|
9
|
+
# the singleton pattern
|
|
10
|
+
def __new__(cls, *args, **kwargs):
|
|
11
|
+
if not hasattr(cls, 'instance'): cls.instance = super(ReaperScheduleStop, cls).__new__(cls)
|
|
12
|
+
|
|
13
|
+
return cls.instance
|
|
14
|
+
|
|
15
|
+
def __init__(self, successor: Command=None):
|
|
16
|
+
super().__init__(successor)
|
|
17
|
+
|
|
18
|
+
def command(self):
|
|
19
|
+
return ReaperScheduleStop.COMMAND
|
|
20
|
+
|
|
21
|
+
def required(self):
|
|
22
|
+
return RequiredState.CLUSTER
|
|
23
|
+
|
|
24
|
+
def run(self, cmd: str, state: ReplState):
|
|
25
|
+
if not(args := self.args(cmd)):
|
|
26
|
+
return super().run(cmd, state)
|
|
27
|
+
|
|
28
|
+
with self.validate(args, state) as (args, state):
|
|
29
|
+
if not args:
|
|
30
|
+
log2('Specify run schedule to stop.')
|
|
31
|
+
|
|
32
|
+
return state
|
|
33
|
+
|
|
34
|
+
with reaper(state) as http:
|
|
35
|
+
schedule_id = args[0]
|
|
36
|
+
http.put(f'repair_schedule/{schedule_id}?state=PAUSED')
|
|
37
|
+
Reapers.show_schedule(state, schedule_id)
|
|
38
|
+
|
|
39
|
+
return schedule_id
|
|
40
|
+
|
|
41
|
+
def completion(self, state: ReplState):
|
|
42
|
+
return super().completion(state, lambda: {id: None for id in Reapers.cached_schedule_ids(state)})
|
|
43
|
+
|
|
44
|
+
def help(self, _: ReplState):
|
|
45
|
+
return f'{ReaperScheduleStop.COMMAND} <schedule-id>\t pause reaper schedule'
|
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
from
|
|
2
|
-
from .
|
|
3
|
-
from
|
|
1
|
+
from adam.commands.command import Command
|
|
2
|
+
from adam.commands.reaper.utils_reaper import Reapers
|
|
3
|
+
from adam.repl_state import ReplState, RequiredState
|
|
4
4
|
|
|
5
5
|
class ReaperSchedules(Command):
|
|
6
6
|
COMMAND = 'reaper show schedules'
|
|
7
|
-
reaper_login = None
|
|
8
7
|
|
|
9
8
|
# the singleton pattern
|
|
10
9
|
def __new__(cls, *args, **kwargs):
|
|
@@ -25,22 +24,13 @@ class ReaperSchedules(Command):
|
|
|
25
24
|
if not(args := self.args(cmd)):
|
|
26
25
|
return super().run(cmd, state)
|
|
27
26
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
return state
|
|
27
|
+
with self.validate(args, state) as (args, state):
|
|
28
|
+
Reapers.show_schedules(state)
|
|
31
29
|
|
|
32
|
-
if not(reaper := ReaperSession.create(state)):
|
|
33
30
|
return state
|
|
34
31
|
|
|
35
|
-
reaper.show_schedules(state)
|
|
36
|
-
|
|
37
|
-
return state
|
|
38
|
-
|
|
39
32
|
def completion(self, state: ReplState):
|
|
40
|
-
|
|
41
|
-
return super().completion(state)
|
|
42
|
-
|
|
43
|
-
return {}
|
|
33
|
+
return super().completion(state)
|
|
44
34
|
|
|
45
35
|
def help(self, _: ReplState):
|
|
46
36
|
return f'{ReaperSchedules.COMMAND}\t show reaper schedules'
|
|
@@ -2,15 +2,13 @@ import re
|
|
|
2
2
|
from typing import List, cast
|
|
3
3
|
from kubernetes import client
|
|
4
4
|
|
|
5
|
-
from
|
|
6
|
-
from
|
|
7
|
-
from .
|
|
8
|
-
from
|
|
9
|
-
from walker.utils import lines_to_tabular, log, log2
|
|
5
|
+
from adam.commands.command import Command
|
|
6
|
+
from adam.commands.commands_utils import show_pods
|
|
7
|
+
from adam.commands.reaper.utils_reaper import Reapers
|
|
8
|
+
from adam.repl_state import ReplState, RequiredState
|
|
10
9
|
|
|
11
10
|
class ReaperStatus(Command):
|
|
12
11
|
COMMAND = 'reaper status'
|
|
13
|
-
reaper_login = None
|
|
14
12
|
|
|
15
13
|
# the singleton pattern
|
|
16
14
|
def __new__(cls, *args, **kwargs):
|
|
@@ -31,18 +29,15 @@ class ReaperStatus(Command):
|
|
|
31
29
|
if not(args := self.args(cmd)):
|
|
32
30
|
return super().run(cmd, state)
|
|
33
31
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
if not(reaper := ReaperSession.create(state)):
|
|
39
|
-
return state
|
|
32
|
+
with self.validate(args, state) as (args, state):
|
|
33
|
+
if not Reapers.pod_name(state):
|
|
34
|
+
return state
|
|
40
35
|
|
|
41
|
-
|
|
36
|
+
pods = self.list_pods(state.sts, state.namespace)
|
|
42
37
|
|
|
43
|
-
|
|
38
|
+
show_pods(pods, state.namespace, show_host_id=False)
|
|
44
39
|
|
|
45
|
-
|
|
40
|
+
return state
|
|
46
41
|
|
|
47
42
|
def list_pods(self, sts_name: str, namespace: str) -> List[client.V1Pod]:
|
|
48
43
|
v1 = client.CoreV1Api()
|
|
@@ -55,10 +50,7 @@ class ReaperStatus(Command):
|
|
|
55
50
|
return cast(List[client.V1Pod], v1.list_namespaced_pod(namespace, label_selector=label_selector).items)
|
|
56
51
|
|
|
57
52
|
def completion(self, state: ReplState):
|
|
58
|
-
|
|
59
|
-
return super().completion(state)
|
|
60
|
-
|
|
61
|
-
return {}
|
|
53
|
+
return super().completion(state)
|
|
62
54
|
|
|
63
55
|
def help(self, _: ReplState):
|
|
64
56
|
return f'{ReaperStatus.COMMAND}\t show reaper status'
|