paasta-tools 1.35.1__py3-none-any.whl → 1.35.6__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 (70) hide show
  1. paasta_tools/__init__.py +1 -1
  2. paasta_tools/cli/cmds/mark_for_deployment.py +1 -1
  3. paasta_tools/cli/cmds/secret.py +2 -2
  4. paasta_tools/cli/cmds/spark_run.py +2 -0
  5. paasta_tools/cli/cmds/status.py +1 -1
  6. paasta_tools/cli/cmds/validate.py +72 -18
  7. paasta_tools/contrib/paasta_update_soa_memcpu.py +10 -14
  8. paasta_tools/kubernetes/application/controller_wrappers.py +23 -2
  9. paasta_tools/kubernetes_tools.py +14 -9
  10. paasta_tools/long_running_service_tools.py +4 -0
  11. paasta_tools/tron_tools.py +3 -0
  12. paasta_tools/utils.py +11 -1
  13. {paasta_tools-1.35.1.data → paasta_tools-1.35.6.data}/scripts/paasta_update_soa_memcpu.py +10 -14
  14. {paasta_tools-1.35.1.dist-info → paasta_tools-1.35.6.dist-info}/METADATA +2 -2
  15. {paasta_tools-1.35.1.dist-info → paasta_tools-1.35.6.dist-info}/RECORD +70 -70
  16. {paasta_tools-1.35.1.data → paasta_tools-1.35.6.data}/scripts/apply_external_resources.py +0 -0
  17. {paasta_tools-1.35.1.data → paasta_tools-1.35.6.data}/scripts/bounce_log_latency_parser.py +0 -0
  18. {paasta_tools-1.35.1.data → paasta_tools-1.35.6.data}/scripts/check_autoscaler_max_instances.py +0 -0
  19. {paasta_tools-1.35.1.data → paasta_tools-1.35.6.data}/scripts/check_cassandracluster_services_replication.py +0 -0
  20. {paasta_tools-1.35.1.data → paasta_tools-1.35.6.data}/scripts/check_flink_services_health.py +0 -0
  21. {paasta_tools-1.35.1.data → paasta_tools-1.35.6.data}/scripts/check_kubernetes_api.py +0 -0
  22. {paasta_tools-1.35.1.data → paasta_tools-1.35.6.data}/scripts/check_kubernetes_services_replication.py +0 -0
  23. {paasta_tools-1.35.1.data → paasta_tools-1.35.6.data}/scripts/check_manual_oapi_changes.sh +0 -0
  24. {paasta_tools-1.35.1.data → paasta_tools-1.35.6.data}/scripts/check_oom_events.py +0 -0
  25. {paasta_tools-1.35.1.data → paasta_tools-1.35.6.data}/scripts/check_orphans.py +0 -0
  26. {paasta_tools-1.35.1.data → paasta_tools-1.35.6.data}/scripts/check_spark_jobs.py +0 -0
  27. {paasta_tools-1.35.1.data → paasta_tools-1.35.6.data}/scripts/cleanup_kubernetes_cr.py +0 -0
  28. {paasta_tools-1.35.1.data → paasta_tools-1.35.6.data}/scripts/cleanup_kubernetes_crd.py +0 -0
  29. {paasta_tools-1.35.1.data → paasta_tools-1.35.6.data}/scripts/cleanup_kubernetes_jobs.py +0 -0
  30. {paasta_tools-1.35.1.data → paasta_tools-1.35.6.data}/scripts/create_dynamodb_table.py +0 -0
  31. {paasta_tools-1.35.1.data → paasta_tools-1.35.6.data}/scripts/create_paasta_playground.py +0 -0
  32. {paasta_tools-1.35.1.data → paasta_tools-1.35.6.data}/scripts/delete_kubernetes_deployments.py +0 -0
  33. {paasta_tools-1.35.1.data → paasta_tools-1.35.6.data}/scripts/emit_allocated_cpu_metrics.py +0 -0
  34. {paasta_tools-1.35.1.data → paasta_tools-1.35.6.data}/scripts/generate_all_deployments +0 -0
  35. {paasta_tools-1.35.1.data → paasta_tools-1.35.6.data}/scripts/generate_authenticating_services.py +0 -0
  36. {paasta_tools-1.35.1.data → paasta_tools-1.35.6.data}/scripts/generate_deployments_for_service.py +0 -0
  37. {paasta_tools-1.35.1.data → paasta_tools-1.35.6.data}/scripts/generate_services_file.py +0 -0
  38. {paasta_tools-1.35.1.data → paasta_tools-1.35.6.data}/scripts/generate_services_yaml.py +0 -0
  39. {paasta_tools-1.35.1.data → paasta_tools-1.35.6.data}/scripts/get_running_task_allocation.py +0 -0
  40. {paasta_tools-1.35.1.data → paasta_tools-1.35.6.data}/scripts/habitat_fixer.py +0 -0
  41. {paasta_tools-1.35.1.data → paasta_tools-1.35.6.data}/scripts/ide_helper.py +0 -0
  42. {paasta_tools-1.35.1.data → paasta_tools-1.35.6.data}/scripts/is_pod_healthy_in_proxy.py +0 -0
  43. {paasta_tools-1.35.1.data → paasta_tools-1.35.6.data}/scripts/is_pod_healthy_in_smartstack.py +0 -0
  44. {paasta_tools-1.35.1.data → paasta_tools-1.35.6.data}/scripts/kill_bad_containers.py +0 -0
  45. {paasta_tools-1.35.1.data → paasta_tools-1.35.6.data}/scripts/kubernetes_remove_evicted_pods.py +0 -0
  46. {paasta_tools-1.35.1.data → paasta_tools-1.35.6.data}/scripts/mass-deploy-tag.sh +0 -0
  47. {paasta_tools-1.35.1.data → paasta_tools-1.35.6.data}/scripts/mock_patch_checker.py +0 -0
  48. {paasta_tools-1.35.1.data → paasta_tools-1.35.6.data}/scripts/paasta_cleanup_remote_run_resources.py +0 -0
  49. {paasta_tools-1.35.1.data → paasta_tools-1.35.6.data}/scripts/paasta_cleanup_stale_nodes.py +0 -0
  50. {paasta_tools-1.35.1.data → paasta_tools-1.35.6.data}/scripts/paasta_deploy_tron_jobs +0 -0
  51. {paasta_tools-1.35.1.data → paasta_tools-1.35.6.data}/scripts/paasta_execute_docker_command.py +0 -0
  52. {paasta_tools-1.35.1.data → paasta_tools-1.35.6.data}/scripts/paasta_secrets_sync.py +0 -0
  53. {paasta_tools-1.35.1.data → paasta_tools-1.35.6.data}/scripts/paasta_tabcomplete.sh +0 -0
  54. {paasta_tools-1.35.1.data → paasta_tools-1.35.6.data}/scripts/render_template.py +0 -0
  55. {paasta_tools-1.35.1.data → paasta_tools-1.35.6.data}/scripts/rightsizer_soaconfigs_update.py +0 -0
  56. {paasta_tools-1.35.1.data → paasta_tools-1.35.6.data}/scripts/service_shard_remove.py +0 -0
  57. {paasta_tools-1.35.1.data → paasta_tools-1.35.6.data}/scripts/service_shard_update.py +0 -0
  58. {paasta_tools-1.35.1.data → paasta_tools-1.35.6.data}/scripts/setup_istio_mesh.py +0 -0
  59. {paasta_tools-1.35.1.data → paasta_tools-1.35.6.data}/scripts/setup_kubernetes_cr.py +0 -0
  60. {paasta_tools-1.35.1.data → paasta_tools-1.35.6.data}/scripts/setup_kubernetes_crd.py +0 -0
  61. {paasta_tools-1.35.1.data → paasta_tools-1.35.6.data}/scripts/setup_kubernetes_internal_crd.py +0 -0
  62. {paasta_tools-1.35.1.data → paasta_tools-1.35.6.data}/scripts/setup_kubernetes_job.py +0 -0
  63. {paasta_tools-1.35.1.data → paasta_tools-1.35.6.data}/scripts/setup_prometheus_adapter_config.py +0 -0
  64. {paasta_tools-1.35.1.data → paasta_tools-1.35.6.data}/scripts/shared_ip_check.py +0 -0
  65. {paasta_tools-1.35.1.data → paasta_tools-1.35.6.data}/scripts/synapse_srv_namespaces_fact.py +0 -0
  66. {paasta_tools-1.35.1.data → paasta_tools-1.35.6.data}/scripts/timeouts_metrics_prom.py +0 -0
  67. {paasta_tools-1.35.1.dist-info → paasta_tools-1.35.6.dist-info}/WHEEL +0 -0
  68. {paasta_tools-1.35.1.dist-info → paasta_tools-1.35.6.dist-info}/entry_points.txt +0 -0
  69. {paasta_tools-1.35.1.dist-info → paasta_tools-1.35.6.dist-info}/licenses/LICENSE +0 -0
  70. {paasta_tools-1.35.1.dist-info → paasta_tools-1.35.6.dist-info}/top_level.txt +0 -0
