paasta-tools 1.34.0__py3-none-any.whl → 1.35.5__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 (72) 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/remote_run.py +9 -0
  4. paasta_tools/cli/cmds/secret.py +2 -2
  5. paasta_tools/cli/cmds/spark_run.py +2 -0
  6. paasta_tools/cli/cmds/status.py +1 -1
  7. paasta_tools/cli/cmds/validate.py +217 -1
  8. paasta_tools/cli/schemas/smartstack_schema.json +12 -0
  9. paasta_tools/contrib/paasta_update_soa_memcpu.py +10 -14
  10. paasta_tools/kubernetes/application/controller_wrappers.py +23 -2
  11. paasta_tools/kubernetes_tools.py +14 -9
  12. paasta_tools/long_running_service_tools.py +4 -0
  13. paasta_tools/tron_tools.py +3 -0
  14. paasta_tools/utils.py +11 -1
  15. {paasta_tools-1.34.0.data → paasta_tools-1.35.5.data}/scripts/paasta_update_soa_memcpu.py +10 -14
  16. {paasta_tools-1.34.0.dist-info → paasta_tools-1.35.5.dist-info}/METADATA +2 -2
  17. {paasta_tools-1.34.0.dist-info → paasta_tools-1.35.5.dist-info}/RECORD +72 -72
  18. {paasta_tools-1.34.0.data → paasta_tools-1.35.5.data}/scripts/apply_external_resources.py +0 -0
  19. {paasta_tools-1.34.0.data → paasta_tools-1.35.5.data}/scripts/bounce_log_latency_parser.py +0 -0
  20. {paasta_tools-1.34.0.data → paasta_tools-1.35.5.data}/scripts/check_autoscaler_max_instances.py +0 -0
  21. {paasta_tools-1.34.0.data → paasta_tools-1.35.5.data}/scripts/check_cassandracluster_services_replication.py +0 -0
  22. {paasta_tools-1.34.0.data → paasta_tools-1.35.5.data}/scripts/check_flink_services_health.py +0 -0
  23. {paasta_tools-1.34.0.data → paasta_tools-1.35.5.data}/scripts/check_kubernetes_api.py +0 -0
  24. {paasta_tools-1.34.0.data → paasta_tools-1.35.5.data}/scripts/check_kubernetes_services_replication.py +0 -0
  25. {paasta_tools-1.34.0.data → paasta_tools-1.35.5.data}/scripts/check_manual_oapi_changes.sh +0 -0
  26. {paasta_tools-1.34.0.data → paasta_tools-1.35.5.data}/scripts/check_oom_events.py +0 -0
  27. {paasta_tools-1.34.0.data → paasta_tools-1.35.5.data}/scripts/check_orphans.py +0 -0
  28. {paasta_tools-1.34.0.data → paasta_tools-1.35.5.data}/scripts/check_spark_jobs.py +0 -0
  29. {paasta_tools-1.34.0.data → paasta_tools-1.35.5.data}/scripts/cleanup_kubernetes_cr.py +0 -0
  30. {paasta_tools-1.34.0.data → paasta_tools-1.35.5.data}/scripts/cleanup_kubernetes_crd.py +0 -0
  31. {paasta_tools-1.34.0.data → paasta_tools-1.35.5.data}/scripts/cleanup_kubernetes_jobs.py +0 -0
  32. {paasta_tools-1.34.0.data → paasta_tools-1.35.5.data}/scripts/create_dynamodb_table.py +0 -0
  33. {paasta_tools-1.34.0.data → paasta_tools-1.35.5.data}/scripts/create_paasta_playground.py +0 -0
  34. {paasta_tools-1.34.0.data → paasta_tools-1.35.5.data}/scripts/delete_kubernetes_deployments.py +0 -0
  35. {paasta_tools-1.34.0.data → paasta_tools-1.35.5.data}/scripts/emit_allocated_cpu_metrics.py +0 -0
  36. {paasta_tools-1.34.0.data → paasta_tools-1.35.5.data}/scripts/generate_all_deployments +0 -0
  37. {paasta_tools-1.34.0.data → paasta_tools-1.35.5.data}/scripts/generate_authenticating_services.py +0 -0
  38. {paasta_tools-1.34.0.data → paasta_tools-1.35.5.data}/scripts/generate_deployments_for_service.py +0 -0
  39. {paasta_tools-1.34.0.data → paasta_tools-1.35.5.data}/scripts/generate_services_file.py +0 -0
  40. {paasta_tools-1.34.0.data → paasta_tools-1.35.5.data}/scripts/generate_services_yaml.py +0 -0
  41. {paasta_tools-1.34.0.data → paasta_tools-1.35.5.data}/scripts/get_running_task_allocation.py +0 -0
  42. {paasta_tools-1.34.0.data → paasta_tools-1.35.5.data}/scripts/habitat_fixer.py +0 -0
  43. {paasta_tools-1.34.0.data → paasta_tools-1.35.5.data}/scripts/ide_helper.py +0 -0
  44. {paasta_tools-1.34.0.data → paasta_tools-1.35.5.data}/scripts/is_pod_healthy_in_proxy.py +0 -0
  45. {paasta_tools-1.34.0.data → paasta_tools-1.35.5.data}/scripts/is_pod_healthy_in_smartstack.py +0 -0
  46. {paasta_tools-1.34.0.data → paasta_tools-1.35.5.data}/scripts/kill_bad_containers.py +0 -0
  47. {paasta_tools-1.34.0.data → paasta_tools-1.35.5.data}/scripts/kubernetes_remove_evicted_pods.py +0 -0
  48. {paasta_tools-1.34.0.data → paasta_tools-1.35.5.data}/scripts/mass-deploy-tag.sh +0 -0
  49. {paasta_tools-1.34.0.data → paasta_tools-1.35.5.data}/scripts/mock_patch_checker.py +0 -0
  50. {paasta_tools-1.34.0.data → paasta_tools-1.35.5.data}/scripts/paasta_cleanup_remote_run_resources.py +0 -0
  51. {paasta_tools-1.34.0.data → paasta_tools-1.35.5.data}/scripts/paasta_cleanup_stale_nodes.py +0 -0
  52. {paasta_tools-1.34.0.data → paasta_tools-1.35.5.data}/scripts/paasta_deploy_tron_jobs +0 -0
  53. {paasta_tools-1.34.0.data → paasta_tools-1.35.5.data}/scripts/paasta_execute_docker_command.py +0 -0
  54. {paasta_tools-1.34.0.data → paasta_tools-1.35.5.data}/scripts/paasta_secrets_sync.py +0 -0
  55. {paasta_tools-1.34.0.data → paasta_tools-1.35.5.data}/scripts/paasta_tabcomplete.sh +0 -0
  56. {paasta_tools-1.34.0.data → paasta_tools-1.35.5.data}/scripts/render_template.py +0 -0
  57. {paasta_tools-1.34.0.data → paasta_tools-1.35.5.data}/scripts/rightsizer_soaconfigs_update.py +0 -0
  58. {paasta_tools-1.34.0.data → paasta_tools-1.35.5.data}/scripts/service_shard_remove.py +0 -0
  59. {paasta_tools-1.34.0.data → paasta_tools-1.35.5.data}/scripts/service_shard_update.py +0 -0
  60. {paasta_tools-1.34.0.data → paasta_tools-1.35.5.data}/scripts/setup_istio_mesh.py +0 -0
  61. {paasta_tools-1.34.0.data → paasta_tools-1.35.5.data}/scripts/setup_kubernetes_cr.py +0 -0
  62. {paasta_tools-1.34.0.data → paasta_tools-1.35.5.data}/scripts/setup_kubernetes_crd.py +0 -0
  63. {paasta_tools-1.34.0.data → paasta_tools-1.35.5.data}/scripts/setup_kubernetes_internal_crd.py +0 -0
  64. {paasta_tools-1.34.0.data → paasta_tools-1.35.5.data}/scripts/setup_kubernetes_job.py +0 -0
  65. {paasta_tools-1.34.0.data → paasta_tools-1.35.5.data}/scripts/setup_prometheus_adapter_config.py +0 -0
  66. {paasta_tools-1.34.0.data → paasta_tools-1.35.5.data}/scripts/shared_ip_check.py +0 -0
  67. {paasta_tools-1.34.0.data → paasta_tools-1.35.5.data}/scripts/synapse_srv_namespaces_fact.py +0 -0
  68. {paasta_tools-1.34.0.data → paasta_tools-1.35.5.data}/scripts/timeouts_metrics_prom.py +0 -0
  69. {paasta_tools-1.34.0.dist-info → paasta_tools-1.35.5.dist-info}/WHEEL +0 -0
  70. {paasta_tools-1.34.0.dist-info → paasta_tools-1.35.5.dist-info}/entry_points.txt +0 -0
  71. {paasta_tools-1.34.0.dist-info → paasta_tools-1.35.5.dist-info}/licenses/LICENSE +0 -0
  72. {paasta_tools-1.34.0.dist-info → paasta_tools-1.35.5.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.34.0"
20
+ __version__ = "1.35.5"
@@ -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():
@@ -295,11 +295,19 @@ def paasta_remote_run_stop(
295
295
 
296
296
 
297
297
  def add_common_args_to_parser(parser: argparse.ArgumentParser):
298
+ def _validate_service_name(name: str) -> str:
299
+ if name not in _list_services_and_toolboxes():
300
+ raise ValueError(f"{name} is not a known service name")
301
+ return name
302
+
298
303
  service_arg = parser.add_argument(
299
304
  "-s",
300
305
  "--service",
301
306
  help="The name of the service you wish to inspect. Required.",
302
307
  required=True,
308
+ # not using `choices` for validation to avoid the help text
309
+ # for the command being incredibly large
310
+ type=_validate_service_name,
303
311
  )
304
312
  service_arg.completer = lazy_choices_completer(_list_services_and_toolboxes) # type: ignore
305
313
  instance_or_toolbox = parser.add_mutually_exclusive_group()
@@ -323,6 +331,7 @@ def add_common_args_to_parser(parser: argparse.ArgumentParser):
323
331
  "--cluster",
324
332
  help="The name of the cluster you wish to run your task on. Required.",
325
333
  required=True,
334
+ choices=list_clusters(),
326
335
  )
327
336
  cluster_arg.completer = lazy_choices_completer(list_clusters) # type: ignore
328
337
 
@@ -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}")
@@ -22,6 +22,7 @@ from datetime import datetime
22
22
  from functools import lru_cache
