paasta-tools 1.19.0__tar.gz → 1.21.0__tar.gz

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 (304) hide show
  1. {paasta-tools-1.19.0/paasta_tools.egg-info → paasta-tools-1.21.0}/PKG-INFO +1 -1
  2. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/__init__.py +1 -1
  3. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/cli/schemas/eks_schema.json +7 -0
  4. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/cli/schemas/kubernetes_schema.json +7 -0
  5. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/kubernetes_tools.py +107 -24
  6. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/long_running_service_tools.py +11 -0
  7. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/utils.py +4 -0
  8. {paasta-tools-1.19.0 → paasta-tools-1.21.0/paasta_tools.egg-info}/PKG-INFO +1 -1
  9. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/LICENSE +0 -0
  10. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/MANIFEST.in +0 -0
  11. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/README.md +0 -0
  12. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/k8s_itests/__init__.py +0 -0
  13. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/k8s_itests/test_autoscaling.py +0 -0
  14. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/k8s_itests/utils.py +0 -0
  15. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/adhoc_tools.py +0 -0
  16. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/api/__init__.py +0 -0
  17. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/api/api.py +0 -0
  18. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/api/api_docs/swagger.json +0 -0
  19. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/api/client.py +0 -0
  20. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/api/settings.py +0 -0
  21. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/api/tweens/__init__.py +0 -0
  22. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/api/tweens/auth.py +0 -0
  23. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/api/tweens/profiling.py +0 -0
  24. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/api/tweens/request_logger.py +0 -0
  25. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/api/views/__init__.py +0 -0
  26. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/api/views/autoscaler.py +0 -0
  27. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/api/views/exception.py +0 -0
  28. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/api/views/flink.py +0 -0
  29. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/api/views/instance.py +0 -0
  30. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/api/views/pause_autoscaler.py +0 -0
  31. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/api/views/remote_run.py +0 -0
  32. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/api/views/resources.py +0 -0
  33. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/api/views/service.py +0 -0
  34. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/api/views/version.py +0 -0
  35. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/apply_external_resources.py +0 -0
  36. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/async_utils.py +0 -0
  37. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/autoscaling/__init__.py +0 -0
  38. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/autoscaling/autoscaling_service_lib.py +0 -0
  39. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/autoscaling/forecasting.py +0 -0
  40. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/autoscaling/max_all_k8s_services.py +0 -0
  41. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/autoscaling/pause_service_autoscaler.py +0 -0
  42. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/autoscaling/utils.py +0 -0
  43. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/bounce_lib.py +0 -0
  44. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/broadcast_log_to_services.py +0 -0
  45. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/cassandracluster_tools.py +0 -0
  46. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/check_autoscaler_max_instances.py +0 -0
  47. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/check_cassandracluster_services_replication.py +0 -0
  48. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/check_flink_services_health.py +0 -0
  49. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/check_kubernetes_api.py +0 -0
  50. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/check_kubernetes_services_replication.py +0 -0
  51. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/check_oom_events.py +0 -0
  52. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/check_services_replication_tools.py +0 -0
  53. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/check_spark_jobs.py +0 -0
  54. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/cleanup_kubernetes_cr.py +0 -0
  55. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/cleanup_kubernetes_crd.py +0 -0
  56. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/cleanup_kubernetes_jobs.py +0 -0
  57. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/cleanup_tron_namespaces.py +0 -0
  58. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/cli/__init__.py +0 -0
  59. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/cli/authentication.py +0 -0
  60. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/cli/cli.py +0 -0
  61. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/cli/cmds/__init__.py +0 -0
  62. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/cli/cmds/autoscale.py +0 -0
  63. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/cli/cmds/check.py +0 -0
  64. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/cli/cmds/cook_image.py +0 -0
  65. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/cli/cmds/get_docker_image.py +0 -0
  66. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/cli/cmds/get_image_version.py +0 -0
  67. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/cli/cmds/get_latest_deployment.py +0 -0
  68. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/cli/cmds/info.py +0 -0
  69. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/cli/cmds/itest.py +0 -0
  70. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/cli/cmds/list.py +0 -0
  71. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/cli/cmds/list_clusters.py +0 -0
  72. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/cli/cmds/list_deploy_queue.py +0 -0
  73. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/cli/cmds/list_namespaces.py +0 -0
  74. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/cli/cmds/local_run.py +0 -0
  75. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/cli/cmds/logs.py +0 -0
  76. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/cli/cmds/mark_for_deployment.py +0 -0
  77. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/cli/cmds/mesh_status.py +0 -0
  78. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/cli/cmds/pause_service_autoscaler.py +0 -0
  79. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/cli/cmds/push_to_registry.py +0 -0
  80. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/cli/cmds/remote_run.py +0 -0
  81. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/cli/cmds/rollback.py +0 -0
  82. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/cli/cmds/secret.py +0 -0
  83. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/cli/cmds/security_check.py +0 -0
  84. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/cli/cmds/spark_run.py +0 -0
  85. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/cli/cmds/start_stop_restart.py +0 -0
  86. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/cli/cmds/status.py +0 -0
  87. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/cli/cmds/validate.py +0 -0
  88. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/cli/cmds/wait_for_deployment.py +0 -0
  89. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/cli/fsm/__init__.py +0 -0
  90. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/cli/fsm/autosuggest.py +0 -0
  91. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/cli/fsm/template/README.md +0 -0
  92. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/cli/fsm/template/cookiecutter.json +0 -0
  93. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/cli/fsm/template/{{cookiecutter.service}}/kubernetes-PROD.yaml +0 -0
  94. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/cli/fsm/template/{{cookiecutter.service}}/monitoring.yaml +0 -0
  95. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/cli/fsm/template/{{cookiecutter.service}}/service.yaml +0 -0
  96. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/cli/fsm/template/{{cookiecutter.service}}/smartstack.yaml +0 -0
  97. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/cli/fsm_cmd.py +0 -0
  98. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/cli/paasta_tabcomplete.sh +0 -0
  99. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/cli/schemas/adhoc_schema.json +0 -0
  100. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/cli/schemas/autoscaling_schema.json +0 -0
  101. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/cli/schemas/autotuned_defaults/cassandracluster_schema.json +0 -0
  102. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/cli/schemas/autotuned_defaults/kubernetes_schema.json +0 -0
  103. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/cli/schemas/deploy_schema.json +0 -0
  104. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/cli/schemas/rollback_schema.json +0 -0
  105. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/cli/schemas/service_schema.json +0 -0
  106. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/cli/schemas/smartstack_schema.json +0 -0
  107. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/cli/schemas/tron_schema.json +0 -0
  108. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/cli/utils.py +0 -0
  109. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/clusterman.py +0 -0
  110. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/config_utils.py +0 -0
  111. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/contrib/__init__.py +0 -0
  112. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/contrib/bounce_log_latency_parser.py +0 -0
  113. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/contrib/check_manual_oapi_changes.sh +0 -0
  114. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/contrib/check_orphans.py +0 -0
  115. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/contrib/create_dynamodb_table.py +0 -0
  116. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/contrib/create_paasta_playground.py +0 -0
  117. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/contrib/emit_allocated_cpu_metrics.py +0 -0
  118. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/contrib/get_running_task_allocation.py +0 -0
  119. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/contrib/habitat_fixer.py +0 -0
  120. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/contrib/ide_helper.py +0 -0
  121. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/contrib/is_pod_healthy_in_proxy.py +0 -0
  122. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/contrib/is_pod_healthy_in_smartstack.py +0 -0
  123. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/contrib/kill_bad_containers.py +0 -0
  124. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/contrib/mass-deploy-tag.sh +0 -0
  125. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/contrib/mock_patch_checker.py +0 -0
  126. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/contrib/paasta_update_soa_memcpu.py +0 -0
  127. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/contrib/render_template.py +0 -0
  128. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/contrib/rightsizer_soaconfigs_update.py +0 -0
  129. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/contrib/service_shard_remove.py +0 -0
  130. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/contrib/service_shard_update.py +0 -0
  131. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/contrib/shared_ip_check.py +0 -0
  132. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/contrib/timeouts_metrics_prom.py +0 -0
  133. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/delete_kubernetes_deployments.py +0 -0
  134. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/deployment_utils.py +0 -0
  135. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/docker_wrapper.py +0 -0
  136. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/docker_wrapper_imports.py +0 -0
  137. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/drain_lib.py +0 -0
  138. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/dump_locally_running_services.py +0 -0
  139. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/eks_tools.py +0 -0
  140. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/envoy_tools.py +0 -0
  141. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/firewall.py +0 -0
  142. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/firewall_logging.py +0 -0
  143. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/firewall_update.py +0 -0
  144. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/flink_tools.py +0 -0
  145. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/flinkeks_tools.py +0 -0
  146. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/frameworks/__init__.py +0 -0
  147. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/frameworks/adhoc_scheduler.py +0 -0
  148. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/frameworks/constraints.py +0 -0
  149. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/frameworks/native_scheduler.py +0 -0
  150. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/frameworks/native_service_config.py +0 -0
  151. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/frameworks/task_store.py +0 -0
  152. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/generate_all_deployments +0 -0
  153. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/generate_authenticating_services.py +0 -0
  154. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/generate_deployments_for_service.py +0 -0
  155. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/generate_services_file.py +0 -0
  156. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/generate_services_yaml.py +0 -0
  157. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/hacheck.py +0 -0
  158. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/instance/__init__.py +0 -0
  159. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/instance/hpa_metrics_parser.py +0 -0
  160. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/instance/kubernetes.py +0 -0
  161. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/iptables.py +0 -0
  162. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/kafkacluster_tools.py +0 -0
  163. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/kubernetes/__init__.py +0 -0
  164. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/kubernetes/application/__init__.py +0 -0
  165. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/kubernetes/application/controller_wrappers.py +0 -0
  166. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/kubernetes/application/tools.py +0 -0
  167. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/kubernetes/bin/__init__.py +0 -0
  168. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/kubernetes/bin/kubernetes_remove_evicted_pods.py +0 -0
  169. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/kubernetes/bin/paasta_cleanup_remote_run_resources.py +0 -0
  170. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/kubernetes/bin/paasta_cleanup_stale_nodes.py +0 -0
  171. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/kubernetes/bin/paasta_secrets_sync.py +0 -0
  172. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/kubernetes/remote_run.py +0 -0
  173. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/list_kubernetes_service_instances.py +0 -0
  174. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/list_tron_namespaces.py +0 -0
  175. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/mac_address.py +0 -0
  176. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/marathon_dashboard.py +0 -0
  177. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/mesos/__init__.py +0 -0
  178. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/mesos/cfg.py +0 -0
  179. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/mesos/cluster.py +0 -0
  180. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/mesos/exceptions.py +0 -0
  181. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/mesos/framework.py +0 -0
  182. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/mesos/log.py +0 -0
  183. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/mesos/master.py +0 -0
  184. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/mesos/mesos_file.py +0 -0
  185. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/mesos/parallel.py +0 -0
  186. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/mesos/slave.py +0 -0
  187. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/mesos/task.py +0 -0
  188. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/mesos/util.py +0 -0
  189. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/mesos/zookeeper.py +0 -0
  190. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/mesos_maintenance.py +0 -0
  191. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/mesos_tools.py +0 -0
  192. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/metrics/__init__.py +0 -0
  193. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/metrics/metastatus_lib.py +0 -0
  194. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/metrics/metrics_lib.py +0 -0
  195. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/monitoring/__init__.py +0 -0
  196. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/monitoring/check_k8s_api_performance.py +0 -0
  197. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/monitoring_tools.py +0 -0
  198. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/monkrelaycluster_tools.py +0 -0
  199. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/nrtsearchservice_tools.py +0 -0
  200. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/nrtsearchserviceeks_tools.py +0 -0
  201. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/oom_logger.py +0 -0
  202. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paasta_deploy_tron_jobs +0 -0
  203. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paasta_execute_docker_command.py +0 -0
  204. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paasta_native_serviceinit.py +0 -0
  205. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paasta_service_config_loader.py +0 -0
  206. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/__init__.py +0 -0
  207. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/api/__init__.py +0 -0
  208. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/api/autoscaler_api.py +0 -0
  209. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/api/default_api.py +0 -0
  210. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/api/remote_run_api.py +0 -0
  211. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/api/resources_api.py +0 -0
  212. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/api/service_api.py +0 -0
  213. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/api_client.py +0 -0
  214. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/apis/__init__.py +0 -0
  215. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/configuration.py +0 -0
  216. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/exceptions.py +0 -0
  217. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/model/__init__.py +0 -0
  218. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/model/adhoc_launch_history.py +0 -0
  219. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/model/autoscaler_count_msg.py +0 -0
  220. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/model/deploy_queue.py +0 -0
  221. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/model/deploy_queue_service_instance.py +0 -0
  222. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/model/envoy_backend.py +0 -0
  223. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/model/envoy_location.py +0 -0
  224. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/model/envoy_status.py +0 -0
  225. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/model/flink_cluster_overview.py +0 -0
  226. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/model/flink_config.py +0 -0
  227. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/model/flink_job.py +0 -0
  228. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/model/flink_job_details.py +0 -0
  229. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/model/flink_jobs.py +0 -0
  230. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/model/float_and_error.py +0 -0
  231. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/model/hpa_metric.py +0 -0
  232. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/model/inline_object.py +0 -0
  233. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/model/inline_response200.py +0 -0
  234. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/model/inline_response2001.py +0 -0
  235. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/model/instance_bounce_status.py +0 -0
  236. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/model/instance_mesh_status.py +0 -0
  237. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/model/instance_status.py +0 -0
  238. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/model/instance_status_adhoc.py +0 -0
  239. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/model/instance_status_cassandracluster.py +0 -0
  240. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/model/instance_status_flink.py +0 -0
  241. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/model/instance_status_kafkacluster.py +0 -0
  242. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/model/instance_status_kubernetes.py +0 -0
  243. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/model/instance_status_kubernetes_autoscaling_status.py +0 -0
  244. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/model/instance_status_kubernetes_v2.py +0 -0
  245. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/model/instance_status_tron.py +0 -0
  246. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/model/instance_tasks.py +0 -0
  247. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/model/integer_and_error.py +0 -0
  248. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/model/kubernetes_container.py +0 -0
  249. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/model/kubernetes_container_v2.py +0 -0
  250. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/model/kubernetes_healthcheck.py +0 -0
  251. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/model/kubernetes_pod.py +0 -0
  252. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/model/kubernetes_pod_event.py +0 -0
  253. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/model/kubernetes_pod_v2.py +0 -0
  254. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/model/kubernetes_replica_set.py +0 -0
  255. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/model/kubernetes_version.py +0 -0
  256. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/model/remote_run_outcome.py +0 -0
  257. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/model/remote_run_start.py +0 -0
  258. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/model/remote_run_stop.py +0 -0
  259. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/model/remote_run_token.py +0 -0
  260. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/model/resource.py +0 -0
  261. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/model/resource_item.py +0 -0
  262. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/model/resource_value.py +0 -0
  263. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/model/smartstack_backend.py +0 -0
  264. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/model/smartstack_location.py +0 -0
  265. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/model/smartstack_status.py +0 -0
  266. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/model/task_tail_lines.py +0 -0
  267. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/model_utils.py +0 -0
  268. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/models/__init__.py +0 -0
  269. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/paastaapi/rest.py +0 -0
  270. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/prune_completed_pods.py +0 -0
  271. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/puppet_service_tools.py +0 -0
  272. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/py.typed +0 -0
  273. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/remote_git.py +0 -0
  274. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/run-paasta-api-in-dev-mode.py +0 -0
  275. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/run-paasta-api-playground.py +0 -0
  276. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/secret_providers/__init__.py +0 -0
  277. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/secret_providers/vault.py +0 -0
  278. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/secret_tools.py +0 -0
  279. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/setup_istio_mesh.py +0 -0
  280. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/setup_kubernetes_cr.py +0 -0
  281. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/setup_kubernetes_crd.py +0 -0
  282. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/setup_kubernetes_internal_crd.py +0 -0
  283. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/setup_kubernetes_job.py +0 -0
  284. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/setup_prometheus_adapter_config.py +0 -0
  285. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/setup_tron_namespace.py +0 -0
  286. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/slack.py +0 -0
  287. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/smartstack_tools.py +0 -0
  288. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/spark_tools.py +0 -0
  289. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/synapse_srv_namespaces_fact.py +0 -0
  290. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/tron/__init__.py +0 -0
  291. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/tron/client.py +0 -0
  292. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/tron/tron_command_context.py +0 -0
  293. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/tron/tron_timeutils.py +0 -0
  294. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/tron_tools.py +0 -0
  295. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools/yaml_tools.py +0 -0
  296. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools.egg-info/SOURCES.txt +0 -0
  297. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools.egg-info/dependency_links.txt +0 -0
  298. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools.egg-info/entry_points.txt +0 -0
  299. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools.egg-info/requires.txt +0 -0
  300. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/paasta_tools.egg-info/top_level.txt +0 -0
  301. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/pyproject.toml +0 -0
  302. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/requirements-minimal.txt +0 -0
  303. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/setup.cfg +0 -0
  304. {paasta-tools-1.19.0 → paasta-tools-1.21.0}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 1.2
