kaqing 2.0.110__py3-none-any.whl → 2.0.214__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.
Potentially problematic release.
This version of kaqing might be problematic. Click here for more details.
- adam/__init__.py +0 -2
- adam/app_session.py +9 -12
- adam/apps.py +18 -4
- adam/batch.py +19 -19
- adam/checks/check_utils.py +16 -46
- adam/checks/cpu.py +7 -1
- adam/checks/cpu_metrics.py +52 -0
- adam/checks/disk.py +2 -3
- adam/columns/columns.py +3 -1
- adam/columns/cpu.py +3 -1
- adam/columns/cpu_metrics.py +22 -0
- adam/columns/memory.py +3 -4
- adam/commands/__init__.py +24 -0
- adam/commands/app/app.py +38 -0
- adam/commands/{app_ping.py → app/app_ping.py} +7 -13
- adam/commands/{login.py → app/login.py} +22 -24
- adam/commands/app/show_app_actions.py +49 -0
- adam/commands/{show → app}/show_app_id.py +8 -11
- adam/commands/{show → app}/show_app_queues.py +7 -14
- adam/commands/app/show_login.py +56 -0
- adam/commands/app/utils_app.py +106 -0
- adam/commands/audit/audit.py +22 -40
- adam/commands/audit/audit_repair_tables.py +15 -19
- adam/commands/audit/audit_run.py +15 -22
- adam/commands/audit/completions_l.py +15 -0
- adam/commands/audit/show_last10.py +4 -18
- adam/commands/audit/show_slow10.py +4 -17
- adam/commands/audit/show_top10.py +4 -16
- adam/commands/audit/utils_show_top10.py +15 -3
- 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/cassandra/__init__.py +0 -0
- adam/commands/cassandra/download_cassandra_log.py +45 -0
- adam/commands/{restart.py → cassandra/restart_cluster.py} +12 -26
- adam/commands/cassandra/restart_node.py +51 -0
- adam/commands/cassandra/restart_nodes.py +47 -0
- adam/commands/{rollout.py → cassandra/rollout.py} +20 -25
- adam/commands/cassandra/show_cassandra_repairs.py +37 -0
- adam/commands/cassandra/show_cassandra_status.py +117 -0
- adam/commands/{show → cassandra}/show_cassandra_version.py +5 -18
- adam/commands/cassandra/show_processes.py +50 -0
- adam/commands/cassandra/show_storage.py +44 -0
- adam/commands/{watch.py → cassandra/watch.py} +26 -29
- adam/commands/cli/__init__.py +0 -0
- adam/commands/{cli_commands.py → cli/cli_commands.py} +8 -4
- adam/commands/cli/clipboard_copy.py +86 -0
- adam/commands/cli/show_cli_commands.py +56 -0
- adam/commands/code.py +57 -0
- adam/commands/command.py +211 -40
- adam/commands/commands_utils.py +20 -27
- adam/commands/config/__init__.py +0 -0
- adam/commands/{param_get.py → config/param_get.py} +11 -14
- adam/commands/{param_set.py → config/param_set.py} +8 -12
- adam/commands/{show → config}/show_params.py +2 -5
- adam/commands/cql/alter_tables.py +66 -0
- adam/commands/cql/completions_c.py +29 -0
- adam/commands/cql/cqlsh.py +10 -32
- adam/commands/cql/utils_cql.py +306 -0
- adam/commands/debug/__init__.py +0 -0
- adam/commands/debug/debug.py +22 -0
- adam/commands/debug/debug_completes.py +35 -0
- adam/commands/debug/debug_timings.py +35 -0
- adam/commands/debug/show_offloaded_completes.py +45 -0
- adam/commands/deploy/code_start.py +7 -10
- adam/commands/deploy/code_stop.py +4 -21
- adam/commands/deploy/code_utils.py +3 -3
- adam/commands/deploy/deploy.py +4 -27
- adam/commands/deploy/deploy_frontend.py +14 -17
- adam/commands/deploy/deploy_pg_agent.py +3 -6
- adam/commands/deploy/deploy_pod.py +65 -73
- adam/commands/deploy/deploy_utils.py +14 -24
- adam/commands/deploy/undeploy.py +4 -27
- adam/commands/deploy/undeploy_frontend.py +4 -7
- adam/commands/deploy/undeploy_pg_agent.py +6 -8
- adam/commands/deploy/undeploy_pod.py +11 -12
- adam/commands/devices/__init__.py +0 -0
- adam/commands/devices/device.py +149 -0
- adam/commands/devices/device_app.py +163 -0
- adam/commands/devices/device_auit_log.py +49 -0
- adam/commands/devices/device_cass.py +179 -0
- adam/commands/devices/device_export.py +87 -0
- adam/commands/devices/device_postgres.py +160 -0
- adam/commands/devices/devices.py +25 -0
- adam/commands/diag/__init__.py +0 -0
- adam/commands/{check.py → diag/check.py} +16 -25
- adam/commands/diag/generate_report.py +52 -0
- adam/commands/diag/issues.py +43 -0
- adam/commands/exit.py +1 -4
- adam/commands/export/__init__.py +0 -0
- adam/commands/export/clean_up_all_export_sessions.py +37 -0
- adam/commands/export/clean_up_export_sessions.py +39 -0
- adam/commands/export/completions_x.py +11 -0
- adam/commands/export/download_export_session.py +40 -0
- adam/commands/export/drop_export_database.py +39 -0
- adam/commands/export/drop_export_databases.py +37 -0
- adam/commands/export/export.py +37 -0
- adam/commands/export/export_databases.py +251 -0
- adam/commands/export/export_select.py +34 -0
- adam/commands/export/export_sessions.py +210 -0
- adam/commands/export/export_use.py +49 -0
- adam/commands/export/export_x_select.py +48 -0
- adam/commands/export/exporter.py +419 -0
- adam/commands/export/import_files.py +44 -0
- adam/commands/export/import_session.py +40 -0
- adam/commands/export/importer.py +81 -0
- adam/commands/export/importer_athena.py +157 -0
- adam/commands/export/importer_sqlite.py +78 -0
- adam/commands/export/show_column_counts.py +45 -0
- adam/commands/export/show_export_databases.py +39 -0
- adam/commands/export/show_export_session.py +39 -0
- adam/commands/export/show_export_sessions.py +37 -0
- adam/commands/export/utils_export.py +366 -0
- adam/commands/fs/__init__.py +0 -0
- adam/commands/fs/cat.py +36 -0
- adam/commands/fs/cat_local.py +42 -0
- adam/commands/fs/cd.py +41 -0
- adam/commands/fs/download_file.py +47 -0
- adam/commands/fs/find_files.py +51 -0
- adam/commands/fs/find_processes.py +76 -0
- adam/commands/fs/head.py +36 -0
- adam/commands/fs/ls.py +41 -0
- adam/commands/fs/ls_local.py +40 -0
- adam/commands/fs/pwd.py +45 -0
- adam/commands/fs/rm.py +18 -0
- adam/commands/fs/rm_downloads.py +39 -0
- adam/commands/fs/rm_logs.py +38 -0
- adam/commands/{shell.py → fs/shell.py} +12 -4
- adam/commands/{show → fs}/show_adam.py +3 -3
- adam/commands/{show → fs}/show_host.py +1 -1
- adam/commands/help.py +5 -3
- adam/commands/intermediate_command.py +52 -0
- adam/commands/kubectl.py +38 -0
- adam/commands/medusa/medusa.py +4 -22
- adam/commands/medusa/medusa_backup.py +20 -27
- adam/commands/medusa/medusa_restore.py +35 -48
- adam/commands/medusa/medusa_show_backupjobs.py +16 -18
- adam/commands/medusa/medusa_show_restorejobs.py +13 -18
- adam/commands/medusa/utils_medusa.py +15 -0
- adam/commands/nodetool/__init__.py +0 -0
- adam/commands/{nodetool.py → nodetool/nodetool.py} +9 -20
- adam/commands/postgres/completions_p.py +22 -0
- adam/commands/postgres/postgres.py +47 -55
- adam/commands/postgres/postgres_databases.py +269 -0
- adam/commands/postgres/postgres_ls.py +5 -9
- adam/commands/postgres/postgres_preview.py +5 -9
- adam/commands/postgres/utils_postgres.py +80 -0
- adam/commands/preview_table.py +8 -44
- adam/commands/reaper/reaper.py +4 -27
- adam/commands/reaper/reaper_forward.py +49 -56
- adam/commands/reaper/reaper_forward_session.py +6 -0
- adam/commands/reaper/reaper_forward_stop.py +10 -16
- adam/commands/reaper/reaper_restart.py +7 -14
- adam/commands/reaper/reaper_run_abort.py +8 -33
- adam/commands/reaper/reaper_runs.py +43 -58
- adam/commands/reaper/reaper_runs_abort.py +29 -49
- adam/commands/reaper/reaper_schedule_activate.py +14 -33
- adam/commands/reaper/reaper_schedule_start.py +9 -33
- adam/commands/reaper/reaper_schedule_stop.py +9 -33
- adam/commands/reaper/reaper_schedules.py +4 -14
- adam/commands/reaper/reaper_status.py +8 -16
- adam/commands/reaper/utils_reaper.py +203 -0
- adam/commands/repair/repair.py +4 -22
- adam/commands/repair/repair_log.py +5 -11
- adam/commands/repair/repair_run.py +27 -34
- adam/commands/repair/repair_scan.py +32 -40
- adam/commands/repair/repair_stop.py +5 -12
- adam/commands/show.py +40 -0
- adam/config.py +5 -15
- adam/embedded_params.py +1 -1
- adam/log.py +4 -4
- adam/repl.py +83 -116
- adam/repl_commands.py +86 -45
- adam/repl_session.py +9 -1
- adam/repl_state.py +176 -40
- adam/sql/async_executor.py +62 -0
- adam/sql/lark_completer.py +286 -0
- adam/sql/lark_parser.py +604 -0
- adam/sql/qingl.lark +1076 -0
- adam/sql/sql_completer.py +52 -27
- adam/sql/sql_state_machine.py +131 -19
- adam/sso/authn_ad.py +6 -8
- adam/sso/authn_okta.py +4 -6
- adam/sso/cred_cache.py +4 -9
- adam/sso/idp.py +9 -12
- adam/utils.py +670 -31
- adam/utils_athena.py +145 -0
- adam/utils_audits.py +12 -103
- adam/utils_issues.py +32 -0
- adam/utils_k8s/app_clusters.py +35 -0
- adam/utils_k8s/app_pods.py +41 -0
- adam/utils_k8s/cassandra_clusters.py +35 -20
- adam/utils_k8s/cassandra_nodes.py +15 -6
- adam/utils_k8s/custom_resources.py +16 -17
- adam/utils_k8s/ingresses.py +2 -2
- adam/utils_k8s/jobs.py +7 -11
- adam/utils_k8s/k8s.py +96 -0
- adam/utils_k8s/kube_context.py +3 -6
- adam/{pod_exec_result.py → utils_k8s/pod_exec_result.py} +13 -4
- adam/utils_k8s/pods.py +159 -89
- adam/utils_k8s/secrets.py +4 -4
- adam/utils_k8s/service_accounts.py +5 -4
- adam/utils_k8s/services.py +2 -2
- adam/utils_k8s/statefulsets.py +6 -14
- adam/utils_local.py +80 -0
- adam/utils_net.py +4 -4
- adam/utils_repl/__init__.py +0 -0
- adam/utils_repl/appendable_completer.py +6 -0
- adam/utils_repl/automata_completer.py +48 -0
- adam/utils_repl/repl_completer.py +93 -0
- adam/utils_repl/state_machine.py +173 -0
- adam/utils_sqlite.py +132 -0
- adam/version.py +1 -1
- {kaqing-2.0.110.dist-info → kaqing-2.0.214.dist-info}/METADATA +1 -1
- kaqing-2.0.214.dist-info/RECORD +272 -0
- kaqing-2.0.214.dist-info/top_level.txt +2 -0
- teddy/__init__.py +0 -0
- teddy/lark_parser.py +436 -0
- teddy/lark_parser2.py +618 -0
- adam/commands/alter_tables.py +0 -81
- adam/commands/app.py +0 -67
- adam/commands/bash.py +0 -150
- adam/commands/cd.py +0 -125
- adam/commands/cp.py +0 -95
- adam/commands/cql/cql_completions.py +0 -15
- adam/commands/cql/cql_utils.py +0 -112
- adam/commands/devices.py +0 -118
- adam/commands/issues.py +0 -75
- adam/commands/logs.py +0 -40
- adam/commands/ls.py +0 -146
- adam/commands/postgres/postgres_context.py +0 -239
- adam/commands/postgres/postgres_utils.py +0 -31
- adam/commands/postgres/psql_completions.py +0 -10
- adam/commands/pwd.py +0 -77
- adam/commands/reaper/reaper_session.py +0 -159
- adam/commands/report.py +0 -63
- adam/commands/show/show.py +0 -54
- adam/commands/show/show_app_actions.py +0 -56
- adam/commands/show/show_cassandra_status.py +0 -128
- adam/commands/show/show_commands.py +0 -61
- adam/commands/show/show_login.py +0 -63
- adam/commands/show/show_processes.py +0 -53
- adam/commands/show/show_repairs.py +0 -47
- adam/commands/show/show_storage.py +0 -52
- kaqing-2.0.110.dist-info/RECORD +0 -187
- kaqing-2.0.110.dist-info/top_level.txt +0 -1
- /adam/commands/{show → app}/__init__.py +0 -0
- /adam/commands/{nodetool_commands.py → nodetool/nodetool_commands.py} +0 -0
- {kaqing-2.0.110.dist-info → kaqing-2.0.214.dist-info}/WHEEL +0 -0
- {kaqing-2.0.110.dist-info → kaqing-2.0.214.dist-info}/entry_points.txt +0 -0
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
from datetime import datetime
|
|
2
|
+
from functools import partial
|
|
2
3
|
|
|
3
|
-
from adam.commands
|
|
4
|
+
from adam.commands import validate_args
|
|
5
|
+
from adam.commands.command import Command, InvalidArgumentsException
|
|
6
|
+
from adam.commands.medusa.utils_medusa import medusa_backup_names
|
|
4
7
|
from adam.utils_k8s.statefulsets import StatefulSets
|
|
5
8
|
from adam.repl_state import ReplState, RequiredState
|
|
6
9
|
from adam.utils_k8s.custom_resources import CustomResources
|
|
7
|
-
from adam.
|
|
8
|
-
from adam.utils import lines_to_tabular, log2
|
|
10
|
+
from adam.utils import tabulize, log2, log_exc
|
|
9
11
|
|
|
10
12
|
class MedusaRestore(Command):
|
|
11
13
|
COMMAND = 'restore'
|
|
@@ -28,58 +30,43 @@ class MedusaRestore(Command):
|
|
|
28
30
|
def run(self, cmd: str, state: ReplState):
|
|
29
31
|
if not(args := self.args(cmd)):
|
|
30
32
|
return super().run(cmd, state)
|
|
31
|
-
state, args = self.apply_state(args, state)
|
|
32
|
-
if not self.validate_state(state):
|
|
33
|
-
return state
|
|
34
|
-
|
|
35
|
-
ns = state.namespace
|
|
36
|
-
dc = StatefulSets.get_datacenter(state.sts, ns)
|
|
37
|
-
if not dc:
|
|
38
|
-
return state
|
|
39
|
-
|
|
40
|
-
if len(args) == 1:
|
|
41
|
-
bkname = args[0]
|
|
42
|
-
job = CustomResources.medusa_get_backupjob(dc, ns, bkname)
|
|
43
|
-
if not job:
|
|
44
|
-
log2('\n* Backup job name is not valid.')
|
|
45
|
-
bklist = [f"{x['metadata']['name']}\t{x['metadata']['creationTimestamp']}\t{x['status'].get('finishTime', '')}" for x in CustomResources.medusa_show_backupjobs(dc, ns)]
|
|
46
|
-
log2(lines_to_tabular(bklist, 'NAME\tCREATED\tFINISHED', separator='\t'))
|
|
47
33
|
|
|
34
|
+
with self.validate(args, state) as (args, state):
|
|
35
|
+
ns = state.namespace
|
|
36
|
+
dc: str = StatefulSets.get_datacenter(state.sts, ns)
|
|
37
|
+
if not dc:
|
|
48
38
|
return state
|
|
49
39
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
log2(lines_to_tabular(bklist, 'NAME\tCREATED\tFINISHED', separator='\t'))
|
|
57
|
-
return state
|
|
58
|
-
|
|
59
|
-
now_dtformat = datetime.now().strftime("%Y-%m-%d.%H.%M.%S")
|
|
60
|
-
rtname = 'medusa-' + now_dtformat + '-restore-from-' + bkname
|
|
61
|
-
try:
|
|
62
|
-
CustomResources.create_medusa_restorejob(rtname, bkname, dc, ns)
|
|
63
|
-
except Exception as e:
|
|
64
|
-
log2("Exception: MedusaRestore failed: %s\n" % e)
|
|
65
|
-
|
|
66
|
-
return state
|
|
40
|
+
def msg(missing: bool):
|
|
41
|
+
if missing:
|
|
42
|
+
log2('\n* Missing Backup Name')
|
|
43
|
+
log2('Usage: qing restore <backup> <sts@name_space>\n')
|
|
44
|
+
else:
|
|
45
|
+
log2('\n* Backup job name is not valid.')
|
|
67
46
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
47
|
+
tabulize(CustomResources.medusa_show_backupjobs(dc, ns),
|
|
48
|
+
lambda x: f"{x['metadata']['name']}\t{x['metadata']['creationTimestamp']}\t{x['status'].get('finishTime', '')}",
|
|
49
|
+
header='NAME\tCREATED\tFINISHED',
|
|
50
|
+
separator='\t',
|
|
51
|
+
to=2)
|
|
52
|
+
|
|
53
|
+
with validate_args(args, state, msg=partial(msg, True)) as bkname:
|
|
54
|
+
if not (job := CustomResources.medusa_get_backupjob(dc, ns, bkname)):
|
|
55
|
+
msg(False)
|
|
56
|
+
raise InvalidArgumentsException()
|
|
74
57
|
|
|
75
|
-
|
|
76
|
-
|
|
58
|
+
if not input(f"Restoring from {bkname} created at {job['metadata']['creationTimestamp']}. Please enter Yes to continue: ").lower() in ['y', 'yes']:
|
|
59
|
+
return state
|
|
77
60
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
61
|
+
with log_exc(lambda e: "Exception: MedusaRestore failed: %s\n" % e):
|
|
62
|
+
now_dtformat = datetime.now().strftime("%Y-%m-%d.%H.%M.%S")
|
|
63
|
+
rtname = 'medusa-' + now_dtformat + '-restore-from-' + bkname
|
|
64
|
+
CustomResources.create_medusa_restorejob(rtname, bkname, dc, ns)
|
|
81
65
|
|
|
82
|
-
|
|
66
|
+
return state
|
|
67
|
+
|
|
68
|
+
def completion(self, state: ReplState):
|
|
69
|
+
return super().completion(state, lambda: {id: None for id in medusa_backup_names(state)}, auto_key='medusa.backups')
|
|
83
70
|
|
|
84
71
|
def help(self, _: ReplState):
|
|
85
72
|
return f'{MedusaRestore.COMMAND}\t start a restore job'
|
|
@@ -2,7 +2,7 @@ from adam.commands.command import Command
|
|
|
2
2
|
from adam.utils_k8s.statefulsets import StatefulSets
|
|
3
3
|
from adam.repl_state import ReplState, RequiredState
|
|
4
4
|
from adam.utils_k8s.custom_resources import CustomResources
|
|
5
|
-
from adam.utils import
|
|
5
|
+
from adam.utils import tabulize, log_exc
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
class MedusaShowBackupJobs(Command):
|
|
@@ -26,28 +26,26 @@ class MedusaShowBackupJobs(Command):
|
|
|
26
26
|
def run(self, cmd: str, state: ReplState):
|
|
27
27
|
if not(args := self.args(cmd)):
|
|
28
28
|
return super().run(cmd, state)
|
|
29
|
-
state, args = self.apply_state(args, state)
|
|
30
|
-
if not self.validate_state(state):
|
|
31
|
-
return state
|
|
32
29
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
30
|
+
with self.validate(args, state) as (args, state):
|
|
31
|
+
ns = state.namespace
|
|
32
|
+
dc = StatefulSets.get_datacenter(state.sts, ns)
|
|
33
|
+
if not dc:
|
|
34
|
+
return state
|
|
37
35
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
log2(lines_to_tabular(bklist, 'NAME\tCREATED\tFINISHED', separator='\t'))
|
|
41
|
-
except Exception as e:
|
|
42
|
-
log2("Exception: MedusaShowBackupJobs failed: %s\n" % e)
|
|
36
|
+
with log_exc(lambda e: "Exception: MedusaShowBackupJobs failed: %s\n" % e):
|
|
37
|
+
CustomResources.clear_caches()
|
|
43
38
|
|
|
44
|
-
|
|
39
|
+
tabulize(CustomResources.medusa_show_backupjobs(dc, ns),
|
|
40
|
+
lambda x: f"{x['metadata']['name']}\t{x['metadata']['creationTimestamp']}\t{x['status'].get('finishTime', '') if 'status' in x else 'unknown'}",
|
|
41
|
+
header='NAME\tCREATED\tFINISHED',
|
|
42
|
+
separator='\t',
|
|
43
|
+
to=2)
|
|
45
44
|
|
|
46
|
-
|
|
47
|
-
if state.sts:
|
|
48
|
-
return super().completion(state)
|
|
45
|
+
return state
|
|
49
46
|
|
|
50
|
-
|
|
47
|
+
def completion(self, state: ReplState):
|
|
48
|
+
return super().completion(state)
|
|
51
49
|
|
|
52
50
|
def help(self, _: ReplState):
|
|
53
51
|
return f'{MedusaShowBackupJobs.COMMAND}\t show Medusa backups'
|
|
@@ -2,7 +2,7 @@ from adam.commands.command import Command
|
|
|
2
2
|
from adam.utils_k8s.statefulsets import StatefulSets
|
|
3
3
|
from adam.repl_state import ReplState, RequiredState
|
|
4
4
|
from adam.utils_k8s.custom_resources import CustomResources
|
|
5
|
-
from adam.utils import
|
|
5
|
+
from adam.utils import tabulize, log_exc
|
|
6
6
|
|
|
7
7
|
class MedusaShowRestoreJobs(Command):
|
|
8
8
|
COMMAND = 'show restores'
|
|
@@ -25,28 +25,23 @@ class MedusaShowRestoreJobs(Command):
|
|
|
25
25
|
def run(self, cmd: str, state: ReplState):
|
|
26
26
|
if not(args := self.args(cmd)):
|
|
27
27
|
return super().run(cmd, state)
|
|
28
|
-
state, args = self.apply_state(args, state)
|
|
29
|
-
if not self.validate_state(state):
|
|
30
|
-
return state
|
|
31
28
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
29
|
+
with self.validate(args, state) as (args, state):
|
|
30
|
+
ns = state.namespace
|
|
31
|
+
dc = StatefulSets.get_datacenter(state.sts, ns)
|
|
32
|
+
if not dc:
|
|
33
|
+
return state
|
|
36
34
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
35
|
+
with log_exc(lambda e: "Exception: MedusaShowRestoreJobs failed: %s\n" % e):
|
|
36
|
+
tabulize(CustomResources.medusa_show_restorejobs(dc, ns),
|
|
37
|
+
header='NAME\tCREATED\tFINISHED',
|
|
38
|
+
separator='\t',
|
|
39
|
+
to=2)
|
|
42
40
|
|
|
43
|
-
|
|
41
|
+
return state
|
|
44
42
|
|
|
45
43
|
def completion(self, state: ReplState):
|
|
46
|
-
|
|
47
|
-
return super().completion(state)
|
|
48
|
-
|
|
49
|
-
return {}
|
|
44
|
+
return super().completion(state)
|
|
50
45
|
|
|
51
46
|
def help(self, _: ReplState):
|
|
52
47
|
return f'{MedusaShowRestoreJobs.COMMAND}\t show Medusa restores'
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
from adam.config import Config
|
|
2
|
+
from adam.repl_state import ReplState
|
|
3
|
+
from adam.utils_k8s.custom_resources import CustomResources
|
|
4
|
+
from adam.utils_k8s.statefulsets import StatefulSets
|
|
5
|
+
|
|
6
|
+
def medusa_backup_names(state: ReplState, warm=False):
|
|
7
|
+
if warm and (auto := Config().get('medusa.restore-auto-complete', 'off')) in ['off', 'jit', 'lazy']:
|
|
8
|
+
return {}
|
|
9
|
+
|
|
10
|
+
ns = state.namespace
|
|
11
|
+
dc: str = StatefulSets.get_datacenter(state.sts, ns)
|
|
12
|
+
if not dc:
|
|
13
|
+
return {}
|
|
14
|
+
|
|
15
|
+
return {id: None for id in [f"{x['metadata']['name']}" for x in CustomResources.medusa_show_backupjobs(dc, ns)]}
|
|
File without changes
|
|
@@ -2,10 +2,10 @@ import click
|
|
|
2
2
|
|
|
3
3
|
from adam.commands.command import Command
|
|
4
4
|
from adam.commands.command_helpers import ClusterOrPodCommandHelper
|
|
5
|
-
from adam.commands.
|
|
5
|
+
from adam.commands.cql.utils_cql import cassandra
|
|
6
|
+
from adam.commands.devices.devices import Devices
|
|
7
|
+
from adam.commands.nodetool.nodetool_commands import NODETOOL_COMMANDS
|
|
6
8
|
from adam.config import Config
|
|
7
|
-
from adam.utils_k8s.cassandra_clusters import CassandraClusters
|
|
8
|
-
from adam.utils_k8s.cassandra_nodes import CassandraNodes
|
|
9
9
|
from adam.repl_state import ReplState, RequiredState
|
|
10
10
|
from adam.utils import log
|
|
11
11
|
|
|
@@ -31,28 +31,17 @@ class NodeTool(Command):
|
|
|
31
31
|
if not(args := self.args(cmd)):
|
|
32
32
|
return super().run(cmd, state)
|
|
33
33
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
user, pw = state.user_pass()
|
|
39
|
-
command = f"nodetool -u {user} -pw {pw} {' '.join(args)}"
|
|
40
|
-
|
|
41
|
-
if state.pod:
|
|
42
|
-
return CassandraNodes.exec(state.pod, state.namespace, command, show_out=True)
|
|
43
|
-
elif state.sts:
|
|
44
|
-
return CassandraClusters.exec(state.sts, state.namespace, command, action='nodetool', show_out=True)
|
|
34
|
+
with self.validate(args, state) as (args, state):
|
|
35
|
+
with cassandra(state) as pods:
|
|
36
|
+
pods.nodetool(' '.join(args), status=(args[0] == 'status'))
|
|
45
37
|
|
|
46
|
-
|
|
38
|
+
return state
|
|
47
39
|
|
|
48
40
|
def completion(self, state: ReplState):
|
|
49
|
-
|
|
50
|
-
return {NodeTool.COMMAND: {'help': None} | {c: {'&': None} for c in NODETOOL_COMMANDS}}
|
|
51
|
-
|
|
52
|
-
return {}
|
|
41
|
+
return super().completion(state, {c: {'&': None} for c in NODETOOL_COMMANDS}, pods=Devices.of(state).pods(state, '-'))
|
|
53
42
|
|
|
54
43
|
def help(self, _: ReplState):
|
|
55
|
-
return f'{NodeTool.COMMAND} <sub-command
|
|
44
|
+
return f'{NodeTool.COMMAND} <sub-command> [&]\t run nodetool with arguments'
|
|
56
45
|
|
|
57
46
|
class NodeToolCommandHelper(click.Command):
|
|
58
47
|
def get_help(self, ctx: click.Context):
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
from adam.commands.postgres.postgres_databases import PostgresDatabases
|
|
2
|
+
from adam.commands.postgres.utils_postgres import pg_table_names
|
|
3
|
+
from adam.repl_state import ReplState
|
|
4
|
+
from adam.sql.lark_completer import LarkCompleter
|
|
5
|
+
|
|
6
|
+
def completions_p(state: ReplState):
|
|
7
|
+
return {
|
|
8
|
+
'\h': None,
|
|
9
|
+
'\d': None,
|
|
10
|
+
'\dt': None,
|
|
11
|
+
'\du': None
|
|
12
|
+
} | LarkCompleter(expandables={
|
|
13
|
+
'tables': lambda x: pg_table_names(state),
|
|
14
|
+
'columns': ['id'],
|
|
15
|
+
'hosts': ['@' + PostgresDatabases.pod_and_container(state.namespace)[0]],
|
|
16
|
+
}, variant=ReplState.P).completions_for_nesting()
|
|
17
|
+
|
|
18
|
+
def psql0_completions(state: ReplState):
|
|
19
|
+
return {
|
|
20
|
+
'\h': None,
|
|
21
|
+
'\l': None,
|
|
22
|
+
}
|
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
import click
|
|
2
2
|
|
|
3
|
+
from adam.commands import extract_trailing_options, validate_args
|
|
3
4
|
from adam.commands.command import Command
|
|
4
|
-
from adam.commands.
|
|
5
|
-
from adam.commands.postgres.
|
|
5
|
+
from adam.commands.intermediate_command import IntermediateCommand
|
|
6
|
+
from adam.commands.postgres.postgres_databases import pg_path
|
|
7
|
+
from adam.commands.postgres.completions_p import psql0_completions, completions_p
|
|
8
|
+
from adam.commands.postgres.utils_postgres import pg_table_names, postgres
|
|
6
9
|
from .postgres_ls import PostgresLs
|
|
7
10
|
from .postgres_preview import PostgresPreview
|
|
8
|
-
from .postgres_context import PostgresContext
|
|
9
11
|
from adam.repl_state import ReplState
|
|
10
|
-
from adam.utils import log, log2
|
|
12
|
+
from adam.utils import log, log2, log_timing
|
|
11
13
|
|
|
12
|
-
class Postgres(
|
|
14
|
+
class Postgres(IntermediateCommand):
|
|
13
15
|
COMMAND = 'pg'
|
|
14
|
-
reaper_login = None
|
|
15
16
|
|
|
16
17
|
# the singleton pattern
|
|
17
18
|
def __new__(cls, *args, **kwargs):
|
|
@@ -29,69 +30,60 @@ class Postgres(Command):
|
|
|
29
30
|
if not(args := self.args(cmd)):
|
|
30
31
|
return super().run(cmd, state)
|
|
31
32
|
|
|
32
|
-
|
|
33
|
+
with self.validate(args, state) as (args, state):
|
|
34
|
+
with extract_trailing_options(args, '&') as (args, backgrounded):
|
|
35
|
+
with validate_args(args, state, name='SQL statement') as sql:
|
|
36
|
+
if not state.pg_path:
|
|
37
|
+
if state.in_repl:
|
|
38
|
+
log2('Enter "use <pg-name>" first.')
|
|
39
|
+
else:
|
|
40
|
+
log2('* pg-name is missing.')
|
|
33
41
|
|
|
34
|
-
|
|
35
|
-
if state.in_repl:
|
|
36
|
-
log2('Please use SQL statement. e.g. pg \l')
|
|
37
|
-
else:
|
|
38
|
-
log2('* Command or SQL statements is missing.')
|
|
39
|
-
Command.display_help()
|
|
42
|
+
return state
|
|
40
43
|
|
|
41
|
-
|
|
44
|
+
if state.in_repl:
|
|
45
|
+
with postgres(state) as pod:
|
|
46
|
+
pod.sql(args, backgrounded=backgrounded)
|
|
47
|
+
elif not self.run_subcommand(cmd, state):
|
|
48
|
+
with postgres(state) as pod:
|
|
49
|
+
pod.sql(args, backgrounded=backgrounded)
|
|
42
50
|
|
|
43
|
-
|
|
44
|
-
self.run_sql(state, args)
|
|
45
|
-
else:
|
|
46
|
-
# head with the Chain of Responsibility pattern
|
|
47
|
-
cmds = Command.chain(Postgres.cmd_list())
|
|
48
|
-
if not cmds.run(cmd, state) :
|
|
49
|
-
self.run_sql(state, args)
|
|
51
|
+
return state
|
|
50
52
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
def cmd_list():
|
|
54
|
-
return [PostgresLs(), PostgresPreview()]
|
|
55
|
-
|
|
56
|
-
def run_sql(self, state: ReplState, args: list[str]):
|
|
57
|
-
if not state.pg_path:
|
|
58
|
-
if state.in_repl:
|
|
59
|
-
log2('Enter "use <pg-name>" first.')
|
|
60
|
-
else:
|
|
61
|
-
log2('* pg-name is missing.')
|
|
62
|
-
|
|
63
|
-
return state
|
|
64
|
-
|
|
65
|
-
PostgresContext.apply(state.namespace, state.pg_path).run_sql(' '.join(args))
|
|
53
|
+
def cmd_list(self):
|
|
54
|
+
return [PostgresLs(), PostgresPreview(), PostgresPg()]
|
|
66
55
|
|
|
67
56
|
def completion(self, state: ReplState):
|
|
68
57
|
if state.device != state.P:
|
|
69
|
-
# conflicts with cql completions
|
|
70
58
|
return {}
|
|
71
59
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
if state.pg_path:
|
|
84
|
-
return super().completion(state, leaf) | leaf
|
|
85
|
-
else:
|
|
86
|
-
return {}
|
|
60
|
+
with pg_path(state) as (host, database):
|
|
61
|
+
if database:
|
|
62
|
+
if pg_table_names(state):
|
|
63
|
+
with log_timing('psql_completions'):
|
|
64
|
+
return completions_p(state)
|
|
65
|
+
elif host:
|
|
66
|
+
return psql0_completions(state)
|
|
67
|
+
|
|
68
|
+
return {}
|
|
87
69
|
|
|
88
70
|
def help(self, _: ReplState):
|
|
89
|
-
return f'
|
|
71
|
+
return f'<sql-statements> [&]\t run queries on Postgres databases'
|
|
90
72
|
|
|
91
73
|
class PostgresCommandHelper(click.Command):
|
|
92
74
|
def get_help(self, ctx: click.Context):
|
|
93
|
-
|
|
75
|
+
IntermediateCommand.intermediate_help(super().get_help(ctx), Postgres.COMMAND, Postgres().cmd_list(), show_cluster_help=True)
|
|
94
76
|
log('PG-Name: Kubernetes secret for Postgres credentials')
|
|
95
77
|
log(' e.g. stgawsscpsr-c3-c3-k8spg-cs-001')
|
|
96
78
|
log('Database: Postgres database name within a host')
|
|
97
|
-
log(' e.g. stgawsscpsr_c3_c3')
|
|
79
|
+
log(' e.g. stgawsscpsr_c3_c3')
|
|
80
|
+
|
|
81
|
+
# No action body, only for a help entry and auto-completion
|
|
82
|
+
class PostgresPg(Command):
|
|
83
|
+
COMMAND = 'pg'
|
|
84
|
+
|
|
85
|
+
def command(self):
|
|
86
|
+
return PostgresPg.COMMAND
|
|
87
|
+
|
|
88
|
+
def help(self, _: ReplState):
|
|
89
|
+
return f'pg <sql-statements>\t run queries on Postgres databases'
|