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.

Files changed (123) hide show
  1. adam/apps.py +2 -2
  2. adam/batch.py +11 -15
  3. adam/checks/check_utils.py +4 -4
  4. adam/checks/compactionstats.py +1 -1
  5. adam/checks/cpu.py +2 -2
  6. adam/checks/disk.py +1 -1
  7. adam/checks/gossip.py +1 -1
  8. adam/checks/memory.py +3 -3
  9. adam/checks/status.py +1 -1
  10. adam/commands/alter_tables.py +3 -14
  11. adam/commands/app.py +2 -2
  12. adam/commands/app_ping.py +2 -2
  13. adam/commands/audit/audit.py +85 -0
  14. adam/commands/audit/audit_repair_tables.py +76 -0
  15. adam/commands/audit/audit_run.py +57 -0
  16. adam/commands/audit/show_last10.py +50 -0
  17. adam/commands/audit/show_slow10.py +49 -0
  18. adam/commands/audit/show_top10.py +48 -0
  19. adam/commands/audit/utils_show_top10.py +59 -0
  20. adam/commands/bash.py +76 -13
  21. adam/commands/cd.py +22 -13
  22. adam/commands/check.py +6 -0
  23. adam/commands/cli_commands.py +3 -3
  24. adam/commands/command.py +15 -11
  25. adam/commands/commands_utils.py +4 -5
  26. adam/commands/cql/cql_completions.py +7 -5
  27. adam/commands/cql/cql_utils.py +13 -10
  28. adam/commands/cql/cqlsh.py +6 -3
  29. adam/commands/deploy/code_utils.py +2 -2
  30. adam/commands/deploy/deploy.py +7 -1
  31. adam/commands/deploy/deploy_pg_agent.py +2 -2
  32. adam/commands/deploy/deploy_pod.py +6 -6
  33. adam/commands/deploy/deploy_utils.py +2 -2
  34. adam/commands/deploy/undeploy.py +7 -1
  35. adam/commands/deploy/undeploy_pg_agent.py +2 -2
  36. adam/commands/deploy/undeploy_pod.py +4 -4
  37. adam/commands/devices.py +29 -0
  38. adam/commands/help.py +10 -7
  39. adam/commands/issues.py +6 -0
  40. adam/commands/login.py +6 -3
  41. adam/commands/logs.py +2 -1
  42. adam/commands/ls.py +30 -24
  43. adam/commands/medusa/medusa_backup.py +2 -2
  44. adam/commands/medusa/medusa_restore.py +2 -2
  45. adam/commands/medusa/medusa_show_backupjobs.py +3 -2
  46. adam/commands/medusa/medusa_show_restorejobs.py +2 -2
  47. adam/commands/nodetool.py +5 -3
  48. adam/commands/postgres/postgres.py +3 -3
  49. adam/commands/postgres/{postgres_session.py → postgres_context.py} +29 -30
  50. adam/commands/postgres/postgres_utils.py +5 -5
  51. adam/commands/postgres/psql_completions.py +2 -3
  52. adam/commands/preview_table.py +17 -32
  53. adam/commands/pwd.py +5 -2
  54. adam/commands/reaper/reaper.py +3 -0
  55. adam/commands/reaper/reaper_restart.py +1 -1
  56. adam/commands/reaper/reaper_session.py +1 -1
  57. adam/commands/repair/repair.py +3 -3
  58. adam/commands/repair/repair_log.py +1 -1
  59. adam/commands/repair/repair_run.py +2 -2
  60. adam/commands/repair/repair_scan.py +1 -1
  61. adam/commands/repair/repair_stop.py +1 -1
  62. adam/commands/report.py +6 -0
  63. adam/commands/restart.py +2 -2
  64. adam/commands/rollout.py +1 -1
  65. adam/commands/show/show.py +5 -2
  66. adam/commands/show/show_app_actions.py +3 -0
  67. adam/commands/show/show_app_id.py +1 -1
  68. adam/commands/show/show_app_queues.py +3 -2
  69. adam/commands/show/show_cassandra_status.py +3 -3
  70. adam/commands/show/show_cassandra_version.py +3 -3
  71. adam/commands/show/show_host.py +33 -0
  72. adam/commands/show/show_login.py +3 -0
  73. adam/commands/show/show_processes.py +1 -1
  74. adam/commands/show/show_repairs.py +2 -2
  75. adam/commands/show/show_storage.py +1 -1
  76. adam/commands/watch.py +1 -1
  77. adam/config.py +2 -1
  78. adam/embedded_params.py +1 -1
  79. adam/pod_exec_result.py +7 -2
  80. adam/repl.py +141 -89
  81. adam/repl_commands.py +21 -20
  82. adam/repl_state.py +167 -39
  83. adam/sql/sql_completer.py +89 -49
  84. adam/sql/sql_state_machine.py +518 -0
  85. adam/sql/term_completer.py +76 -0
  86. adam/sso/cred_cache.py +1 -1
  87. adam/sso/idp.py +1 -1
  88. adam/utils.py +0 -1
  89. adam/utils_audits.py +193 -0
  90. adam/{k8s_utils → utils_k8s}/cassandra_clusters.py +6 -8
  91. adam/{k8s_utils → utils_k8s}/cassandra_nodes.py +11 -4
  92. adam/{k8s_utils → utils_k8s}/deployment.py +2 -2
  93. adam/{k8s_utils → utils_k8s}/pods.py +33 -9
  94. adam/{k8s_utils → utils_k8s}/secrets.py +4 -0
  95. adam/{k8s_utils → utils_k8s}/statefulsets.py +4 -4
  96. adam/utils_net.py +24 -0
  97. adam/version.py +1 -1
  98. {kaqing-2.0.50.dist-info → kaqing-2.0.110.dist-info}/METADATA +1 -1
  99. kaqing-2.0.110.dist-info/RECORD +187 -0
  100. adam/commands/cql/cql_table_completer.py +0 -16
  101. adam/commands/describe/describe.py +0 -46
  102. adam/commands/describe/describe_keyspace.py +0 -60
  103. adam/commands/describe/describe_keyspaces.py +0 -50
  104. adam/commands/describe/describe_table.py +0 -60
  105. adam/commands/describe/describe_tables.py +0 -50
  106. adam/commands/postgres/psql_table_completer.py +0 -18
  107. adam/sql/any_completer.py +0 -84
  108. adam/sql/sql_utils.py +0 -5
  109. adam/sql/table_name_completer.py +0 -17
  110. kaqing-2.0.50.dist-info/RECORD +0 -185
  111. /adam/commands/{describe → audit}/__init__.py +0 -0
  112. /adam/{k8s_utils → utils_k8s}/__init__.py +0 -0
  113. /adam/{k8s_utils → utils_k8s}/config_maps.py +0 -0
  114. /adam/{k8s_utils → utils_k8s}/custom_resources.py +0 -0
  115. /adam/{k8s_utils → utils_k8s}/ingresses.py +0 -0
  116. /adam/{k8s_utils → utils_k8s}/jobs.py +0 -0
  117. /adam/{k8s_utils → utils_k8s}/kube_context.py +0 -0
  118. /adam/{k8s_utils → utils_k8s}/service_accounts.py +0 -0
  119. /adam/{k8s_utils → utils_k8s}/services.py +0 -0
  120. /adam/{k8s_utils → utils_k8s}/volumes.py +0 -0
  121. {kaqing-2.0.50.dist-info → kaqing-2.0.110.dist-info}/WHEEL +0 -0
  122. {kaqing-2.0.50.dist-info → kaqing-2.0.110.dist-info}/entry_points.txt +0 -0
  123. {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.config import Config
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', max_workers=0, show_out=True, on_any = False) -> list[PodExecResult]:
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.k8s_utils.pods import Pods
3
- from adam.k8s_utils.secrets import Secrets
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
- return Pods.exec(pod_name, "cassandra", namespace, command, show_out, throw_err)
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.k8s_utils.pods import Pods
4
- from adam.k8s_utils.volumes import ConfigMapMount
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.k8s_utils.volumes import ConfigMapMount
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
- api_response = v1.delete_namespaced_pod(pod_name, namespace, grace_period_seconds=grace_period_seconds)
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', max_workers=0, show_out=True, on_any = False) -> list[T]:
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, show_out = True, throw_err = False, interaction: Callable[[any, list[str]], any] = None):
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
- exec_command = ["/bin/sh", "-c", command]
105
- k_command = f'kubectl exec {pod_name} -c {container} -n {namespace} -- {command}'
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=True,
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(show_namespace = True):
32
- if show_namespace:
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
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env python
2
2
  # -*- coding: utf-8 -*-
3
3
 
4
- __version__ = "2.0.50" #: the working version
4
+ __version__ = "2.0.110" #: the working version
5
5
  __release__ = "1.0.0" #: the release version
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: kaqing
3
- Version: 2.0.50
3
+ Version: 2.0.110
4
4
  Summary: UNKNOWN
5
5
  Home-page: UNKNOWN
6
6
  License: UNKNOWN
@@ -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,,