2
2
  Name: paasta-tools
3
- Version: 1.19.0
3
+ Version: 1.21.0
4
4
  Summary: Tools for Yelps SOA infrastructure
5
5
  Home-page: UNKNOWN
6
6
  Author: Compute Infrastructure @ Yelp
@@ -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.19.0"
20
+ __version__ = "1.21.0"
@@ -859,6 +859,13 @@
859
859
  }
860
860
  }
861
861
  ]
862
+ },
863
+ "pre_stop_drain_seconds": {
864
+ "type": "integer",
865
+ "minimum": 0
866
+ },
867
+ "pre_stop_wait_for_connections_to_complete": {
868
+ "type": "boolean"
862
869
  }
863
870
  }
864
871
  },
@@ -859,6 +859,13 @@
859
859
  }
860
860
  }
861
861
  ]
862
+ },
863
+ "pre_stop_drain_seconds": {
864
+ "type": "integer",
865
+ "minimum": 0
866
+ },
867
+ "pre_stop_wait_for_connections_to_complete": {
868
+ "type": "boolean"
862
869
  }
863
870
  }
864
871
  },
@@ -223,9 +223,6 @@ JOB_TYPE_LABEL_NAME = "job_type"
223
223
 
224
224
  GPU_RESOURCE_NAME = "nvidia.com/gpu"
