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.
Files changed (89) hide show
  1. paasta_tools/__init__.py +1 -1
  2. paasta_tools/api/views/instance.py +9 -2
  3. paasta_tools/async_utils.py +4 -1
  4. paasta_tools/bounce_lib.py +8 -5
  5. paasta_tools/check_services_replication_tools.py +10 -4
  6. paasta_tools/check_spark_jobs.py +1 -1
  7. paasta_tools/cli/cli.py +4 -4
  8. paasta_tools/cli/cmds/logs.py +29 -7
  9. paasta_tools/cli/cmds/mark_for_deployment.py +2 -2
  10. paasta_tools/cli/cmds/mesh_status.py +1 -1
  11. paasta_tools/cli/cmds/remote_run.py +1 -1
  12. paasta_tools/cli/cmds/rollback.py +1 -1
  13. paasta_tools/cli/cmds/spark_run.py +3 -3
  14. paasta_tools/cli/cmds/status.py +24 -21
  15. paasta_tools/cli/cmds/validate.py +3 -3
  16. paasta_tools/cli/utils.py +32 -19
  17. paasta_tools/contrib/check_orphans.py +1 -1
  18. paasta_tools/contrib/get_running_task_allocation.py +1 -1
  19. paasta_tools/instance/kubernetes.py +2 -1
  20. paasta_tools/kubernetes_tools.py +1 -1
  21. paasta_tools/metrics/metastatus_lib.py +0 -24
  22. paasta_tools/metrics/metrics_lib.py +12 -3
  23. paasta_tools/setup_kubernetes_job.py +1 -1
  24. paasta_tools/setup_tron_namespace.py +2 -2
  25. paasta_tools/tron_tools.py +1 -1
  26. paasta_tools/utils.py +2 -1
  27. {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/check_orphans.py +1 -1
  28. {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/check_spark_jobs.py +1 -1
  29. {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/get_running_task_allocation.py +1 -1
  30. {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/setup_kubernetes_job.py +1 -1
  31. {paasta_tools-1.30.8.dist-info → paasta_tools-1.30.9.dist-info}/METADATA +2 -2
  32. {paasta_tools-1.30.8.dist-info → paasta_tools-1.30.9.dist-info}/RECORD +84 -89
  33. paasta_tools/frameworks/adhoc_scheduler.py +0 -71
  34. paasta_tools/frameworks/native_scheduler.py +0 -652
  35. paasta_tools/frameworks/task_store.py +0 -245
  36. paasta_tools/mesos_maintenance.py +0 -848
  37. paasta_tools/paasta_native_serviceinit.py +0 -21
  38. {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/apply_external_resources.py +0 -0
  39. {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/bounce_log_latency_parser.py +0 -0
  40. {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/check_autoscaler_max_instances.py +0 -0
  41. {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/check_cassandracluster_services_replication.py +0 -0
  42. {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/check_flink_services_health.py +0 -0
  43. {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/check_kubernetes_api.py +0 -0
  44. {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/check_kubernetes_services_replication.py +0 -0
  45. {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/check_manual_oapi_changes.sh +0 -0
  46. {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/check_oom_events.py +0 -0
  47. {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/cleanup_kubernetes_cr.py +0 -0
  48. {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/cleanup_kubernetes_crd.py +0 -0
  49. {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/cleanup_kubernetes_jobs.py +0 -0
  50. {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/create_dynamodb_table.py +0 -0
  51. {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/create_paasta_playground.py +0 -0
  52. {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/delete_kubernetes_deployments.py +0 -0
  53. {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/emit_allocated_cpu_metrics.py +0 -0
  54. {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/generate_all_deployments +0 -0
  55. {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/generate_authenticating_services.py +0 -0
  56. {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/generate_deployments_for_service.py +0 -0
  57. {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/generate_services_file.py +0 -0
  58. {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/generate_services_yaml.py +0 -0
  59. {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/habitat_fixer.py +0 -0
  60. {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/ide_helper.py +0 -0
  61. {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/is_pod_healthy_in_proxy.py +0 -0
  62. {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/is_pod_healthy_in_smartstack.py +0 -0
  63. {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/kill_bad_containers.py +0 -0
  64. {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/kubernetes_remove_evicted_pods.py +0 -0
  65. {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/mass-deploy-tag.sh +0 -0
  66. {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/mock_patch_checker.py +0 -0
  67. {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/paasta_cleanup_remote_run_resources.py +0 -0
  68. {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/paasta_cleanup_stale_nodes.py +0 -0
  69. {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/paasta_deploy_tron_jobs +0 -0
  70. {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/paasta_execute_docker_command.py +0 -0
  71. {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/paasta_secrets_sync.py +0 -0
  72. {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/paasta_tabcomplete.sh +0 -0
  73. {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/paasta_update_soa_memcpu.py +0 -0
  74. {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/render_template.py +0 -0
  75. {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/rightsizer_soaconfigs_update.py +0 -0
  76. {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/service_shard_remove.py +0 -0
  77. {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/service_shard_update.py +0 -0
  78. {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/setup_istio_mesh.py +0 -0
  79. {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/setup_kubernetes_cr.py +0 -0
  80. {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/setup_kubernetes_crd.py +0 -0
  81. {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/setup_kubernetes_internal_crd.py +0 -0
  82. {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/setup_prometheus_adapter_config.py +0 -0
  83. {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/shared_ip_check.py +0 -0
  84. {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/synapse_srv_namespaces_fact.py +0 -0
  85. {paasta_tools-1.30.8.data → paasta_tools-1.30.9.data}/scripts/timeouts_metrics_prom.py +0 -0
  86. {paasta_tools-1.30.8.dist-info → paasta_tools-1.30.9.dist-info}/WHEEL +0 -0
  87. {paasta_tools-1.30.8.dist-info → paasta_tools-1.30.9.dist-info}/entry_points.txt +0 -0
  88. {paasta_tools-1.30.8.dist-info → paasta_tools-1.30.9.dist-info}/licenses/LICENSE +0 -0
  89. {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("/")