paasta-tools 1.30.8__py3-none-any.whl → 1.30.9__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.
- paasta_tools/__init__.py +1 -1
- paasta_tools/api/views/instance.py +9 -2
- paasta_tools/async_utils.py +4 -1
- paasta_tools/bounce_lib.py +8 -5
- paasta_tools/check_services_replication_tools.py +10 -4
- paasta_tools/check_spark_jobs.py +1 -1
- paasta_tools/cli/cli.py +4 -4
- paasta_tools/cli/cmds/logs.py +29 -7
- paasta_tools/cli/cmds/mark_for_deployment.py +2 -2
- paasta_tools/cli/cmds/mesh_status.py +1 -1
- paasta_tools/cli/cmds/remote_run.py +1 -1
- paasta_tools/cli/cmds/rollback.py +1 -1
- paasta_tools/cli/cmds/spark_run.py +3 -3
- paasta_tools/cli/cmds/status.py +24 -21
- paasta_tools/cli/cmds/validate.py +3 -3
- paasta_tools/cli/utils.py +32 -19
- paasta_tools/contrib/check_orphans.py +1 -1
- paasta_tools/contrib/get_running_task_allocation.py +1 -1
- paasta_tools/instance/kubernetes.py +2 -1
- paasta_tools/kubernetes_tools.py +1 -1
- paasta_tools/metrics/metastatus_lib.py +0 -24
- paasta_tools/metrics/metrics_lib.py +12 -3
- paasta_tools/setup_kubernetes_job.py +1 -1
- paasta_tools/setup_tron_namespace.py +2 -2
- paasta_tools/tron_tools.py +1 -1
- paasta_tools/utils.py +2 -1
- {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/check_orphans.py +1 -1
- {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/check_spark_jobs.py +1 -1
- {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/get_running_task_allocation.py +1 -1
- {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/setup_kubernetes_job.py +1 -1
- {paasta_tools-1.30.8.dist-info → paasta_tools-1.30.9.dist-info}/METADATA +2 -2
- {paasta_tools-1.30.8.dist-info → paasta_tools-1.30.9.dist-info}/RECORD +84 -89
- paasta_tools/frameworks/adhoc_scheduler.py +0 -71
- paasta_tools/frameworks/native_scheduler.py +0 -652
- paasta_tools/frameworks/task_store.py +0 -245
- paasta_tools/mesos_maintenance.py +0 -848
- paasta_tools/paasta_native_serviceinit.py +0 -21
- {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/apply_external_resources.py +0 -0
- {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/bounce_log_latency_parser.py +0 -0
- {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/check_autoscaler_max_instances.py +0 -0
- {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/check_cassandracluster_services_replication.py +0 -0
- {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/check_flink_services_health.py +0 -0
- {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/check_kubernetes_api.py +0 -0
- {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/check_kubernetes_services_replication.py +0 -0
- {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/check_manual_oapi_changes.sh +0 -0
- {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/check_oom_events.py +0 -0
- {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/cleanup_kubernetes_cr.py +0 -0
- {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/cleanup_kubernetes_crd.py +0 -0
- {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/cleanup_kubernetes_jobs.py +0 -0
- {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/create_dynamodb_table.py +0 -0
- {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/create_paasta_playground.py +0 -0
- {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/delete_kubernetes_deployments.py +0 -0
- {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/emit_allocated_cpu_metrics.py +0 -0
- {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/generate_all_deployments +0 -0
- {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/generate_authenticating_services.py +0 -0
- {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/generate_deployments_for_service.py +0 -0
- {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/generate_services_file.py +0 -0
- {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/generate_services_yaml.py +0 -0
- {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/habitat_fixer.py +0 -0
- {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/ide_helper.py +0 -0
- {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/is_pod_healthy_in_proxy.py +0 -0
- {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/is_pod_healthy_in_smartstack.py +0 -0
- {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/kill_bad_containers.py +0 -0
- {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/kubernetes_remove_evicted_pods.py +0 -0
- {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/mass-deploy-tag.sh +0 -0
- {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/mock_patch_checker.py +0 -0
- {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/paasta_cleanup_remote_run_resources.py +0 -0
- {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/paasta_cleanup_stale_nodes.py +0 -0
- {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/paasta_deploy_tron_jobs +0 -0
- {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/paasta_execute_docker_command.py +0 -0
- {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/paasta_secrets_sync.py +0 -0
- {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/paasta_tabcomplete.sh +0 -0
- {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/paasta_update_soa_memcpu.py +0 -0
- {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/render_template.py +0 -0
- {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/rightsizer_soaconfigs_update.py +0 -0
- {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/service_shard_remove.py +0 -0
- {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/service_shard_update.py +0 -0
- {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/setup_istio_mesh.py +0 -0
- {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/setup_kubernetes_cr.py +0 -0
- {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/setup_kubernetes_crd.py +0 -0
- {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/setup_kubernetes_internal_crd.py +0 -0
- {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/setup_prometheus_adapter_config.py +0 -0
- {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/shared_ip_check.py +0 -0
- {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/synapse_srv_namespaces_fact.py +0 -0
- {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/timeouts_metrics_prom.py +0 -0
- {paasta_tools-1.30.8.dist-info → paasta_tools-1.30.9.dist-info}/WHEEL +0 -0
- {paasta_tools-1.30.8.dist-info → paasta_tools-1.30.9.dist-info}/entry_points.txt +0 -0
- {paasta_tools-1.30.8.dist-info → paasta_tools-1.30.9.dist-info}/licenses/LICENSE +0 -0
- {paasta_tools-1.30.8.dist-info → paasta_tools-1.30.9.dist-info}/top_level.txt +0 -0
|
@@ -1,245 +0,0 @@
|
|
|
1
|
-
import copy
|
|
2
|
-
import json
|
|
3
|
-
from typing import Any
|
|
4
|
-
from typing import Dict
|
|
5
|
-
from typing import Tuple
|
|
6
|
-
from typing import Type
|
|
7
|
-
from typing import TypeVar
|
|
8
|
-
from typing import Union
|
|
9
|
-
|
|
10
|
-
from kazoo.client import KazooClient
|
|
11
|
-
from kazoo.exceptions import BadVersionError
|
|
12
|
-
from kazoo.exceptions import NodeExistsError
|
|
13
|
-
from kazoo.exceptions import NoNodeError
|
|
14
|
-
from kazoo.protocol.states import ZnodeStat
|
|
15
|
-
|
|
16
|
-
from paasta_tools.utils import _log
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
class MesosTaskParametersIsImmutableError(Exception):
|
|
20
|
-
pass
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
_SelfT = TypeVar("_SelfT", bound="MesosTaskParameters")
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
class MesosTaskParameters:
|
|
27
|
-
health: Any
|
|
28
|
-
mesos_task_state: str
|
|
29
|
-
is_draining: bool
|
|
30
|
-
is_healthy: bool
|
|
31
|
-
offer: Any
|
|
32
|
-
resources: Any
|
|
33
|
-
|
|
34
|
-
def __init__(
|
|
35
|
-
self,
|
|
36
|
-
health=None,
|
|
37
|
-
mesos_task_state=None,
|
|
38
|
-
is_draining=None,
|
|
39
|
-
is_healthy=None,
|
|
40
|
-
offer=None,
|
|
41
|
-
resources=None,
|
|
42
|
-
):
|
|
43
|
-
self.__dict__["health"] = health
|
|
44
|
-
self.__dict__["mesos_task_state"] = mesos_task_state
|
|
45
|
-
self.__dict__["is_draining"] = is_draining
|
|
46
|
-
self.__dict__["is_healthy"] = is_healthy
|
|
47
|
-
self.__dict__["offer"] = offer
|
|
48
|
-
self.__dict__["resources"] = resources
|
|
49
|
-
|
|
50
|
-
def __eq__(self, other):
|
|
51
|
-
return self.__dict__ == other.__dict__
|
|
52
|
-
|
|
53
|
-
def __repr__(self):
|
|
54
|
-
return "{}(\n {})".format(
|
|
55
|
-
type(self).__name__,
|
|
56
|
-
",\n ".join(["%s=%r" % kv for kv in self.__dict__.items()]),
|
|
57
|
-
)
|
|
58
|
-
|
|
59
|
-
def __setattr__(self, name, value):
|
|
60
|
-
raise MesosTaskParametersIsImmutableError()
|
|
61
|
-
|
|
62
|
-
def __delattr__(self, name):
|
|
63
|
-
raise MesosTaskParametersIsImmutableError()
|
|
64
|
-
|
|
65
|
-
def merge(self: _SelfT, **kwargs) -> "MesosTaskParameters":
|
|
66
|
-
"""Return a merged MesosTaskParameters object, where attributes in other take precedence over self."""
|
|
67
|
-
|
|
68
|
-
new_dict = copy.deepcopy(self.__dict__)
|
|
69
|
-
new_dict.update(kwargs)
|
|
70
|
-
|
|
71
|
-
return MesosTaskParameters(**new_dict)
|
|
72
|
-
|
|
73
|
-
@classmethod
|
|
74
|
-
def deserialize(cls: Type[_SelfT], serialized_params: Union[str, bytes]) -> _SelfT:
|
|
75
|
-
return cls(**json.loads(serialized_params))
|
|
76
|
-
|
|
77
|
-
def serialize(self):
|
|
78
|
-
return json.dumps(self.__dict__).encode("utf-8")
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
class TaskStore:
|
|
82
|
-
def __init__(self, service_name, instance_name, framework_id, system_paasta_config):
|
|
83
|
-
self.service_name = service_name
|
|
84
|
-
self.instance_name = instance_name
|
|
85
|
-
self.framework_id = framework_id
|
|
86
|
-
self.system_paasta_config = system_paasta_config
|
|
87
|
-
|
|
88
|
-
def get_task(self, task_id: str) -> MesosTaskParameters:
|
|
89
|
-
"""Get task data for task_id. If we don't know about task_id, return None"""
|
|
90
|
-
raise NotImplementedError()
|
|
91
|
-
|
|
92
|
-
def get_all_tasks(self) -> Dict[str, MesosTaskParameters]:
|
|
93
|
-
"""Returns a dictionary of task_id -> MesosTaskParameters for all known tasks."""
|
|
94
|
-
raise NotImplementedError()
|
|
95
|
-
|
|
96
|
-
def overwrite_task(self, task_id: str, params: MesosTaskParameters) -> None:
|
|
97
|
-
raise NotImplementedError()
|
|
98
|
-
|
|
99
|
-
def add_task_if_doesnt_exist(self, task_id: str, **kwargs) -> None:
|
|
100
|
-
"""Add a task if it does not already exist. If it already exists, do nothing."""
|
|
101
|
-
if self.get_task(task_id) is not None:
|
|
102
|
-
return
|
|
103
|
-
else:
|
|
104
|
-
self.overwrite_task(task_id, MesosTaskParameters(**kwargs))
|
|
105
|
-
|
|
106
|
-
def update_task(self, task_id: str, **kwargs) -> MesosTaskParameters:
|
|
107
|
-
existing_task = self.get_task(task_id)
|
|
108
|
-
if existing_task:
|
|
109
|
-
merged_params = existing_task.merge(**kwargs)
|
|
110
|
-
else:
|
|
111
|
-
merged_params = MesosTaskParameters(**kwargs)
|
|
112
|
-
|
|
113
|
-
self.overwrite_task(task_id, merged_params)
|
|
114
|
-
return merged_params
|
|
115
|
-
|
|
116
|
-
def garbage_collect_old_tasks(self, max_dead_task_age: float) -> None:
|
|
117
|
-
# TODO: call me.
|
|
118
|
-
# TODO: implement in base class.
|
|
119
|
-
raise NotImplementedError()
|
|
120
|
-
|
|
121
|
-
def close(self):
|
|
122
|
-
pass
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
class DictTaskStore(TaskStore):
|
|
126
|
-
def __init__(self, service_name, instance_name, framework_id, system_paasta_config):
|
|
127
|
-
self.tasks: Dict[str, MesosTaskParameters] = {}
|
|
128
|
-
super().__init__(
|
|
129
|
-
service_name, instance_name, framework_id, system_paasta_config
|
|
130
|
-
)
|
|
131
|
-
|
|
132
|
-
def get_task(self, task_id: str) -> MesosTaskParameters:
|
|
133
|
-
return self.tasks.get(task_id)
|
|
134
|
-
|
|
135
|
-
def get_all_tasks(self) -> Dict[str, MesosTaskParameters]:
|
|
136
|
-
"""Returns a dictionary of task_id -> MesosTaskParameters for all known tasks."""
|
|
137
|
-
return dict(self.tasks)
|
|
138
|
-
|
|
139
|
-
def overwrite_task(self, task_id: str, params: MesosTaskParameters) -> None:
|
|
140
|
-
# serialize/deserialize to make sure the returned values are the same format as ZKTaskStore.
|
|
141
|
-
self.tasks[task_id] = MesosTaskParameters.deserialize(params.serialize())
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
class ZKTaskStore(TaskStore):
|
|
145
|
-
def __init__(self, service_name, instance_name, framework_id, system_paasta_config):
|
|
146
|
-
super().__init__(
|
|
147
|
-
service_name, instance_name, framework_id, system_paasta_config
|
|
148
|
-
)
|
|
149
|
-
self.zk_hosts = system_paasta_config.get_zk_hosts()
|
|
150
|
-
|
|
151
|
-
# For some reason, I could not get the code suggested by this SO post to work to ensure_path on the chroot.
|
|
152
|
-
# https://stackoverflow.com/a/32785625/25327
|
|
153
|
-
# Plus, it just felt dirty to modify instance attributes of a running connection, especially given that
|
|
154
|
-
# KazooClient.set_hosts() doesn't allow you to change the chroot. Must be for a good reason.
|
|
155
|
-
|
|
156
|
-
chroot = f"task_store/{service_name}/{instance_name}/{framework_id}"
|
|
157
|
-
|
|
158
|
-
temp_zk_client = KazooClient(hosts=self.zk_hosts)
|
|
159
|
-
temp_zk_client.start()
|
|
160
|
-
temp_zk_client.ensure_path(chroot)
|
|
161
|
-
temp_zk_client.stop()
|
|
162
|
-
temp_zk_client.close()
|
|
163
|
-
|
|
164
|
-
self.zk_client = KazooClient(hosts=f"{self.zk_hosts}/{chroot}")
|
|
165
|
-
self.zk_client.start()
|
|
166
|
-
self.zk_client.ensure_path("/")
|
|
167
|
-
|
|
168
|
-
def close(self):
|
|
169
|
-
self.zk_client.stop()
|
|
170
|
-
self.zk_client.close()
|
|
171
|
-
|
|
172
|
-
def get_task(self, task_id: str) -> MesosTaskParameters:
|
|
173
|
-
params, stat = self._get_task(task_id)
|
|
174
|
-
return params
|
|
175
|
-
|
|
176
|
-
def _get_task(self, task_id: str) -> Tuple[MesosTaskParameters, ZnodeStat]:
|
|
177
|
-
"""Like get_task, but also returns the ZnodeStat that self.zk_client.get() returns"""
|
|
178
|
-
try:
|
|
179
|
-
data, stat = self.zk_client.get("/%s" % task_id)
|
|
180
|
-
return MesosTaskParameters.deserialize(data), stat
|
|
181
|
-
except NoNodeError:
|
|
182
|
-
return None, None
|
|
183
|
-
except json.decoder.JSONDecodeError:
|
|
184
|
-
_log(
|
|
185
|
-
service=self.service_name,
|
|
186
|
-
instance=self.instance_name,
|
|
187
|
-
level="debug",
|
|
188
|
-
component="deploy",
|
|
189
|
-
line=f"Warning: found non-json-decodable value in zookeeper for task {task_id}: {data}",
|
|
190
|
-
)
|
|
191
|
-
return None, None
|
|
192
|
-
|
|
193
|
-
def get_all_tasks(self):
|
|
194
|
-
all_tasks = {}
|
|
195
|
-
|
|
196
|
-
for child_path in self.zk_client.get_children("/"):
|
|
197
|
-
task_id = self._task_id_from_zk_path(child_path)
|
|
198
|
-
params = self.get_task(task_id)
|
|
199
|
-
# sometimes there are bogus child ZK nodes. Ignore them.
|
|
200
|
-
if params is not None:
|
|
201
|
-
all_tasks[task_id] = params
|
|
202
|
-
|
|
203
|
-
return all_tasks
|
|
204
|
-
|
|
205
|
-
def update_task(self, task_id: str, **kwargs):
|
|
206
|
-
retry = True
|
|
207
|
-
while retry:
|
|
208
|
-
retry = False
|
|
209
|
-
existing_task, stat = self._get_task(task_id)
|
|
210
|
-
|
|
211
|
-
zk_path = self._zk_path_from_task_id(task_id)
|
|
212
|
-
if existing_task:
|
|
213
|
-
merged_params = existing_task.merge(**kwargs)
|
|
214
|
-
try:
|
|
215
|
-
self.zk_client.set(
|
|
216
|
-
zk_path, merged_params.serialize(), version=stat.version
|
|
217
|
-
)
|
|
218
|
-
except BadVersionError:
|
|
219
|
-
retry = True
|
|
220
|
-
else:
|
|
221
|
-
merged_params = MesosTaskParameters(**kwargs)
|
|
222
|
-
try:
|
|
223
|
-
self.zk_client.create(zk_path, merged_params.serialize())
|
|
224
|
-
except NodeExistsError:
|
|
225
|
-
retry = True
|
|
226
|
-
|
|
227
|
-
return merged_params
|
|
228
|
-
|
|
229
|
-
def overwrite_task(
|
|
230
|
-
self, task_id: str, params: MesosTaskParameters, version=-1
|
|
231
|
-
) -> None:
|
|
232
|
-
try:
|
|
233
|
-
self.zk_client.set(
|
|
234
|
-
self._zk_path_from_task_id(task_id), params.serialize(), version=version
|
|
235
|
-
)
|
|
236
|
-
except NoNodeError:
|
|
237
|
-
self.zk_client.create(
|
|
238
|
-
self._zk_path_from_task_id(task_id), params.serialize()
|
|
239
|
-
)
|
|
240
|
-
|
|
241
|
-
def _zk_path_from_task_id(self, task_id: str) -> str:
|
|
242
|
-
return "/%s" % task_id
|
|
243
|
-
|
|
244
|
-
def _task_id_from_zk_path(self, zk_path: str) -> str:
|
|
245
|
-
return zk_path.lstrip("/")
|