23
23
  from functools import partial
24
24
  from glob import glob
25
+ from pathlib import Path
25
26
  from typing import Any
26
27
  from typing import Callable
27
28
  from typing import cast
@@ -34,6 +35,9 @@ from typing import Union
34
35
 
35
36
  import pytz
36
37
  from croniter import croniter
38
+ from environment_tools.type_utils import available_location_types
39
+ from environment_tools.type_utils import compare_types
40
+ from environment_tools.type_utils import convert_location_type
37
41
  from jsonschema import Draft4Validator
38
42
  from jsonschema import exceptions
39
43
  from jsonschema import FormatChecker
@@ -121,6 +125,7 @@ SCHEMA_TYPES = {
121
125
  "rollback", # automatic rollbacks during deployments
122
126
  "tron", # batch workloads
123
127
  "eks", # eks workloads
128
+ "smartstack", # mesh configs
124
129
  "autotuned_defaults/kubernetes",
125
130
  "autotuned_defaults/cassandracluster",
126
131
  }
@@ -171,6 +176,26 @@ INVALID_AUTOSCALING_FIELDS = {
171
176
  METRICS_PROVIDER_PROMQL: {"desired_active_requests_per_replica"},
172
177
  }
173
178
 
179
+ # Listener names in Envoy cannot exceed 128 characters and use the
180
+ # following format:
181
+ # service_name.namespace.listener
182
+ # This naming scheme leaves 128 - 10 = 118 characters
183
+ # for the Smartstack service name and namespace.
184
+ # See COREBACK-6303 for more context.
185
+ MAX_ENVOY_NAME_LEN = 118
186
+
187
+ # Socket names cannot exceed 108 characters, and the longest socket
188
+ # name generated by HAProxy uses the following format:
189
+ # /var/run/synapse/sockets/service_name.namespace.LONGPID.sock.tmp
190
+ # This naming scheme leaves 108 - 43 = 65 characters combined for the
191
+ # Smartstack service name and namespace. We leave a generous buffer
192
+ # to arrive at a maximum name length of 55, in case e.g. the .sock
193
+ # suffix is renamed to a longer name for certain sockets.
194
+ # See SMTSTK-204 for more context.
195
+ # NOTE: the above is mostly still true - but the path we use is now /var/run/envoy/sockets/...
196
+ # so we may want to adjust this a tad in the future ;)
197
+ MAX_SMARTSTACK_NAME_LEN = 55
198
+
174
199
 
