paasta-tools 1.33.4__py3-none-any.whl → 1.35.0__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 (66) hide show
  1. paasta_tools/__init__.py +1 -1
  2. paasta_tools/cli/cmds/validate.py +217 -1
  3. paasta_tools/cli/schemas/eks_schema.json +23 -1
  4. paasta_tools/cli/schemas/smartstack_schema.json +12 -0
  5. paasta_tools/instance/hpa_metrics_parser.py +3 -5
  6. paasta_tools/kubernetes/remote_run.py +2 -2
  7. paasta_tools/kubernetes_tools.py +7 -3
  8. paasta_tools/utils.py +1 -0
  9. {paasta_tools-1.33.4.dist-info → paasta_tools-1.35.0.dist-info}/METADATA +2 -2
  10. {paasta_tools-1.33.4.dist-info → paasta_tools-1.35.0.dist-info}/RECORD +66 -66
  11. {paasta_tools-1.33.4.data → paasta_tools-1.35.0.data}/scripts/apply_external_resources.py +0 -0
  12. {paasta_tools-1.33.4.data → paasta_tools-1.35.0.data}/scripts/bounce_log_latency_parser.py +0 -0
  13. {paasta_tools-1.33.4.data → paasta_tools-1.35.0.data}/scripts/check_autoscaler_max_instances.py +0 -0
  14. {paasta_tools-1.33.4.data → paasta_tools-1.35.0.data}/scripts/check_cassandracluster_services_replication.py +0 -0
  15. {paasta_tools-1.33.4.data → paasta_tools-1.35.0.data}/scripts/check_flink_services_health.py +0 -0
  16. {paasta_tools-1.33.4.data → paasta_tools-1.35.0.data}/scripts/check_kubernetes_api.py +0 -0
  17. {paasta_tools-1.33.4.data → paasta_tools-1.35.0.data}/scripts/check_kubernetes_services_replication.py +0 -0
  18. {paasta_tools-1.33.4.data → paasta_tools-1.35.0.data}/scripts/check_manual_oapi_changes.sh +0 -0
  19. {paasta_tools-1.33.4.data → paasta_tools-1.35.0.data}/scripts/check_oom_events.py +0 -0
  20. {paasta_tools-1.33.4.data → paasta_tools-1.35.0.data}/scripts/check_orphans.py +0 -0
  21. {paasta_tools-1.33.4.data → paasta_tools-1.35.0.data}/scripts/check_spark_jobs.py +0 -0
  22. {paasta_tools-1.33.4.data → paasta_tools-1.35.0.data}/scripts/cleanup_kubernetes_cr.py +0 -0
  23. {paasta_tools-1.33.4.data → paasta_tools-1.35.0.data}/scripts/cleanup_kubernetes_crd.py +0 -0
  24. {paasta_tools-1.33.4.data → paasta_tools-1.35.0.data}/scripts/cleanup_kubernetes_jobs.py +0 -0
  25. {paasta_tools-1.33.4.data → paasta_tools-1.35.0.data}/scripts/create_dynamodb_table.py +0 -0
  26. {paasta_tools-1.33.4.data → paasta_tools-1.35.0.data}/scripts/create_paasta_playground.py +0 -0
  27. {paasta_tools-1.33.4.data → paasta_tools-1.35.0.data}/scripts/delete_kubernetes_deployments.py +0 -0
  28. {paasta_tools-1.33.4.data → paasta_tools-1.35.0.data}/scripts/emit_allocated_cpu_metrics.py +0 -0
  29. {paasta_tools-1.33.4.data → paasta_tools-1.35.0.data}/scripts/generate_all_deployments +0 -0
  30. {paasta_tools-1.33.4.data → paasta_tools-1.35.0.data}/scripts/generate_authenticating_services.py +0 -0
  31. {paasta_tools-1.33.4.data → paasta_tools-1.35.0.data}/scripts/generate_deployments_for_service.py +0 -0
  32. {paasta_tools-1.33.4.data → paasta_tools-1.35.0.data}/scripts/generate_services_file.py +0 -0
  33. {paasta_tools-1.33.4.data → paasta_tools-1.35.0.data}/scripts/generate_services_yaml.py +0 -0
  34. {paasta_tools-1.33.4.data → paasta_tools-1.35.0.data}/scripts/get_running_task_allocation.py +0 -0
  35. {paasta_tools-1.33.4.data → paasta_tools-1.35.0.data}/scripts/habitat_fixer.py +0 -0
  36. {paasta_tools-1.33.4.data → paasta_tools-1.35.0.data}/scripts/ide_helper.py +0 -0
  37. {paasta_tools-1.33.4.data → paasta_tools-1.35.0.data}/scripts/is_pod_healthy_in_proxy.py +0 -0
  38. {paasta_tools-1.33.4.data → paasta_tools-1.35.0.data}/scripts/is_pod_healthy_in_smartstack.py +0 -0
  39. {paasta_tools-1.33.4.data → paasta_tools-1.35.0.data}/scripts/kill_bad_containers.py +0 -0
  40. {paasta_tools-1.33.4.data → paasta_tools-1.35.0.data}/scripts/kubernetes_remove_evicted_pods.py +0 -0
  41. {paasta_tools-1.33.4.data → paasta_tools-1.35.0.data}/scripts/mass-deploy-tag.sh +0 -0
  42. {paasta_tools-1.33.4.data → paasta_tools-1.35.0.data}/scripts/mock_patch_checker.py +0 -0
  43. {paasta_tools-1.33.4.data → paasta_tools-1.35.0.data}/scripts/paasta_cleanup_remote_run_resources.py +0 -0
  44. {paasta_tools-1.33.4.data → paasta_tools-1.35.0.data}/scripts/paasta_cleanup_stale_nodes.py +0 -0
  45. {paasta_tools-1.33.4.data → paasta_tools-1.35.0.data}/scripts/paasta_deploy_tron_jobs +0 -0
  46. {paasta_tools-1.33.4.data → paasta_tools-1.35.0.data}/scripts/paasta_execute_docker_command.py +0 -0
  47. {paasta_tools-1.33.4.data → paasta_tools-1.35.0.data}/scripts/paasta_secrets_sync.py +0 -0
  48. {paasta_tools-1.33.4.data → paasta_tools-1.35.0.data}/scripts/paasta_tabcomplete.sh +0 -0
  49. {paasta_tools-1.33.4.data → paasta_tools-1.35.0.data}/scripts/paasta_update_soa_memcpu.py +0 -0
  50. {paasta_tools-1.33.4.data → paasta_tools-1.35.0.data}/scripts/render_template.py +0 -0
  51. {paasta_tools-1.33.4.data → paasta_tools-1.35.0.data}/scripts/rightsizer_soaconfigs_update.py +0 -0
  52. {paasta_tools-1.33.4.data → paasta_tools-1.35.0.data}/scripts/service_shard_remove.py +0 -0
  53. {paasta_tools-1.33.4.data → paasta_tools-1.35.0.data}/scripts/service_shard_update.py +0 -0
  54. {paasta_tools-1.33.4.data → paasta_tools-1.35.0.data}/scripts/setup_istio_mesh.py +0 -0
  55. {paasta_tools-1.33.4.data → paasta_tools-1.35.0.data}/scripts/setup_kubernetes_cr.py +0 -0
  56. {paasta_tools-1.33.4.data → paasta_tools-1.35.0.data}/scripts/setup_kubernetes_crd.py +0 -0
  57. {paasta_tools-1.33.4.data → paasta_tools-1.35.0.data}/scripts/setup_kubernetes_internal_crd.py +0 -0
  58. {paasta_tools-1.33.4.data → paasta_tools-1.35.0.data}/scripts/setup_kubernetes_job.py +0 -0
  59. {paasta_tools-1.33.4.data → paasta_tools-1.35.0.data}/scripts/setup_prometheus_adapter_config.py +0 -0
  60. {paasta_tools-1.33.4.data → paasta_tools-1.35.0.data}/scripts/shared_ip_check.py +0 -0
  61. {paasta_tools-1.33.4.data → paasta_tools-1.35.0.data}/scripts/synapse_srv_namespaces_fact.py +0 -0
  62. {paasta_tools-1.33.4.data → paasta_tools-1.35.0.data}/scripts/timeouts_metrics_prom.py +0 -0
  63. {paasta_tools-1.33.4.dist-info → paasta_tools-1.35.0.dist-info}/WHEEL +0 -0
  64. {paasta_tools-1.33.4.dist-info → paasta_tools-1.35.0.dist-info}/entry_points.txt +0 -0
  65. {paasta_tools-1.33.4.dist-info → paasta_tools-1.35.0.dist-info}/licenses/LICENSE +0 -0
  66. {paasta_tools-1.33.4.dist-info → paasta_tools-1.35.0.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.33.4"
20
+ __version__ = "1.35.0"
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$schema": "http://json-schema.org/draft-04/schema#",
3
- "description": "http://paasta.readthedocs.io/en/latest/yelpsoa_configs.html#kubernetes-clustername-yaml",
3
+ "description": "http://paasta.readthedocs.io/en/latest/yelpsoa_configs.html#eks-clustername-yaml",
4
4
  "type": "object",
5
5
  "additionalProperties": false,
6
6
  "minProperties": 1,
@@ -955,6 +955,28 @@
955
955
  },