225
225
  DEFAULT_STORAGE_CLASS_NAME = "ebs"
226
- DEFAULT_PRESTOP_SLEEP_SECONDS = 30
227
- DEFAULT_HADOWN_PRESTOP_SLEEP_SECONDS = DEFAULT_PRESTOP_SLEEP_SECONDS + 1
228
-
229
226
 
230
227
  DEFAULT_SIDECAR_REQUEST: KubeContainerResourceRequest = {
231
228
  "cpu": 0.1,
@@ -306,6 +303,8 @@ class CustomResourceDefinition(NamedTuple):
306
303
  class KubeLifecycleDict(TypedDict, total=False):
307
304
  termination_grace_period_seconds: int
308
305
  pre_stop_command: Union[str, List[str]]
306
+ pre_stop_drain_seconds: int
307
+ pre_stop_wait_for_connections_to_complete: bool
309
308
 
310
309
 
311
310
  class KubeAffinityCondition(TypedDict, total=False):
@@ -1131,7 +1130,7 @@ class KubernetesDeploymentConfig(LongRunningServiceConfig):
1131
1130
  command=[
1132
1131
  "/bin/sh",
1133
1132
  "-c",
1134
- f"/usr/bin/hadown {registrations}; sleep {DEFAULT_HADOWN_PRESTOP_SLEEP_SECONDS}",
1133
+ f"/usr/bin/hadown {registrations}; sleep {self.get_hacheck_prestop_sleep_seconds()}",
1135
1134
  ]
1136
1135
  )