175
200
  class ConditionConfig(TypedDict, total=False):
176
201
  """
@@ -983,6 +1008,191 @@ def validate_cpu_burst(service_path: str) -> bool:
983
1008
  return returncode
984
1009
 
985
1010
 
1011
+ def _check_smartstack_name_length_envoy(service: str, namespace: str) -> None:
1012
+ """Ensures that Smartstack service name and namespace does not
1013
+ exceed the limit on the length of Envoy's listener names
1014
+ """
1015
+ if len(service) + len(namespace) > MAX_ENVOY_NAME_LEN:
1016
+ raise ValueError(
1017
+ "Service name and namespace exceeds max listener name length in Envoy. Note that the full listener name "
1018
+ 'is "{}.{}.listener". Please rename so that the combined length of the service name and namespace does '
1019
+ "not exceed {} characters".format(service, namespace, MAX_ENVOY_NAME_LEN),
1020
+ )
1021
+
1022
+
1023
+ def _check_smartstack_name_length(service: str, namespace: str) -> None:
1024
+ """Ensure that Smartstack name does not
1025
+ exceed limits on HAProxy socket name
1026
+ """
1027
+ if len(service + namespace) > MAX_SMARTSTACK_NAME_LEN:
1028
+ socket_name = "/var/run/synapse/sockets/{}.{}.sock.LONGPID.tmp".format(
1029
+ service,
1030
+ namespace,
1031
+ )
1032
+ raise ValueError(
1033
+ "Name exceeds max socket name length. Note that the full socket name under the HAProxy naming scheme "
1034
+ 'is "{}". Please rename so that the combined length of the service name and namespace does not '
1035
+ "exceed {} characters".format(socket_name, MAX_SMARTSTACK_NAME_LEN),
1036
+ )
1037
+
1038
+
1039
+ @lru_cache()
1040
+ def _get_etc_services() -> list[str]:
1041
+ with open("/etc/services") as f:
1042
+ return f.read().splitlines()
1043
+
1044
+
1045
+ @lru_cache()
1046
+ def _get_etc_services_entry(port_lookup: int) -> str | None:
1047
+ entries = _get_etc_services()
1048
+ for entry in entries:
1049
+ try:
1050
+ service = entry.split()[0]
1051
+ port = entry.split()[1]
1052
+ if port.startswith("%s/" % str(port_lookup)):
1053
+ return service
1054
+ except IndexError:
1055
+ continue
1056
+ return None
1057
+
1058
+
1059
+ def _check_proxy_port_in_use(service: str, namespace: str, port: int) -> bool:
1060
+ if port is None:
1061
+ return False
1062
+
1063
+ # TODO(luisp): this should probably check the distributed /nail/etc/services
1064
+ # smartstack.yamls OR we should more automatically manage /etc/services
1065
+ etc_services_entry = _get_etc_services_entry(port)
1066
+ if etc_services_entry is None:
1067
+ return False
1068
+ elif f"{service}.{namespace}" == etc_services_entry:
1069
+ return False
1070
+ else:
1071
+ raise ValueError(
1072
+ (
1073
+ "port {} is already in use by {} according to /etc/services, it cannot be used by "
1074
+ "{}.{}. Please either pick a different port or update /etc/services via puppet"
1075
+ ).format(port, etc_services_entry, service, namespace),
1076
+ )
1077
+
1078
+
1079
+ def _check_advertise_discover(
1080
+ smartstack_data: dict[str, Any]
1081
+ ) -> None: # XXX: we should use a TypedDict here
1082
+ """Need to ensure a few properties about smartstack files
1083
+ 1) discover is a member of advertise
1084
+ 2) discovery and advertise contain valid locations
1085
+ 3) extra_advertise contains valid locations
1086
+ 4) rhs of extra_advertise are >= discover type
1087
+ """
1088
+
1089
+ def assert_valid_type(location_type: str) -> None:
1090
+ if location_type not in available_location_types():
1091
+ raise ValueError(
1092
+ 'Location type "{}" not a valid Yelp location type'.format(
1093
+ location_type,
1094
+ ),
1095
+ )
1096
+
1097
+ def assert_valid_location(location_string: str) -> None:
1098
+ try:
1099
+ typ, loc = location_string.split(":")
1100
+ assert len(convert_location_type(loc, typ, typ)) == 1
1101
+ except Exception:
1102
+ raise ValueError(
1103
+ 'Location string "{}" not a valid Yelp location'.format(
1104
+ location_string,
1105
+ ),
1106
+ )
1107
+
1108
+ advertise = smartstack_data.get("advertise", ["region"])
1109
+ discover = smartstack_data.get("discover", "region")
1110
+ if discover not in advertise:
1111
+ raise ValueError(
1112
+ 'discover key "{}" not a member of advertise "{}"'.format(
1113
+ discover,
1114
+ advertise,
1115
+ ),
1116
+ )
1117
+ for location_type in [discover] + advertise:
1118
+ assert_valid_type(location_type)
1119
+
1120
+ extra_advertisements = smartstack_data.get("extra_advertise", {})
1121
+ for source, destinations in extra_advertisements.items():
1122
+ assert_valid_location(source)
1123
+ for destination in destinations:
1124
+ assert_valid_location(destination)
1125
+ dest_type = destination.split(":")[0]
1126
+ if compare_types(dest_type, discover) > 0:
1127
+ raise ValueError(
1128
+ 'Right hand side "{}" less general than discover type "{}". Your advertisement would potentially '
1129
+ "result in more hosts seeing your service than intended. Please change the type of your RHS to be "
1130
+ ">= the discover type".format(destination, discover),
1131
+ )
1132
+
1133
+
1134
+ def _check_smartstack_valid_proxy(proxied_through: str, soa_dir: str) -> None:
1135
+ """Checks whether its parameter is a valid Smartstack namespace. Can be used for proxied_through or clb_proxy."""
1136
+ proxy_service, proxy_namespace = proxied_through.split(".")
1137
+ proxy_smartstack_filename = Path(soa_dir) / proxy_service / "smartstack.yaml"
1138
+ try:
1139
+ yaml_data = get_config_file_dict(proxy_smartstack_filename)
1140
+ if proxy_namespace not in yaml_data:
1141
+ raise ValueError(
1142
+ f"{proxied_through} is not a valid Smartstack namespace to proxy through: "
1143
+ f"{proxy_namespace} not found in {proxy_smartstack_filename}.",
1144
+ )
1145
+ except FileNotFoundError:
1146
+ raise ValueError(
1147
+ f"{proxied_through} is not a valid Smartstack namespace to proxy through: "
1148
+ f"{proxy_smartstack_filename} does not exist.",
1149
+ )
1150
+
1151
+
1152
+ def _check_smartstack_proxied_through(
1153
+ smartstack_data: dict[str, Any],
1154
+ soa_dir: str,
1155
+ ) -> None: # XXX: we should use a TypedDict here
1156
+ """Checks the proxied_through field of a Smartstack namespace refers to another valid Smartstack namespace"""
1157
+ if "proxied_through" not in smartstack_data:
1158
+ return
1159
+
1160
+ proxied_through = smartstack_data["proxied_through"]
1161
+ _check_smartstack_valid_proxy(proxied_through, soa_dir)
1162
+
1163
+
1164
+ def validate_smartstack(service_path: str) -> bool:
1165
+ if not os.path.exists(os.path.join(service_path, "smartstack.yaml")):
1166
+ # not every service is mesh-registered, exit early if this is the case
1167
+ return True
1168
+
1169
+ config = get_config_file_dict(os.path.join(service_path, "smartstack.yaml"))
1170
+ if not config:
1171
+ print(
1172
+ failure(
1173
+ "smartstack.yaml is empty - if this service is not mesh-registered, please remove this file.",
1174
+ "http://paasta.readthedocs.io/en/latest/yelpsoa_configs.html",
1175
+ )
1176
+ )
1177
+ return False
1178
+
1179
+ soa_dir, service = path_to_soa_dir_service(service_path)
1180
+ for namespace, namespace_config in config.items():
1181
+ # XXX(luisp): these should all really either return bools or be enforced in the schema
1182
+ # ...i'm mostly leaving these as-is since i'm trying to remove some internal code that
1183
+ # duplicates a bunch of paasta validate checks (i.e., py-gitolite)
1184
+ _check_smartstack_name_length_envoy(service, namespace)
1185
+ if namespace_config["proxy_port"]:
1186
+ _check_smartstack_name_length(service, namespace)
1187
+ proxy_port = namespace_config["proxy_port"]
1188
+ _check_proxy_port_in_use(service, namespace, proxy_port)
1189
+ _check_advertise_discover(namespace_config)
1190
+ _check_smartstack_proxied_through(namespace_config, soa_dir)
1191
+
1192
+ print(success("All SmartStack configs are valid"))
1193
+ return True
1194
+
1195
+
986
1196
  def paasta_validate_soa_configs(
987
1197
  service: str, service_path: str, verbose: bool = False
988
1198
  ) -> bool:
@@ -1005,6 +1215,7 @@ def paasta_validate_soa_configs(
1005
1215
  validate_secrets,
1006
1216
  validate_min_max_instances,
1007
1217
  validate_cpu_burst,
1218
+ validate_smartstack,
1008
1219
  ]
1009
1220
 
1010
1221
  # NOTE: we're explicitly passing a list comprehension to all()
@@ -1018,8 +1229,13 @@ def paasta_validate(args):
1018
1229
 
1019
1230
  :param args: argparse.Namespace obj created from sys.args by cli
1020
1231
  """