956
956
  "max_skew": {
957
957
  "type": "integer"
958
+ },
959
+ "match_label_keys": {
960
+ "type": "array",
961
+ "items": {
962
+ "allOf": [
963
+ {
964
+ "type": "string",
965
+ "pattern": "^([a-zA-Z0-9]([-a-zA-Z0-9_.]*[a-zA-Z0-9])?/)?[a-zA-Z0-9]([-a-zA-Z0-9_.]*[a-zA-Z0-9])?$",
966
+ "maxLength": 63
967
+ },
968
+ {
969
+ "not": {
970
+ "enum": [
971
+ "paasta.yelp.com/service",
972
+ "paasta.yelp.com/instance"
973
+ ]
974
+ }
975
+ }
976
+ ],
977
+ "$comment": "Valid Kubernetes label key: optional prefix (DNS subdomain) followed by '/' and name segment (max 63 chars each)"
978
+ },
979
+ "uniqueItems": true
958
980
  }
959
981
  },
960
982
  "required": []
@@ -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": {
@@ -1,8 +1,6 @@
1
1
  from typing import Optional
2
2
 
3
- from kubernetes.client.models.v2beta2_object_metric_status import (
4
- V2beta2ObjectMetricStatus,
5
- )
3
+ from kubernetes.client import V2ObjectMetricStatus
6
4
  from mypy_extensions import TypedDict
7
5
 
8
6
 
@@ -102,7 +100,7 @@ class HPAMetricsParser:
102
100
  )
103
101
 
104
102
  def parse_object_metric(
105
- self, metric_spec: V2beta2ObjectMetricStatus, status: HPAMetricsDict
103
+ self, metric_spec: V2ObjectMetricStatus, status: HPAMetricsDict
106
104
  ) -> None:
107
105
  status["name"] = metric_spec.metric.name
108
106
  status["target_value"] = (
@@ -112,7 +110,7 @@ class HPAMetricsParser:
112
110
  )
113
111
 
