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
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import click
|
|
2
|
+
|
|
3
|
+
from adam.commands.intermediate_command import IntermediateCommand
|
|
4
|
+
from adam.commands.medusa.medusa_show_backupjobs import MedusaShowBackupJobs
|
|
5
|
+
from adam.commands.medusa.medusa_show_restorejobs import MedusaShowRestoreJobs
|
|
6
|
+
from adam.commands.show.show_app_actions import ShowAppActions
|
|
7
|
+
from adam.commands.show.show_app_queues import ShowAppQueues
|
|
8
|
+
from adam.commands.show.show_host import ShowHost
|
|
9
|
+
from adam.commands.show.show_login import ShowLogin
|
|
10
|
+
from .show_params import ShowParams
|
|
11
|
+
from .show_app_id import ShowAppId
|
|
12
|
+
from .show_cassandra_status import ShowCassandraStatus
|
|
13
|
+
from .show_cassandra_version import ShowCassandraVersion
|
|
14
|
+
from .show_commands import ShowKubectlCommands
|
|
15
|
+
from .show_processes import ShowProcesses
|
|
16
|
+
from .show_cassandra_repairs import ShowCassandraRepairs
|
|
17
|
+
from .show_storage import ShowStorage
|
|
18
|
+
from .show_adam import ShowAdam
|
|
19
|
+
|
|
20
|
+
class Show(IntermediateCommand):
|
|
21
|
+
COMMAND = 'show'
|
|
22
|
+
|
|
23
|
+
# the singleton pattern
|
|
24
|
+
def __new__(cls, *args, **kwargs):
|
|
25
|
+
if not hasattr(cls, 'instance'): cls.instance = super(Show, cls).__new__(cls)
|
|
26
|
+
|
|
27
|
+
return cls.instance
|
|
28
|
+
|
|
29
|
+
def command(self):
|
|
30
|
+
return Show.COMMAND
|
|
31
|
+
|
|
32
|
+
def cmd_list(self):
|
|
33
|
+
return [ShowAppActions(), ShowAppId(), ShowAppQueues(), ShowHost(), ShowLogin(), ShowKubectlCommands(),
|
|
34
|
+
ShowParams(), ShowProcesses(), ShowCassandraRepairs(), ShowStorage(), ShowAdam(),
|
|
35
|
+
ShowCassandraStatus(), ShowCassandraVersion(), MedusaShowRestoreJobs(), MedusaShowBackupJobs()]
|
|
36
|
+
|
|
37
|
+
class ShowCommandHelper(click.Command):
|
|
38
|
+
def get_help(self, ctx: click.Context):
|
|
39
|
+
IntermediateCommand.intermediate_help(super().get_help(ctx), Show.COMMAND, Show().cmd_list(), show_cluster_help=True)
|
|
@@ -1,25 +1,24 @@
|
|
|
1
1
|
import sys
|
|
2
2
|
import os
|
|
3
3
|
|
|
4
|
-
from
|
|
4
|
+
from adam.utils import lines_to_tabular, log2
|
|
5
5
|
|
|
6
6
|
current_dir = os.path.dirname(os.path.abspath(__file__))
|
|
7
|
-
# sys.path.append(os.path.dirname(current_dir))
|
|
8
7
|
|
|
9
8
|
parent_dir = os.path.dirname(current_dir)
|
|
10
9
|
grandparent_dir = os.path.dirname(parent_dir)
|
|
11
10
|
sys.path.append(grandparent_dir)
|
|
12
11
|
|
|
13
12
|
from version import __version__
|
|
14
|
-
from
|
|
15
|
-
from
|
|
13
|
+
from adam.commands.command import Command
|
|
14
|
+
from adam.repl_state import ReplState
|
|
16
15
|
|
|
17
|
-
class
|
|
18
|
-
COMMAND = 'show
|
|
16
|
+
class ShowAdam(Command):
|
|
17
|
+
COMMAND = 'show adam'
|
|
19
18
|
|
|
20
19
|
# the singleton pattern
|
|
21
20
|
def __new__(cls, *args, **kwargs):
|
|
22
|
-
if not hasattr(cls, 'instance'): cls.instance = super(
|
|
21
|
+
if not hasattr(cls, 'instance'): cls.instance = super(ShowAdam, cls).__new__(cls)
|
|
23
22
|
|
|
24
23
|
return cls.instance
|
|
25
24
|
|
|
@@ -27,13 +26,18 @@ class ShowVersion(Command):
|
|
|
27
26
|
super().__init__(successor)
|
|
28
27
|
|
|
29
28
|
def command(self):
|
|
30
|
-
return
|
|
29
|
+
return ShowAdam.COMMAND
|
|
31
30
|
|
|
32
31
|
def run(self, cmd: str, state: ReplState):
|
|
33
32
|
if not self.args(cmd):
|
|
34
33
|
return super().run(cmd, state)
|
|
35
34
|
|
|
36
|
-
|
|
35
|
+
package = os.path.dirname(os.path.abspath(__file__))
|
|
36
|
+
package = package.split('/adam/')[0] + '/adam'
|
|
37
|
+
log2(lines_to_tabular([
|
|
38
|
+
f'version\t{__version__}',
|
|
39
|
+
f'source\t{package}'
|
|
40
|
+
], separator='\t'))
|
|
37
41
|
|
|
38
42
|
return state
|
|
39
43
|
|
|
@@ -41,4 +45,4 @@ class ShowVersion(Command):
|
|
|
41
45
|
return super().completion(state)
|
|
42
46
|
|
|
43
47
|
def help(self, _: ReplState):
|
|
44
|
-
return f'{
|
|
48
|
+
return f'{ShowAdam.COMMAND}\t show kaqing version'
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
from adam.app_session import AppSession
|
|
2
|
+
from adam.apps import AppAction, Apps
|
|
3
|
+
from adam.commands.command import Command
|
|
4
|
+
from adam.config import Config
|
|
5
|
+
from adam.repl_state import ReplState
|
|
6
|
+
from adam.utils import lines_to_tabular, log
|
|
7
|
+
|
|
8
|
+
class ShowAppActions(Command):
|
|
9
|
+
COMMAND = 'show app actions'
|
|
10
|
+
|
|
11
|
+
# the singleton pattern
|
|
12
|
+
def __new__(cls, *args, **kwargs):
|
|
13
|
+
if not hasattr(cls, 'instance'): cls.instance = super(ShowAppActions, cls).__new__(cls)
|
|
14
|
+
|
|
15
|
+
return cls.instance
|
|
16
|
+
|
|
17
|
+
def __init__(self, successor: Command=None):
|
|
18
|
+
super().__init__(successor)
|
|
19
|
+
|
|
20
|
+
def command(self):
|
|
21
|
+
return ShowAppActions.COMMAND
|
|
22
|
+
|
|
23
|
+
def required(self):
|
|
24
|
+
return ReplState.A
|
|
25
|
+
|
|
26
|
+
def run(self, cmd: str, state: ReplState):
|
|
27
|
+
if not (args := self.args(cmd)):
|
|
28
|
+
return super().run(cmd, state)
|
|
29
|
+
|
|
30
|
+
with self.validate(args, state) as (args, state):
|
|
31
|
+
lines = []
|
|
32
|
+
for typ in Apps().app_types():
|
|
33
|
+
for action in typ.actions:
|
|
34
|
+
a: AppAction = action
|
|
35
|
+
args = ','.join(a.arguments())
|
|
36
|
+
if args:
|
|
37
|
+
line = f'{typ.name}.{a.name},{args}'
|
|
38
|
+
else:
|
|
39
|
+
line = f'{typ.name}.{a.name},'
|
|
40
|
+
if a.help:
|
|
41
|
+
line = f'{line},{a.help}'
|
|
42
|
+
lines.append(line)
|
|
43
|
+
log(lines_to_tabular(lines, 'ACTION,ARGS,DESCRIPTION', separator=','))
|
|
44
|
+
log()
|
|
45
|
+
|
|
46
|
+
app_session: AppSession = AppSession.create(state.app_env or 'c3', state.app_app or 'c3')
|
|
47
|
+
endpoint = Config().get('app.console-endpoint', 'https://{host}/{env}/{app}/static/console/index.html')
|
|
48
|
+
endpoint = endpoint.replace('{host}', app_session.host).replace('{env}', app_session.env).replace('{app}', state.app_app or 'c3')
|
|
49
|
+
log(lines_to_tabular([f'CONSOLE:,{endpoint}'], separator=','))
|
|
50
|
+
|
|
51
|
+
return lines
|
|
52
|
+
|
|
53
|
+
def completion(self, state: ReplState):
|
|
54
|
+
return super().completion(state)
|
|
55
|
+
|
|
56
|
+
def help(self, _: ReplState):
|
|
57
|
+
return f"{ShowAppActions.COMMAND}\t show app actions"
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
from
|
|
2
|
-
from
|
|
3
|
-
from
|
|
4
|
-
from
|
|
1
|
+
from adam.commands.command import Command
|
|
2
|
+
from adam.utils_k8s.custom_resources import CustomResources
|
|
3
|
+
from adam.repl_state import ReplState, RequiredState
|
|
4
|
+
from adam.utils import log
|
|
5
5
|
|
|
6
6
|
class ShowAppId(Command):
|
|
7
7
|
COMMAND = 'show app id'
|
|
@@ -25,20 +25,17 @@ class ShowAppId(Command):
|
|
|
25
25
|
if not(args := self.args(cmd)):
|
|
26
26
|
return super().run(cmd, state)
|
|
27
27
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
return state
|
|
28
|
+
with self.validate(args, state) as (args, state):
|
|
29
|
+
c3_app_id = 'Unknown'
|
|
31
30
|
|
|
32
|
-
|
|
31
|
+
apps = CustomResources.get_app_ids()
|
|
32
|
+
cr_name = CustomResources.get_cr_name(state.sts if state.sts else state.pod, namespace=state.namespace)
|
|
33
|
+
if cr_name in apps:
|
|
34
|
+
c3_app_id = (apps[cr_name])
|
|
33
35
|
|
|
34
|
-
|
|
35
|
-
cr_name = CustomResources.get_cr_name(state.sts if state.sts else state.pod, namespace=state.namespace)
|
|
36
|
-
if cr_name in apps:
|
|
37
|
-
c3_app_id = (apps[cr_name])
|
|
36
|
+
log(c3_app_id)
|
|
38
37
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
return c3_app_id
|
|
38
|
+
return c3_app_id
|
|
42
39
|
|
|
43
40
|
def completion(self, state: ReplState):
|
|
44
41
|
return super().completion(state)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
from
|
|
2
|
-
from
|
|
3
|
-
from
|
|
1
|
+
from adam.commands import app, extract_options
|
|
2
|
+
from adam.commands.command import Command
|
|
3
|
+
from adam.repl_state import ReplState, RequiredState
|
|
4
4
|
|
|
5
5
|
class ShowAppQueues(Command):
|
|
6
6
|
COMMAND = 'show app queues'
|
|
@@ -18,21 +18,18 @@ class ShowAppQueues(Command):
|
|
|
18
18
|
return ShowAppQueues.COMMAND
|
|
19
19
|
|
|
20
20
|
def required(self):
|
|
21
|
-
return RequiredState.
|
|
21
|
+
return RequiredState.APP_APP
|
|
22
22
|
|
|
23
23
|
def run(self, cmd: str, state: ReplState):
|
|
24
24
|
if not(args := self.args(cmd)):
|
|
25
25
|
return super().run(cmd, state)
|
|
26
26
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
27
|
+
with self.validate(args, state) as (_, state):
|
|
28
|
+
with extract_options(args, '--force') as (args, forced):
|
|
29
|
+
with app(state) as http:
|
|
30
|
+
http.post(['InvalidationQueue.countAll'], forced=forced)
|
|
30
31
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
AppSession.run(state.app_env, state.app_app, state.namespace, 'InvalidationQueue', 'countAll', forced= forced)
|
|
34
|
-
|
|
35
|
-
return state
|
|
32
|
+
return state
|
|
36
33
|
|
|
37
34
|
def completion(self, state: ReplState):
|
|
38
35
|
if state.app_app:
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
from adam.commands.command import Command
|
|
2
|
+
from adam.commands.cql.utils_cql import cassandra
|
|
3
|
+
from adam.repl_state import ReplState, RequiredState
|
|
4
|
+
|
|
5
|
+
class ShowCassandraRepairs(Command):
|
|
6
|
+
COMMAND = 'show cassandra repairs'
|
|
7
|
+
|
|
8
|
+
# the singleton pattern
|
|
9
|
+
def __new__(cls, *args, **kwargs):
|
|
10
|
+
if not hasattr(cls, 'instance'): cls.instance = super(ShowCassandraRepairs, cls).__new__(cls)
|
|
11
|
+
|
|
12
|
+
return cls.instance
|
|
13
|
+
|
|
14
|
+
def __init__(self, successor: Command=None):
|
|
15
|
+
super().__init__(successor)
|
|
16
|
+
|
|
17
|
+
def command(self):
|
|
18
|
+
return ShowCassandraRepairs.COMMAND
|
|
19
|
+
|
|
20
|
+
def required(self):
|
|
21
|
+
return RequiredState.CLUSTER_OR_POD
|
|
22
|
+
|
|
23
|
+
def run(self, cmd: str, state: ReplState):
|
|
24
|
+
if not(args := self.args(cmd)):
|
|
25
|
+
return super().run(cmd, state)
|
|
26
|
+
|
|
27
|
+
with self.validate(args, state) as (args, state):
|
|
28
|
+
with cassandra(state) as pods:
|
|
29
|
+
return pods.nodetool('repair_admin list')
|
|
30
|
+
|
|
31
|
+
def completion(self, state: ReplState):
|
|
32
|
+
if state.sts:
|
|
33
|
+
return super().completion(state)
|
|
34
|
+
|
|
35
|
+
return {}
|
|
36
|
+
|
|
37
|
+
def help(self, _: ReplState):
|
|
38
|
+
return f'{ShowCassandraRepairs.COMMAND}\t show Cassandra repairs'
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import sys
|
|
2
|
+
|
|
3
|
+
from adam.checks.check_result import CheckResult
|
|
4
|
+
from adam.checks.check_utils import run_checks
|
|
5
|
+
from adam.checks.compactionstats import CompactionStats
|
|
6
|
+
from adam.checks.gossip import Gossip
|
|
7
|
+
from adam.columns.columns import Columns
|
|
8
|
+
from adam.commands import extract_options
|
|
9
|
+
from adam.commands.command import Command
|
|
10
|
+
from adam.commands.cql.utils_cql import cassandra
|
|
11
|
+
from adam.config import Config
|
|
12
|
+
from adam.utils_issues import IssuesUtils
|
|
13
|
+
from adam.utils_k8s.statefulsets import StatefulSets
|
|
14
|
+
from adam.repl_state import ReplState, RequiredState
|
|
15
|
+
from adam.utils import lines_to_tabular, log, log2
|
|
16
|
+
from adam.checks.status import parse_nodetool_status
|
|
17
|
+
|
|
18
|
+
class ShowCassandraStatus(Command):
|
|
19
|
+
COMMAND = 'show cassandra status'
|
|
20
|
+
|
|
21
|
+
# the singleton pattern
|
|
22
|
+
def __new__(cls, *args, **kwargs):
|
|
23
|
+
if not hasattr(cls, 'instance'): cls.instance = super(ShowCassandraStatus, cls).__new__(cls)
|
|
24
|
+
|
|
25
|
+
return cls.instance
|
|
26
|
+
|
|
27
|
+
def __init__(self, successor: Command=None):
|
|
28
|
+
super().__init__(successor)
|
|
29
|
+
|
|
30
|
+
def command(self):
|
|
31
|
+
return ShowCassandraStatus.COMMAND
|
|
32
|
+
|
|
33
|
+
def required(self):
|
|
34
|
+
return RequiredState.CLUSTER_OR_POD
|
|
35
|
+
|
|
36
|
+
def run(self, cmd: str, state: ReplState):
|
|
37
|
+
if not(args := self.args(cmd)):
|
|
38
|
+
return super().run(cmd, state)
|
|
39
|
+
|
|
40
|
+
with self.validate(args, state) as (args, state):
|
|
41
|
+
with extract_options(args, ['-s', '--show']) as (args, show_out):
|
|
42
|
+
if state.namespace and state.pod:
|
|
43
|
+
self.show_single_pod(state, show_out=show_out)
|
|
44
|
+
elif state.namespace and state.sts:
|
|
45
|
+
self.merge(state, Config().get('nodetool.samples', sys.maxsize), show_output=show_out)
|
|
46
|
+
|
|
47
|
+
return state
|
|
48
|
+
|
|
49
|
+
def show_single_pod(self, state: ReplState, show_out = False):
|
|
50
|
+
try:
|
|
51
|
+
with cassandra(state) as pods:
|
|
52
|
+
result = pods.nodetool('status', show_out=False)
|
|
53
|
+
status = parse_nodetool_status(result.stdout)
|
|
54
|
+
check_results = run_checks(cluster=state.sts, namespace=state.namespace, checks=[CompactionStats(), Gossip()], show_out=show_out)
|
|
55
|
+
self.show_table(status, check_results)
|
|
56
|
+
except Exception as e:
|
|
57
|
+
log2(e)
|
|
58
|
+
|
|
59
|
+
def merge(self, state: ReplState, samples: int, show_output=False):
|
|
60
|
+
statuses: list[list[dict]] = []
|
|
61
|
+
|
|
62
|
+
pod_names = StatefulSets.pod_names(state.sts, state.namespace)
|
|
63
|
+
for pod_name in pod_names:
|
|
64
|
+
pod_name = pod_name.split('(')[0]
|
|
65
|
+
|
|
66
|
+
try:
|
|
67
|
+
with cassandra(state, pod=pod_name) as pods:
|
|
68
|
+
result = pods.nodetool('status', show_out=False)
|
|
69
|
+
status = parse_nodetool_status(result.stdout)
|
|
70
|
+
if status:
|
|
71
|
+
statuses.append(status)
|
|
72
|
+
if samples <= len(statuses) and len(pod_names) != len(statuses):
|
|
73
|
+
break
|
|
74
|
+
except Exception as e:
|
|
75
|
+
log2(e)
|
|
76
|
+
|
|
77
|
+
combined_status = self.merge_status(statuses)
|
|
78
|
+
log2(f'Showing merged status from {len(statuses)}/{len(pod_names)} nodes...')
|
|
79
|
+
check_results = run_checks(cluster=state.sts, namespace=state.namespace, checks=[CompactionStats(), Gossip()], show_out=show_output)
|
|
80
|
+
self.show_table(combined_status, check_results)
|
|
81
|
+
|
|
82
|
+
return combined_status
|
|
83
|
+
|
|
84
|
+
def merge_status(self, statuses: list[list[dict]]):
|
|
85
|
+
combined = statuses[0]
|
|
86
|
+
|
|
87
|
+
status_by_host = {}
|
|
88
|
+
for status in statuses[0]:
|
|
89
|
+
status_by_host[status['host_id']] = status
|
|
90
|
+
for status in statuses[1:]:
|
|
91
|
+
for s in status:
|
|
92
|
+
if s['host_id'] in status_by_host:
|
|
93
|
+
c = status_by_host[s['host_id']]
|
|
94
|
+
if c['status'] == 'UN' and s['status'] == 'DN':
|
|
95
|
+
c['status'] = 'DN*'
|
|
96
|
+
else:
|
|
97
|
+
combined.append(s)
|
|
98
|
+
|
|
99
|
+
return combined
|
|
100
|
+
|
|
101
|
+
def show_table(self, status: list[dict[str, any]], check_results: list[CheckResult]):
|
|
102
|
+
cols = Config().get('status.columns', 'status,address,load,tokens,owns,host_id,gossip,compactions')
|
|
103
|
+
header = Config().get('status.header', '--,Address,Load,Tokens,Owns,Host ID,GOSSIP,COMPACTIONS')
|
|
104
|
+
columns = Columns.create_columns(cols)
|
|
105
|
+
|
|
106
|
+
def line(status: dict):
|
|
107
|
+
cells = [c.host_value(check_results, status) for c in columns]
|
|
108
|
+
return ','.join(cells)
|
|
109
|
+
|
|
110
|
+
lines = [line(d) for d in status]
|
|
111
|
+
lines.sort()
|
|
112
|
+
|
|
113
|
+
log(lines_to_tabular(lines, header, separator=','))
|
|
114
|
+
|
|
115
|
+
IssuesUtils.show(check_results)
|
|
116
|
+
|
|
117
|
+
def completion(self, state: ReplState):
|
|
118
|
+
if state.sts:
|
|
119
|
+
return super().completion(state, {'-s': None})
|
|
120
|
+
|
|
121
|
+
return {}
|
|
122
|
+
|
|
123
|
+
def help(self, _: ReplState):
|
|
124
|
+
return f'{ShowCassandraStatus.COMMAND} [-s]\t show merged nodetool status -s show commands on nodes'
|
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
from
|
|
2
|
-
from
|
|
3
|
-
from
|
|
4
|
-
from walker.k8s_utils.secrets import Secrets
|
|
5
|
-
from walker.repl_state import ReplState, RequiredState
|
|
1
|
+
from adam.commands.command import Command
|
|
2
|
+
from adam.commands.cql.utils_cql import cassandra
|
|
3
|
+
from adam.repl_state import ReplState, RequiredState
|
|
6
4
|
|
|
7
5
|
class ShowCassandraVersion(Command):
|
|
8
6
|
COMMAND = 'show cassandra version'
|
|
@@ -26,17 +24,9 @@ class ShowCassandraVersion(Command):
|
|
|
26
24
|
if not(args := self.args(cmd)):
|
|
27
25
|
return super().run(cmd, state)
|
|
28
26
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
user, pw = Secrets.get_user_pass(state.sts if state.sts else state.pod, state.namespace, secret_path='cql.secret')
|
|
34
|
-
command = f'cqlsh -u {user} -p {pw} -e "show version"'
|
|
35
|
-
|
|
36
|
-
if state.pod:
|
|
37
|
-
return CassandraNodes.exec(state.pod, state.namespace, command)
|
|
38
|
-
else:
|
|
39
|
-
return CassandraClusters.exec(state.sts, state.namespace, command, action='cql')
|
|
27
|
+
with self.validate(args, state) as (_, state):
|
|
28
|
+
with cassandra(state) as pods:
|
|
29
|
+
return pods.cql('show version', show_out=True, on_any=True)
|
|
40
30
|
|
|
41
31
|
def completion(self, state: ReplState):
|
|
42
32
|
if state.sts:
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
from adam.commands.command import Command
|
|
2
|
+
from adam.commands.cli_commands import CliCommands
|
|
3
|
+
from adam.repl_state import ReplState, RequiredState
|
|
4
|
+
from adam.utils import lines_to_tabular, log
|
|
5
|
+
|
|
6
|
+
class ShowKubectlCommands(Command):
|
|
7
|
+
COMMAND = 'show cli-commands'
|
|
8
|
+
|
|
9
|
+
# the singleton pattern
|
|
10
|
+
def __new__(cls, *args, **kwargs):
|
|
11
|
+
if not hasattr(cls, 'instance'): cls.instance = super(ShowKubectlCommands, 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 ShowKubectlCommands.COMMAND
|
|
20
|
+
|
|
21
|
+
def required(self):
|
|
22
|
+
return RequiredState.CLUSTER_OR_POD
|
|
23
|
+
|
|
24
|
+
def run(self, cmd: str, state: ReplState):
|
|
25
|
+
if not self.args(cmd):
|
|
26
|
+
return super().run(cmd, state)
|
|
27
|
+
|
|
28
|
+
with self.validate(args, state) as (args, state):
|
|
29
|
+
v = CliCommands.values(state, collapse=True)
|
|
30
|
+
# node-exec-?, nodetool-?, cql-?, reaper-exec, reaper-forward, reaper-ui, reaper-username, reaper-password
|
|
31
|
+
cmds = [
|
|
32
|
+
f'bash,{v["node-exec-?"]}',
|
|
33
|
+
f'nodetool,{v["nodetool-?"]}',
|
|
34
|
+
f'cql,{v["cql-?"]}',
|
|
35
|
+
]
|
|
36
|
+
|
|
37
|
+
if 'reaper-exec' in v:
|
|
38
|
+
cmds += [
|
|
39
|
+
f'reaper,{v["reaper-exec"]}',
|
|
40
|
+
f',{v["reaper-forward"]} * should be run from your laptop',
|
|
41
|
+
f',{v["reaper-ui"]}',
|
|
42
|
+
f',{v["reaper-username"]}',
|
|
43
|
+
f',{v["reaper-password"]}',
|
|
44
|
+
]
|
|
45
|
+
|
|
46
|
+
cmds += [f'{k},{v0}' for k, v0 in v.items() if k.startswith('pg-')]
|
|
47
|
+
|
|
48
|
+
log(lines_to_tabular(cmds, separator=','))
|
|
49
|
+
|
|
50
|
+
return cmds
|
|
51
|
+
|
|
52
|
+
def completion(self, state: ReplState):
|
|
53
|
+
if not state.sts:
|
|
54
|
+
return {}
|
|
55
|
+
|
|
56
|
+
return super().completion(state)
|
|
57
|
+
|
|
58
|
+
def help(self, _: ReplState):
|
|
59
|
+
return f"{ShowKubectlCommands.COMMAND}\t show kubectl commands"
|
|
@@ -1,13 +1,14 @@
|
|
|
1
|
-
from
|
|
2
|
-
from
|
|
3
|
-
from
|
|
1
|
+
from adam.commands.command import Command
|
|
2
|
+
from adam.repl_state import ReplState
|
|
3
|
+
from adam.utils import log
|
|
4
|
+
from adam.utils_net import get_my_host
|
|
4
5
|
|
|
5
|
-
class
|
|
6
|
-
COMMAND = 'show
|
|
6
|
+
class ShowHost(Command):
|
|
7
|
+
COMMAND = 'show host'
|
|
7
8
|
|
|
8
9
|
# the singleton pattern
|
|
9
10
|
def __new__(cls, *args, **kwargs):
|
|
10
|
-
if not hasattr(cls, 'instance'): cls.instance = super(
|
|
11
|
+
if not hasattr(cls, 'instance'): cls.instance = super(ShowHost, cls).__new__(cls)
|
|
11
12
|
|
|
12
13
|
return cls.instance
|
|
13
14
|
|
|
@@ -15,21 +16,18 @@ class ShowStorage(Command):
|
|
|
15
16
|
super().__init__(successor)
|
|
16
17
|
|
|
17
18
|
def command(self):
|
|
18
|
-
return
|
|
19
|
+
return ShowHost.COMMAND
|
|
19
20
|
|
|
20
21
|
def run(self, cmd: str, state: ReplState):
|
|
21
22
|
if not self.args(cmd):
|
|
22
23
|
return super().run(cmd, state)
|
|
23
24
|
|
|
24
|
-
|
|
25
|
+
log(get_my_host())
|
|
25
26
|
|
|
26
27
|
return state
|
|
27
28
|
|
|
28
29
|
def completion(self, state: ReplState):
|
|
29
|
-
|
|
30
|
-
return super().completion(state)
|
|
31
|
-
|
|
32
|
-
return {}
|
|
30
|
+
return super().completion(state)
|
|
33
31
|
|
|
34
32
|
def help(self, _: ReplState):
|
|
35
|
-
return f'{
|
|
33
|
+
return f'{ShowHost.COMMAND}\t show host'
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import time
|
|
2
|
+
import traceback
|
|
3
|
+
|
|
4
|
+
from adam.apps import Apps
|
|
5
|
+
from adam.config import Config
|
|
6
|
+
from adam.sso.idp import Idp
|
|
7
|
+
from adam.sso.idp_login import IdpLogin
|
|
8
|
+
from adam.commands.command import Command
|
|
9
|
+
from adam.repl_state import ReplState
|
|
10
|
+
from adam.utils import duration, lines_to_tabular, log, log2
|
|
11
|
+
|
|
12
|
+
class ShowLogin(Command):
|
|
13
|
+
COMMAND = 'show login'
|
|
14
|
+
|
|
15
|
+
# the singleton pattern
|
|
16
|
+
def __new__(cls, *args, **kwargs):
|
|
17
|
+
if not hasattr(cls, 'instance'): cls.instance = super(ShowLogin, cls).__new__(cls)
|
|
18
|
+
|
|
19
|
+
return cls.instance
|
|
20
|
+
|
|
21
|
+
def __init__(self, successor: Command=None):
|
|
22
|
+
super().__init__(successor)
|
|
23
|
+
|
|
24
|
+
def command(self):
|
|
25
|
+
return ShowLogin.COMMAND
|
|
26
|
+
|
|
27
|
+
def required(self):
|
|
28
|
+
return ReplState.NON_L
|
|
29
|
+
|
|
30
|
+
def run(self, cmd: str, state: ReplState):
|
|
31
|
+
if not(args := self.args(cmd)):
|
|
32
|
+
return super().run(cmd, state)
|
|
33
|
+
|
|
34
|
+
with self.validate(args, state) as (args, state):
|
|
35
|
+
login: IdpLogin = None
|
|
36
|
+
try:
|
|
37
|
+
if not(host := Apps.app_host('c3', 'c3', state.namespace)):
|
|
38
|
+
log2('Cannot locate ingress for app.')
|
|
39
|
+
return state
|
|
40
|
+
|
|
41
|
+
login = Idp.login(host, use_token_from_env=True)
|
|
42
|
+
if login and login.id_token_obj:
|
|
43
|
+
it = login.id_token_obj
|
|
44
|
+
lines = [
|
|
45
|
+
f'email\t{it.email}',
|
|
46
|
+
f'user\t{it.username}',
|
|
47
|
+
f'IDP expires in\t{duration(time.time(), it.exp)}',
|
|
48
|
+
f'IDP Groups\t{",".join(it.groups)}'
|
|
49
|
+
]
|
|
50
|
+
log(lines_to_tabular(lines, separator='\t'))
|
|
51
|
+
except Exception as e:
|
|
52
|
+
log2(e)
|
|
53
|
+
if Config().is_debug():
|
|
54
|
+
log2(traceback.format_exc())
|
|
55
|
+
|
|
56
|
+
return state
|
|
57
|
+
|
|
58
|
+
def completion(self, state: ReplState):
|
|
59
|
+
return super().completion(state)
|
|
60
|
+
|
|
61
|
+
def help(self, _: ReplState):
|
|
62
|
+
return f'{ShowLogin.COMMAND}\t show login details'
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
from
|
|
2
|
-
from
|
|
3
|
-
from
|
|
4
|
-
from
|
|
1
|
+
from adam.commands.command import Command
|
|
2
|
+
from adam.config import Config
|
|
3
|
+
from adam.repl_state import ReplState
|
|
4
|
+
from adam.utils import lines_to_tabular, log
|
|
5
5
|
|
|
6
6
|
class ShowParams(Command):
|
|
7
7
|
COMMAND = 'show params'
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
from adam.commands import extract_options
|
|
2
|
+
from adam.commands.command import Command
|
|
3
|
+
from adam.commands.commands_utils import show_table
|
|
4
|
+
from adam.commands.cql.utils_cql import cassandra
|
|
5
|
+
from adam.config import Config
|
|
6
|
+
from adam.utils_k8s.statefulsets import StatefulSets
|
|
7
|
+
from adam.repl_state import ReplState, RequiredState
|
|
8
|
+
|
|
9
|
+
class ShowProcesses(Command):
|
|
10
|
+
COMMAND = 'show processes'
|
|
11
|
+
|
|
12
|
+
# the singleton pattern
|
|
13
|
+
def __new__(cls, *args, **kwargs):
|
|
14
|
+
if not hasattr(cls, 'instance'): cls.instance = super(ShowProcesses, cls).__new__(cls)
|
|
15
|
+
|
|
16
|
+
return cls.instance
|
|
17
|
+
|
|
18
|
+
def __init__(self, successor: Command=None):
|
|
19
|
+
super().__init__(successor)
|
|
20
|
+
|
|
21
|
+
def command(self):
|
|
22
|
+
return ShowProcesses.COMMAND
|
|
23
|
+
|
|
24
|
+
def required(self):
|
|
25
|
+
return RequiredState.CLUSTER_OR_POD
|
|
26
|
+
|
|
27
|
+
def run(self, cmd: str, state: ReplState):
|
|
28
|
+
if not(args := self.args(cmd)):
|
|
29
|
+
return super().run(cmd, state)
|
|
30
|
+
|
|
31
|
+
with self.validate(args, state) as (args, state):
|
|
32
|
+
with extract_options(args, ['-s', '--show']) as (args, show_out):
|
|
33
|
+
cols = Config().get('processes.columns', 'pod,cpu-metrics,mem')
|
|
34
|
+
header = Config().get('processes.header', 'POD_NAME,M_CPU(USAGE/LIMIT),MEM/LIMIT')
|
|
35
|
+
|
|
36
|
+
qing_args = ['qing', 'recipe', 'with']
|
|
37
|
+
args, _, recipe_qing = Command.extract_options(args, options=qing_args)
|
|
38
|
+
if set(recipe_qing) == set(qing_args):
|
|
39
|
+
cols = Config().get('processes-qing.columns', 'pod,cpu,mem')
|
|
40
|
+
header = Config().get('processes-qing.header', 'POD_NAME,Q_CPU/TOTAL,MEM/LIMIT')
|
|
41
|
+
|
|
42
|
+
with cassandra(state) as pods:
|
|
43
|
+
pods.show_table(cols, header, show_out=show_out)
|
|
44
|
+
|
|
45
|
+
return state
|
|
46
|
+
|
|
47
|
+
def completion(self, state: ReplState):
|
|
48
|
+
return super().completion(state, {'with': {'recipe': {'metrics': {'-s': None}, 'qing': {'-s': None}}}, '-s': None})
|
|
49
|
+
|
|
50
|
+
def help(self, _: ReplState):
|
|
51
|
+
return f'{ShowProcesses.COMMAND} [with recipe qing|metrics] [-s]\t show process overview -s show commands on nodes'
|