paasta_tools/__init__.py CHANGED
@@ -17,4 +17,4 @@
17
17
  # setup phase, the dependencies may not exist on disk yet.
18
18
  #
19
19
  # Don't bump version manually. See `make release` docs in ./Makefile
20
- __version__ = "1.35.1"
20
+ __version__ = "1.35.6"
@@ -1851,7 +1851,7 @@ async def wait_for_deployment(
1851
1851
  system_paasta_config.get_mark_for_deployment_default_time_before_first_diagnosis()
1852
1852
  )
1853
1853
 
1854
- with progressbar.ProgressBar(maxval=total_instances) as bar:
1854
+ with progressbar.ProgressBar(max_value=total_instances) as bar:
1855
1855
  instance_done_futures = []
1856
1856
  with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as executor:
1857
1857
  for cluster, instance_configs in instance_configs_per_cluster.items():
@@ -212,7 +212,7 @@ def _add_vault_auth_args(parser: argparse.ArgumentParser):
212
212
  dest="vault_auth_method",
213
213
  required=False,
214
214
  default="token",
215
- choices=["token", "ldap"],
215
+ choices=["token", "okta"],
216
216
  )
217
217
  parser.add_argument(
218
218
  "--vault-token-file",
@@ -456,7 +456,7 @@ def paasta_secret(args):
456
456
  "vault_token_file": args.vault_token_file,
457
457
  # best solution so far is to change the below string to "token",
458
458
  # so that token file is picked up from argparse
459
- "vault_auth_method": "ldap", # must have LDAP to get 2FA push for prod
459
+ "vault_auth_method": "okta", # must use Okta to get 2FA push
460
460
  },
461
461
  )
462
462
  secret_provider.write_secret(
@@ -897,6 +897,8 @@ def configure_and_run_docker_container(
897
897
  )
898
898
  ) # type:ignore
899
899
  environment.update(extra_driver_envs)
900
+ if "jupyter-lab" == args.cmd:
901
+ environment["SPARK_DRIVER_TYPE"] = "jupyter"
900
902
 
901
903
  if args.use_service_auth_token:
902
904
  environment["YELP_SVC_AUTHZ_TOKEN"] = get_service_auth_token()
@@ -891,7 +891,7 @@ def _print_flink_status_from_job_manager(
891
891
 
892
892
  # Print Flink Costs Link
893
893
  output.append(
894
- f" Flink Cost: https://splunk.yelpcorp.com/en-US/app/yelp_computeinfra/paasta_service_utilization?form.service={service}&form.field1.earliest=-30d%40d&form.field1.latest=now&form.instance={instance}&form.cluster={cluster}"
894
+ f" Flink Cost: https://app.cloudzero.com/explorer?activeCostType=invoiced_amortized_cost&partitions=costcontext%3AResource%20Summary&dateRange=Last%2030%20Days&costcontext%3AKube%20Paasta%20Cluster={cluster}&costcontext%3APaasta%20Instance={instance}&costcontext%3APaasta%20Service={service}&showRightFlyout=filters"
895
895
  )
896
896
 
897
897
  output.append(f"{OUTPUT_HORIZONTAL_RULE}")
@@ -369,11 +369,9 @@ def get_config_file_dict(file_path: str, use_ruamel: bool = False) -> Dict[Any,
369
369
  # sets disk: 100 -> an instance uses that template and overwrites
370
370
  # it with disk: 1000)
371
371
  ruamel_loader.allow_duplicate_keys = True
372
- # we want to actually expand out all anchors so that we still get
373
- # comments from the original block
374
- ruamel_loader.Constructor.flatten_mapping = (
375
- SafeConstructor.flatten_mapping
376
- )
372
+ # Note: we do NOT use flatten_mapping here because it breaks simple
373
+ # override patterns. For nested merge patterns, we load a flattened
374
+ # version separately for comment detection only.
377
375
  return ruamel_loader.load(config_file)
378
376
  else:
379
377
  return yaml.safe_load(config_file)
@@ -637,7 +635,22 @@ def validate_unique_instance_names(service_path):
637
635
  return check_passed
638
636
 
639
637
 
640
- def _get_comments_for_key(data: CommentedMap, key: Any) -> Optional[str]:
638
+ def _get_config_flattened(file_path: str) -> CommentedMap:
639
+ """Load config with flatten_mapping enabled (for nested merge pattern comment detection)"""
640
+ config_file = get_file_contents(file_path)
641
+ ruamel_loader = YAML(typ="rt")
642
+ ruamel_loader.allow_duplicate_keys = True
643
+ ruamel_loader.Constructor.flatten_mapping = SafeConstructor.flatten_mapping
644
+ return ruamel_loader.load(config_file)
645
+
646
+
647
+ def _get_comments_for_key(
648
+ data: CommentedMap,
649
+ key: Any,
650
+ full_config: Optional[Dict[Any, Any]] = None,
651
+ key_value: Any = None,
652
+ full_config_flattened: Optional[Dict[Any, Any]] = None,
653
+ ) -> Optional[str]:
641
654
  # this is a little weird, but ruamel is returning a list that looks like:
642
655
  # [None, None, CommentToken(...), None] for some reason instead of just a
643
656
  # single string
@@ -654,6 +667,31 @@ def _get_comments_for_key(data: CommentedMap, key: Any) -> Optional[str]:
654
667
 
655
668
  raw_comments = [*_flatten_comments(data.ca.items.get(key, []))]
656
669
  if not raw_comments:
670
+ # If we didn't find a comment in the instance itself, check if this key
671
+ # might be inherited from a template. Look for ANY other instance/template
672
+ # in the config that has the same key with the same value and a comment.
673
+ if full_config is not None and key_value is not None:
674
+ for config_key, config_value in full_config.items():
675
+ if isinstance(config_value, CommentedMap):
676
+ if config_value.get(key) == key_value:
677
+ other_comments = [
678
+ *_flatten_comments(config_value.ca.items.get(key, []))
679
+ ]
680
+ if other_comments:
681
+ return "".join(other_comments)
682
+
683
+ # If still not found and we have a flattened config, check there
684
+ # (flattened config is needed for nested merges)
685
+ if full_config_flattened is not None:
686
+ for config_key, config_value in full_config_flattened.items():
687
+ if isinstance(config_value, CommentedMap):
688
+ if config_value.get(key) == key_value:
689
+ flattened_comments = [
690
+ *_flatten_comments(config_value.ca.items.get(key, []))
691
+ ]
692
+ if flattened_comments:
693
+ return "".join(flattened_comments)
694
+
657
695
  # return None so that we don't return an empty string below if there really aren't
658
696
  # any comments
659
697
  return None
@@ -802,12 +840,13 @@ def validate_autoscaling_configs(service_path: str) -> bool:
802
840
 
803
841
  # we need access to the comments, so we need to read the config with ruamel to be able
804
842
  # to actually get them in a "nice" automated fashion
843
+ config_file_path = os.path.join(
844
+ soa_dir,
845
+ service,
846
+ f"{instance_config.get_instance_type()}-{cluster}.yaml",
847
+ )
805
848
  config = get_config_file_dict(
806
- os.path.join(
807
- soa_dir,
808
- service,
809
- f"{instance_config.get_instance_type()}-{cluster}.yaml",
810
- ),
849
+ config_file_path,
811
850
  use_ruamel=True,
812
851
  )
813
852
  if config[instance].get("cpus") is None:
@@ -822,8 +861,15 @@ def validate_autoscaling_configs(service_path: str) -> bool:
822
861
  # cpu autoscaled, but using autotuned values - can skip
823
862
  continue
824
863
 
864
+ # Load flattened config for comment detection (handles nested merges)
865
+ config_flattened = _get_config_flattened(config_file_path)
866
+
825
867
  cpu_comment = _get_comments_for_key(
826
- data=config[instance], key="cpus"
868
+ data=config[instance],
869
+ key="cpus",
870
+ full_config=config,
871
+ key_value=config[instance].get("cpus"),
872
+ full_config_flattened=config_flattened,
827
873
  )
828
874
  # we could probably have a separate error message if there's a comment that doesn't match
829
875
  # the ack pattern, but that seems like overkill - especially for something that could cause
@@ -965,12 +1011,13 @@ def validate_cpu_burst(service_path: str) -> bool:
965
1011
  if is_k8s_service and not should_skip_cpu_burst_validation:
966
1012
  # we need access to the comments, so we need to read the config with ruamel to be able
967
1013
  # to actually get them in a "nice" automated fashion
1014
+ config_file_path = os.path.join(
1015
+ soa_dir,
1016
+ service,
1017
+ f"{instance_config.get_instance_type()}-{cluster}.yaml",
1018
+ )
968
1019
  config = get_config_file_dict(
969
- os.path.join(
970
- soa_dir,
971
- service,
972
- f"{instance_config.get_instance_type()}-{cluster}.yaml",
973
- ),
1020
+ config_file_path,
974
1021
  use_ruamel=True,
975
1022
  )
976
1023
 
@@ -981,8 +1028,15 @@ def validate_cpu_burst(service_path: str) -> bool:
981
1028
  # under the threshold - can also skip
982
1029
  continue
983
1030
 
1031
+ # Load flattened config for comment detection (handles nested merges)
1032
+ config_flattened = _get_config_flattened(config_file_path)
1033
+
984
1034
  burst_comment = _get_comments_for_key(
985
- data=config[instance], key="cpu_burst_add"
1035
+ data=config[instance],
1036
+ key="cpu_burst_add",
1037
+ full_config=config,
1038
+ key_value=config[instance].get("cpu_burst_add"),
1039
+ full_config_flattened=config_flattened,
986
1040
  )
987
1041
  # we could probably have a separate error message if there's a comment that doesn't match
988
1042
  # the ack pattern, but that seems like overkill - especially for something that could cause
@@ -181,6 +181,9 @@ def get_report_from_splunk(creds, app, filename, criteria_filter):
181
181
  "date": d["result"]["_time"].split(" ")[0],
182
182
  "instance": criteria.split(" ")[2],
183
183
  "money": d["result"].get("estimated_monthly_savings", 0),
184
+ "old_cpus": d["result"].get("current_cpus"),
185
+ "old_disk": d["result"].get("current_disk"),
186
+ "old_mem": d["result"].get("current_mem"),
184
187
  "owner": d["result"].get("service_owner", "Unavailable"),
185
188
  "project": d["result"].get("project", "Unavailable"),
186
189
  "service": criteria.split(" ")[0],
@@ -192,24 +195,17 @@ def get_report_from_splunk(creds, app, filename, criteria_filter):
192
195
  "max_instances": d["result"].get("suggested_max_instances"),
193
196
  "mem": d["result"].get("suggested_mem"),
194
197
  "min_instances": d["result"].get("suggested_min_instances"),
195
- "old_cpus": d["result"].get("current_cpus"),
196
- "old_disk": d["result"].get("current_disk"),
197
- "old_mem": d["result"].get("current_mem"),
198
198
  }
199
199
 
200
200
  # the report we get is all strings, so we need to convert them to the right types
201
201
  field_conversions = {
202
- "current_cpus": float,
203
- "suggested_cpu_burst_add": float,
204
- "suggested_cpus": float,
205
- "suggested_disk": int,
206
- "suggested_hacheck_cpus": float,
207
- "suggested_max_instances": int,
208
- "suggested_mem": int,
209
- "suggested_min_instances": int,
210
- # not quite sure why these are floats...they're ints in soaconfigs
211
- "current_disk": _force_str_to_int,
212
- "current_mem": _force_str_to_int,
202
+ "cpus": float,
203
+ "cpu_burst_add": float,
204
+ "disk": int,
205
+ "hacheck_cpus": float,
206
+ "max_instances": int,
207
+ "mem": int,
208
+ "min_instances": int,
213
209
  }
214
210
 
215
211
  # merge results if we've already seen rows for this service
@@ -173,19 +173,31 @@ class Application(ABC):
173
173
  self, kube_client: KubeClient, namespace: str
174
174
  ) -> V1PodDisruptionBudget:
175
175
  max_unavailable: Union[str, int]
176
+
177
+ system_paasta_config = load_system_paasta_config()
178
+
176
179
  if "bounce_margin_factor" in self.soa_config.config_dict:
177
180
  max_unavailable = (
178
181
  f"{int((1 - self.soa_config.get_bounce_margin_factor()) * 100)}%"
179
182
  )
180
183
  else:
181
- system_paasta_config = load_system_paasta_config()
182
184
  max_unavailable = system_paasta_config.get_pdb_max_unavailable()
183
185
 
186
+ if "unhealthy_pod_eviction_policy" in self.soa_config.config_dict:
187
+ unhealthy_pod_eviction_policy = (
188
+ self.soa_config.get_unhealthy_pod_eviction_policy()
189
+ )
190
+ else:
191
+ unhealthy_pod_eviction_policy = (
192
+ system_paasta_config.get_unhealthy_pod_eviction_policy()
193
+ )
194
+
184
195
  pdr = pod_disruption_budget_for_service_instance(
185
196
  service=self.kube_deployment.service,
186
197
  instance=self.kube_deployment.instance,
187
198
  max_unavailable=max_unavailable,
188
199
  namespace=namespace,
200
+ unhealthy_pod_eviction_policy=unhealthy_pod_eviction_policy,
189
201
  )
190
202
  try:
191
203
  existing_pdr = kube_client.policy.read_namespaced_pod_disruption_budget(
@@ -198,12 +210,21 @@ class Application(ABC):
198
210
  raise
199
211
 
200
212
  if existing_pdr:
213
+ """
214
+ Update the pod disruption budget only if spec.max_unavailable
215
+ or spec.unhealthy_pod_eviction_policy have changed;
216
+ ignore changes to other fields
217
+ """
201
218
  if existing_pdr.spec.min_available is not None:
202
219
  logging.info(
203
220
  "Not updating poddisruptionbudget: can't have both "
204
221
  "min_available and max_unavailable"
205
222
  )
206
- elif existing_pdr.spec.max_unavailable != pdr.spec.max_unavailable:
223
+ elif (
224
+ existing_pdr.spec.max_unavailable != pdr.spec.max_unavailable
225
+ or existing_pdr.spec.unhealthy_pod_eviction_policy
226
+ != pdr.spec.unhealthy_pod_eviction_policy
227
+ ):
207
228
  logging.info(f"Updating poddisruptionbudget {pdr.metadata.name}")
208
229
  return kube_client.policy.patch_namespaced_pod_disruption_budget(
209
230
  name=pdr.metadata.name, namespace=pdr.metadata.namespace, body=pdr
@@ -3374,21 +3374,26 @@ def pod_disruption_budget_for_service_instance(
3374
3374
  instance: str,
3375
3375
  max_unavailable: Union[str, int],
3376
3376
  namespace: str,
3377
+ unhealthy_pod_eviction_policy: str,
3377
3378
  ) -> V1PodDisruptionBudget:
3379
+ selector = V1LabelSelector(
3380
+ match_labels={
3381
+ "paasta.yelp.com/service": service,
3382
+ "paasta.yelp.com/instance": instance,
3383
+ }
3384
+ )
3385
+ spec = V1PodDisruptionBudgetSpec(
3386
+ max_unavailable=max_unavailable,
3387
+ unhealthy_pod_eviction_policy=unhealthy_pod_eviction_policy,
3388
+ selector=selector,
3389
+ )
3390
+
3378
3391
  return V1PodDisruptionBudget(
3379
3392
  metadata=V1ObjectMeta(
3380
3393
  name=get_kubernetes_app_name(service, instance),
3381
3394
  namespace=namespace,
3382
3395
  ),
3383
- spec=V1PodDisruptionBudgetSpec(
3384
- max_unavailable=max_unavailable,
3385
- selector=V1LabelSelector(
3386
- match_labels={
3387
- "paasta.yelp.com/service": service,
3388
- "paasta.yelp.com/instance": instance,
3389
- }
3390
- ),
3391
- ),
3396
+ spec=spec,
3392
3397
  )
3393
3398
 
3394
3399
 
@@ -88,6 +88,7 @@ class LongRunningServiceConfigDict(InstanceConfigDict, total=False):
88
88
  bounce_margin_factor: float
89
89
  should_ping_for_unhealthy_pods: bool
90
90
  weight: int
91
+ unhealthy_pod_eviction_policy: str
91
92
 
92
93
 
93
94
  class ServiceNamespaceConfig(dict):
@@ -413,6 +414,9 @@ class LongRunningServiceConfig(InstanceConfig):
413
414
  def get_bounce_margin_factor(self) -> float:
414
415
  return self.config_dict.get("bounce_margin_factor", 0.95)
415
416
 
417
+ def get_unhealthy_pod_eviction_policy(self) -> str:
418
+ return self.config_dict.get("unhealthy_pod_eviction_policy", "IfHealthyBudget")
419
+
416
420
  def get_should_ping_for_unhealthy_pods(self, default: bool) -> bool:
417
421
  return self.config_dict.get("should_ping_for_unhealthy_pods", default)
418
422
 
@@ -506,6 +506,9 @@ class TronActionConfig(InstanceConfig):
506
506
  # XXX: update PAASTA_RESOURCE_* env vars to use the correct value from spark_args and set
507
507
  # these to the correct values for the executors as part of the driver commandline
508
508
 
509
+ # our internal Spark configuration service needs this to determine if any special behavior is required
510
+ env["SPARK_DRIVER_TYPE"] = "tron"
511
+
509
512
  return env
510
513
 
511
514
  def get_iam_role(self) -> str:
paasta_tools/utils.py CHANGED
@@ -2070,6 +2070,7 @@ class SystemPaastaConfigDict(TypedDict, total=False):
2070
2070
  default_spark_driver_pool_override: str
2071
2071
  readonly_docker_registry_auth_file: str
2072
2072
  private_docker_registries: List[str]
2073
+ unhealthy_pod_eviction_policy: str
2073
2074
 
2074
2075
 
2075
2076
  def load_system_paasta_config(
@@ -2855,6 +2856,15 @@ class SystemPaastaConfig:
2855
2856
  """Get all the internal Docker registries without generally-available RO creds."""
2856
2857
  return set(self.config_dict.get("private_docker_registries", []))
2857
2858
 
2859
+ def get_unhealthy_pod_eviction_policy(self) -> str:
2860
+ """
2861
+ Get the unhealthy pod eviction policy for the cluster. Posible values:
2862
+ * IfHealthyBudget: unhealthy pods will only be evicted wrt to PodDisruptionBudget
2863
+ * AlwaysAllow: evict unhealthy pods regardless of the PodDisruptionBudget status.
2864
+ Defaults to IfHealthyBudget
2865
+ """
2866
+ return self.config_dict.get("unhealthy_pod_eviction_policy", "IfHealthyBudget")
2867
+
2858
2868
 
2859
2869
  def _run(
2860
2870
  command: Union[str, List[str]],
@@ -3468,7 +3478,7 @@ def get_docker_host() -> str:
3468
3478
 
3469
3479
 
3470
3480
  def get_docker_client() -> APIClient:
3471
- client_opts = kwargs_from_env(assert_hostname=False)
3481
+ client_opts = kwargs_from_env()
3472
3482
  if "base_url" in client_opts:
3473
3483
  return APIClient(**client_opts)
3474
3484
  else:
@@ -181,6 +181,9 @@ def get_report_from_splunk(creds, app, filename, criteria_filter):
181
181
  "date": d["result"]["_time"].split(" ")[0],
182
182
  "instance": criteria.split(" ")[2],
183
183
  "money": d["result"].get("estimated_monthly_savings", 0),
184
+ "old_cpus": d["result"].get("current_cpus"),
185
+ "old_disk": d["result"].get("current_disk"),
186
+ "old_mem": d["result"].get("current_mem"),
184
187
  "owner": d["result"].get("service_owner", "Unavailable"),
185
188
  "project": d["result"].get("project", "Unavailable"),
186
189
  "service": criteria.split(" ")[0],
@@ -192,24 +195,17 @@ def get_report_from_splunk(creds, app, filename, criteria_filter):
192
195
  "max_instances": d["result"].get("suggested_max_instances"),
193
196
  "mem": d["result"].get("suggested_mem"),
194
197
  "min_instances": d["result"].get("suggested_min_instances"),
195
- "old_cpus": d["result"].get("current_cpus"),
196
- "old_disk": d["result"].get("current_disk"),
197
- "old_mem": d["result"].get("current_mem"),
198
198
  }
199
199
 
200
200
  # the report we get is all strings, so we need to convert them to the right types
201
201
  field_conversions = {
202
- "current_cpus": float,
203
- "suggested_cpu_burst_add": float,
204
- "suggested_cpus": float,
205
- "suggested_disk": int,
206
- "suggested_hacheck_cpus": float,
207
- "suggested_max_instances": int,
208
- "suggested_mem": int,
209
- "suggested_min_instances": int,
210
- # not quite sure why these are floats...they're ints in soaconfigs
211
- "current_disk": _force_str_to_int,
212
- "current_mem": _force_str_to_int,
202
+ "cpus": float,
203
+ "cpu_burst_add": float,
204
+ "disk": int,
205
+ "hacheck_cpus": float,
206
+ "max_instances": int,
207
+ "mem": int,
208
+ "min_instances": int,
213
209
  }
214
210
 
215
211
  # merge results if we've already seen rows for this service
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: paasta-tools
3
- Version: 1.35.1
3
+ Version: 1.35.6
4
4
  Summary: Tools for Yelps SOA infrastructure
5
5
  Author: Compute Infrastructure @ Yelp
6
6
  Author-email: compute-infra@yelp.com
@@ -54,7 +54,7 @@ Requires-Dist: python-dateutil>=2.4.0
54
54
  Requires-Dist: python-iptables
55
55
  Requires-Dist: pytimeparse>=1.1.0
56
56
  Requires-Dist: pytz>=2014.10
57
- Requires-Dist: requests<2.32.0,>=2.18.4
57
+ Requires-Dist: requests>=2.18.4
58
58
  Requires-Dist: requests-cache>=0.4.10
59
59
  Requires-Dist: retry
60
60
  Requires-Dist: ruamel.yaml
@@ -1,7 +1,7 @@
1
1
  k8s_itests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
2
  k8s_itests/test_autoscaling.py,sha256=gX30L1wG1sDBaM0wE2aYR4OqHPSLvQBZ6LV0mLTrXZA,536
3
3
  k8s_itests/utils.py,sha256=PNibpYR0-g8Jcts9CjpkNb3oVzmdk9tZQrrNRuATCCM,966
4
- paasta_tools/__init__.py,sha256=ae5nohc1ic6vTNn38v-1J1mTwXWYsDjRTb4XmgUFZKg,865
4
+ paasta_tools/__init__.py,sha256=1uC7HaQ-9m8S_NIIHcWYdHXQRQeFFVUzftrJMumI4e8,865
5
5
  paasta_tools/adhoc_tools.py,sha256=OfhyZwilB93kNX8r4Nq_KyZCvsZ4rNX-FBcQAi41KCM,4751
6
6
  paasta_tools/apply_external_resources.py,sha256=DHZJ8zkGQKTBR6Ku2lNxnrdHo8rD7PD0rZEN2yloOn8,3375
7
7
  paasta_tools/async_utils.py,sha256=LOpYxaN-8u7js6IlibPRGq9OtgWFig59LGeIFgW9PsA,3591
@@ -44,10 +44,10 @@ paasta_tools/generate_services_yaml.py,sha256=BM760XGEOmLeJcEm0ez5nBZ2NmFJWsNXbZ
44
44
  paasta_tools/hacheck.py,sha256=GtQd32G4JoB2bOWqzH9h9NPrkg8a50i-iXAblfYz2p4,2748
45
45
  paasta_tools/iptables.py,sha256=SQ7hutHarfCd13oAknKv_h9rUuln4rf11W6C2HHUy9g,7518
46
46
  paasta_tools/kafkacluster_tools.py,sha256=NMfowdpYhFpXW55MKx_eX6rrQj5Fn-5M_9ryZKd749A,4992
47
- paasta_tools/kubernetes_tools.py,sha256=yUoWHz7dtiILz3w4x96doQsJjqShHDTjkQabiwA0AQ4,181659
47
+ paasta_tools/kubernetes_tools.py,sha256=yFZsRtJLU_YIfZKE3F0hGn4PWpaHtmW5wTTYk_et58E,181757
48
48
  paasta_tools/list_kubernetes_service_instances.py,sha256=UEPiTqNxUAqUgSyPzJlNcrI2W4HBwpngzDM1QD6AAVQ,3910
49
49
  paasta_tools/list_tron_namespaces.py,sha256=wfSkPY9_C-RkORmnon3DWL2lVZ4GNSSDG9VkFrDfY1E,1679
50
- paasta_tools/long_running_service_tools.py,sha256=RphI6rDE4BK2zN2bfM900abuj7kDn7YXUcMq4pQVyO4,26400
50
+ paasta_tools/long_running_service_tools.py,sha256=oMimyMLoCO0xfvHpPm6ca0E2sKW_MfVGnVRSdZmqz8Y,26584
51
51
  paasta_tools/mac_address.py,sha256=YWEXbRSBwJXrH--iDDFqBV0BWjRH9DedbPcKFPk36A0,1324
52
52
  paasta_tools/marathon_dashboard.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
53
53
  paasta_tools/mesos_tools.py,sha256=WWRC4bGuEXqF1Y0MR3_EjvgaFSPBRlPYXI419CWnNKY,35540
@@ -77,8 +77,8 @@ paasta_tools/slack.py,sha256=WEJsTcr2vCdftG4bVkePNBFaC2hzEzMDwglHA0UC0s8,2700
77
77
  paasta_tools/smartstack_tools.py,sha256=J0mPialC9KFW9mW0fOUCj040VyowEjQgBI_s13fzEgE,25557
78
78
  paasta_tools/spark_tools.py,sha256=qZIa1g9JQrX3Nndd3vsblJ3nfXEhSMyizmOTQfFP2k8,9749
79
79
  paasta_tools/synapse_srv_namespaces_fact.py,sha256=XG_Fgr_3D-MaEYkhKyQSmKHbOyZp9zwpevyTX4BOLWE,1421
80
- paasta_tools/tron_tools.py,sha256=XJjuLp98zdaJeZt7Wg55t7G8lhTffL5HuA1G_mkiekA,55901
81
- paasta_tools/utils.py,sha256=zgcrS2bc5sP_LIfOEs1olzXChArxp8TSIOiTMzDpmlo,149501
80
+ paasta_tools/tron_tools.py,sha256=f6yrjnkN0vumMDVvOFYMTuY9_54hBwC0P4Ls-dn0bQs,56063
81
+ paasta_tools/utils.py,sha256=BHeqclWCPtqqHBN5n7pULytA3INPn71V66uLlvjCoQw,149983
82
82
  paasta_tools/yaml_tools.py,sha256=4gXbrFQWWihp9edKt4J14MWcdS8r8sYJAsMYmmL3byk,1263
83
83
  paasta_tools/api/__init__.py,sha256=H0VmJeHyCSXD9GbiEjjQwcB_sKOcoBiyK-IEJMmtCyQ,578
84
84
  paasta_tools/api/api.py,sha256=SwlBbwH9e8ihnBSSkLU65CHrnzyQeDHPfRg_ik5LWZU,9859
@@ -126,18 +126,18 @@ paasta_tools/cli/cmds/list_deploy_queue.py,sha256=IqtsblfL0LpZyp-cwaRHpo6tAfvo5I
126
126
  paasta_tools/cli/cmds/list_namespaces.py,sha256=KPszBdsOAqRaPECUF1HgCFm1BYQqfBPTG3dwAsvywm4,3138
127
127
  paasta_tools/cli/cmds/local_run.py,sha256=5dUBZR_ziVGHDVhk2NtDO6HPQVYWDywOIjUK55HLwiQ,54541
128
128
  paasta_tools/cli/cmds/logs.py,sha256=fx4hdmHssPNRpmqEuyLLxnBAbevrDG-r89VULr89bzE,58922
129
- paasta_tools/cli/cmds/mark_for_deployment.py,sha256=4cFqxJXzdz3kDzJpQWPRhYGSfxSvh8l5UaWnsMo7TiI,76711
129
+ paasta_tools/cli/cmds/mark_for_deployment.py,sha256=Fg5WNA4H5hDHK-_qJwr6TCplnMH3aJoltqMYSEsC5D4,76714
130
130
  paasta_tools/cli/cmds/mesh_status.py,sha256=KpNfSomS5Uh98szloSpFh3qn0-IYHq4M37BS92t5mdc,6124
131
131
  paasta_tools/cli/cmds/pause_service_autoscaler.py,sha256=3Ie0wTkpRkl-Uja33WzWkPmBa5EJcPxMNAcZ8_P1LSo,3494
132
132
  paasta_tools/cli/cmds/push_to_registry.py,sha256=F7hWPY7MFtqznUfmJoQ0QPc5zAF5BS30_FWdQOrIqME,9736
133
133
  paasta_tools/cli/cmds/remote_run.py,sha256=4Pf43qmImuWavIjPwiAdOuHyKw9zN9Vex4xNxf0ESPw,16383
134
134
  paasta_tools/cli/cmds/rollback.py,sha256=2Wc4JWEudCKRHVWibeASNrF56xJ9xbvANT-_nmCuFHE,13840
135
- paasta_tools/cli/cmds/secret.py,sha256=onVUKyh4uuxBHLcBQcMYH_1uBbRjJrnPa5nMwHGzDSk,19709
135
+ paasta_tools/cli/cmds/secret.py,sha256=oLuu0_ip1dDwGobncnszMlg2vaPhCJxnDSEh2DVjGdQ,19699
136
136
  paasta_tools/cli/cmds/security_check.py,sha256=IEtcM0Hv2BWcavCjWcnPbyfrLcCRYC8jHLiHDj020z4,2377
137
- paasta_tools/cli/cmds/spark_run.py,sha256=NEPPCf5pvkW0Kn9SKAaazZn3ge4HhidWVAm-hEQybnk,51355
137
+ paasta_tools/cli/cmds/spark_run.py,sha256=ApxCKLxYH7qFirhO90T_a6y9l_c6AbsDMa5cS2cAzRA,51442
138
138
  paasta_tools/cli/cmds/start_stop_restart.py,sha256=MIMShmHer_uPEsLCb3qDaBOYyHSgqDHrLHEVFCcxaE0,14600
139
- paasta_tools/cli/cmds/status.py,sha256=c3AlD3nhR638nk0KD5PV_ULG3Yr39T0SvZBbR1kFa20,87784
140
- paasta_tools/cli/cmds/validate.py,sha256=2Z0UildDGNnjm3X6eoMsgMlgzfBalUYADweFQeMBHFk,49740
139
+ paasta_tools/cli/cmds/status.py,sha256=Naw1eZMlFgIt1LuLo8lGwB1aLDeifHgUyVltMFAfz1k,87878
140
+ paasta_tools/cli/cmds/validate.py,sha256=6sxAxjbxEIAxG-D_KlN9UhZBgKeoVs5vpyMGXku7w2Q,52495
141
141
  paasta_tools/cli/cmds/wait_for_deployment.py,sha256=8vPnJ6vXxJCfxQ20PTI3RgrH8mbNe-NuU663SbSXobk,9298
142
142
  paasta_tools/cli/fsm/__init__.py,sha256=H0VmJeHyCSXD9GbiEjjQwcB_sKOcoBiyK-IEJMmtCyQ,578
143
143
  paasta_tools/cli/fsm/autosuggest.py,sha256=M4pxd4khsS5NWnSRihJe4ODvMr0XmwHdfLyaPh0w3m4,2789
@@ -173,7 +173,7 @@ paasta_tools/contrib/is_pod_healthy_in_smartstack.py,sha256=CWNIiwm-1FpXT5hpmZFA
173
173
  paasta_tools/contrib/kill_bad_containers.py,sha256=DVpemHWcH_gxlXK_9KS5pGOLbgbpwqN04lx1qyC0_Yk,3861
174
174
  paasta_tools/contrib/mass-deploy-tag.sh,sha256=cfPgDDvAOhy3ijTUocklogzoIY8hfoE6T5QI-0aqcfM,1578
175
175
  paasta_tools/contrib/mock_patch_checker.py,sha256=3FUebvAPiyrlFwjz7BIC5JQBcB9bRLXsq3Y1smftGDk,2576
176
- paasta_tools/contrib/paasta_update_soa_memcpu.py,sha256=RTFlg1VNJqj0etKLcQPuhlNfuZjbQuXiF2slKOvCXFw,20827
176
+ paasta_tools/contrib/paasta_update_soa_memcpu.py,sha256=iwriXBQk_x68Yjbmpw5fFhwW58gbGWUSp2VvTRxug2U,20550
177
177
  paasta_tools/contrib/render_template.py,sha256=S8_U0zOIQra67RxvqumZ2F0OU8-jXx7Qmd32uQOsM50,3992
178
178
  paasta_tools/contrib/rightsizer_soaconfigs_update.py,sha256=0UPVtDyX6wXXurv7l5fiKuzXH8VEszKx_V7UqDm6Ck0,10493
179
179
  paasta_tools/contrib/service_shard_remove.py,sha256=WCvCxu3GTYEa3cYnWybTOiuHN14axj0x5_-snVd-mqE,4927
@@ -189,7 +189,7 @@ paasta_tools/instance/kubernetes.py,sha256=teCBM2Xn-6cp6DJAfMokRc5OXtwbe8gb56ECd
189
189
  paasta_tools/kubernetes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
190
190
  paasta_tools/kubernetes/remote_run.py,sha256=dj_hGNoze4wfMC12l4zHHoMsw9Ae8g30q-0bJLPWyCw,18994
191
191
  paasta_tools/kubernetes/application/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
192
- paasta_tools/kubernetes/application/controller_wrappers.py,sha256=H43lZoTIT94ZAU6ZSBGc21YzVkJuxPtA5Y3MSJYJ3k4,19292
192
+ paasta_tools/kubernetes/application/controller_wrappers.py,sha256=vZL7clRzsWjXgUCDXsu4mijKl7GPEDA6vsqdcsiZKwc,20084
193
193
  paasta_tools/kubernetes/application/tools.py,sha256=-qbkn4ynM_LFa-NfiDMFZ3G4jty93DWKbx3_Go3OIIo,3618
194
194
  paasta_tools/kubernetes/bin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
195
195
  paasta_tools/kubernetes/bin/kubernetes_remove_evicted_pods.py,sha256=_IkK7vm3FlOF5hYq1M2Xf5DIu-j5d7HJUVmoVetCB94,5287
@@ -287,61 +287,61 @@ paasta_tools/tron/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU
287
287
  paasta_tools/tron/client.py,sha256=ypWjM4bZCzQWLn-qe1driqAxvF0ux8dROuFUv63dryA,5562
288
288
  paasta_tools/tron/tron_command_context.py,sha256=c6mph_DAt7pjcE3Uo271haJ0DfxJzfvcRhR2o-UmOeY,5379
289
289
  paasta_tools/tron/tron_timeutils.py,sha256=vDn04K7A3Xbs3lM04EgLuViC8AavOc5qyo8J5MC5nLk,3054
290
- paasta_tools-1.35.1.data/scripts/apply_external_resources.py,sha256=BOIdCQ5Md9RI3enzqbIWQge3clkXhPybAmLE3hqfDwQ,3347
291
- paasta_tools-1.35.1.data/scripts/bounce_log_latency_parser.py,sha256=dC06a0a5LdtPJ8xo88QWe5DMH_vwVB1BNbkFH7kJ3j0,2225
292
- paasta_tools-1.35.1.data/scripts/check_autoscaler_max_instances.py,sha256=2z6ifSU26-ULOK-FXp75b45mCdjSJnuvU8TxvapB8Wk,9423
293
- paasta_tools-1.35.1.data/scripts/check_cassandracluster_services_replication.py,sha256=mKlCK9pRNzxnOt41wA6CtDQIHhcky438i044kA6pbEc,1127
294
- paasta_tools-1.35.1.data/scripts/check_flink_services_health.py,sha256=ElYa1hr6KUcXuu0B8Nf-dt2Vfyo5FrwF5gVV4QBX7Lg,7162
295
- paasta_tools-1.35.1.data/scripts/check_kubernetes_api.py,sha256=BhOqJkkKNJPfonfIPonW5dlIubd1ji-3ppjXHomNwzM,1522
296
- paasta_tools-1.35.1.data/scripts/check_kubernetes_services_replication.py,sha256=LCLlumReRdy9Cw_sPpqanjPcBlbcrJDiECaYYru5Cwk,5751
297
- paasta_tools-1.35.1.data/scripts/check_manual_oapi_changes.sh,sha256=1IdphwXP7xnMNS7huZ3FeEHy67-nY4n3ydHmbojQvJg,879
298
- paasta_tools-1.35.1.data/scripts/check_oom_events.py,sha256=tUr14T2LYEgqwpAq4vkZ_Z0VTPOfQg7yrSSkwGQ86Hg,7801
299
- paasta_tools-1.35.1.data/scripts/check_orphans.py,sha256=9PmzRUZ1HwCcmTm4J1xTznz7hZl8fKsu1wdXUDufXJs,9984
300
- paasta_tools-1.35.1.data/scripts/check_spark_jobs.py,sha256=W4HUIbX_ylxl4DlqcdmoRWDbKYgPEr04OM-DLvfnXE8,7316
301
- paasta_tools-1.35.1.data/scripts/cleanup_kubernetes_cr.py,sha256=m-w_wuTuVG9FlwQQkxXYgri5DTGac9Nc2pbK4k1FNDE,4659
302
- paasta_tools-1.35.1.data/scripts/cleanup_kubernetes_crd.py,sha256=p9eLk-0-pU-hcVg-GAM92h1ZdQqlvmYhBzUFCiMPYR8,4478
303
- paasta_tools-1.35.1.data/scripts/cleanup_kubernetes_jobs.py,sha256=7LHB4tsz1kt-zygssIfQbBY6c3LSqXYDUILvHkSfBog,12433
304
- paasta_tools-1.35.1.data/scripts/create_dynamodb_table.py,sha256=9wJftWGgNtvLnpXeUqpoMXBIIep1hNySf0YiQmzpl5c,1167
305
- paasta_tools-1.35.1.data/scripts/create_paasta_playground.py,sha256=jzoE5e1pxWeVXwCEkD9O0jefOhEnIlSa3QMP9PC2f0M,3239
306
- paasta_tools-1.35.1.data/scripts/delete_kubernetes_deployments.py,sha256=de4C-5yqEuCeJXp6zhbc0v-c0LOElr4qabLnOTRcX4o,3124
307
- paasta_tools-1.35.1.data/scripts/emit_allocated_cpu_metrics.py,sha256=Cjd3xoOJoYSP3ciSAlZ7fh6_z678KpYt43Xh-WVCY1M,1859
308
- paasta_tools-1.35.1.data/scripts/generate_all_deployments,sha256=Qr5B0zogTOr8Lcn_7dpORixpGIJcXZ_pWz_ZlWnmsik,248
309
- paasta_tools-1.35.1.data/scripts/generate_authenticating_services.py,sha256=r5AQyquVm8_rbAhBETUU2ZHZvolpqZZTakW3lKFiOqw,2982
310
- paasta_tools-1.35.1.data/scripts/generate_deployments_for_service.py,sha256=FAFzIAtKY7GsA13s-ssCMH7T-_p9B1pBtyyYFzsCZ6k,9822
311
- paasta_tools-1.35.1.data/scripts/generate_services_file.py,sha256=w3Wyyn9ZkjfrvkT0SnTbh5mrTZJnjhTC2JIqLBpb6-g,3583
312
- paasta_tools-1.35.1.data/scripts/generate_services_yaml.py,sha256=XyIUsHa1BPLqeklayaFewX69-6GT_luaSLS_TMDLkQ0,991
313
- paasta_tools-1.35.1.data/scripts/get_running_task_allocation.py,sha256=NGYO2td42XQOduUmvgz0CZw0ir36bY6fUe3VOR1Ln6E,10876
314
- paasta_tools-1.35.1.data/scripts/habitat_fixer.py,sha256=hCC7fEnxrBOmiCJj4rPwhGlae9JsYg_gltk10l-FwaE,2625
315
- paasta_tools-1.35.1.data/scripts/ide_helper.py,sha256=QUVWxIeh54IhTn3HEhBrmJKvtgw6RDv9smoJ-6pZA4c,12348
316
- paasta_tools-1.35.1.data/scripts/is_pod_healthy_in_proxy.py,sha256=MiY85MJDXcN9oS8d840WG1iYDIzzO9lmk_NC0i_CrQg,4321
317
- paasta_tools-1.35.1.data/scripts/is_pod_healthy_in_smartstack.py,sha256=z3uP9sgwLwg94BubFgBKare2t1L5qhcY48MWsJxjxPY,1697
318
- paasta_tools-1.35.1.data/scripts/kill_bad_containers.py,sha256=oNY5x0Zg0eu34cXhFy60I7WRlqg4PKD_6xWi0eoRTCA,3832
319
- paasta_tools-1.35.1.data/scripts/kubernetes_remove_evicted_pods.py,sha256=D9Ovdc9Xer_Qf3vM5CtPVcKvnMwLiC0H-WQmQGXrBKM,5274
320
- paasta_tools-1.35.1.data/scripts/mass-deploy-tag.sh,sha256=cfPgDDvAOhy3ijTUocklogzoIY8hfoE6T5QI-0aqcfM,1578
321
- paasta_tools-1.35.1.data/scripts/mock_patch_checker.py,sha256=Q6Je8QjmfLzdnv_6JR6ehh2kA5SUxmeZGeLI2WC3BSY,2559
322
- paasta_tools-1.35.1.data/scripts/paasta_cleanup_remote_run_resources.py,sha256=4oN9UwnR7q6aEEyFUhVrT41VSeQJ2YS3upFpbZQXNUI,4558
323
- paasta_tools-1.35.1.data/scripts/paasta_cleanup_stale_nodes.py,sha256=C-DmEVgtienoMgJnIeESvFqWcJOW2SOGoS1l8RXA8NE,6304
324
- paasta_tools-1.35.1.data/scripts/paasta_deploy_tron_jobs,sha256=fFN2aP5FNSm5WfDV3yvLpihXaKkAF65MRXFcN2iD7S4,106
325
- paasta_tools-1.35.1.data/scripts/paasta_execute_docker_command.py,sha256=6kh7h2bleQbNULc37MiRsfnk9MDHqVv30UQdg3rF3kQ,4086
326
- paasta_tools-1.35.1.data/scripts/paasta_secrets_sync.py,sha256=sMdyWMt9BU5CmWHIRwzhpFKve7zxFHkygt_SNTJutWM,28766
327
- paasta_tools-1.35.1.data/scripts/paasta_tabcomplete.sh,sha256=qbQKSriz_L4MogA12L_8i-tg0Lplpshbk_FUMjK6uG0,929
328
- paasta_tools-1.35.1.data/scripts/paasta_update_soa_memcpu.py,sha256=5fShpZYpb7EeoC70cWdICnNHjHAaNU5mTHaAc3mloIs,20813
329
- paasta_tools-1.35.1.data/scripts/render_template.py,sha256=KcKfeSP2a9f6fMDRhnjX7OJaHmFIBtCJcHhUI_B7p9Y,3975
330
- paasta_tools-1.35.1.data/scripts/rightsizer_soaconfigs_update.py,sha256=0UPVtDyX6wXXurv7l5fiKuzXH8VEszKx_V7UqDm6Ck0,10493
331
- paasta_tools-1.35.1.data/scripts/service_shard_remove.py,sha256=WCvCxu3GTYEa3cYnWybTOiuHN14axj0x5_-snVd-mqE,4927
332
- paasta_tools-1.35.1.data/scripts/service_shard_update.py,sha256=AajuRS4s-HXhEcIIYK2dsyBSdCjZbh4x6Po48ipl7M4,13346
333
- paasta_tools-1.35.1.data/scripts/setup_istio_mesh.py,sha256=LbLxeI_DnhNXkyCgG-GxutlNu9_vcIitorYr4I9x4CY,11575
334
- paasta_tools-1.35.1.data/scripts/setup_kubernetes_cr.py,sha256=xsZJ_X1YpQ0NExyY1cXFH8KW2_vAgctCwdrW0bu102s,14931
335
- paasta_tools-1.35.1.data/scripts/setup_kubernetes_crd.py,sha256=QCiFOcSmE0nMEheIb7IUnYMUn0heh1kHyMFBCm7XIRU,4020
336
- paasta_tools-1.35.1.data/scripts/setup_kubernetes_internal_crd.py,sha256=dDyAOKFow7yeHWGa197angYwGTDWNyR7vZ6Cx5JlS6k,4629
337
- paasta_tools-1.35.1.data/scripts/setup_kubernetes_job.py,sha256=H2VuRaCpBj-J2Qc3DmIMutGuDL8nlfabshEiCGNNqmY,19095
338
- paasta_tools-1.35.1.data/scripts/setup_prometheus_adapter_config.py,sha256=JzvztaJ__5MOAV6pD5Vj3mamARh6TZUCzYdlqhWDOOY,43962
339
- paasta_tools-1.35.1.data/scripts/shared_ip_check.py,sha256=dbMwCwDLy9hCIbVWV1rk0FKuBkZNuQtM59hGVKxV2B4,2464
340
- paasta_tools-1.35.1.data/scripts/synapse_srv_namespaces_fact.py,sha256=HFX0zIXkXIjtAw8zrA7mUiy6NOKR11eBzE39R3aZv_E,1408
341
- paasta_tools-1.35.1.data/scripts/timeouts_metrics_prom.py,sha256=icK1j72-e-hvbUGs3LtcaMn9KBMopD9cGv5UUVo-OSc,2607
342
- paasta_tools-1.35.1.dist-info/licenses/LICENSE,sha256=Tcxn8PpeSjHDwUTemLW_thUNxcOOm612dK_no2ebEpo,10837
343
- paasta_tools-1.35.1.dist-info/METADATA,sha256=Tw4-FTxLdHpKM7TGgB2pI7O7ej6-jyQhkHph8zfKx8E,2258
344
- paasta_tools-1.35.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
345
- paasta_tools-1.35.1.dist-info/entry_points.txt,sha256=qokGSdKYA6AjtdMM_BjmCAOMghMsjOpcAdL9e4fY6D8,1179
346
- paasta_tools-1.35.1.dist-info/top_level.txt,sha256=6vZZAZ7bbaDxuXZjNYixDwzkrezpNgDQHpS0ikvFOk4,24
347
- paasta_tools-1.35.1.dist-info/RECORD,,
290
+ paasta_tools-1.35.6.data/scripts/apply_external_resources.py,sha256=BOIdCQ5Md9RI3enzqbIWQge3clkXhPybAmLE3hqfDwQ,3347
291
+ paasta_tools-1.35.6.data/scripts/bounce_log_latency_parser.py,sha256=dC06a0a5LdtPJ8xo88QWe5DMH_vwVB1BNbkFH7kJ3j0,2225
292
+ paasta_tools-1.35.6.data/scripts/check_autoscaler_max_instances.py,sha256=2z6ifSU26-ULOK-FXp75b45mCdjSJnuvU8TxvapB8Wk,9423
293
+ paasta_tools-1.35.6.data/scripts/check_cassandracluster_services_replication.py,sha256=mKlCK9pRNzxnOt41wA6CtDQIHhcky438i044kA6pbEc,1127
294
+ paasta_tools-1.35.6.data/scripts/check_flink_services_health.py,sha256=ElYa1hr6KUcXuu0B8Nf-dt2Vfyo5FrwF5gVV4QBX7Lg,7162
295
+ paasta_tools-1.35.6.data/scripts/check_kubernetes_api.py,sha256=BhOqJkkKNJPfonfIPonW5dlIubd1ji-3ppjXHomNwzM,1522
296
+ paasta_tools-1.35.6.data/scripts/check_kubernetes_services_replication.py,sha256=LCLlumReRdy9Cw_sPpqanjPcBlbcrJDiECaYYru5Cwk,5751
297
+ paasta_tools-1.35.6.data/scripts/check_manual_oapi_changes.sh,sha256=1IdphwXP7xnMNS7huZ3FeEHy67-nY4n3ydHmbojQvJg,879
298
+ paasta_tools-1.35.6.data/scripts/check_oom_events.py,sha256=tUr14T2LYEgqwpAq4vkZ_Z0VTPOfQg7yrSSkwGQ86Hg,7801
299
+ paasta_tools-1.35.6.data/scripts/check_orphans.py,sha256=9PmzRUZ1HwCcmTm4J1xTznz7hZl8fKsu1wdXUDufXJs,9984
300
+ paasta_tools-1.35.6.data/scripts/check_spark_jobs.py,sha256=W4HUIbX_ylxl4DlqcdmoRWDbKYgPEr04OM-DLvfnXE8,7316
301
+ paasta_tools-1.35.6.data/scripts/cleanup_kubernetes_cr.py,sha256=m-w_wuTuVG9FlwQQkxXYgri5DTGac9Nc2pbK4k1FNDE,4659
302
+ paasta_tools-1.35.6.data/scripts/cleanup_kubernetes_crd.py,sha256=p9eLk-0-pU-hcVg-GAM92h1ZdQqlvmYhBzUFCiMPYR8,4478
303
+ paasta_tools-1.35.6.data/scripts/cleanup_kubernetes_jobs.py,sha256=7LHB4tsz1kt-zygssIfQbBY6c3LSqXYDUILvHkSfBog,12433
304
+ paasta_tools-1.35.6.data/scripts/create_dynamodb_table.py,sha256=9wJftWGgNtvLnpXeUqpoMXBIIep1hNySf0YiQmzpl5c,1167
305
+ paasta_tools-1.35.6.data/scripts/create_paasta_playground.py,sha256=jzoE5e1pxWeVXwCEkD9O0jefOhEnIlSa3QMP9PC2f0M,3239
306
+ paasta_tools-1.35.6.data/scripts/delete_kubernetes_deployments.py,sha256=de4C-5yqEuCeJXp6zhbc0v-c0LOElr4qabLnOTRcX4o,3124
307
+ paasta_tools-1.35.6.data/scripts/emit_allocated_cpu_metrics.py,sha256=Cjd3xoOJoYSP3ciSAlZ7fh6_z678KpYt43Xh-WVCY1M,1859
308
+ paasta_tools-1.35.6.data/scripts/generate_all_deployments,sha256=Qr5B0zogTOr8Lcn_7dpORixpGIJcXZ_pWz_ZlWnmsik,248
309
+ paasta_tools-1.35.6.data/scripts/generate_authenticating_services.py,sha256=r5AQyquVm8_rbAhBETUU2ZHZvolpqZZTakW3lKFiOqw,2982
310
+ paasta_tools-1.35.6.data/scripts/generate_deployments_for_service.py,sha256=FAFzIAtKY7GsA13s-ssCMH7T-_p9B1pBtyyYFzsCZ6k,9822
311
+ paasta_tools-1.35.6.data/scripts/generate_services_file.py,sha256=w3Wyyn9ZkjfrvkT0SnTbh5mrTZJnjhTC2JIqLBpb6-g,3583
312
+ paasta_tools-1.35.6.data/scripts/generate_services_yaml.py,sha256=XyIUsHa1BPLqeklayaFewX69-6GT_luaSLS_TMDLkQ0,991
313
+ paasta_tools-1.35.6.data/scripts/get_running_task_allocation.py,sha256=NGYO2td42XQOduUmvgz0CZw0ir36bY6fUe3VOR1Ln6E,10876
314
+ paasta_tools-1.35.6.data/scripts/habitat_fixer.py,sha256=hCC7fEnxrBOmiCJj4rPwhGlae9JsYg_gltk10l-FwaE,2625
315
+ paasta_tools-1.35.6.data/scripts/ide_helper.py,sha256=QUVWxIeh54IhTn3HEhBrmJKvtgw6RDv9smoJ-6pZA4c,12348
316
+ paasta_tools-1.35.6.data/scripts/is_pod_healthy_in_proxy.py,sha256=MiY85MJDXcN9oS8d840WG1iYDIzzO9lmk_NC0i_CrQg,4321
317
+ paasta_tools-1.35.6.data/scripts/is_pod_healthy_in_smartstack.py,sha256=z3uP9sgwLwg94BubFgBKare2t1L5qhcY48MWsJxjxPY,1697
318
+ paasta_tools-1.35.6.data/scripts/kill_bad_containers.py,sha256=oNY5x0Zg0eu34cXhFy60I7WRlqg4PKD_6xWi0eoRTCA,3832
319
+ paasta_tools-1.35.6.data/scripts/kubernetes_remove_evicted_pods.py,sha256=D9Ovdc9Xer_Qf3vM5CtPVcKvnMwLiC0H-WQmQGXrBKM,5274
320
+ paasta_tools-1.35.6.data/scripts/mass-deploy-tag.sh,sha256=cfPgDDvAOhy3ijTUocklogzoIY8hfoE6T5QI-0aqcfM,1578
321
+ paasta_tools-1.35.6.data/scripts/mock_patch_checker.py,sha256=Q6Je8QjmfLzdnv_6JR6ehh2kA5SUxmeZGeLI2WC3BSY,2559
322
+ paasta_tools-1.35.6.data/scripts/paasta_cleanup_remote_run_resources.py,sha256=4oN9UwnR7q6aEEyFUhVrT41VSeQJ2YS3upFpbZQXNUI,4558
323
+ paasta_tools-1.35.6.data/scripts/paasta_cleanup_stale_nodes.py,sha256=C-DmEVgtienoMgJnIeESvFqWcJOW2SOGoS1l8RXA8NE,6304
324
+ paasta_tools-1.35.6.data/scripts/paasta_deploy_tron_jobs,sha256=fFN2aP5FNSm5WfDV3yvLpihXaKkAF65MRXFcN2iD7S4,106
325
+ paasta_tools-1.35.6.data/scripts/paasta_execute_docker_command.py,sha256=6kh7h2bleQbNULc37MiRsfnk9MDHqVv30UQdg3rF3kQ,4086
326
+ paasta_tools-1.35.6.data/scripts/paasta_secrets_sync.py,sha256=sMdyWMt9BU5CmWHIRwzhpFKve7zxFHkygt_SNTJutWM,28766
327
+ paasta_tools-1.35.6.data/scripts/paasta_tabcomplete.sh,sha256=qbQKSriz_L4MogA12L_8i-tg0Lplpshbk_FUMjK6uG0,929
328
+ paasta_tools-1.35.6.data/scripts/paasta_update_soa_memcpu.py,sha256=WsbOFy80rbCxTSo4mbn9ok-cIETyBeCyGB8yFAOwdvc,20536
329
+ paasta_tools-1.35.6.data/scripts/render_template.py,sha256=KcKfeSP2a9f6fMDRhnjX7OJaHmFIBtCJcHhUI_B7p9Y,3975
330
+ paasta_tools-1.35.6.data/scripts/rightsizer_soaconfigs_update.py,sha256=0UPVtDyX6wXXurv7l5fiKuzXH8VEszKx_V7UqDm6Ck0,10493
331
+ paasta_tools-1.35.6.data/scripts/service_shard_remove.py,sha256=WCvCxu3GTYEa3cYnWybTOiuHN14axj0x5_-snVd-mqE,4927
332
+ paasta_tools-1.35.6.data/scripts/service_shard_update.py,sha256=AajuRS4s-HXhEcIIYK2dsyBSdCjZbh4x6Po48ipl7M4,13346
333
+ paasta_tools-1.35.6.data/scripts/setup_istio_mesh.py,sha256=LbLxeI_DnhNXkyCgG-GxutlNu9_vcIitorYr4I9x4CY,11575
334
+ paasta_tools-1.35.6.data/scripts/setup_kubernetes_cr.py,sha256=xsZJ_X1YpQ0NExyY1cXFH8KW2_vAgctCwdrW0bu102s,14931
335
+ paasta_tools-1.35.6.data/scripts/setup_kubernetes_crd.py,sha256=QCiFOcSmE0nMEheIb7IUnYMUn0heh1kHyMFBCm7XIRU,4020
336
+ paasta_tools-1.35.6.data/scripts/setup_kubernetes_internal_crd.py,sha256=dDyAOKFow7yeHWGa197angYwGTDWNyR7vZ6Cx5JlS6k,4629
337
+ paasta_tools-1.35.6.data/scripts/setup_kubernetes_job.py,sha256=H2VuRaCpBj-J2Qc3DmIMutGuDL8nlfabshEiCGNNqmY,19095
338
+ paasta_tools-1.35.6.data/scripts/setup_prometheus_adapter_config.py,sha256=JzvztaJ__5MOAV6pD5Vj3mamARh6TZUCzYdlqhWDOOY,43962
339
+ paasta_tools-1.35.6.data/scripts/shared_ip_check.py,sha256=dbMwCwDLy9hCIbVWV1rk0FKuBkZNuQtM59hGVKxV2B4,2464
340
+ paasta_tools-1.35.6.data/scripts/synapse_srv_namespaces_fact.py,sha256=HFX0zIXkXIjtAw8zrA7mUiy6NOKR11eBzE39R3aZv_E,1408
341
+ paasta_tools-1.35.6.data/scripts/timeouts_metrics_prom.py,sha256=icK1j72-e-hvbUGs3LtcaMn9KBMopD9cGv5UUVo-OSc,2607
342
+ paasta_tools-1.35.6.dist-info/licenses/LICENSE,sha256=Tcxn8PpeSjHDwUTemLW_thUNxcOOm612dK_no2ebEpo,10837
343
+ paasta_tools-1.35.6.dist-info/METADATA,sha256=fK7ajdx6QGiMfWBDB-_3Yw4TR56hKBuchASP41L-2vk,2250
344
+ paasta_tools-1.35.6.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
345
+ paasta_tools-1.35.6.dist-info/entry_points.txt,sha256=qokGSdKYA6AjtdMM_BjmCAOMghMsjOpcAdL9e4fY6D8,1179
346
+ paasta_tools-1.35.6.dist-info/top_level.txt,sha256=6vZZAZ7bbaDxuXZjNYixDwzkrezpNgDQHpS0ikvFOk4,24
347
+ paasta_tools-1.35.6.dist-info/RECORD,,