114
112
  def parse_object_metric_current(
115
- self, metric_spec: V2beta2ObjectMetricStatus, status: HPAMetricsDict
113
+ self, metric_spec: V2ObjectMetricStatus, status: HPAMetricsDict
116
114
  ) -> None:
117
115
  status["name"] = metric_spec.metric.name
118
116
  status["current_value"] = (
@@ -20,6 +20,7 @@ from typing import Sequence
20
20
  from typing import TypedDict
21
21
 
22
22
  from kubernetes.client import AuthenticationV1TokenRequest
23
+ from kubernetes.client import RbacV1Subject
23
24
  from kubernetes.client import V1Job
24
25
  from kubernetes.client import V1ObjectMeta
25
26
  from kubernetes.client import V1Pod
@@ -28,7 +29,6 @@ from kubernetes.client import V1Role
28
29
  from kubernetes.client import V1RoleBinding
29
30
  from kubernetes.client import V1RoleRef
30
31
  from kubernetes.client import V1ServiceAccount
31
- from kubernetes.client import V1Subject
32
32
  from kubernetes.client import V1TokenRequestSpec
33
33
  from kubernetes.client.exceptions import ApiException
34
34
 
@@ -522,7 +522,7 @@ def bind_role_to_service_account(
522
522
  name=role,
523
523
  ),
524
524
  subjects=[
525
- V1Subject(
525
+ RbacV1Subject(
526
526
  kind="ServiceAccount",
527
527
  name=service_account,
528
528
  ),
@@ -50,6 +50,7 @@ from kubernetes import client as kube_client
50
50
  from kubernetes import config as kube_config
51
51
  from kubernetes.client import CoreV1Event
52
52
  from kubernetes.client import models
53
+ from kubernetes.client import RbacV1Subject
53
54
  from kubernetes.client import V1Affinity
54
55
  from kubernetes.client import V1AWSElasticBlockStoreVolumeSource
55
56
  from kubernetes.client import V1Capabilities
@@ -113,7 +114,6 @@ from kubernetes.client import V1ServiceAccount
113
114
  from kubernetes.client import V1ServiceAccountTokenProjection
114
115
  from kubernetes.client import V1StatefulSet
115
116
  from kubernetes.client import V1StatefulSetSpec
116
- from kubernetes.client import V1Subject
117
117
  from kubernetes.client import V1TCPSocketAction
118
118
  from kubernetes.client import V1TopologySpreadConstraint
119
119
  from kubernetes.client import V1Volume
@@ -2992,7 +2992,7 @@ def ensure_paasta_api_rolebinding(kube_client: KubeClient, namespace: str) -> No
2992
2992
  name="paasta-api-server-per-namespace",
2993
2993
  ),
2994
2994
  subjects=[
2995
- V1Subject(
2995
+ RbacV1Subject(
2996
2996
  kind="User",
2997
2997
  name="yelp.com/paasta-api-server",
2998
2998
  ),
@@ -4172,6 +4172,10 @@ def create_pod_topology_spread_constraints(
4172
4172
  when_unsatisfiable=constraint.get(
4173
4173
  "when_unsatisfiable", "ScheduleAnyway"
4174
4174
  ),
4175
+ # we might want to default this to someting else in the future
4176
+ # but for now, make this opt-in
4177
+ # (null or empty list means only match against the labelSelector)
4178
+ match_label_keys=constraint.get("match_label_keys", None),
4175
4179
  )
4176
4180
  )
4177
4181
 
@@ -4375,7 +4379,7 @@ def ensure_service_account(
4375
4379
  name=k8s_role,
4376
4380
  ),
4377
4381
  subjects=[
4378
- V1Subject(
4382
+ RbacV1Subject(
4379
4383
  kind="ServiceAccount",
4380
4384
  namespace=namespace,
4381
4385
  name=sa_name,
paasta_tools/utils.py CHANGED
@@ -1950,6 +1950,7 @@ class TopologySpreadConstraintDict(TypedDict, total=False):
1950
1950
  topology_key: str
1951
1951
  when_unsatisfiable: Literal["ScheduleAnyway", "DoNotSchedule"]
1952
1952
  max_skew: int
1953
+ match_label_keys: List[str]
1953
1954
 
1954
1955
 
1955
1956
  class SystemPaastaConfigDict(TypedDict, total=False):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: paasta-tools
3
- Version: 1.33.4
3
+ Version: 1.35.0
4
4
  Summary: Tools for Yelps SOA infrastructure
5
5
  Author: Compute Infrastructure @ Yelp
6
6
  Author-email: compute-infra@yelp.com
@@ -34,7 +34,7 @@ Requires-Dist: ipaddress>=1.0.22
34
34
  Requires-Dist: isodate>=0.7.2
35
35
  Requires-Dist: jsonschema[format]
36
36
  Requires-Dist: kazoo>=2.0.0
37
- Requires-Dist: kubernetes<26.0.0,>=18.20.0
37
+ Requires-Dist: kubernetes<35.0.0,>=29.0.0
38
38
  Requires-Dist: ldap3
39
39
  Requires-Dist: manhole
40
40
  Requires-Dist: mypy-extensions>=0.3.0
@@ -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=Aj5Xs_Glk76ZIBv6HTo0Ix-QOHXccni4B92PS0YoiOI,865
4
+ paasta_tools/__init__.py,sha256=OHNQAVWBDTjpYwvUv2yT_ymseoY56x-Vc9cF-ojcPPk,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,7 +44,7 @@ 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=B4ahvbb90oRyLyI2F4Nk9tlnJypB7EnMTRiVMA13PCw,181363
47
+ paasta_tools/kubernetes_tools.py,sha256=yUoWHz7dtiILz3w4x96doQsJjqShHDTjkQabiwA0AQ4,181659
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
50
  paasta_tools/long_running_service_tools.py,sha256=RphI6rDE4BK2zN2bfM900abuj7kDn7YXUcMq4pQVyO4,26400
@@ -78,7 +78,7 @@ paasta_tools/smartstack_tools.py,sha256=J0mPialC9KFW9mW0fOUCj040VyowEjQgBI_s13fz
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
80
  paasta_tools/tron_tools.py,sha256=XJjuLp98zdaJeZt7Wg55t7G8lhTffL5HuA1G_mkiekA,55901
81
- paasta_tools/utils.py,sha256=2ybUjMUEQHULs91i1FjnDYm_VO7g9aMI9O5CBt9Xng4,149469
81
+ paasta_tools/utils.py,sha256=zgcrS2bc5sP_LIfOEs1olzXChArxp8TSIOiTMzDpmlo,149501
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
@@ -137,7 +137,7 @@ paasta_tools/cli/cmds/security_check.py,sha256=IEtcM0Hv2BWcavCjWcnPbyfrLcCRYC8jH
137
137
  paasta_tools/cli/cmds/spark_run.py,sha256=NEPPCf5pvkW0Kn9SKAaazZn3ge4HhidWVAm-hEQybnk,51355
138
138
  paasta_tools/cli/cmds/start_stop_restart.py,sha256=MIMShmHer_uPEsLCb3qDaBOYyHSgqDHrLHEVFCcxaE0,14600
139
139
  paasta_tools/cli/cmds/status.py,sha256=c3AlD3nhR638nk0KD5PV_ULG3Yr39T0SvZBbR1kFa20,87784
140
- paasta_tools/cli/cmds/validate.py,sha256=dcVIDhjefS2-C2zbltusFVZ1gablVsP44L1zK9DEp_M,40765
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
@@ -150,11 +150,11 @@ paasta_tools/cli/fsm/template/{{cookiecutter.service}}/smartstack.yaml,sha256=wu
150
150
  paasta_tools/cli/schemas/adhoc_schema.json,sha256=AYQ-yt_E7Px2JXLIInyEVCtEHT6UaWwIt_UuhGyqNFQ,6996
151
151
  paasta_tools/cli/schemas/autoscaling_schema.json,sha256=-JzNBjfEqynrMyWwb7X6h6RHsd_DoghsiH6gqxxQWcE,2842
152
152
  paasta_tools/cli/schemas/deploy_schema.json,sha256=NwxiTm-rncX4n5ql3mJ09pj2zfG5pDfFJnANP7A0XSM,5301
153
- paasta_tools/cli/schemas/eks_schema.json,sha256=ED9dgIBTDFe57AXcuNqEomv2oqhVmS-Ohuz5rNaqOxM,40763
153
+ paasta_tools/cli/schemas/eks_schema.json,sha256=ZKLsUgcDEMVAaYYhNy0anpwM_zeTrTYmd3nIZtX_I40,42066
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
@@ -184,10 +184,10 @@ paasta_tools/frameworks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG
184
184
  paasta_tools/frameworks/constraints.py,sha256=1ctyAzrAZlplcJp9pQ4zSuc-by988bQJrSdwxHOLsWY,2969
185
185
  paasta_tools/frameworks/native_service_config.py,sha256=C9fThwq2g0TnNQhRbK5Pz3RwfO23GLUZWFKwh8KdAUE,9182
186
186
  paasta_tools/instance/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
187
- paasta_tools/instance/hpa_metrics_parser.py,sha256=IsAYHSITL0z7LZUPC7gFj8oeASBx_Ad4bj5507irLx8,4371
187
+ paasta_tools/instance/hpa_metrics_parser.py,sha256=EtV-DB5Ty1uNeQwy3qnUxCytpJPKwy8h0gR20Y15w2U,4311
188
188
  paasta_tools/instance/kubernetes.py,sha256=teCBM2Xn-6cp6DJAfMokRc5OXtwbe8gb56ECdIUGFME,49113
189
189
  paasta_tools/kubernetes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
190
- paasta_tools/kubernetes/remote_run.py,sha256=QavlPQdNUI17CCY9QqFA3LJDRucXxMsIfk4mGR8e1xc,18986
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
192
  paasta_tools/kubernetes/application/controller_wrappers.py,sha256=H43lZoTIT94ZAU6ZSBGc21YzVkJuxPtA5Y3MSJYJ3k4,19292
193
193
  paasta_tools/kubernetes/application/tools.py,sha256=-qbkn4ynM_LFa-NfiDMFZ3G4jty93DWKbx3_Go3OIIo,3618
@@ -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.33.4.data/scripts/apply_external_resources.py,sha256=BOIdCQ5Md9RI3enzqbIWQge3clkXhPybAmLE3hqfDwQ,3347
291
- paasta_tools-1.33.4.data/scripts/bounce_log_latency_parser.py,sha256=dC06a0a5LdtPJ8xo88QWe5DMH_vwVB1BNbkFH7kJ3j0,2225
292
- paasta_tools-1.33.4.data/scripts/check_autoscaler_max_instances.py,sha256=2z6ifSU26-ULOK-FXp75b45mCdjSJnuvU8TxvapB8Wk,9423
293
- paasta_tools-1.33.4.data/scripts/check_cassandracluster_services_replication.py,sha256=mKlCK9pRNzxnOt41wA6CtDQIHhcky438i044kA6pbEc,1127
294
- paasta_tools-1.33.4.data/scripts/check_flink_services_health.py,sha256=ElYa1hr6KUcXuu0B8Nf-dt2Vfyo5FrwF5gVV4QBX7Lg,7162
295
- paasta_tools-1.33.4.data/scripts/check_kubernetes_api.py,sha256=BhOqJkkKNJPfonfIPonW5dlIubd1ji-3ppjXHomNwzM,1522
296
- paasta_tools-1.33.4.data/scripts/check_kubernetes_services_replication.py,sha256=LCLlumReRdy9Cw_sPpqanjPcBlbcrJDiECaYYru5Cwk,5751
297
- paasta_tools-1.33.4.data/scripts/check_manual_oapi_changes.sh,sha256=1IdphwXP7xnMNS7huZ3FeEHy67-nY4n3ydHmbojQvJg,879
298
- paasta_tools-1.33.4.data/scripts/check_oom_events.py,sha256=tUr14T2LYEgqwpAq4vkZ_Z0VTPOfQg7yrSSkwGQ86Hg,7801
299
- paasta_tools-1.33.4.data/scripts/check_orphans.py,sha256=9PmzRUZ1HwCcmTm4J1xTznz7hZl8fKsu1wdXUDufXJs,9984
300
- paasta_tools-1.33.4.data/scripts/check_spark_jobs.py,sha256=W4HUIbX_ylxl4DlqcdmoRWDbKYgPEr04OM-DLvfnXE8,7316
301
- paasta_tools-1.33.4.data/scripts/cleanup_kubernetes_cr.py,sha256=m-w_wuTuVG9FlwQQkxXYgri5DTGac9Nc2pbK4k1FNDE,4659
302
- paasta_tools-1.33.4.data/scripts/cleanup_kubernetes_crd.py,sha256=p9eLk-0-pU-hcVg-GAM92h1ZdQqlvmYhBzUFCiMPYR8,4478
303
- paasta_tools-1.33.4.data/scripts/cleanup_kubernetes_jobs.py,sha256=7LHB4tsz1kt-zygssIfQbBY6c3LSqXYDUILvHkSfBog,12433
304
- paasta_tools-1.33.4.data/scripts/create_dynamodb_table.py,sha256=9wJftWGgNtvLnpXeUqpoMXBIIep1hNySf0YiQmzpl5c,1167
305
- paasta_tools-1.33.4.data/scripts/create_paasta_playground.py,sha256=jzoE5e1pxWeVXwCEkD9O0jefOhEnIlSa3QMP9PC2f0M,3239
306
- paasta_tools-1.33.4.data/scripts/delete_kubernetes_deployments.py,sha256=de4C-5yqEuCeJXp6zhbc0v-c0LOElr4qabLnOTRcX4o,3124
307
- paasta_tools-1.33.4.data/scripts/emit_allocated_cpu_metrics.py,sha256=Cjd3xoOJoYSP3ciSAlZ7fh6_z678KpYt43Xh-WVCY1M,1859
308
- paasta_tools-1.33.4.data/scripts/generate_all_deployments,sha256=Qr5B0zogTOr8Lcn_7dpORixpGIJcXZ_pWz_ZlWnmsik,248
309
- paasta_tools-1.33.4.data/scripts/generate_authenticating_services.py,sha256=r5AQyquVm8_rbAhBETUU2ZHZvolpqZZTakW3lKFiOqw,2982
310
- paasta_tools-1.33.4.data/scripts/generate_deployments_for_service.py,sha256=FAFzIAtKY7GsA13s-ssCMH7T-_p9B1pBtyyYFzsCZ6k,9822
311
- paasta_tools-1.33.4.data/scripts/generate_services_file.py,sha256=w3Wyyn9ZkjfrvkT0SnTbh5mrTZJnjhTC2JIqLBpb6-g,3583
312
- paasta_tools-1.33.4.data/scripts/generate_services_yaml.py,sha256=XyIUsHa1BPLqeklayaFewX69-6GT_luaSLS_TMDLkQ0,991
313
- paasta_tools-1.33.4.data/scripts/get_running_task_allocation.py,sha256=NGYO2td42XQOduUmvgz0CZw0ir36bY6fUe3VOR1Ln6E,10876
314
- paasta_tools-1.33.4.data/scripts/habitat_fixer.py,sha256=hCC7fEnxrBOmiCJj4rPwhGlae9JsYg_gltk10l-FwaE,2625
315
- paasta_tools-1.33.4.data/scripts/ide_helper.py,sha256=QUVWxIeh54IhTn3HEhBrmJKvtgw6RDv9smoJ-6pZA4c,12348
316
- paasta_tools-1.33.4.data/scripts/is_pod_healthy_in_proxy.py,sha256=MiY85MJDXcN9oS8d840WG1iYDIzzO9lmk_NC0i_CrQg,4321
317
- paasta_tools-1.33.4.data/scripts/is_pod_healthy_in_smartstack.py,sha256=z3uP9sgwLwg94BubFgBKare2t1L5qhcY48MWsJxjxPY,1697
318
- paasta_tools-1.33.4.data/scripts/kill_bad_containers.py,sha256=oNY5x0Zg0eu34cXhFy60I7WRlqg4PKD_6xWi0eoRTCA,3832
319
- paasta_tools-1.33.4.data/scripts/kubernetes_remove_evicted_pods.py,sha256=D9Ovdc9Xer_Qf3vM5CtPVcKvnMwLiC0H-WQmQGXrBKM,5274
320
- paasta_tools-1.33.4.data/scripts/mass-deploy-tag.sh,sha256=cfPgDDvAOhy3ijTUocklogzoIY8hfoE6T5QI-0aqcfM,1578
321
- paasta_tools-1.33.4.data/scripts/mock_patch_checker.py,sha256=Q6Je8QjmfLzdnv_6JR6ehh2kA5SUxmeZGeLI2WC3BSY,2559
322
- paasta_tools-1.33.4.data/scripts/paasta_cleanup_remote_run_resources.py,sha256=4oN9UwnR7q6aEEyFUhVrT41VSeQJ2YS3upFpbZQXNUI,4558
323
- paasta_tools-1.33.4.data/scripts/paasta_cleanup_stale_nodes.py,sha256=C-DmEVgtienoMgJnIeESvFqWcJOW2SOGoS1l8RXA8NE,6304
324
- paasta_tools-1.33.4.data/scripts/paasta_deploy_tron_jobs,sha256=fFN2aP5FNSm5WfDV3yvLpihXaKkAF65MRXFcN2iD7S4,106
325
- paasta_tools-1.33.4.data/scripts/paasta_execute_docker_command.py,sha256=6kh7h2bleQbNULc37MiRsfnk9MDHqVv30UQdg3rF3kQ,4086
326
- paasta_tools-1.33.4.data/scripts/paasta_secrets_sync.py,sha256=sMdyWMt9BU5CmWHIRwzhpFKve7zxFHkygt_SNTJutWM,28766
327
- paasta_tools-1.33.4.data/scripts/paasta_tabcomplete.sh,sha256=qbQKSriz_L4MogA12L_8i-tg0Lplpshbk_FUMjK6uG0,929
328
- paasta_tools-1.33.4.data/scripts/paasta_update_soa_memcpu.py,sha256=5fShpZYpb7EeoC70cWdICnNHjHAaNU5mTHaAc3mloIs,20813
329
- paasta_tools-1.33.4.data/scripts/render_template.py,sha256=KcKfeSP2a9f6fMDRhnjX7OJaHmFIBtCJcHhUI_B7p9Y,3975
330
- paasta_tools-1.33.4.data/scripts/rightsizer_soaconfigs_update.py,sha256=0UPVtDyX6wXXurv7l5fiKuzXH8VEszKx_V7UqDm6Ck0,10493
331
- paasta_tools-1.33.4.data/scripts/service_shard_remove.py,sha256=WCvCxu3GTYEa3cYnWybTOiuHN14axj0x5_-snVd-mqE,4927
332
- paasta_tools-1.33.4.data/scripts/service_shard_update.py,sha256=AajuRS4s-HXhEcIIYK2dsyBSdCjZbh4x6Po48ipl7M4,13346
333
- paasta_tools-1.33.4.data/scripts/setup_istio_mesh.py,sha256=LbLxeI_DnhNXkyCgG-GxutlNu9_vcIitorYr4I9x4CY,11575
334
- paasta_tools-1.33.4.data/scripts/setup_kubernetes_cr.py,sha256=xsZJ_X1YpQ0NExyY1cXFH8KW2_vAgctCwdrW0bu102s,14931
335
- paasta_tools-1.33.4.data/scripts/setup_kubernetes_crd.py,sha256=QCiFOcSmE0nMEheIb7IUnYMUn0heh1kHyMFBCm7XIRU,4020
336
- paasta_tools-1.33.4.data/scripts/setup_kubernetes_internal_crd.py,sha256=dDyAOKFow7yeHWGa197angYwGTDWNyR7vZ6Cx5JlS6k,4629
337
- paasta_tools-1.33.4.data/scripts/setup_kubernetes_job.py,sha256=H2VuRaCpBj-J2Qc3DmIMutGuDL8nlfabshEiCGNNqmY,19095
338
- paasta_tools-1.33.4.data/scripts/setup_prometheus_adapter_config.py,sha256=JzvztaJ__5MOAV6pD5Vj3mamARh6TZUCzYdlqhWDOOY,43962
339
- paasta_tools-1.33.4.data/scripts/shared_ip_check.py,sha256=dbMwCwDLy9hCIbVWV1rk0FKuBkZNuQtM59hGVKxV2B4,2464
340
- paasta_tools-1.33.4.data/scripts/synapse_srv_namespaces_fact.py,sha256=HFX0zIXkXIjtAw8zrA7mUiy6NOKR11eBzE39R3aZv_E,1408
341
- paasta_tools-1.33.4.data/scripts/timeouts_metrics_prom.py,sha256=icK1j72-e-hvbUGs3LtcaMn9KBMopD9cGv5UUVo-OSc,2607
342
- paasta_tools-1.33.4.dist-info/licenses/LICENSE,sha256=Tcxn8PpeSjHDwUTemLW_thUNxcOOm612dK_no2ebEpo,10837
343
- paasta_tools-1.33.4.dist-info/METADATA,sha256=VrCIxDKKgAuQFjblmmCQioPaViISGinNtjOIQCZnO1M,2259
344
- paasta_tools-1.33.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
345
- paasta_tools-1.33.4.dist-info/entry_points.txt,sha256=qokGSdKYA6AjtdMM_BjmCAOMghMsjOpcAdL9e4fY6D8,1179
346
- paasta_tools-1.33.4.dist-info/top_level.txt,sha256=6vZZAZ7bbaDxuXZjNYixDwzkrezpNgDQHpS0ikvFOk4,24
347
- paasta_tools-1.33.4.dist-info/RECORD,,
290
+ paasta_tools-1.35.0.data/scripts/apply_external_resources.py,sha256=BOIdCQ5Md9RI3enzqbIWQge3clkXhPybAmLE3hqfDwQ,3347
291
+ paasta_tools-1.35.0.data/scripts/bounce_log_latency_parser.py,sha256=dC06a0a5LdtPJ8xo88QWe5DMH_vwVB1BNbkFH7kJ3j0,2225
292
+ paasta_tools-1.35.0.data/scripts/check_autoscaler_max_instances.py,sha256=2z6ifSU26-ULOK-FXp75b45mCdjSJnuvU8TxvapB8Wk,9423
293
+ paasta_tools-1.35.0.data/scripts/check_cassandracluster_services_replication.py,sha256=mKlCK9pRNzxnOt41wA6CtDQIHhcky438i044kA6pbEc,1127
294
+ paasta_tools-1.35.0.data/scripts/check_flink_services_health.py,sha256=ElYa1hr6KUcXuu0B8Nf-dt2Vfyo5FrwF5gVV4QBX7Lg,7162
295
+ paasta_tools-1.35.0.data/scripts/check_kubernetes_api.py,sha256=BhOqJkkKNJPfonfIPonW5dlIubd1ji-3ppjXHomNwzM,1522
296
+ paasta_tools-1.35.0.data/scripts/check_kubernetes_services_replication.py,sha256=LCLlumReRdy9Cw_sPpqanjPcBlbcrJDiECaYYru5Cwk,5751
297
+ paasta_tools-1.35.0.data/scripts/check_manual_oapi_changes.sh,sha256=1IdphwXP7xnMNS7huZ3FeEHy67-nY4n3ydHmbojQvJg,879
298
+ paasta_tools-1.35.0.data/scripts/check_oom_events.py,sha256=tUr14T2LYEgqwpAq4vkZ_Z0VTPOfQg7yrSSkwGQ86Hg,7801
299
+ paasta_tools-1.35.0.data/scripts/check_orphans.py,sha256=9PmzRUZ1HwCcmTm4J1xTznz7hZl8fKsu1wdXUDufXJs,9984
300
+ paasta_tools-1.35.0.data/scripts/check_spark_jobs.py,sha256=W4HUIbX_ylxl4DlqcdmoRWDbKYgPEr04OM-DLvfnXE8,7316
301
+ paasta_tools-1.35.0.data/scripts/cleanup_kubernetes_cr.py,sha256=m-w_wuTuVG9FlwQQkxXYgri5DTGac9Nc2pbK4k1FNDE,4659
302
+ paasta_tools-1.35.0.data/scripts/cleanup_kubernetes_crd.py,sha256=p9eLk-0-pU-hcVg-GAM92h1ZdQqlvmYhBzUFCiMPYR8,4478
303
+ paasta_tools-1.35.0.data/scripts/cleanup_kubernetes_jobs.py,sha256=7LHB4tsz1kt-zygssIfQbBY6c3LSqXYDUILvHkSfBog,12433
304
+ paasta_tools-1.35.0.data/scripts/create_dynamodb_table.py,sha256=9wJftWGgNtvLnpXeUqpoMXBIIep1hNySf0YiQmzpl5c,1167
305
+ paasta_tools-1.35.0.data/scripts/create_paasta_playground.py,sha256=jzoE5e1pxWeVXwCEkD9O0jefOhEnIlSa3QMP9PC2f0M,3239
306
+ paasta_tools-1.35.0.data/scripts/delete_kubernetes_deployments.py,sha256=de4C-5yqEuCeJXp6zhbc0v-c0LOElr4qabLnOTRcX4o,3124
307
+ paasta_tools-1.35.0.data/scripts/emit_allocated_cpu_metrics.py,sha256=Cjd3xoOJoYSP3ciSAlZ7fh6_z678KpYt43Xh-WVCY1M,1859
308
+ paasta_tools-1.35.0.data/scripts/generate_all_deployments,sha256=Qr5B0zogTOr8Lcn_7dpORixpGIJcXZ_pWz_ZlWnmsik,248
309
+ paasta_tools-1.35.0.data/scripts/generate_authenticating_services.py,sha256=r5AQyquVm8_rbAhBETUU2ZHZvolpqZZTakW3lKFiOqw,2982
310
+ paasta_tools-1.35.0.data/scripts/generate_deployments_for_service.py,sha256=FAFzIAtKY7GsA13s-ssCMH7T-_p9B1pBtyyYFzsCZ6k,9822
311
+ paasta_tools-1.35.0.data/scripts/generate_services_file.py,sha256=w3Wyyn9ZkjfrvkT0SnTbh5mrTZJnjhTC2JIqLBpb6-g,3583
312
+ paasta_tools-1.35.0.data/scripts/generate_services_yaml.py,sha256=XyIUsHa1BPLqeklayaFewX69-6GT_luaSLS_TMDLkQ0,991
313
+ paasta_tools-1.35.0.data/scripts/get_running_task_allocation.py,sha256=NGYO2td42XQOduUmvgz0CZw0ir36bY6fUe3VOR1Ln6E,10876
314
+ paasta_tools-1.35.0.data/scripts/habitat_fixer.py,sha256=hCC7fEnxrBOmiCJj4rPwhGlae9JsYg_gltk10l-FwaE,2625
315
+ paasta_tools-1.35.0.data/scripts/ide_helper.py,sha256=QUVWxIeh54IhTn3HEhBrmJKvtgw6RDv9smoJ-6pZA4c,12348
316
+ paasta_tools-1.35.0.data/scripts/is_pod_healthy_in_proxy.py,sha256=MiY85MJDXcN9oS8d840WG1iYDIzzO9lmk_NC0i_CrQg,4321
317
+ paasta_tools-1.35.0.data/scripts/is_pod_healthy_in_smartstack.py,sha256=z3uP9sgwLwg94BubFgBKare2t1L5qhcY48MWsJxjxPY,1697
318
+ paasta_tools-1.35.0.data/scripts/kill_bad_containers.py,sha256=oNY5x0Zg0eu34cXhFy60I7WRlqg4PKD_6xWi0eoRTCA,3832
319
+ paasta_tools-1.35.0.data/scripts/kubernetes_remove_evicted_pods.py,sha256=D9Ovdc9Xer_Qf3vM5CtPVcKvnMwLiC0H-WQmQGXrBKM,5274
320
+ paasta_tools-1.35.0.data/scripts/mass-deploy-tag.sh,sha256=cfPgDDvAOhy3ijTUocklogzoIY8hfoE6T5QI-0aqcfM,1578
321
+ paasta_tools-1.35.0.data/scripts/mock_patch_checker.py,sha256=Q6Je8QjmfLzdnv_6JR6ehh2kA5SUxmeZGeLI2WC3BSY,2559
322
+ paasta_tools-1.35.0.data/scripts/paasta_cleanup_remote_run_resources.py,sha256=4oN9UwnR7q6aEEyFUhVrT41VSeQJ2YS3upFpbZQXNUI,4558
323
+ paasta_tools-1.35.0.data/scripts/paasta_cleanup_stale_nodes.py,sha256=C-DmEVgtienoMgJnIeESvFqWcJOW2SOGoS1l8RXA8NE,6304
324
+ paasta_tools-1.35.0.data/scripts/paasta_deploy_tron_jobs,sha256=fFN2aP5FNSm5WfDV3yvLpihXaKkAF65MRXFcN2iD7S4,106
325
+ paasta_tools-1.35.0.data/scripts/paasta_execute_docker_command.py,sha256=6kh7h2bleQbNULc37MiRsfnk9MDHqVv30UQdg3rF3kQ,4086
326
+ paasta_tools-1.35.0.data/scripts/paasta_secrets_sync.py,sha256=sMdyWMt9BU5CmWHIRwzhpFKve7zxFHkygt_SNTJutWM,28766
327
+ paasta_tools-1.35.0.data/scripts/paasta_tabcomplete.sh,sha256=qbQKSriz_L4MogA12L_8i-tg0Lplpshbk_FUMjK6uG0,929
328
+ paasta_tools-1.35.0.data/scripts/paasta_update_soa_memcpu.py,sha256=5fShpZYpb7EeoC70cWdICnNHjHAaNU5mTHaAc3mloIs,20813
329
+ paasta_tools-1.35.0.data/scripts/render_template.py,sha256=KcKfeSP2a9f6fMDRhnjX7OJaHmFIBtCJcHhUI_B7p9Y,3975
330
+ paasta_tools-1.35.0.data/scripts/rightsizer_soaconfigs_update.py,sha256=0UPVtDyX6wXXurv7l5fiKuzXH8VEszKx_V7UqDm6Ck0,10493
331
+ paasta_tools-1.35.0.data/scripts/service_shard_remove.py,sha256=WCvCxu3GTYEa3cYnWybTOiuHN14axj0x5_-snVd-mqE,4927
332
+ paasta_tools-1.35.0.data/scripts/service_shard_update.py,sha256=AajuRS4s-HXhEcIIYK2dsyBSdCjZbh4x6Po48ipl7M4,13346
333
+ paasta_tools-1.35.0.data/scripts/setup_istio_mesh.py,sha256=LbLxeI_DnhNXkyCgG-GxutlNu9_vcIitorYr4I9x4CY,11575
334
+ paasta_tools-1.35.0.data/scripts/setup_kubernetes_cr.py,sha256=xsZJ_X1YpQ0NExyY1cXFH8KW2_vAgctCwdrW0bu102s,14931
335
+ paasta_tools-1.35.0.data/scripts/setup_kubernetes_crd.py,sha256=QCiFOcSmE0nMEheIb7IUnYMUn0heh1kHyMFBCm7XIRU,4020
336
+ paasta_tools-1.35.0.data/scripts/setup_kubernetes_internal_crd.py,sha256=dDyAOKFow7yeHWGa197angYwGTDWNyR7vZ6Cx5JlS6k,4629
337
+ paasta_tools-1.35.0.data/scripts/setup_kubernetes_job.py,sha256=H2VuRaCpBj-J2Qc3DmIMutGuDL8nlfabshEiCGNNqmY,19095
338
+ paasta_tools-1.35.0.data/scripts/setup_prometheus_adapter_config.py,sha256=JzvztaJ__5MOAV6pD5Vj3mamARh6TZUCzYdlqhWDOOY,43962
339
+ paasta_tools-1.35.0.data/scripts/shared_ip_check.py,sha256=dbMwCwDLy9hCIbVWV1rk0FKuBkZNuQtM59hGVKxV2B4,2464
340
+ paasta_tools-1.35.0.data/scripts/synapse_srv_namespaces_fact.py,sha256=HFX0zIXkXIjtAw8zrA7mUiy6NOKR11eBzE39R3aZv_E,1408
341
+ paasta_tools-1.35.0.data/scripts/timeouts_metrics_prom.py,sha256=icK1j72-e-hvbUGs3LtcaMn9KBMopD9cGv5UUVo-OSc,2607
342
+ paasta_tools-1.35.0.dist-info/licenses/LICENSE,sha256=Tcxn8PpeSjHDwUTemLW_thUNxcOOm612dK_no2ebEpo,10837
343
+ paasta_tools-1.35.0.dist-info/METADATA,sha256=mzajVnU_U_h3LkzpY5yMU9RNj3DTsgX1HphzUP0XeGQ,2258
344
+ paasta_tools-1.35.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
345
+ paasta_tools-1.35.0.dist-info/entry_points.txt,sha256=qokGSdKYA6AjtdMM_BjmCAOMghMsjOpcAdL9e4fY6D8,1179
346
+ paasta_tools-1.35.0.dist-info/top_level.txt,sha256=6vZZAZ7bbaDxuXZjNYixDwzkrezpNgDQHpS0ikvFOk4,24
347
+ paasta_tools-1.35.0.dist-info/RECORD,,