kaqing 2.0.50__py3-none-any.whl → 2.0.110__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/apps.py +2 -2
- adam/batch.py +11 -15
- adam/checks/check_utils.py +4 -4
- adam/checks/compactionstats.py +1 -1
- adam/checks/cpu.py +2 -2
- adam/checks/disk.py +1 -1
- adam/checks/gossip.py +1 -1
- adam/checks/memory.py +3 -3
- adam/checks/status.py +1 -1
- adam/commands/alter_tables.py +3 -14
- adam/commands/app.py +2 -2
- adam/commands/app_ping.py +2 -2
- adam/commands/audit/audit.py +85 -0
- adam/commands/audit/audit_repair_tables.py +76 -0
- adam/commands/audit/audit_run.py +57 -0
- adam/commands/audit/show_last10.py +50 -0
- adam/commands/audit/show_slow10.py +49 -0
- adam/commands/audit/show_top10.py +48 -0
- adam/commands/audit/utils_show_top10.py +59 -0
- adam/commands/bash.py +76 -13
- adam/commands/cd.py +22 -13
- adam/commands/check.py +6 -0
- adam/commands/cli_commands.py +3 -3
- adam/commands/command.py +15 -11
- adam/commands/commands_utils.py +4 -5
- adam/commands/cql/cql_completions.py +7 -5
- adam/commands/cql/cql_utils.py +13 -10
- adam/commands/cql/cqlsh.py +6 -3
- adam/commands/deploy/code_utils.py +2 -2
- adam/commands/deploy/deploy.py +7 -1
- adam/commands/deploy/deploy_pg_agent.py +2 -2
- adam/commands/deploy/deploy_pod.py +6 -6
- adam/commands/deploy/deploy_utils.py +2 -2
- adam/commands/deploy/undeploy.py +7 -1
- adam/commands/deploy/undeploy_pg_agent.py +2 -2
- adam/commands/deploy/undeploy_pod.py +4 -4
- adam/commands/devices.py +29 -0
- adam/commands/help.py +10 -7
- adam/commands/issues.py +6 -0
- adam/commands/login.py +6 -3
- adam/commands/logs.py +2 -1
- adam/commands/ls.py +30 -24
- adam/commands/medusa/medusa_backup.py +2 -2
- adam/commands/medusa/medusa_restore.py +2 -2
- adam/commands/medusa/medusa_show_backupjobs.py +3 -2
- adam/commands/medusa/medusa_show_restorejobs.py +2 -2
- adam/commands/nodetool.py +5 -3
- adam/commands/postgres/postgres.py +3 -3
- adam/commands/postgres/{postgres_session.py → postgres_context.py} +29 -30
- adam/commands/postgres/postgres_utils.py +5 -5
- adam/commands/postgres/psql_completions.py +2 -3
- adam/commands/preview_table.py +17 -32
- adam/commands/pwd.py +5 -2
- adam/commands/reaper/reaper.py +3 -0
- adam/commands/reaper/reaper_restart.py +1 -1
- adam/commands/reaper/reaper_session.py +1 -1
- adam/commands/repair/repair.py +3 -3
- adam/commands/repair/repair_log.py +1 -1
- adam/commands/repair/repair_run.py +2 -2
- adam/commands/repair/repair_scan.py +1 -1
- adam/commands/repair/repair_stop.py +1 -1
- adam/commands/report.py +6 -0
- adam/commands/restart.py +2 -2
- adam/commands/rollout.py +1 -1
- adam/commands/show/show.py +5 -2
- adam/commands/show/show_app_actions.py +3 -0
- adam/commands/show/show_app_id.py +1 -1
- adam/commands/show/show_app_queues.py +3 -2
- adam/commands/show/show_cassandra_status.py +3 -3
- adam/commands/show/show_cassandra_version.py +3 -3
- adam/commands/show/show_host.py +33 -0
- adam/commands/show/show_login.py +3 -0
- adam/commands/show/show_processes.py +1 -1
- adam/commands/show/show_repairs.py +2 -2
- adam/commands/show/show_storage.py +1 -1
- adam/commands/watch.py +1 -1
- adam/config.py +2 -1
- adam/embedded_params.py +1 -1
- adam/pod_exec_result.py +7 -2
- adam/repl.py +141 -89
- adam/repl_commands.py +21 -20
- adam/repl_state.py +167 -39
- adam/sql/sql_completer.py +89 -49
- adam/sql/sql_state_machine.py +518 -0
- adam/sql/term_completer.py +76 -0
- adam/sso/cred_cache.py +1 -1
- adam/sso/idp.py +1 -1
- adam/utils.py +0 -1
- adam/utils_audits.py +193 -0
- adam/{k8s_utils → utils_k8s}/cassandra_clusters.py +6 -8
- adam/{k8s_utils → utils_k8s}/cassandra_nodes.py +11 -4
- adam/{k8s_utils → utils_k8s}/deployment.py +2 -2
- adam/{k8s_utils → utils_k8s}/pods.py +33 -9
- adam/{k8s_utils → utils_k8s}/secrets.py +4 -0
- adam/{k8s_utils → utils_k8s}/statefulsets.py +4 -4
- adam/utils_net.py +24 -0
- adam/version.py +1 -1
- {kaqing-2.0.50.dist-info → kaqing-2.0.110.dist-info}/METADATA +1 -1
- kaqing-2.0.110.dist-info/RECORD +187 -0
- adam/commands/cql/cql_table_completer.py +0 -16
- adam/commands/describe/describe.py +0 -46
- adam/commands/describe/describe_keyspace.py +0 -60
- adam/commands/describe/describe_keyspaces.py +0 -50
- adam/commands/describe/describe_table.py +0 -60
- adam/commands/describe/describe_tables.py +0 -50
- adam/commands/postgres/psql_table_completer.py +0 -18
- adam/sql/any_completer.py +0 -84
- adam/sql/sql_utils.py +0 -5
- adam/sql/table_name_completer.py +0 -17
- kaqing-2.0.50.dist-info/RECORD +0 -185
- /adam/commands/{describe → audit}/__init__.py +0 -0
- /adam/{k8s_utils → utils_k8s}/__init__.py +0 -0
- /adam/{k8s_utils → utils_k8s}/config_maps.py +0 -0
- /adam/{k8s_utils → utils_k8s}/custom_resources.py +0 -0
- /adam/{k8s_utils → utils_k8s}/ingresses.py +0 -0
- /adam/{k8s_utils → utils_k8s}/jobs.py +0 -0
- /adam/{k8s_utils → utils_k8s}/kube_context.py +0 -0
- /adam/{k8s_utils → utils_k8s}/service_accounts.py +0 -0
- /adam/{k8s_utils → utils_k8s}/services.py +0 -0
- /adam/{k8s_utils → utils_k8s}/volumes.py +0 -0
- {kaqing-2.0.50.dist-info → kaqing-2.0.110.dist-info}/WHEEL +0 -0
- {kaqing-2.0.50.dist-info → kaqing-2.0.110.dist-info}/entry_points.txt +0 -0
- {kaqing-2.0.50.dist-info → kaqing-2.0.110.dist-info}/top_level.txt +0 -0
adam/utils_audits.py
ADDED
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
from datetime import datetime
|
|
2
|
+
import functools
|
|
3
|
+
import getpass
|
|
4
|
+
import time
|
|
5
|
+
import boto3
|
|
6
|
+
import requests
|
|
7
|
+
|
|
8
|
+
from adam.config import Config
|
|
9
|
+
from adam.utils import lines_to_tabular, log, log2
|
|
10
|
+
from adam.utils_net import get_my_host
|
|
11
|
+
|
|
12
|
+
class AuditMeta:
|
|
13
|
+
def __init__(self, partitions_last_checked: float, cluster_last_checked: float):
|
|
14
|
+
self.partitions_last_checked = partitions_last_checked
|
|
15
|
+
self.cluster_last_checked = cluster_last_checked
|
|
16
|
+
|
|
17
|
+
# no state utility class
|
|
18
|
+
class Audits:
|
|
19
|
+
PARTITIONS_ADDED = 'partitions-added'
|
|
20
|
+
ADD_CLUSTERS = 'add-clusters'
|
|
21
|
+
|
|
22
|
+
def log(cmd: str, cluster = 'NA', drive: str = 'NA', duration: float = 0.0, audit_extra = None):
|
|
23
|
+
payload = {
|
|
24
|
+
'cluster': cluster if cluster else 'NA',
|
|
25
|
+
'ts': time.time(),
|
|
26
|
+
'host': get_my_host(),
|
|
27
|
+
'user': getpass.getuser(),
|
|
28
|
+
'line': cmd.replace('"', '""').replace('\n', ' '),
|
|
29
|
+
'drive': drive,
|
|
30
|
+
'duration': duration,
|
|
31
|
+
'audit_extra': audit_extra if audit_extra else '',
|
|
32
|
+
}
|
|
33
|
+
audit_endpoint = Config().get("audit.endpoint", "https://4psvtaxlcb.execute-api.us-west-2.amazonaws.com/prod/")
|
|
34
|
+
try:
|
|
35
|
+
response = requests.post(audit_endpoint, json=payload, timeout=Config().get("audit.timeout", 10))
|
|
36
|
+
if response.status_code in [200, 201]:
|
|
37
|
+
Config().debug(response.text)
|
|
38
|
+
else:
|
|
39
|
+
log2(f"Error: {response.status_code} {response.text}")
|
|
40
|
+
except requests.exceptions.Timeout as e:
|
|
41
|
+
log2(f"Timeout occurred: {e}")
|
|
42
|
+
|
|
43
|
+
def get_meta() -> AuditMeta:
|
|
44
|
+
checked_in = 0.0
|
|
45
|
+
cluster_last_checked = 0.0
|
|
46
|
+
|
|
47
|
+
state, _, rs = Audits.audit_query(f'select partitions_last_checked, clusters_last_checked from meta')
|
|
48
|
+
if state == 'SUCCEEDED':
|
|
49
|
+
if len(rs) > 1:
|
|
50
|
+
try:
|
|
51
|
+
row = rs[1]['Data']
|
|
52
|
+
checked_in = float(row[0]['VarCharValue'])
|
|
53
|
+
cluster_last_checked = float(row[1]['VarCharValue'])
|
|
54
|
+
except:
|
|
55
|
+
pass
|
|
56
|
+
|
|
57
|
+
return AuditMeta(checked_in, cluster_last_checked)
|
|
58
|
+
|
|
59
|
+
def put_meta(action: str, meta: AuditMeta, clusters: list[str] = None):
|
|
60
|
+
payload = {
|
|
61
|
+
'action': action,
|
|
62
|
+
'partitions-last-checked': meta.partitions_last_checked,
|
|
63
|
+
'clusters-last-checked': meta.cluster_last_checked
|
|
64
|
+
}
|
|
65
|
+
if clusters:
|
|
66
|
+
payload['clusters'] = clusters
|
|
67
|
+
|
|
68
|
+
audit_endpoint = Config().get("audit.endpoint", "https://4psvtaxlcb.execute-api.us-west-2.amazonaws.com/prod/")
|
|
69
|
+
try:
|
|
70
|
+
response = requests.post(audit_endpoint, json=payload, timeout=Config().get("audit.timeout", 10))
|
|
71
|
+
if response.status_code in [200, 201]:
|
|
72
|
+
Config().debug(response.text)
|
|
73
|
+
else:
|
|
74
|
+
log2(f"Error: {response.status_code} {response.text}")
|
|
75
|
+
except requests.exceptions.Timeout as e:
|
|
76
|
+
log2(f"Timeout occurred: {e}")
|
|
77
|
+
|
|
78
|
+
def find_new_clusters(cluster_last_checked: float) -> list[str]:
|
|
79
|
+
dt_object = datetime.fromtimestamp(cluster_last_checked)
|
|
80
|
+
|
|
81
|
+
# select distinct c2.name from cluster as c1 right outer join
|
|
82
|
+
# (select distinct c as name from audit where y = '1969' and m = '12' and d >= '31' or y = '1969' and m > '12' or y > '1969') as c2
|
|
83
|
+
# on c1.name = c2.name where c1.name is null
|
|
84
|
+
query = '\n '.join([
|
|
85
|
+
'select distinct c2.name from cluster as c1 right outer join',
|
|
86
|
+
f'(select distinct c as name from audit where {Audits.date_from(dt_object)}) as c2',
|
|
87
|
+
'on c1.name = c2.name where c1.name is null'])
|
|
88
|
+
log2(query)
|
|
89
|
+
state, _, rs = Audits.audit_query(query)
|
|
90
|
+
if state == 'SUCCEEDED':
|
|
91
|
+
if len(rs) > 1:
|
|
92
|
+
try:
|
|
93
|
+
return [r['Data'][0]['VarCharValue'] for r in rs[1:]]
|
|
94
|
+
except:
|
|
95
|
+
pass
|
|
96
|
+
|
|
97
|
+
return []
|
|
98
|
+
|
|
99
|
+
@functools.lru_cache()
|
|
100
|
+
def audit_table_names():
|
|
101
|
+
region_name = Config().get('audit.athena.region', 'us-west-2')
|
|
102
|
+
database_name = Config().get('audit.athena.database', 'audit')
|
|
103
|
+
catalog_name = Config().get('audit.athena.catalog', 'AwsDataCatalog')
|
|
104
|
+
|
|
105
|
+
athena_client = boto3.client('athena', region_name=region_name)
|
|
106
|
+
paginator = athena_client.get_paginator('list_table_metadata')
|
|
107
|
+
|
|
108
|
+
table_names = []
|
|
109
|
+
for page in paginator.paginate(CatalogName=catalog_name, DatabaseName=database_name):
|
|
110
|
+
for table_metadata in page.get('TableMetadataList', []):
|
|
111
|
+
table_names.append(table_metadata['Name'])
|
|
112
|
+
|
|
113
|
+
return table_names
|
|
114
|
+
|
|
115
|
+
@functools.lru_cache()
|
|
116
|
+
def audit_column_names(tables: list[str] = [], database: str = None, partition_cols_only = False):
|
|
117
|
+
if not database:
|
|
118
|
+
database = Config().get('audit.athena.database', 'audit')
|
|
119
|
+
|
|
120
|
+
if not tables:
|
|
121
|
+
tables = Config().get('audit.athena.tables', 'audit').split(',')
|
|
122
|
+
|
|
123
|
+
table_names = "'" + "','".join([table.strip() for table in tables]) + "'"
|
|
124
|
+
|
|
125
|
+
query = f"select column_name from information_schema.columns where table_name in ({table_names}) and table_schema = '{database}'"
|
|
126
|
+
if partition_cols_only:
|
|
127
|
+
query = f"{query} and extra_info = 'partition key'"
|
|
128
|
+
|
|
129
|
+
_, _, rs = Audits.audit_query(query)
|
|
130
|
+
if rs:
|
|
131
|
+
return [row['Data'][0].get('VarCharValue') for row in rs[1:]]
|
|
132
|
+
|
|
133
|
+
return []
|
|
134
|
+
|
|
135
|
+
def run_audit_query(sql: str, database: str = None):
|
|
136
|
+
state, reason, rs = Audits.audit_query(sql, database)
|
|
137
|
+
|
|
138
|
+
if state == 'SUCCEEDED':
|
|
139
|
+
if rs:
|
|
140
|
+
column_info = rs[0]['Data']
|
|
141
|
+
columns = [col.get('VarCharValue') for col in column_info]
|
|
142
|
+
lines = []
|
|
143
|
+
for row in rs[1:]:
|
|
144
|
+
row_data = [col.get('VarCharValue') if col else '' for col in row['Data']]
|
|
145
|
+
lines.append('\t'.join(row_data))
|
|
146
|
+
|
|
147
|
+
log(lines_to_tabular(lines, header='\t'.join(columns), separator='\t'))
|
|
148
|
+
else:
|
|
149
|
+
log2(f"Query failed or was cancelled. State: {state}")
|
|
150
|
+
log2(f"Reason: {reason}")
|
|
151
|
+
|
|
152
|
+
def audit_query(sql: str, database: str = None) -> tuple[str, str, list]:
|
|
153
|
+
athena_client = boto3.client('athena')
|
|
154
|
+
|
|
155
|
+
if not database:
|
|
156
|
+
database = Config().get('audit.athena.database', 'audit')
|
|
157
|
+
|
|
158
|
+
s3_output_location = Config().get('audit.athena.output', 's3://s3.ops--audit/ddl/results')
|
|
159
|
+
|
|
160
|
+
response = athena_client.start_query_execution(
|
|
161
|
+
QueryString=sql,
|
|
162
|
+
QueryExecutionContext={
|
|
163
|
+
'Database': database
|
|
164
|
+
},
|
|
165
|
+
ResultConfiguration={
|
|
166
|
+
'OutputLocation': s3_output_location
|
|
167
|
+
}
|
|
168
|
+
)
|
|
169
|
+
|
|
170
|
+
query_execution_id = response['QueryExecutionId']
|
|
171
|
+
|
|
172
|
+
while True:
|
|
173
|
+
query_status = athena_client.get_query_execution(QueryExecutionId=query_execution_id)
|
|
174
|
+
state = query_status['QueryExecution']['Status']['State']
|
|
175
|
+
if state in ['SUCCEEDED', 'FAILED', 'CANCELLED']:
|
|
176
|
+
break
|
|
177
|
+
time.sleep(1)
|
|
178
|
+
|
|
179
|
+
if state == 'SUCCEEDED':
|
|
180
|
+
results_response = athena_client.get_query_results(QueryExecutionId=query_execution_id)
|
|
181
|
+
if results_response['ResultSet']['Rows']:
|
|
182
|
+
return (state, None, results_response['ResultSet']['Rows'])
|
|
183
|
+
|
|
184
|
+
return (state, None, [])
|
|
185
|
+
else:
|
|
186
|
+
return (state, query_status['QueryExecution']['Status'].get('StateChangeReason'), [])
|
|
187
|
+
|
|
188
|
+
def date_from(dt_object: datetime):
|
|
189
|
+
y = dt_object.strftime("%Y")
|
|
190
|
+
m = dt_object.strftime("%m")
|
|
191
|
+
d = dt_object.strftime("%d")
|
|
192
|
+
|
|
193
|
+
return f"y = '{y}' and m = '{m}' and d >= '{d}' or y = '{y}' and m > '{m}' or y > '{y}'"
|
|
@@ -1,26 +1,24 @@
|
|
|
1
|
-
from collections.abc import Callable
|
|
2
1
|
from concurrent.futures import ThreadPoolExecutor
|
|
3
2
|
import sys
|
|
4
3
|
from typing import TypeVar
|
|
5
4
|
|
|
6
|
-
from adam.
|
|
7
|
-
from adam.k8s_utils.cassandra_nodes import CassandraNodes
|
|
5
|
+
from adam.utils_k8s.cassandra_nodes import CassandraNodes
|
|
8
6
|
from adam.pod_exec_result import PodExecResult
|
|
9
7
|
from adam.utils import log2
|
|
10
8
|
from .statefulsets import StatefulSets
|
|
11
|
-
from .pods import Pods
|
|
12
9
|
from .kube_context import KubeContext
|
|
13
10
|
|
|
14
11
|
T = TypeVar('T')
|
|
15
12
|
|
|
16
13
|
# utility collection on cassandra clusters; methods are all static
|
|
17
14
|
class CassandraClusters:
|
|
18
|
-
def exec(statefulset: str, namespace: str, command: str, action: str = 'action',
|
|
15
|
+
def exec(statefulset: str, namespace: str, command: str, action: str = 'action',
|
|
16
|
+
max_workers=0, show_out=True, on_any = False, shell = '/bin/sh', background = False) -> list[PodExecResult]:
|
|
19
17
|
def body(executor: ThreadPoolExecutor, pod: str, namespace: str, show_out: bool):
|
|
20
18
|
if executor:
|
|
21
|
-
return executor.submit(CassandraNodes.exec, pod, namespace, command, False, False,)
|
|
19
|
+
return executor.submit(CassandraNodes.exec, pod, namespace, command, False, False, shell, background)
|
|
22
20
|
|
|
23
|
-
return CassandraNodes.exec(pod, namespace, command, show_out=show_out)
|
|
21
|
+
return CassandraNodes.exec(pod, namespace, command, show_out=show_out, background=background)
|
|
24
22
|
|
|
25
23
|
def post(result, show_out: bool):
|
|
26
24
|
if KubeContext.show_out(show_out):
|
|
@@ -32,4 +30,4 @@ class CassandraClusters:
|
|
|
32
30
|
|
|
33
31
|
return result
|
|
34
32
|
|
|
35
|
-
return StatefulSets.on_cluster(statefulset, namespace, body, post=post, action=action, max_workers=max_workers, show_out=show_out, on_any=on_any)
|
|
33
|
+
return StatefulSets.on_cluster(statefulset, namespace, body, post=post, action=action, max_workers=max_workers, show_out=show_out, on_any=on_any, background=background)
|
|
@@ -1,12 +1,19 @@
|
|
|
1
1
|
from adam.config import Config
|
|
2
|
-
from adam.
|
|
3
|
-
from adam.
|
|
2
|
+
from adam.utils_k8s.pods import Pods
|
|
3
|
+
from adam.utils_k8s.secrets import Secrets
|
|
4
4
|
from adam.pod_exec_result import PodExecResult
|
|
5
|
+
from adam.repl_session import ReplSession
|
|
5
6
|
|
|
6
7
|
# utility collection on cassandra nodes; methods are all static
|
|
7
8
|
class CassandraNodes:
|
|
8
|
-
def exec(pod_name: str, namespace: str, command: str, show_out = True, throw_err = False) -> PodExecResult:
|
|
9
|
-
|
|
9
|
+
def exec(pod_name: str, namespace: str, command: str, show_out = True, throw_err = False, shell = '/bin/sh', background = False) -> PodExecResult:
|
|
10
|
+
r = Pods.exec(pod_name, "cassandra", namespace, command, show_out = show_out, throw_err = throw_err, shell = shell, background = background)
|
|
11
|
+
|
|
12
|
+
if r and Config().get('repl.history.push-cat-remote-log-file', True):
|
|
13
|
+
if r.log_file and ReplSession().prompt_session:
|
|
14
|
+
ReplSession().prompt_session.history.append_string(f'bash {r.pod} cat {r.log_file}')
|
|
15
|
+
|
|
16
|
+
return r
|
|
10
17
|
|
|
11
18
|
def get_host_id(pod_name: str, ns: str):
|
|
12
19
|
try:
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from kubernetes import client
|
|
2
2
|
|
|
3
|
-
from adam.
|
|
4
|
-
from adam.
|
|
3
|
+
from adam.utils_k8s.pods import Pods
|
|
4
|
+
from adam.utils_k8s.volumes import ConfigMapMount
|
|
5
5
|
|
|
6
6
|
# utility collection on deployments; methods are all static
|
|
7
7
|
class Deployments:
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
from collections.abc import Callable
|
|
2
2
|
from concurrent.futures import ThreadPoolExecutor, as_completed
|
|
3
|
+
from datetime import datetime
|
|
3
4
|
import sys
|
|
4
5
|
import time
|
|
5
6
|
from typing import TypeVar, cast
|
|
@@ -8,7 +9,7 @@ from kubernetes.stream import stream
|
|
|
8
9
|
from kubernetes.stream.ws_client import ERROR_CHANNEL
|
|
9
10
|
|
|
10
11
|
from adam.config import Config
|
|
11
|
-
from adam.
|
|
12
|
+
from adam.utils_k8s.volumes import ConfigMapMount
|
|
12
13
|
from adam.pod_exec_result import PodExecResult
|
|
13
14
|
from adam.utils import elapsed_time, log2
|
|
14
15
|
from .kube_context import KubeContext
|
|
@@ -27,7 +28,7 @@ class Pods:
|
|
|
27
28
|
def delete(pod_name: str, namespace: str, grace_period_seconds: int = None):
|
|
28
29
|
try:
|
|
29
30
|
v1 = client.CoreV1Api()
|
|
30
|
-
|
|
31
|
+
v1.delete_namespaced_pod(pod_name, namespace, grace_period_seconds=grace_period_seconds)
|
|
31
32
|
except Exception as e:
|
|
32
33
|
log2("Exception when calling CoreV1Api->delete_namespaced_pod: %s\n" % e)
|
|
33
34
|
|
|
@@ -42,7 +43,11 @@ class Pods:
|
|
|
42
43
|
namespace: str,
|
|
43
44
|
body: Callable[[ThreadPoolExecutor, str, str, bool], T],
|
|
44
45
|
post: Callable[[T], T] = None,
|
|
45
|
-
action: str = 'action',
|
|
46
|
+
action: str = 'action',
|
|
47
|
+
max_workers=0,
|
|
48
|
+
show_out=True,
|
|
49
|
+
on_any = False,
|
|
50
|
+
background = False) -> list[T]:
|
|
46
51
|
show_out = KubeContext.show_out(show_out)
|
|
47
52
|
|
|
48
53
|
if not max_workers:
|
|
@@ -93,7 +98,10 @@ class Pods:
|
|
|
93
98
|
|
|
94
99
|
return results
|
|
95
100
|
|
|
96
|
-
def exec(pod_name: str, container: str, namespace: str, command: str,
|
|
101
|
+
def exec(pod_name: str, container: str, namespace: str, command: str,
|
|
102
|
+
show_out = True, throw_err = False, shell = '/bin/sh',
|
|
103
|
+
background = False,
|
|
104
|
+
interaction: Callable[[any, list[str]], any] = None):
|
|
97
105
|
if _TEST_POD_EXEC_OUTS:
|
|
98
106
|
return _TEST_POD_EXEC_OUTS
|
|
99
107
|
|
|
@@ -101,8 +109,24 @@ class Pods:
|
|
|
101
109
|
|
|
102
110
|
api = client.CoreV1Api()
|
|
103
111
|
|
|
104
|
-
|
|
105
|
-
|
|
112
|
+
log_file = None
|
|
113
|
+
tty = True
|
|
114
|
+
exec_command = [shell, '-c', command]
|
|
115
|
+
if background or command.endswith(' &'):
|
|
116
|
+
# should be false for starting a background process
|
|
117
|
+
tty = False
|
|
118
|
+
|
|
119
|
+
if Config().get('repl.background-process.auto-nohup', True):
|
|
120
|
+
command = command.strip(' &')
|
|
121
|
+
cmd_name = ''
|
|
122
|
+
if command.startswith('nodetool '):
|
|
123
|
+
cmd_name = f".{'_'.join(command.split(' ')[5:])}"
|
|
124
|
+
|
|
125
|
+
log_file = f'/tmp/qing-{datetime.now().strftime("%d%H%M%S")}{cmd_name}.log'
|
|
126
|
+
command = f"nohup {command} > {log_file} 2>&1 &"
|
|
127
|
+
exec_command = [shell, '-c', command]
|
|
128
|
+
|
|
129
|
+
k_command = f'kubectl exec {pod_name} -c {container} -n {namespace} -- {shell} -c "{command}"'
|
|
106
130
|
if show_out:
|
|
107
131
|
print(k_command)
|
|
108
132
|
|
|
@@ -115,7 +139,7 @@ class Pods:
|
|
|
115
139
|
stderr=True,
|
|
116
140
|
stdin=True,
|
|
117
141
|
stdout=True,
|
|
118
|
-
tty=
|
|
142
|
+
tty=tty,
|
|
119
143
|
_preload_content=False,
|
|
120
144
|
)
|
|
121
145
|
|
|
@@ -140,7 +164,7 @@ class Pods:
|
|
|
140
164
|
try:
|
|
141
165
|
# get the exit code from server
|
|
142
166
|
error_output = resp.read_channel(ERROR_CHANNEL)
|
|
143
|
-
except Exception:
|
|
167
|
+
except Exception as e:
|
|
144
168
|
pass
|
|
145
169
|
except Exception as e:
|
|
146
170
|
if throw_err:
|
|
@@ -150,7 +174,7 @@ class Pods:
|
|
|
150
174
|
finally:
|
|
151
175
|
resp.close()
|
|
152
176
|
|
|
153
|
-
return PodExecResult("".join(stdout), "".join(stderr), k_command, error_output)
|
|
177
|
+
return PodExecResult("".join(stdout), "".join(stderr), k_command, error_output, pod=pod_name, log_file=log_file)
|
|
154
178
|
|
|
155
179
|
def get_container(namespace: str, pod_name: str, container_name: str):
|
|
156
180
|
pod = Pods.get(namespace, pod_name)
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import base64
|
|
2
|
+
import functools
|
|
2
3
|
import re
|
|
3
4
|
from typing import cast
|
|
4
5
|
from kubernetes import client
|
|
@@ -9,7 +10,10 @@ from adam.utils import log2
|
|
|
9
10
|
|
|
10
11
|
# utility collection on secrets; methods are all static
|
|
11
12
|
class Secrets:
|
|
13
|
+
@functools.lru_cache()
|
|
12
14
|
def list_secrets(namespace: str = None, name_pattern: str = None):
|
|
15
|
+
Config().wait_log('Inspecting Cassandra Instances...')
|
|
16
|
+
|
|
13
17
|
secrets_names = []
|
|
14
18
|
|
|
15
19
|
v1 = client.CoreV1Api()
|
|
@@ -28,8 +28,8 @@ class StatefulSets:
|
|
|
28
28
|
def list_sts_name_and_ns():
|
|
29
29
|
return [(statefulset.metadata.name, statefulset.metadata.namespace) for statefulset in StatefulSets.list_sts()]
|
|
30
30
|
|
|
31
|
-
def list_sts_names(
|
|
32
|
-
if
|
|
31
|
+
def list_sts_names():
|
|
32
|
+
if not KubeContext.in_cluster_namespace():
|
|
33
33
|
return [f"{sts}@{ns}" for sts, ns in StatefulSets.list_sts_name_and_ns()]
|
|
34
34
|
else:
|
|
35
35
|
return [f"{sts}" for sts, _ in StatefulSets.list_sts_name_and_ns()]
|
|
@@ -62,10 +62,10 @@ class StatefulSets:
|
|
|
62
62
|
namespace: str,
|
|
63
63
|
body: Callable[[ThreadPoolExecutor, str, str, bool], T],
|
|
64
64
|
post: Callable[[T], T] = None,
|
|
65
|
-
action: str = 'action', max_workers=0, show_out=True, on_any = False) -> list[T]:
|
|
65
|
+
action: str = 'action', max_workers=0, show_out=True, on_any = False, background = False) -> list[T]:
|
|
66
66
|
pods = StatefulSets.pod_names(statefulset, namespace)
|
|
67
67
|
|
|
68
|
-
return Pods.on_pods(pods, namespace, body, post=post, action=action, max_workers=max_workers, show_out=show_out, on_any=on_any)
|
|
68
|
+
return Pods.on_pods(pods, namespace, body, post=post, action=action, max_workers=max_workers, show_out=show_out, on_any=on_any, background=background)
|
|
69
69
|
|
|
70
70
|
@functools.lru_cache()
|
|
71
71
|
def pod_names(ss: str, ns: str):
|
adam/utils_net.py
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import socket
|
|
2
|
+
|
|
3
|
+
MY_HOST = None
|
|
4
|
+
|
|
5
|
+
def get_my_host():
|
|
6
|
+
global MY_HOST
|
|
7
|
+
|
|
8
|
+
if MY_HOST:
|
|
9
|
+
return MY_HOST
|
|
10
|
+
|
|
11
|
+
MY_HOST = get_ip_from_hostname('host.docker.internal')
|
|
12
|
+
if not MY_HOST:
|
|
13
|
+
MY_HOST = socket.gethostname()
|
|
14
|
+
|
|
15
|
+
if not MY_HOST:
|
|
16
|
+
MY_HOST = 'NA'
|
|
17
|
+
|
|
18
|
+
return MY_HOST
|
|
19
|
+
|
|
20
|
+
def get_ip_from_hostname(hostname):
|
|
21
|
+
try:
|
|
22
|
+
return socket.gethostbyname(hostname)
|
|
23
|
+
except socket.gaierror:
|
|
24
|
+
return None
|
adam/version.py
CHANGED
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
adam/__init__.py,sha256=oVw1FNd9HZPJ7wm6BNn5ybyNGJLjJ8kopMeBiwgMaOI,59
|
|
2
|
+
adam/app_session.py,sha256=Klypm4JYHOlovaRCHAZ2P_Mj_nheMlcQgX403R0TJGk,6969
|
|
3
|
+
adam/apps.py,sha256=okYibOEiCVoM5zsPUKaLJZlwlnvWSHKL7U2J1Yk3-Aw,6701
|
|
4
|
+
adam/batch.py,sha256=IYNydQtld7KallhSJyos70akArLChj7hzkRF9wmBCqU,23969
|
|
5
|
+
adam/cli.py,sha256=03pIZdomAu7IL-GSP6Eun_PKwwISShRAmfx6eVRPGC0,458
|
|
6
|
+
adam/cli_group.py,sha256=W3zy1BghCtVcEXizq8fBH-93ZRVVwgAyGPzy0sHno1Y,593
|
|
7
|
+
adam/config.py,sha256=GRtfpGgGwfeYdVSPfk3LKCRXlOEJZ2vmXM3ADr7IhVk,2880
|
|
8
|
+
adam/embedded_apps.py,sha256=lKPx63mKzJbNmwz0rgL4gF76M9fDGxraYTtNAIGnZ_s,419
|
|
9
|
+
adam/embedded_params.py,sha256=K8_qziSq42vbcAJWSw_bPcYR1IePdBhLXdk2AE1jtRA,5062
|
|
10
|
+
adam/log.py,sha256=gg5DK52wLPc9cjykeh0WFHyAk1qI3HEpGaAK8W2dzXY,1146
|
|
11
|
+
adam/pod_exec_result.py,sha256=r-xt_oJxzfaednTAhQDnFaABBGZlBQFuEqSgybDnfP0,1134
|
|
12
|
+
adam/repl.py,sha256=BlvRLmGswotR64Z3MDc5TndS92H56PLnY5wTiCJM71U,9464
|
|
13
|
+
adam/repl_commands.py,sha256=JNRQxp9SVri9C1bEHJFqy9COtHyzIdoHR35qjA1zFFI,4734
|
|
14
|
+
adam/repl_session.py,sha256=uIogcvWBh7wd8QQ-p_JgLsyJ8YJgINw5vOd6JIsd7Vo,472
|
|
15
|
+
adam/repl_state.py,sha256=QYI7mBA7wz3gcpPkNe1KiJV6l19kPLS5_fbZWrT8nss,11807
|
|
16
|
+
adam/utils.py,sha256=sbsNZP3qGJtb6fXCa4dDXHry5ay9ev583cCZIQzy07s,7382
|
|
17
|
+
adam/utils_audits.py,sha256=vD57AFvuYCIqCDvqWvdbDWno_cBkhsPfjCp1SWRVGBE,7450
|
|
18
|
+
adam/utils_net.py,sha256=65fhBnWMCkhGtyHqz95qcHaCo35q-WX1RBkkXG8dKpI,416
|
|
19
|
+
adam/version.py,sha256=qPHUDRIAHlXvGE1Lqi_UK7o9qeDIO9mEqXgHAqj7Ynk,140
|
|
20
|
+
adam/checks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
21
|
+
adam/checks/check.py,sha256=Qopr3huYcMu2bzQgb99dEUYjFzkjKHRI76S6KA9b9Rk,702
|
|
22
|
+
adam/checks/check_context.py,sha256=FEHkQ32jY1EDopQ2uYWqy9v7aEEX1orLpJWhopwAlh4,402
|
|
23
|
+
adam/checks/check_result.py,sha256=5_DVNgkCC9t7xFJYNsjd9bfXA1I4vYb6K3kmN8cdMrA,669
|
|
24
|
+
adam/checks/check_utils.py,sha256=z6MqlCZg1YMJZgDe0GGq4sYBaQ2w0_wXsbTLjlAEz1Q,3772
|
|
25
|
+
adam/checks/compactionstats.py,sha256=NFi9RcRImZqCJBZs3LH851RHmlu4BO0s_QOsvkdUxKQ,2304
|
|
26
|
+
adam/checks/cpu.py,sha256=5KK-t1_2TSbT0lX6syEBRF1kZPoFQMOr1EJejFFq5gs,2666
|
|
27
|
+
adam/checks/disk.py,sha256=y0gwfh-MuEx0Ot7EXf8d7Q0ovbkThFMS1yWrIeeVe84,5214
|
|
28
|
+
adam/checks/gossip.py,sha256=60PeVkhtMWziiYILPwMKfesFjOanIn-nxeZZL5nUHQs,3119
|
|
29
|
+
adam/checks/issue.py,sha256=u3E6yCpDGGJiveKXdpkrKq7HQRTrG7aR2XLCoO-ys7U,498
|
|
30
|
+
adam/checks/memory.py,sha256=1TPoC_eL7QmMMJfaclW3hoSxudsUc4qvrzzb0Z4f5Kw,3056
|
|
31
|
+
adam/checks/status.py,sha256=4IFCesrovCbGKgbJxLr0VxjGGWmmF23ZQNfHUFb5Kyg,2140
|
|
32
|
+
adam/columns/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
33
|
+
adam/columns/column.py,sha256=O_5ptfx136BKdLo8enDvSL3HlId1dkjMM2XUumg1tNA,956
|
|
34
|
+
adam/columns/columns.py,sha256=AzovFIwOhBDQHc4bFEbhMoxxuOCIbxIzXfp6fQyiRYk,1645
|
|
35
|
+
adam/columns/compactions.py,sha256=ybIEYTkDuRTBLIUNurGhu1jhVnf1UEpJ0abo3GTgmKw,928
|
|
36
|
+
adam/columns/cpu.py,sha256=rPb4pOFNZDOplggaUmSZbpCPgZxyWVXO_JXLcE4YPlM,493
|
|
37
|
+
adam/columns/dir_data.py,sha256=gDLcrwMZ6dEVTmpvc35yX3iNY97mQ5q0eQojm8tZ2so,545
|
|
38
|
+
adam/columns/dir_snapshots.py,sha256=OSseuf7gAvT-_ujLvGt43jF-q7QVJNDcvqOK47QSJbk,451
|
|
39
|
+
adam/columns/gossip.py,sha256=KKUycFG-8YxMh9VYUrYOFwPVvnh-0i19k---DrpW93g,656
|
|
40
|
+
adam/columns/host_id.py,sha256=oqesvFCzUu0utkcH5mhYg0vx7lAW2EIDoezgY_CCP_Y,350
|
|
41
|
+
adam/columns/memory.py,sha256=GinntQroWK6kxn6PrumkJd9ok2skTWXLepM1U6lzc4g,701
|
|
42
|
+
adam/columns/node_address.py,sha256=PqSm2FtR0NAhc-R17sPRJJ3c6eWlJLHPctu8RsCslcM,355
|
|
43
|
+
adam/columns/node_load.py,sha256=Oc-kdfezYBP5eWDug-ijgM48x6XRNjwxxoQDZt_MbQc,349
|
|
44
|
+
adam/columns/node_owns.py,sha256=Iv5FDYV0m3ZM2JK05Fl485ZxDgOxZHDIN9KYNJc6Zdg,349
|
|
45
|
+
adam/columns/node_status.py,sha256=im52GfdETXVJVM00fU5OjJM2FvLZrgqpLkWKCwWhjAs,353
|
|
46
|
+
adam/columns/node_tokens.py,sha256=38D9xJ3uA48gzEYBtIiIUbZJcteM1H4KryzJNn01uZ8,353
|
|
47
|
+
adam/columns/node_utils.py,sha256=ql2StXmASC7equuabZVZEQ_BPTu2KkS99gY_3JXpIvU,774
|
|
48
|
+
adam/columns/pod_name.py,sha256=IYw0ZKA7Fb9LaGXENqzZTiTgL98tahwFRtfy0KkKh2Q,280
|
|
49
|
+
adam/columns/volume_cassandra.py,sha256=9KRNOzjNYganI9avN6zaA5_-7yxD4rV-KNxro9CSUg4,753
|
|
50
|
+
adam/columns/volume_root.py,sha256=29ujLoCAf9LO75u62LxEaPD58s6ihV-tcK17OeLSOM0,556
|
|
51
|
+
adam/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
52
|
+
adam/commands/alter_tables.py,sha256=DaJ77QSILzCnCBU1TzTQLiy67PooeneJ0kIm9Fkom4I,3112
|
|
53
|
+
adam/commands/app.py,sha256=k7dxmRuT3uUGFTwNGq48C1m7dmOENcLvtbmM-z69qfw,1920
|
|
54
|
+
adam/commands/app_ping.py,sha256=YxuTvhIiZWfhr_OKquGAhRQfrhPdE8zL5tsb3MDf48Y,1294
|
|
55
|
+
adam/commands/bash.py,sha256=qkpHHrfB9rMbO2q5WlDPbdsH7MRUwv6WAPBTrRDsiJ8,5924
|
|
56
|
+
adam/commands/cd.py,sha256=_NAp0g3O0qMUC938IWNFGD3R-2NxR58uaOMGQqC6H0M,4892
|
|
57
|
+
adam/commands/check.py,sha256=DOWoTpyuwgXm0wGCjLeAljkTkXbAoeh7zmBAUxePFFo,2306
|
|
58
|
+
adam/commands/cli_commands.py,sha256=vZMgXBQpTfiJ9E4v9yHB6WwcJgO6UcqWF3NuRspicq8,3620
|
|
59
|
+
adam/commands/command.py,sha256=8YEbPznpoCcwSLH4pZXR0WHpaQrIhCNxLPPF_WnmG6E,4062
|
|
60
|
+
adam/commands/command_helpers.py,sha256=leOJJK1UXczNTJHN9TGMCbIpUpmpreULvQ-TvnsYS7w,1134
|
|
61
|
+
adam/commands/commands_utils.py,sha256=lRzLrgDklmDPDDS3brG_ZVBabpG4M9W-fi_1bw799dE,3093
|
|
62
|
+
adam/commands/cp.py,sha256=dyQViRDPNqsKRkxPb7WyEVIBNw7YB6IfYa2q3VtfzyA,3107
|
|
63
|
+
adam/commands/devices.py,sha256=ygpvjYa_NcezM_hctGOAAuBEHiDJtLtJNlOcLGvFJAc,3184
|
|
64
|
+
adam/commands/exit.py,sha256=5MWUAmzYBlsrp0CoiTDB13SUkX9Ya18UlGeOIPia6TA,798
|
|
65
|
+
adam/commands/help.py,sha256=sW9L8X90RD3c66ujIUywVTwjeieZbiU5JqymdblNAyo,1803
|
|
66
|
+
adam/commands/issues.py,sha256=6r6CbdTgzMbi-lMmyQMAjmKyJgVD-n05IUrGQ-lsnp4,2724
|
|
67
|
+
adam/commands/login.py,sha256=FB6fESfgEyC8hYCK5ncqt7-M8bfQgu4KOWzE-J6ApyA,1975
|
|
68
|
+
adam/commands/logs.py,sha256=61iHB6iinNTGlYqdNad2c21pF7LlRjbdKiSjWTM5QTw,1197
|
|
69
|
+
adam/commands/ls.py,sha256=gzoJ4HS9OhAGbw2KHKyC_YI6nlOStjA3nn2N6c9aYXk,5860
|
|
70
|
+
adam/commands/nodetool.py,sha256=k4Gr63slw0BGinbbj3nHue2GHf55cjAjTdt636UKjb8,2363
|
|
71
|
+
adam/commands/nodetool_commands.py,sha256=5IgWC3rmeDD1cgwqQjiiWzi-wJpJ3n_8pAzz_9phXuk,2635
|
|
72
|
+
adam/commands/param_get.py,sha256=kPAAppK2T0tEFRnSIVFLDPIIGHhgLA7drJhn8TRyvvE,1305
|
|
73
|
+
adam/commands/param_set.py,sha256=QDIuqfU80aWCB16OK49yf7XRaRTWwiLkwMsJuVikq9I,1271
|
|
74
|
+
adam/commands/preview_table.py,sha256=6nqvuU39O6iQ0f2zONfPP8zsbQHaq4gdJ_k9hJfDVes,2692
|
|
75
|
+
adam/commands/pwd.py,sha256=AvM1gMgxBfIupevtYkGmNWGyEcsIx7-S8L9_v_DPEgk,2469
|
|
76
|
+
adam/commands/report.py,sha256=hgLOF_yDxkfAd00DSAZWtAMT3ksNt-U-1rpDT6a8vE4,2069
|
|
77
|
+
adam/commands/restart.py,sha256=SAxWHvglTckQJ0tJe5t-HWsVerbreNMM-7Nb9PAqno4,2044
|
|
78
|
+
adam/commands/rollout.py,sha256=Db9P4Owd3aPcRLIGhwyEElBNm_2Ke54KbiXyVKmztcE,2959
|
|
79
|
+
adam/commands/shell.py,sha256=wY_PIx7Lt6vuxhFArlfxdEnBbrouCJ3yNHhFn17DEqw,848
|
|
80
|
+
adam/commands/watch.py,sha256=fU2LGll-Igl08HpUQALOnh8l3s3AMGFX26NCLhqbfcw,2438
|
|
81
|
+
adam/commands/audit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
82
|
+
adam/commands/audit/audit.py,sha256=BeCAFDZRCRjctR87pYMdHLk6LFDYftWNs_aMInHGdkI,3074
|
|
83
|
+
adam/commands/audit/audit_repair_tables.py,sha256=aIvX8XDXr2orUt15TJZyzSA4R2469cO7lCq3g4jvJJs,2669
|
|
84
|
+
adam/commands/audit/audit_run.py,sha256=ZwnGHi7FjMhCOAL9ywf1l9vS80myFCVIgdrASERnKXc,1844
|
|
85
|
+
adam/commands/audit/show_last10.py,sha256=EGXFJ-8jjiVKsKkruiRYVqHzVOvELas3c72iZRx_XdQ,1421
|
|
86
|
+
adam/commands/audit/show_slow10.py,sha256=u7RGSxiSELTKXr91fwB-VSJbDU3d0JycBDJsESsRhlk,1440
|
|
87
|
+
adam/commands/audit/show_top10.py,sha256=2MY8mnaNDS3p-qBJ4AUi_p7HZEsM_qq2_9kc-bQSdKo,1508
|
|
88
|
+
adam/commands/audit/utils_show_top10.py,sha256=LtRZ0wDPDYQ9S3PlUIBbAP8zYzKPB58n1iIcHLca8P8,1865
|
|
89
|
+
adam/commands/cql/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
90
|
+
adam/commands/cql/cql_completions.py,sha256=29TJmNHg2_EwGyBrgh04dtZl0BDxGEnLXf_hbPQF9no,660
|
|
91
|
+
adam/commands/cql/cql_utils.py,sha256=XJnkqDeq-yPRnX2Zt1aE_cBO-qwMEZntM_rjyl6_AuI,4126
|
|
92
|
+
adam/commands/cql/cqlsh.py,sha256=mpyGUdtnoCw2ZMI5S8yc2_DUQ9rT5QLuE2EBhWmuCbA,2828
|
|
93
|
+
adam/commands/deploy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
94
|
+
adam/commands/deploy/code_start.py,sha256=-iH8HThTNM83IfBxT_LqTByuHVatV9d-Il4OYOfrwLI,1370
|
|
95
|
+
adam/commands/deploy/code_stop.py,sha256=ch7ZMgosvTHsGaIcDwQY5XYh_5HYrUjBkZFOI-d2gOU,1696
|
|
96
|
+
adam/commands/deploy/code_utils.py,sha256=cRvktxpAB2-QBX7-eYt9O57uio58X763uXWotTci3mc,3296
|
|
97
|
+
adam/commands/deploy/deploy.py,sha256=t54wa0cKXUpNFT0jvwaK-mWszFwGxbcpLZjz94ujHk4,1402
|
|
98
|
+
adam/commands/deploy/deploy_frontend.py,sha256=S3SvJD4JZQ9kDOOP_mrTnZFDl54AHhio5xxNgIUBZVk,1704
|
|
99
|
+
adam/commands/deploy/deploy_pg_agent.py,sha256=v1jVzNnNIxsemHVzGb6iDvvztjLTmHoCVRdZ_S1ATQM,1203
|
|
100
|
+
adam/commands/deploy/deploy_pod.py,sha256=QvNeBoTa_d3ERXQA7OcQm1awLi5ixj_nS94pqktYMb0,4663
|
|
101
|
+
adam/commands/deploy/deploy_utils.py,sha256=uQEl0gMOJw2TNjP0Q3pv5nrZYjAsoACtep0a15M0DCE,1524
|
|
102
|
+
adam/commands/deploy/undeploy.py,sha256=4Vces7YmTdYWnlXU6HCsjCjI3jCUFPV3AeWkUqwZoGY,1456
|
|
103
|
+
adam/commands/deploy/undeploy_frontend.py,sha256=gHekPn7l19JgVbhneKpQ7ModNoDFmzWRMyQv9v4FBxo,1261
|
|
104
|
+
adam/commands/deploy/undeploy_pg_agent.py,sha256=gWYaxxw9Hu1V-cI2bYynej9nMaZmR_uA8mRqrYP6zpY,1319
|
|
105
|
+
adam/commands/deploy/undeploy_pod.py,sha256=I-pNfdcfBGLJ5YssTjSHoM4miygqoiGN233wUSIUG9Y,1905
|
|
106
|
+
adam/commands/medusa/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
107
|
+
adam/commands/medusa/medusa.py,sha256=KNFjStvilIuOJt3wTtcWmKvdm8FdCnrDY2ltEWbratk,1402
|
|
108
|
+
adam/commands/medusa/medusa_backup.py,sha256=Tns-nBbqTnry8zoCFtXCisco3ipcOgArQbN5rc7SRGY,1801
|
|
109
|
+
adam/commands/medusa/medusa_restore.py,sha256=yvqMZtGsZHlFfBNAfcvzfcCbe1NQdlP3H4JQfsQ0WvU,3274
|
|
110
|
+
adam/commands/medusa/medusa_show_backupjobs.py,sha256=LPLyFOLH2Y3FxjZlW7DoyQKththaieh_gmBFC4YyA_4,1757
|
|
111
|
+
adam/commands/medusa/medusa_show_restorejobs.py,sha256=bj7afDJ7tgvssazOcxru9rCmcwPoDaTAgkYdvHKWhjI,1651
|
|
112
|
+
adam/commands/postgres/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
113
|
+
adam/commands/postgres/postgres.py,sha256=xiiMgNUUXr1nFO8Lwxjr27ooPZ6i2fMyuMSkqmqjVc0,3154
|
|
114
|
+
adam/commands/postgres/postgres_context.py,sha256=Bk7yKHuYCjq3eNhNQ7AT8bEaNvEzyx9WwdBMFJ128b0,9357
|
|
115
|
+
adam/commands/postgres/postgres_ls.py,sha256=HwZTgwGKXUqHX33S8aQPF6FqCrLqtoz4cLyJV2SpoE0,1186
|
|
116
|
+
adam/commands/postgres/postgres_preview.py,sha256=MLzdEc4mvNj6V1Q8jO5OPznXyYELJHgd35_eQgLlNIU,1274
|
|
117
|
+
adam/commands/postgres/postgres_utils.py,sha256=yzOdeo2opAgCb-hXurD2w2JfJ-g-D4EyBcFDw3ooGe4,889
|
|
118
|
+
adam/commands/postgres/psql_completions.py,sha256=Ep5BIjwH0ZnH1-YbkYdRMdT0r9R6GVVjCKmmUyfP54g,336
|
|
119
|
+
adam/commands/reaper/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
120
|
+
adam/commands/reaper/reaper.py,sha256=QUvJ9sFMiaUwMDbbCDpTlT8CfadafPa3O5yeJLh2TIo,1977
|
|
121
|
+
adam/commands/reaper/reaper_forward.py,sha256=mUp409MzT91cVXGxoPfBGceaR3qZ0rVdWKGdyzPNzSA,3177
|
|
122
|
+
adam/commands/reaper/reaper_forward_stop.py,sha256=mllxBGxOUkFYMvF0eaFbL5VGMVAiFuT5KY8rKWTIiOE,1384
|
|
123
|
+
adam/commands/reaper/reaper_restart.py,sha256=vqPm-8aY0PnIELxmWF-th3wQFE3f0-8DoJrgRIjb8xc,1290
|
|
124
|
+
adam/commands/reaper/reaper_run_abort.py,sha256=vp69f1zoNodwqx61N0CQaevYoR7qF2rccrzjJuF47qY,1858
|
|
125
|
+
adam/commands/reaper/reaper_runs.py,sha256=uVfAK3Pca_N10XKZ1aeMTrCCM8vDExXBWo84_2UmSqo,3253
|
|
126
|
+
adam/commands/reaper/reaper_runs_abort.py,sha256=HZm8Re66XwgURgd0sJtIF2UIwrdozHQJf1O_ZAsLy-I,2538
|
|
127
|
+
adam/commands/reaper/reaper_schedule_activate.py,sha256=HbwaSeKaDoR2qgiWgglwM5gm-4iTN2xKofiOlhUpvrQ,1952
|
|
128
|
+
adam/commands/reaper/reaper_schedule_start.py,sha256=oDwH99QVyeKgu-jk5-pB7BzUH_rablCbtumNHXjBnpU,1940
|
|
129
|
+
adam/commands/reaper/reaper_schedule_stop.py,sha256=_Ld5BRX5pqfIis5i1KG8yif0q5u9RTaFBmmQwkZuOMY,1929
|
|
130
|
+
adam/commands/reaper/reaper_schedules.py,sha256=-b7eKl0wJT7zMru8qKcLqG5JF0-LfeTcNmlxut9t93E,1263
|
|
131
|
+
adam/commands/reaper/reaper_session.py,sha256=bZyknDtsqlGc2JPMfUg0EXA7fOi_fEIzGiVn5x0HwNs,6650
|
|
132
|
+
adam/commands/reaper/reaper_status.py,sha256=g3Uep1AVYOThAaZoFjn4bWTKHElZnCleJyYYHP9HayY,1967
|
|
133
|
+
adam/commands/repair/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
134
|
+
adam/commands/repair/repair.py,sha256=Dp-yTvsT2hJU3xeJ8PA05o2pTtKeCHGsV62TT4GMixk,1339
|
|
135
|
+
adam/commands/repair/repair_log.py,sha256=CZTOfNoJdrmimktZlvzr4Mk3h6ldrtyjsf2aGo7w5oA,1159
|
|
136
|
+
adam/commands/repair/repair_run.py,sha256=JMSr17C_1KanbaL-vtHVhz69fOXzuXAiCRenQVmws9s,2598
|
|
137
|
+
adam/commands/repair/repair_scan.py,sha256=WC79lE4TOw6M7TdG2Zdfswuq9gRejJWoL_B4YWBOm8c,2439
|
|
138
|
+
adam/commands/repair/repair_stop.py,sha256=OJAPeWYmaW7MzoAE4un_qGyegSIJlmykdFaqtGV-k64,1193
|
|
139
|
+
adam/commands/show/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
140
|
+
adam/commands/show/show.py,sha256=goOS_gimZZS6cvl5qb4udjNpul4knNtNqXGFJVbt1NM,2128
|
|
141
|
+
adam/commands/show/show_adam.py,sha256=osuafMipN2My4O7bLdukBLsDHtTKguDfTagmgz7aZvw,1314
|
|
142
|
+
adam/commands/show/show_app_actions.py,sha256=TKhvjD5Br63-exbq11V48toXVxX8HhMppg5c1IZsAFE,1977
|
|
143
|
+
adam/commands/show/show_app_id.py,sha256=h2ezkJiu18dyDTIYA9F6crUGyelgOevsJuxh3jOUelg,1384
|
|
144
|
+
adam/commands/show/show_app_queues.py,sha256=1WUVI_PkM7m9vTO2we9Ky3hTkH12YY_R6JpF52uodnQ,1409
|
|
145
|
+
adam/commands/show/show_cassandra_status.py,sha256=j2kr0asSYQ-VTAsJW3Ikqkk2R6ltM-az3HXcACUM4rU,5157
|
|
146
|
+
adam/commands/show/show_cassandra_version.py,sha256=vq9F1O03tkYMlqENxEYFXXh8RnK30lXrFYVIgN4hP_I,1633
|
|
147
|
+
adam/commands/show/show_commands.py,sha256=ivjY3u3Ph969zOh0dYi0KjAfm7ClUGdQpkJLJAvpeUc,1893
|
|
148
|
+
adam/commands/show/show_host.py,sha256=nJZdk3guvHNZqoy5QDW9xff9bmqPgYVVpteXBp9RE8U,877
|
|
149
|
+
adam/commands/show/show_login.py,sha256=9sZYuRX_gdBKL1EJngJPPIBZyfqSlUoaQ0XWiIh1Pfk,1924
|
|
150
|
+
adam/commands/show/show_params.py,sha256=LoBj_ScmtsPrXSUH59p3IYAlmL-0Q_Gb01bp_7zrwQA,1008
|
|
151
|
+
adam/commands/show/show_processes.py,sha256=K7sBSyvCukp3bfoi0SBaqMV5a4Af8paEQXVZJT-gqgE,1770
|
|
152
|
+
adam/commands/show/show_repairs.py,sha256=m82ukc6YxjvJc9rdKXsiJLtXrEUCiaE-VPqgxDsIOeM,1477
|
|
153
|
+
adam/commands/show/show_storage.py,sha256=WuBB5AEFm4g7oBz_YCbtkrF2GEeJ-J2tqCVmvzwmwuI,1837
|
|
154
|
+
adam/sql/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
155
|
+
adam/sql/sql_completer.py,sha256=V4RI6LA1vdYcwP5sNuyQzOH9XkBailh7N68y2DrBOhk,3152
|
|
156
|
+
adam/sql/sql_state_machine.py,sha256=4ZUJCMzsenjay1a0n2ijJ-qdzryycXZ5AXd_fve2ikA,29865
|
|
157
|
+
adam/sql/term_completer.py,sha256=HZjOV4fEV9LraoMjkk8lHxNvzRtSIYsGUJhSMOhuoHY,2599
|
|
158
|
+
adam/sso/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
159
|
+
adam/sso/authenticator.py,sha256=BCm16L9zf5aLU47-sTCnudn2zLPwd8M2wwRminJfsqw,615
|
|
160
|
+
adam/sso/authn_ad.py,sha256=fDW8UR3WWykny5Awa5dQjjBUSFzIDz4aMn-lwXoABl8,5857
|
|
161
|
+
adam/sso/authn_okta.py,sha256=TV5vg7OEQPGFG_DSUQnWn37nbMX_qszZB0GRuQl6kGM,4529
|
|
162
|
+
adam/sso/cred_cache.py,sha256=Y86PDrTsuzoZSd8iae14SAv-YVEnxeaf6LukX35iTnw,2099
|
|
163
|
+
adam/sso/id_token.py,sha256=wmVZ8S0sjScnOxmSvOKlIEKgnvdWqhsgq9XjFe355O4,744
|
|
164
|
+
adam/sso/idp.py,sha256=tt6SjpZ2ix_zgfi3hQS9UUis9fvUWl6b4RLaEJ--ruY,5804
|
|
165
|
+
adam/sso/idp_login.py,sha256=QAtCUeDTVWliJy40RK_oac8Vgybr13xH8wzeBoxPaa8,1754
|
|
166
|
+
adam/sso/idp_session.py,sha256=9BUHNRf70u4rVKrVY1HKPOEmOviXvkjam8WJxmXSKIM,1735
|
|
167
|
+
adam/sso/sso_config.py,sha256=5N8WZgIJQBtHUy585XLRWKjpU87_v6QluyNK9E27D5s,2459
|
|
168
|
+
adam/utils_k8s/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
169
|
+
adam/utils_k8s/cassandra_clusters.py,sha256=i_kPRim0YELLxJDDlRcSSsQ0gmTBqvtBxW7wPH2LSkg,1455
|
|
170
|
+
adam/utils_k8s/cassandra_nodes.py,sha256=WadQpTGmA_zvgA6-sxjEx3xRwmrnkv0IoALrWmd2R4U,1518
|
|
171
|
+
adam/utils_k8s/config_maps.py,sha256=vc9A-2D1-1mindCMFL1wuysDOXb0RCl4BdjC6B6usXI,1194
|
|
172
|
+
adam/utils_k8s/custom_resources.py,sha256=cIeaZRQET2DelTGU2f5QsMckh7TddPpWZDFeNK3txeQ,7647
|
|
173
|
+
adam/utils_k8s/deployment.py,sha256=SLhnMm5GMXwEldj2OupSFBUsvNjynwSNrv5tIDvLMrc,2921
|
|
174
|
+
adam/utils_k8s/ingresses.py,sha256=ul3Z6fDGc_Cxcn-ExP0vXhZatoShCUZFtpwtCY4Qx7o,3460
|
|
175
|
+
adam/utils_k8s/jobs.py,sha256=gJpBpjcZ_FlkWJJIlavbHC_bqdmvv-GMVo8UZVh0sOQ,2610
|
|
176
|
+
adam/utils_k8s/kube_context.py,sha256=xJF_72vUJu-X9MpIYzOIfnj7KEWU7a_sLBR-H3994Y0,3311
|
|
177
|
+
adam/utils_k8s/pods.py,sha256=dbNyxu2xUZcQGrUIkt55sOXtwQ2yNbV_afAZSSaDkTk,11428
|
|
178
|
+
adam/utils_k8s/secrets.py,sha256=tBSKLknHlwdwyTzqvtJ2YS-y9x4gvW57Ug9sOkK_U50,2413
|
|
179
|
+
adam/utils_k8s/service_accounts.py,sha256=v2oQSqCrNvt2uRnKlNwR3fjtpUG7oF5nqgzEB7NnT-U,6349
|
|
180
|
+
adam/utils_k8s/services.py,sha256=EOJJGACVbbRvu5T3rMKqIJqgYic1_MSJ17EA0TJ6UOk,3156
|
|
181
|
+
adam/utils_k8s/statefulsets.py,sha256=0J_cYRqH96PCcq3tdsRrs4Q4ewv5dT_FMBR0HGAJ3d8,4710
|
|
182
|
+
adam/utils_k8s/volumes.py,sha256=RIBmlOSWM3V3QVXLCFT0owVOyh4rGG1ETp521a-6ndo,1137
|
|
183
|
+
kaqing-2.0.110.dist-info/METADATA,sha256=KvS1zxINszG8_ozyq2SNpaSCcOxqvnYakQRTgEyuo1w,133
|
|
184
|
+
kaqing-2.0.110.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
|
|
185
|
+
kaqing-2.0.110.dist-info/entry_points.txt,sha256=SkzhuQJUWsXOzHeZ5TgQ2c3_g53UGK23zzJU_JTZOZI,39
|
|
186
|
+
kaqing-2.0.110.dist-info/top_level.txt,sha256=8_2PZkwBb-xDcnc8a2rAbQeJhXKXskc7zTP7pSPa1fw,5
|
|
187
|
+
kaqing-2.0.110.dist-info/RECORD,,
|