1021
- service_path = get_service_path(args.service, args.yelpsoa_config_root)
1022
1232
  service = args.service or guess_service_name()
1233
+ service_path = get_service_path(service, args.yelpsoa_config_root)
1234
+
1235
+ # not much we can do if we have no path to inspect ;)
1236
+ if not service_path:
1237
+ return 1
1238
+
1023
1239
  if not paasta_validate_soa_configs(service, service_path, args.verbose):
1024
1240
  print("Invalid configs found. Please try again.")
1025
1241
  return 1
@@ -62,6 +62,11 @@
62
62
  "minimum": 0,
63
63
  "maximum": 60000
64
64
  },
65
+ "timeout_client_ms": {
66
+ "type": "integer",
67
+ "minimum": 0,
68
+ "maximum": 86400000
69
+ },
65
70
  "timeout_server_ms": {
66
71
  "type": "integer",
67
72
  "minimum": 0,
@@ -132,6 +137,10 @@
132
137
  "CLUSTER_PROVIDED"
133
138
  ]
134
139
  },
140
+ "choice_count": {
141
+ "type": "integer",
142
+ "minimum": 1
143
+ },
135
144
  "chaos": {
136
145
  "type": "object",
137
146
  "additionalProperties": {
@@ -156,6 +165,9 @@
156
165
  "proxied_through": {
157
166
  "type": "string"
158
167
  },
168
+ "clb_proxy": {
169
+ "type": "string"
170
+ },
159
171
  "fixed_delay": {
160
172
  "type": "object",
161
173
  "additionalProperties": {
@@ -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.34.0
3
+ Version: 1.35.5
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=0_9arSYOdPuLPZ7nLp0OEFsvxvmfAtBAxiOd3JHh1mU,865
4
+ paasta_tools/__init__.py,sha256=vyHhw7Ta273K-6gvYGiHIhG3O4UVwKmL16i-Y3Nh1wo,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
- paasta_tools/cli/cmds/remote_run.py,sha256=nqo_i6ubxK65qYknEIMX9p_4fDDh5nh5xsCndJ7LGco,16002
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=dcVIDhjefS2-C2zbltusFVZ1gablVsP44L1zK9DEp_M,40765
139
+ paasta_tools/cli/cmds/status.py,sha256=Naw1eZMlFgIt1LuLo8lGwB1aLDeifHgUyVltMFAfz1k,87878
140
+ paasta_tools/cli/cmds/validate.py,sha256=2Z0UildDGNnjm3X6eoMsgMlgzfBalUYADweFQeMBHFk,49740
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
@@ -154,7 +154,7 @@ paasta_tools/cli/schemas/eks_schema.json,sha256=ZKLsUgcDEMVAaYYhNy0anpwM_zeTrTYm
154
154
  paasta_tools/cli/schemas/kubernetes_schema.json,sha256=ED9dgIBTDFe57AXcuNqEomv2oqhVmS-Ohuz5rNaqOxM,40763
155
155
  paasta_tools/cli/schemas/rollback_schema.json,sha256=LJW9wINcIIa7-QrJmzmFx44OLw4TlLpPdEWuHDxd9cQ,6442
156
156
  paasta_tools/cli/schemas/service_schema.json,sha256=6wiKhmd0-i3dGS8QUOkwsIbAWrUkKpiLbmZBve7xLGQ,785
157
- paasta_tools/cli/schemas/smartstack_schema.json,sha256=R2uiTV_QNcscdLKrePnaoIadCEEuR29lJbNYFfVe6xk,10696
157
+ paasta_tools/cli/schemas/smartstack_schema.json,sha256=Kvoh1E7xXUhCeGgYEe9ZhyrRKdJE9k-8LgmQvRtsB_w,11031
158
158
  paasta_tools/cli/schemas/tron_schema.json,sha256=2G0hY8V7odgOhQJWu5k735LMPyzP6rNkU4hK6IqhKRo,28168
159
159
  paasta_tools/cli/schemas/autotuned_defaults/cassandracluster_schema.json,sha256=W9wKEHLZpGvh5h-MK05Zw-3o0RM2TF645HLdMQligTc,1158
160
160
  paasta_tools/cli/schemas/autotuned_defaults/kubernetes_schema.json,sha256=xfaobvcV1WF7YC9YGt7D25a8p3Dv0zIKmGt0L29nPlg,3612
@@ -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.34.0.data/scripts/apply_external_resources.py,sha256=BOIdCQ5Md9RI3enzqbIWQge3clkXhPybAmLE3hqfDwQ,3347
291
- paasta_tools-1.34.0.data/scripts/bounce_log_latency_parser.py,sha256=dC06a0a5LdtPJ8xo88QWe5DMH_vwVB1BNbkFH7kJ3j0,2225
292
- paasta_tools-1.34.0.data/scripts/check_autoscaler_max_instances.py,sha256=2z6ifSU26-ULOK-FXp75b45mCdjSJnuvU8TxvapB8Wk,9423
293
- paasta_tools-1.34.0.data/scripts/check_cassandracluster_services_replication.py,sha256=mKlCK9pRNzxnOt41wA6CtDQIHhcky438i044kA6pbEc,1127
294
- paasta_tools-1.34.0.data/scripts/check_flink_services_health.py,sha256=ElYa1hr6KUcXuu0B8Nf-dt2Vfyo5FrwF5gVV4QBX7Lg,7162
295
- paasta_tools-1.34.0.data/scripts/check_kubernetes_api.py,sha256=BhOqJkkKNJPfonfIPonW5dlIubd1ji-3ppjXHomNwzM,1522
296
- paasta_tools-1.34.0.data/scripts/check_kubernetes_services_replication.py,sha256=LCLlumReRdy9Cw_sPpqanjPcBlbcrJDiECaYYru5Cwk,5751
297
- paasta_tools-1.34.0.data/scripts/check_manual_oapi_changes.sh,sha256=1IdphwXP7xnMNS7huZ3FeEHy67-nY4n3ydHmbojQvJg,879
298
- paasta_tools-1.34.0.data/scripts/check_oom_events.py,sha256=tUr14T2LYEgqwpAq4vkZ_Z0VTPOfQg7yrSSkwGQ86Hg,7801
299
- paasta_tools-1.34.0.data/scripts/check_orphans.py,sha256=9PmzRUZ1HwCcmTm4J1xTznz7hZl8fKsu1wdXUDufXJs,9984
300
- paasta_tools-1.34.0.data/scripts/check_spark_jobs.py,sha256=W4HUIbX_ylxl4DlqcdmoRWDbKYgPEr04OM-DLvfnXE8,7316
301
- paasta_tools-1.34.0.data/scripts/cleanup_kubernetes_cr.py,sha256=m-w_wuTuVG9FlwQQkxXYgri5DTGac9Nc2pbK4k1FNDE,4659
302
- paasta_tools-1.34.0.data/scripts/cleanup_kubernetes_crd.py,sha256=p9eLk-0-pU-hcVg-GAM92h1ZdQqlvmYhBzUFCiMPYR8,4478
303
- paasta_tools-1.34.0.data/scripts/cleanup_kubernetes_jobs.py,sha256=7LHB4tsz1kt-zygssIfQbBY6c3LSqXYDUILvHkSfBog,12433
304
- paasta_tools-1.34.0.data/scripts/create_dynamodb_table.py,sha256=9wJftWGgNtvLnpXeUqpoMXBIIep1hNySf0YiQmzpl5c,1167
305
- paasta_tools-1.34.0.data/scripts/create_paasta_playground.py,sha256=jzoE5e1pxWeVXwCEkD9O0jefOhEnIlSa3QMP9PC2f0M,3239
306
- paasta_tools-1.34.0.data/scripts/delete_kubernetes_deployments.py,sha256=de4C-5yqEuCeJXp6zhbc0v-c0LOElr4qabLnOTRcX4o,3124
307
- paasta_tools-1.34.0.data/scripts/emit_allocated_cpu_metrics.py,sha256=Cjd3xoOJoYSP3ciSAlZ7fh6_z678KpYt43Xh-WVCY1M,1859
308
- paasta_tools-1.34.0.data/scripts/generate_all_deployments,sha256=Qr5B0zogTOr8Lcn_7dpORixpGIJcXZ_pWz_ZlWnmsik,248
309
- paasta_tools-1.34.0.data/scripts/generate_authenticating_services.py,sha256=r5AQyquVm8_rbAhBETUU2ZHZvolpqZZTakW3lKFiOqw,2982
310
- paasta_tools-1.34.0.data/scripts/generate_deployments_for_service.py,sha256=FAFzIAtKY7GsA13s-ssCMH7T-_p9B1pBtyyYFzsCZ6k,9822
311
- paasta_tools-1.34.0.data/scripts/generate_services_file.py,sha256=w3Wyyn9ZkjfrvkT0SnTbh5mrTZJnjhTC2JIqLBpb6-g,3583
312
- paasta_tools-1.34.0.data/scripts/generate_services_yaml.py,sha256=XyIUsHa1BPLqeklayaFewX69-6GT_luaSLS_TMDLkQ0,991
313
- paasta_tools-1.34.0.data/scripts/get_running_task_allocation.py,sha256=NGYO2td42XQOduUmvgz0CZw0ir36bY6fUe3VOR1Ln6E,10876
314
- paasta_tools-1.34.0.data/scripts/habitat_fixer.py,sha256=hCC7fEnxrBOmiCJj4rPwhGlae9JsYg_gltk10l-FwaE,2625
315
- paasta_tools-1.34.0.data/scripts/ide_helper.py,sha256=QUVWxIeh54IhTn3HEhBrmJKvtgw6RDv9smoJ-6pZA4c,12348
316
- paasta_tools-1.34.0.data/scripts/is_pod_healthy_in_proxy.py,sha256=MiY85MJDXcN9oS8d840WG1iYDIzzO9lmk_NC0i_CrQg,4321
317
- paasta_tools-1.34.0.data/scripts/is_pod_healthy_in_smartstack.py,sha256=z3uP9sgwLwg94BubFgBKare2t1L5qhcY48MWsJxjxPY,1697
318
- paasta_tools-1.34.0.data/scripts/kill_bad_containers.py,sha256=oNY5x0Zg0eu34cXhFy60I7WRlqg4PKD_6xWi0eoRTCA,3832
319
- paasta_tools-1.34.0.data/scripts/kubernetes_remove_evicted_pods.py,sha256=D9Ovdc9Xer_Qf3vM5CtPVcKvnMwLiC0H-WQmQGXrBKM,5274
320
- paasta_tools-1.34.0.data/scripts/mass-deploy-tag.sh,sha256=cfPgDDvAOhy3ijTUocklogzoIY8hfoE6T5QI-0aqcfM,1578
321
- paasta_tools-1.34.0.data/scripts/mock_patch_checker.py,sha256=Q6Je8QjmfLzdnv_6JR6ehh2kA5SUxmeZGeLI2WC3BSY,2559
322
- paasta_tools-1.34.0.data/scripts/paasta_cleanup_remote_run_resources.py,sha256=4oN9UwnR7q6aEEyFUhVrT41VSeQJ2YS3upFpbZQXNUI,4558
323
- paasta_tools-1.34.0.data/scripts/paasta_cleanup_stale_nodes.py,sha256=C-DmEVgtienoMgJnIeESvFqWcJOW2SOGoS1l8RXA8NE,6304
324
- paasta_tools-1.34.0.data/scripts/paasta_deploy_tron_jobs,sha256=fFN2aP5FNSm5WfDV3yvLpihXaKkAF65MRXFcN2iD7S4,106
325
- paasta_tools-1.34.0.data/scripts/paasta_execute_docker_command.py,sha256=6kh7h2bleQbNULc37MiRsfnk9MDHqVv30UQdg3rF3kQ,4086
326
- paasta_tools-1.34.0.data/scripts/paasta_secrets_sync.py,sha256=sMdyWMt9BU5CmWHIRwzhpFKve7zxFHkygt_SNTJutWM,28766
327
- paasta_tools-1.34.0.data/scripts/paasta_tabcomplete.sh,sha256=qbQKSriz_L4MogA12L_8i-tg0Lplpshbk_FUMjK6uG0,929
328
- paasta_tools-1.34.0.data/scripts/paasta_update_soa_memcpu.py,sha256=5fShpZYpb7EeoC70cWdICnNHjHAaNU5mTHaAc3mloIs,20813
329
- paasta_tools-1.34.0.data/scripts/render_template.py,sha256=KcKfeSP2a9f6fMDRhnjX7OJaHmFIBtCJcHhUI_B7p9Y,3975
330
- paasta_tools-1.34.0.data/scripts/rightsizer_soaconfigs_update.py,sha256=0UPVtDyX6wXXurv7l5fiKuzXH8VEszKx_V7UqDm6Ck0,10493
331
- paasta_tools-1.34.0.data/scripts/service_shard_remove.py,sha256=WCvCxu3GTYEa3cYnWybTOiuHN14axj0x5_-snVd-mqE,4927
332
- paasta_tools-1.34.0.data/scripts/service_shard_update.py,sha256=AajuRS4s-HXhEcIIYK2dsyBSdCjZbh4x6Po48ipl7M4,13346
333
- paasta_tools-1.34.0.data/scripts/setup_istio_mesh.py,sha256=LbLxeI_DnhNXkyCgG-GxutlNu9_vcIitorYr4I9x4CY,11575
334
- paasta_tools-1.34.0.data/scripts/setup_kubernetes_cr.py,sha256=xsZJ_X1YpQ0NExyY1cXFH8KW2_vAgctCwdrW0bu102s,14931
335
- paasta_tools-1.34.0.data/scripts/setup_kubernetes_crd.py,sha256=QCiFOcSmE0nMEheIb7IUnYMUn0heh1kHyMFBCm7XIRU,4020
336
- paasta_tools-1.34.0.data/scripts/setup_kubernetes_internal_crd.py,sha256=dDyAOKFow7yeHWGa197angYwGTDWNyR7vZ6Cx5JlS6k,4629
337
- paasta_tools-1.34.0.data/scripts/setup_kubernetes_job.py,sha256=H2VuRaCpBj-J2Qc3DmIMutGuDL8nlfabshEiCGNNqmY,19095
338
- paasta_tools-1.34.0.data/scripts/setup_prometheus_adapter_config.py,sha256=JzvztaJ__5MOAV6pD5Vj3mamARh6TZUCzYdlqhWDOOY,43962
339
- paasta_tools-1.34.0.data/scripts/shared_ip_check.py,sha256=dbMwCwDLy9hCIbVWV1rk0FKuBkZNuQtM59hGVKxV2B4,2464
340
- paasta_tools-1.34.0.data/scripts/synapse_srv_namespaces_fact.py,sha256=HFX0zIXkXIjtAw8zrA7mUiy6NOKR11eBzE39R3aZv_E,1408
341
- paasta_tools-1.34.0.data/scripts/timeouts_metrics_prom.py,sha256=icK1j72-e-hvbUGs3LtcaMn9KBMopD9cGv5UUVo-OSc,2607
342
- paasta_tools-1.34.0.dist-info/licenses/LICENSE,sha256=Tcxn8PpeSjHDwUTemLW_thUNxcOOm612dK_no2ebEpo,10837
343
- paasta_tools-1.34.0.dist-info/METADATA,sha256=mJ33VTC1O8rAtMvqgwfyNqpGU0bqdoW-NYHcrRqddKI,2258
344
- paasta_tools-1.34.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
345
- paasta_tools-1.34.0.dist-info/entry_points.txt,sha256=qokGSdKYA6AjtdMM_BjmCAOMghMsjOpcAdL9e4fY6D8,1179
346
- paasta_tools-1.34.0.dist-info/top_level.txt,sha256=6vZZAZ7bbaDxuXZjNYixDwzkrezpNgDQHpS0ikvFOk4,24
347
- paasta_tools-1.34.0.dist-info/RECORD,,
290
+ paasta_tools-1.35.5.data/scripts/apply_external_resources.py,sha256=BOIdCQ5Md9RI3enzqbIWQge3clkXhPybAmLE3hqfDwQ,3347
291
+ paasta_tools-1.35.5.data/scripts/bounce_log_latency_parser.py,sha256=dC06a0a5LdtPJ8xo88QWe5DMH_vwVB1BNbkFH7kJ3j0,2225
292
+ paasta_tools-1.35.5.data/scripts/check_autoscaler_max_instances.py,sha256=2z6ifSU26-ULOK-FXp75b45mCdjSJnuvU8TxvapB8Wk,9423
293
+ paasta_tools-1.35.5.data/scripts/check_cassandracluster_services_replication.py,sha256=mKlCK9pRNzxnOt41wA6CtDQIHhcky438i044kA6pbEc,1127
294
+ paasta_tools-1.35.5.data/scripts/check_flink_services_health.py,sha256=ElYa1hr6KUcXuu0B8Nf-dt2Vfyo5FrwF5gVV4QBX7Lg,7162
295
+ paasta_tools-1.35.5.data/scripts/check_kubernetes_api.py,sha256=BhOqJkkKNJPfonfIPonW5dlIubd1ji-3ppjXHomNwzM,1522
296
+ paasta_tools-1.35.5.data/scripts/check_kubernetes_services_replication.py,sha256=LCLlumReRdy9Cw_sPpqanjPcBlbcrJDiECaYYru5Cwk,5751
297
+ paasta_tools-1.35.5.data/scripts/check_manual_oapi_changes.sh,sha256=1IdphwXP7xnMNS7huZ3FeEHy67-nY4n3ydHmbojQvJg,879
298
+ paasta_tools-1.35.5.data/scripts/check_oom_events.py,sha256=tUr14T2LYEgqwpAq4vkZ_Z0VTPOfQg7yrSSkwGQ86Hg,7801
299
+ paasta_tools-1.35.5.data/scripts/check_orphans.py,sha256=9PmzRUZ1HwCcmTm4J1xTznz7hZl8fKsu1wdXUDufXJs,9984
300
+ paasta_tools-1.35.5.data/scripts/check_spark_jobs.py,sha256=W4HUIbX_ylxl4DlqcdmoRWDbKYgPEr04OM-DLvfnXE8,7316
301
+ paasta_tools-1.35.5.data/scripts/cleanup_kubernetes_cr.py,sha256=m-w_wuTuVG9FlwQQkxXYgri5DTGac9Nc2pbK4k1FNDE,4659
302
+ paasta_tools-1.35.5.data/scripts/cleanup_kubernetes_crd.py,sha256=p9eLk-0-pU-hcVg-GAM92h1ZdQqlvmYhBzUFCiMPYR8,4478
303
+ paasta_tools-1.35.5.data/scripts/cleanup_kubernetes_jobs.py,sha256=7LHB4tsz1kt-zygssIfQbBY6c3LSqXYDUILvHkSfBog,12433
304
+ paasta_tools-1.35.5.data/scripts/create_dynamodb_table.py,sha256=9wJftWGgNtvLnpXeUqpoMXBIIep1hNySf0YiQmzpl5c,1167
305
+ paasta_tools-1.35.5.data/scripts/create_paasta_playground.py,sha256=jzoE5e1pxWeVXwCEkD9O0jefOhEnIlSa3QMP9PC2f0M,3239
306
+ paasta_tools-1.35.5.data/scripts/delete_kubernetes_deployments.py,sha256=de4C-5yqEuCeJXp6zhbc0v-c0LOElr4qabLnOTRcX4o,3124
307
+ paasta_tools-1.35.5.data/scripts/emit_allocated_cpu_metrics.py,sha256=Cjd3xoOJoYSP3ciSAlZ7fh6_z678KpYt43Xh-WVCY1M,1859
308
+ paasta_tools-1.35.5.data/scripts/generate_all_deployments,sha256=Qr5B0zogTOr8Lcn_7dpORixpGIJcXZ_pWz_ZlWnmsik,248
309
+ paasta_tools-1.35.5.data/scripts/generate_authenticating_services.py,sha256=r5AQyquVm8_rbAhBETUU2ZHZvolpqZZTakW3lKFiOqw,2982
310
+ paasta_tools-1.35.5.data/scripts/generate_deployments_for_service.py,sha256=FAFzIAtKY7GsA13s-ssCMH7T-_p9B1pBtyyYFzsCZ6k,9822
311
+ paasta_tools-1.35.5.data/scripts/generate_services_file.py,sha256=w3Wyyn9ZkjfrvkT0SnTbh5mrTZJnjhTC2JIqLBpb6-g,3583
312
+ paasta_tools-1.35.5.data/scripts/generate_services_yaml.py,sha256=XyIUsHa1BPLqeklayaFewX69-6GT_luaSLS_TMDLkQ0,991
313
+ paasta_tools-1.35.5.data/scripts/get_running_task_allocation.py,sha256=NGYO2td42XQOduUmvgz0CZw0ir36bY6fUe3VOR1Ln6E,10876
314
+ paasta_tools-1.35.5.data/scripts/habitat_fixer.py,sha256=hCC7fEnxrBOmiCJj4rPwhGlae9JsYg_gltk10l-FwaE,2625
315
+ paasta_tools-1.35.5.data/scripts/ide_helper.py,sha256=QUVWxIeh54IhTn3HEhBrmJKvtgw6RDv9smoJ-6pZA4c,12348
316
+ paasta_tools-1.35.5.data/scripts/is_pod_healthy_in_proxy.py,sha256=MiY85MJDXcN9oS8d840WG1iYDIzzO9lmk_NC0i_CrQg,4321
317
+ paasta_tools-1.35.5.data/scripts/is_pod_healthy_in_smartstack.py,sha256=z3uP9sgwLwg94BubFgBKare2t1L5qhcY48MWsJxjxPY,1697
318
+ paasta_tools-1.35.5.data/scripts/kill_bad_containers.py,sha256=oNY5x0Zg0eu34cXhFy60I7WRlqg4PKD_6xWi0eoRTCA,3832
319
+ paasta_tools-1.35.5.data/scripts/kubernetes_remove_evicted_pods.py,sha256=D9Ovdc9Xer_Qf3vM5CtPVcKvnMwLiC0H-WQmQGXrBKM,5274
320
+ paasta_tools-1.35.5.data/scripts/mass-deploy-tag.sh,sha256=cfPgDDvAOhy3ijTUocklogzoIY8hfoE6T5QI-0aqcfM,1578
321
+ paasta_tools-1.35.5.data/scripts/mock_patch_checker.py,sha256=Q6Je8QjmfLzdnv_6JR6ehh2kA5SUxmeZGeLI2WC3BSY,2559
322
+ paasta_tools-1.35.5.data/scripts/paasta_cleanup_remote_run_resources.py,sha256=4oN9UwnR7q6aEEyFUhVrT41VSeQJ2YS3upFpbZQXNUI,4558
323
+ paasta_tools-1.35.5.data/scripts/paasta_cleanup_stale_nodes.py,sha256=C-DmEVgtienoMgJnIeESvFqWcJOW2SOGoS1l8RXA8NE,6304
324
+ paasta_tools-1.35.5.data/scripts/paasta_deploy_tron_jobs,sha256=fFN2aP5FNSm5WfDV3yvLpihXaKkAF65MRXFcN2iD7S4,106
325
+ paasta_tools-1.35.5.data/scripts/paasta_execute_docker_command.py,sha256=6kh7h2bleQbNULc37MiRsfnk9MDHqVv30UQdg3rF3kQ,4086
326
+ paasta_tools-1.35.5.data/scripts/paasta_secrets_sync.py,sha256=sMdyWMt9BU5CmWHIRwzhpFKve7zxFHkygt_SNTJutWM,28766
327
+ paasta_tools-1.35.5.data/scripts/paasta_tabcomplete.sh,sha256=qbQKSriz_L4MogA12L_8i-tg0Lplpshbk_FUMjK6uG0,929
328
+ paasta_tools-1.35.5.data/scripts/paasta_update_soa_memcpu.py,sha256=WsbOFy80rbCxTSo4mbn9ok-cIETyBeCyGB8yFAOwdvc,20536
329
+ paasta_tools-1.35.5.data/scripts/render_template.py,sha256=KcKfeSP2a9f6fMDRhnjX7OJaHmFIBtCJcHhUI_B7p9Y,3975
330
+ paasta_tools-1.35.5.data/scripts/rightsizer_soaconfigs_update.py,sha256=0UPVtDyX6wXXurv7l5fiKuzXH8VEszKx_V7UqDm6Ck0,10493
331
+ paasta_tools-1.35.5.data/scripts/service_shard_remove.py,sha256=WCvCxu3GTYEa3cYnWybTOiuHN14axj0x5_-snVd-mqE,4927
332
+ paasta_tools-1.35.5.data/scripts/service_shard_update.py,sha256=AajuRS4s-HXhEcIIYK2dsyBSdCjZbh4x6Po48ipl7M4,13346
333
+ paasta_tools-1.35.5.data/scripts/setup_istio_mesh.py,sha256=LbLxeI_DnhNXkyCgG-GxutlNu9_vcIitorYr4I9x4CY,11575
334
+ paasta_tools-1.35.5.data/scripts/setup_kubernetes_cr.py,sha256=xsZJ_X1YpQ0NExyY1cXFH8KW2_vAgctCwdrW0bu102s,14931
335
+ paasta_tools-1.35.5.data/scripts/setup_kubernetes_crd.py,sha256=QCiFOcSmE0nMEheIb7IUnYMUn0heh1kHyMFBCm7XIRU,4020
336
+ paasta_tools-1.35.5.data/scripts/setup_kubernetes_internal_crd.py,sha256=dDyAOKFow7yeHWGa197angYwGTDWNyR7vZ6Cx5JlS6k,4629
337
+ paasta_tools-1.35.5.data/scripts/setup_kubernetes_job.py,sha256=H2VuRaCpBj-J2Qc3DmIMutGuDL8nlfabshEiCGNNqmY,19095
338
+ paasta_tools-1.35.5.data/scripts/setup_prometheus_adapter_config.py,sha256=JzvztaJ__5MOAV6pD5Vj3mamARh6TZUCzYdlqhWDOOY,43962
339
+ paasta_tools-1.35.5.data/scripts/shared_ip_check.py,sha256=dbMwCwDLy9hCIbVWV1rk0FKuBkZNuQtM59hGVKxV2B4,2464
340
+ paasta_tools-1.35.5.data/scripts/synapse_srv_namespaces_fact.py,sha256=HFX0zIXkXIjtAw8zrA7mUiy6NOKR11eBzE39R3aZv_E,1408
341
+ paasta_tools-1.35.5.data/scripts/timeouts_metrics_prom.py,sha256=icK1j72-e-hvbUGs3LtcaMn9KBMopD9cGv5UUVo-OSc,2607
342
+ paasta_tools-1.35.5.dist-info/licenses/LICENSE,sha256=Tcxn8PpeSjHDwUTemLW_thUNxcOOm612dK_no2ebEpo,10837
343
+ paasta_tools-1.35.5.dist-info/METADATA,sha256=pMjJ86MofTz2YR62FThTv7LV8fp-Wj3GTBEqNbBTM78,2250
344
+ paasta_tools-1.35.5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
345
+ paasta_tools-1.35.5.dist-info/entry_points.txt,sha256=qokGSdKYA6AjtdMM_BjmCAOMghMsjOpcAdL9e4fY6D8,1179
346
+ paasta_tools-1.35.5.dist-info/top_level.txt,sha256=6vZZAZ7bbaDxuXZjNYixDwzkrezpNgDQHpS0ikvFOk4,24
347
+ paasta_tools-1.35.5.dist-info/RECORD,,