1137
1136
  )
@@ -1176,7 +1175,7 @@ class KubernetesDeploymentConfig(LongRunningServiceConfig):
1176
1175
  "-c",
1177
1176
  # we sleep for the same amount of time as we do after an hadown to ensure that we have accurate
1178
1177
  # metrics up until our Pod dies
1179
- f"sleep {DEFAULT_HADOWN_PRESTOP_SLEEP_SECONDS}",
1178
+ f"sleep {self.get_hacheck_prestop_sleep_seconds()}",
1180
1179
  ]
1181
1180
  )
1182
1181
  )
@@ -1200,13 +1199,6 @@ class KubernetesDeploymentConfig(LongRunningServiceConfig):
1200
1199
  "git_sha", ""
1201
1200
  )
1202
1201
 
1203
- # Our workloads interact with AWS quite a lot, so it comes handy to
1204
- # propagate an "application ID" in the user-agent of API requests
1205
- # for debugging purposes (max length is 50 chars from AWS docs).
1206
- # TODO: temporarily setting this here rather than in `InstanceConfig`
1207
- # to only affect long running services.
1208
- env["AWS_SDK_UA_APP_ID"] = f"{self.service}.{self.instance}"[:50]
1209
-
1210
1202
  # We drop PAASTA_CLUSTER here because it will be added via `get_kubernetes_environment()`
1211
1203
  env.pop("PAASTA_CLUSTER", None)
1212
1204
 
@@ -1477,7 +1469,9 @@ class KubernetesDeploymentConfig(LongRunningServiceConfig):
1477
1469
  env=self.get_container_env(),
1478
1470
  resources=self.get_resource_requirements(),
1479
1471
  lifecycle=V1Lifecycle(
1480
- pre_stop=self.get_kubernetes_container_termination_action()
1472
+ pre_stop=self.get_kubernetes_container_termination_action(
1473
+ service_namespace_config
1474
+ )
1481
1475
  ),
1482
1476
  name=self.get_sanitised_instance_name(),
1483
1477
  liveness_probe=self.get_liveness_probe(service_namespace_config),
@@ -1509,17 +1503,77 @@ class KubernetesDeploymentConfig(LongRunningServiceConfig):
1509
1503
  else:
1510
1504
  return self.get_liveness_probe(service_namespace_config)
1511
1505
 
1512
- def get_kubernetes_container_termination_action(self) -> V1LifecycleHandler:
1513
- command = self.config_dict.get("lifecycle", KubeLifecycleDict({})).get(
1514
- "pre_stop_command", []
1506
+ def get_lifecycle_dict(self) -> KubeLifecycleDict:
1507
+ return self.config_dict.get("lifecycle", KubeLifecycleDict({}))
1508
+
1509
+ def get_prestop_sleep_seconds(self, is_in_smartstack: bool) -> int:
1510
+ if is_in_smartstack:
1511
+ default = 30
1512
+ else:
1513
+ default = 0
1514
+ return self.get_lifecycle_dict().get("pre_stop_drain_seconds", default)
1515
+
1516
+ def get_hacheck_prestop_sleep_seconds(self) -> int:
1517
+ """The number of seconds to sleep between hadown and terminating the hacheck container. We want hacheck to be
1518
+ up for slightly longer than the main container is, so we default to pre_stop_drain_seconds + 1.
1519
+
1520
+ It doesn't super matter if hacheck goes down before the main container -- if it's down, healthchecks will fail
1521
+ and the service will be removed from smartstack, which is the same effect we get after running hadown.
1522
+ """
1523
+
1524
+ # Everywhere this value is currently used (hacheck sidecar or gunicorn sidecar), we can pretty safely
1525
+ # assume that the service is in smartstack.
1526
+ return self.get_prestop_sleep_seconds(is_in_smartstack=True) + 1
1527
+
1528
+ def get_pre_stop_wait_for_connections_to_complete(
1529
+ self, service_namespace_config: ServiceNamespaceConfig
1530
+ ) -> bool:
1531
+ return self.get_lifecycle_dict().get(
1532
+ "pre_stop_wait_for_connections_to_complete",
1533
+ service_namespace_config.is_in_smartstack()
1534
+ and service_namespace_config.get_longest_timeout_ms() >= 20000,
1515
1535
  )
1536
+
1537
+ def get_kubernetes_container_termination_action(
1538
+ self,
1539
+ service_namespace_config: ServiceNamespaceConfig,
1540
+ ) -> V1LifecycleHandler:
1541
+ command = self.get_lifecycle_dict().get("pre_stop_command", [])
1516
1542
  # default pre stop hook for the container
1517
1543
  if not command:
1518
- return V1LifecycleHandler(
1519
- _exec=V1ExecAction(
1520
- command=["/bin/sh", "-c", f"sleep {DEFAULT_PRESTOP_SLEEP_SECONDS}"]
1521
- )
1544
+ pre_stop_sleep_seconds = self.get_prestop_sleep_seconds(
1545
+ service_namespace_config.is_in_smartstack()
1522
1546
  )
1547
+ if self.get_pre_stop_wait_for_connections_to_complete(
1548
+ service_namespace_config
1549
+ ):
1550
+ # This pre-stop command:
1551
+ # 1. Waits for pre_stop_sleep_seconds seconds (to give hadown time to take effect). This avoids a
1552
+ # potential race condition where step 2 detects no connections in flight and the pod is terminated
1553
+ # immediately, but because the pod is still listed in Envoy somewhere, it receives a new connection
1554
+ # just as the pod is terminated.
1555
+ # 2. Every second, checks if there are any established connections to the pod. It exits when there are no
1556
+ # established connections.
1557
+ # It exits when all connections are closed, which should mean the pod can be safely terminated.
1558
+ # The first four fields of /proc/net/tcp are:
1559
+ # 1. slot number (which is not relevant here, but it's a decimal number left-padded with whitespace)
1560
+ # 2. local address:port (both in hex)
1561
+ # 3. remote address:port (both in hex)
1562
+ # 4. state (in hex)
1563
+ # State 01 means ESTABLISHED.
1564
+ hex_port = hex(self.get_container_port()).upper()[2:]
1565
+ command = [
1566
+ "/bin/sh",
1567
+ "-c",
1568
+ f"sleep {pre_stop_sleep_seconds}; while grep '^ *[0-9]*: ........:{hex_port} ........:.... 01 ' /proc/net/tcp; do sleep 1; echo; done",
1569
+ ]
1570
+ else:
1571
+ command = [
1572
+ "/bin/sh",
1573
+ "-c",
1574
+ f"sleep {pre_stop_sleep_seconds}",
1575
+ ]
1576
+
1523
1577
  if isinstance(command, str):
1524
1578
  command = [command]
1525
1579
  return V1LifecycleHandler(_exec=V1ExecAction(command=command))
@@ -2314,7 +2368,9 @@ class KubernetesDeploymentConfig(LongRunningServiceConfig):
2314
2368
  constraints += pod_topology_spread_constraints
2315
2369
  pod_spec_kwargs["topology_spread_constraints"] = constraints
2316
2370
 
2317
- termination_grace_period = self.get_termination_grace_period()
2371
+ termination_grace_period = self.get_termination_grace_period(
2372
+ service_namespace_config
2373
+ )
2318
2374
  if termination_grace_period is not None:
2319
2375
  pod_spec_kwargs[
2320
2376
  "termination_grace_period_seconds"
@@ -2644,9 +2700,36 @@ class KubernetesDeploymentConfig(LongRunningServiceConfig):
2644
2700
 
2645
2701
  return ahash
2646
2702
 
2647
- def get_termination_grace_period(self) -> Optional[int]:
2648
- return self.config_dict.get("lifecycle", KubeLifecycleDict({})).get(
2649
- "termination_grace_period_seconds"
2703
+ def get_termination_grace_period(
2704
+ self, service_namespace_config: ServiceNamespaceConfig
2705
+ ) -> Optional[int]:
2706
+ """Return the number of seconds that kubernetes should wait for pre-stop hooks to finish (or for the main
2707
+ process to exit after signaling) before forcefully terminating the pod.
2708
+
2709
+ For smartstack services, defaults to a value long enough to allow the default pre-stop hook to finish.
2710
+ For non-smartstack services, defaults to None (kubernetes default of 30s).
2711
+ """
2712
+
2713
+ if service_namespace_config.is_in_smartstack():
2714
+ default = self.get_hacheck_prestop_sleep_seconds() + 1
2715
+ if self.get_pre_stop_wait_for_connections_to_complete(
2716
+ service_namespace_config
2717
+ ):
2718
+ # If the max timeout is more than 30 minutes, cap it to 30 minutes.
2719
+ # Most services with ultra-long timeouts are probably able to handle SIGTERM gracefully anyway.
2720
+ default += int(
2721
+ math.ceil(
2722
+ min(
2723
+ 1800,
2724
+ service_namespace_config.get_longest_timeout_ms() / 1000,
2725
+ )
2726
+ )
2727
+ )
2728
+ else:
2729
+ default = None
2730
+
2731
+ return self.get_lifecycle_dict().get(
2732
+ "termination_grace_period_seconds", default
2650
2733
  )
2651
2734
 
2652
2735
  def get_prometheus_shard(self) -> Optional[str]:
@@ -126,6 +126,16 @@ class ServiceNamespaceConfig(dict):
126
126
  def is_in_smartstack(self) -> bool:
127
127
  return "proxy_port" in self
128
128
 
129
+ def get_timeout_server_ms(self) -> int:
130
+ return self.get("timeout_server_ms", 1000)
131
+
132
+ def get_longest_timeout_ms(self) -> int:
133
+ """Calculate the longest amount of time a connection to this service might stay open."""
134
+ return max(
135
+ [self.get_timeout_server_ms()]
136
+ + list(self.get("endpoint_timeouts", {}).values())
137
+ )
138
+
129
139
 
130
140
  class LongRunningServiceConfig(InstanceConfig):
131
141
  config_dict: LongRunningServiceConfigDict
@@ -503,6 +513,7 @@ def load_service_namespace_config(
503
513
  "advertise",
504
514
  "extra_healthcheck_headers",
505
515
  "lb_policy",
516
+ "endpoint_timeouts",
506
517
  }
507
518
 
508
519
  for key, value in namespace_config_from_file.items():
@@ -697,6 +697,10 @@ class InstanceConfig:
697
697
  instance_type = self.get_instance_type()
698
698
  if instance_type:
699
699
  env["PAASTA_INSTANCE_TYPE"] = instance_type
700
+ # Our workloads interact with AWS quite a lot, so it comes handy to
701
+ # propagate an "application ID" in the user-agent of API requests
702
+ # for debugging purposes (max length is 50 chars from AWS docs).
703
+ env["AWS_SDK_UA_APP_ID"] = f"{self.service}.{self.instance}"[:50]
700
704
  user_env = self.config_dict.get("env", {})
701
705
  env.update(user_env)
702
706
  return {str(k): str(v) for (k, v) in env.items()}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 1.2
2
2
  Name: paasta-tools
3
- Version: 1.19.0
3
+ Version: 1.21.0
4
4
  Summary: Tools for Yelps SOA infrastructure
5
5
  Home-page: UNKNOWN
6
6
  Author: Compute Infrastructure @ Yelp
File without changes
File without changes
File without changes