paasta-tools 1.26.0__tar.gz → 1.27.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 (359) hide show
  1. {paasta_tools-1.26.0/paasta_tools.egg-info → paasta_tools-1.27.0}/PKG-INFO +1 -1
  2. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/__init__.py +1 -1
  3. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/api/api_docs/swagger.json +16 -3
  4. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/api/views/autoscaler.py +60 -23
  5. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/cli/cmds/autoscale.py +38 -17
  6. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/kubernetes/application/controller_wrappers.py +4 -1
  7. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/kubernetes_tools.py +7 -3
  8. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/model/autoscaling_override.py +7 -6
  9. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/model/inline_response202.py +5 -2
  10. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/setup_kubernetes_cr.py +14 -7
  11. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/setup_kubernetes_job.py +10 -4
  12. {paasta_tools-1.26.0 → paasta_tools-1.27.0/paasta_tools.egg-info}/PKG-INFO +1 -1
  13. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/LICENSE +0 -0
  14. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/MANIFEST.in +0 -0
  15. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/README.md +0 -0
  16. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/k8s_itests/__init__.py +0 -0
  17. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/k8s_itests/test_autoscaling.py +0 -0
  18. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/k8s_itests/utils.py +0 -0
  19. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/adhoc_tools.py +0 -0
  20. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/api/__init__.py +0 -0
  21. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/api/api.py +0 -0
  22. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/api/client.py +0 -0
  23. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/api/settings.py +0 -0
  24. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/api/tweens/__init__.py +0 -0
  25. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/api/tweens/auth.py +0 -0
  26. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/api/tweens/profiling.py +0 -0
  27. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/api/tweens/request_logger.py +0 -0
  28. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/api/views/__init__.py +0 -0
  29. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/api/views/exception.py +0 -0
  30. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/api/views/flink.py +0 -0
  31. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/api/views/instance.py +0 -0
  32. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/api/views/pause_autoscaler.py +0 -0
  33. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/api/views/remote_run.py +0 -0
  34. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/api/views/resources.py +0 -0
  35. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/api/views/service.py +0 -0
  36. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/api/views/version.py +0 -0
  37. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/apply_external_resources.py +0 -0
  38. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/async_utils.py +0 -0
  39. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/autoscaling/__init__.py +0 -0
  40. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/autoscaling/autoscaling_service_lib.py +0 -0
  41. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/autoscaling/forecasting.py +0 -0
  42. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/autoscaling/max_all_k8s_services.py +0 -0
  43. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/autoscaling/pause_service_autoscaler.py +0 -0
  44. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/autoscaling/utils.py +0 -0
  45. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/bounce_lib.py +0 -0
  46. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/broadcast_log_to_services.py +0 -0
  47. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/cassandracluster_tools.py +0 -0
  48. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/check_autoscaler_max_instances.py +0 -0
  49. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/check_cassandracluster_services_replication.py +0 -0
  50. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/check_flink_services_health.py +0 -0
  51. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/check_kubernetes_api.py +0 -0
  52. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/check_kubernetes_services_replication.py +0 -0
  53. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/check_oom_events.py +0 -0
  54. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/check_services_replication_tools.py +0 -0
  55. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/check_spark_jobs.py +0 -0
  56. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/cleanup_expired_autoscaling_overrides.py +0 -0
  57. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/cleanup_kubernetes_cr.py +0 -0
  58. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/cleanup_kubernetes_crd.py +0 -0
  59. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/cleanup_kubernetes_jobs.py +0 -0
  60. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/cleanup_tron_namespaces.py +0 -0
  61. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/cli/__init__.py +0 -0
  62. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/cli/authentication.py +0 -0
  63. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/cli/cli.py +0 -0
  64. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/cli/cmds/__init__.py +0 -0
  65. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/cli/cmds/check.py +0 -0
  66. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/cli/cmds/cook_image.py +0 -0
  67. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/cli/cmds/get_docker_image.py +0 -0
  68. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/cli/cmds/get_image_version.py +0 -0
  69. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/cli/cmds/get_latest_deployment.py +0 -0
  70. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/cli/cmds/info.py +0 -0
  71. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/cli/cmds/itest.py +0 -0
  72. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/cli/cmds/list.py +0 -0
  73. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/cli/cmds/list_clusters.py +0 -0
  74. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/cli/cmds/list_deploy_queue.py +0 -0
  75. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/cli/cmds/list_namespaces.py +0 -0
  76. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/cli/cmds/local_run.py +0 -0
  77. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/cli/cmds/logs.py +0 -0
  78. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/cli/cmds/mark_for_deployment.py +0 -0
  79. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/cli/cmds/mesh_status.py +0 -0
  80. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/cli/cmds/pause_service_autoscaler.py +0 -0
  81. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/cli/cmds/push_to_registry.py +0 -0
  82. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/cli/cmds/remote_run.py +0 -0
  83. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/cli/cmds/rollback.py +0 -0
  84. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/cli/cmds/secret.py +0 -0
  85. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/cli/cmds/security_check.py +0 -0
  86. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/cli/cmds/spark_run.py +0 -0
  87. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/cli/cmds/start_stop_restart.py +0 -0
  88. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/cli/cmds/status.py +0 -0
  89. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/cli/cmds/validate.py +0 -0
  90. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/cli/cmds/wait_for_deployment.py +0 -0
  91. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/cli/fsm/__init__.py +0 -0
  92. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/cli/fsm/autosuggest.py +0 -0
  93. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/cli/fsm/template/README.md +0 -0
  94. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/cli/fsm/template/cookiecutter.json +0 -0
  95. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/cli/fsm/template/{{cookiecutter.service}}/kubernetes-PROD.yaml +0 -0
  96. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/cli/fsm/template/{{cookiecutter.service}}/monitoring.yaml +0 -0
  97. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/cli/fsm/template/{{cookiecutter.service}}/service.yaml +0 -0
  98. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/cli/fsm/template/{{cookiecutter.service}}/smartstack.yaml +0 -0
  99. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/cli/fsm_cmd.py +0 -0
  100. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/cli/paasta_tabcomplete.sh +0 -0
  101. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/cli/schemas/adhoc_schema.json +0 -0
  102. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/cli/schemas/autoscaling_schema.json +0 -0
  103. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/cli/schemas/autotuned_defaults/cassandracluster_schema.json +0 -0
  104. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/cli/schemas/autotuned_defaults/kubernetes_schema.json +0 -0
  105. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/cli/schemas/deploy_schema.json +0 -0
  106. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/cli/schemas/eks_schema.json +0 -0
  107. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/cli/schemas/kubernetes_schema.json +0 -0
  108. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/cli/schemas/rollback_schema.json +0 -0
  109. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/cli/schemas/service_schema.json +0 -0
  110. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/cli/schemas/smartstack_schema.json +0 -0
  111. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/cli/schemas/tron_schema.json +0 -0
  112. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/cli/utils.py +0 -0
  113. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/clusterman.py +0 -0
  114. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/config_utils.py +0 -0
  115. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/contrib/__init__.py +0 -0
  116. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/contrib/bounce_log_latency_parser.py +0 -0
  117. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/contrib/check_manual_oapi_changes.sh +0 -0
  118. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/contrib/check_orphans.py +0 -0
  119. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/contrib/create_dynamodb_table.py +0 -0
  120. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/contrib/create_paasta_playground.py +0 -0
  121. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/contrib/emit_allocated_cpu_metrics.py +0 -0
  122. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/contrib/get_running_task_allocation.py +0 -0
  123. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/contrib/habitat_fixer.py +0 -0
  124. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/contrib/ide_helper.py +0 -0
  125. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/contrib/is_pod_healthy_in_proxy.py +0 -0
  126. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/contrib/is_pod_healthy_in_smartstack.py +0 -0
  127. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/contrib/kill_bad_containers.py +0 -0
  128. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/contrib/mass-deploy-tag.sh +0 -0
  129. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/contrib/mock_patch_checker.py +0 -0
  130. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/contrib/paasta_update_soa_memcpu.py +0 -0
  131. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/contrib/render_template.py +0 -0
  132. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/contrib/rightsizer_soaconfigs_update.py +0 -0
  133. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/contrib/service_shard_remove.py +0 -0
  134. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/contrib/service_shard_update.py +0 -0
  135. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/contrib/shared_ip_check.py +0 -0
  136. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/contrib/timeouts_metrics_prom.py +0 -0
  137. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/delete_kubernetes_deployments.py +0 -0
  138. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/deployment_utils.py +0 -0
  139. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/docker_wrapper.py +0 -0
  140. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/docker_wrapper_imports.py +0 -0
  141. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/drain_lib.py +0 -0
  142. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/dump_locally_running_services.py +0 -0
  143. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/eks_tools.py +0 -0
  144. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/envoy_tools.py +0 -0
  145. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/firewall.py +0 -0
  146. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/firewall_logging.py +0 -0
  147. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/firewall_update.py +0 -0
  148. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/flink_tools.py +0 -0
  149. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/flinkeks_tools.py +0 -0
  150. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/frameworks/__init__.py +0 -0
  151. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/frameworks/adhoc_scheduler.py +0 -0
  152. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/frameworks/constraints.py +0 -0
  153. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/frameworks/native_scheduler.py +0 -0
  154. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/frameworks/native_service_config.py +0 -0
  155. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/frameworks/task_store.py +0 -0
  156. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/generate_all_deployments +0 -0
  157. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/generate_authenticating_services.py +0 -0
  158. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/generate_deployments_for_service.py +0 -0
  159. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/generate_services_file.py +0 -0
  160. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/generate_services_yaml.py +0 -0
  161. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/hacheck.py +0 -0
  162. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/instance/__init__.py +0 -0
  163. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/instance/hpa_metrics_parser.py +0 -0
  164. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/instance/kubernetes.py +0 -0
  165. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/iptables.py +0 -0
  166. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/kafkacluster_tools.py +0 -0
  167. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/kubernetes/__init__.py +0 -0
  168. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/kubernetes/application/__init__.py +0 -0
  169. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/kubernetes/application/tools.py +0 -0
  170. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/kubernetes/bin/__init__.py +0 -0
  171. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/kubernetes/bin/kubernetes_remove_evicted_pods.py +0 -0
  172. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/kubernetes/bin/paasta_cleanup_remote_run_resources.py +0 -0
  173. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/kubernetes/bin/paasta_cleanup_stale_nodes.py +0 -0
  174. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/kubernetes/bin/paasta_secrets_sync.py +0 -0
  175. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/kubernetes/remote_run.py +0 -0
  176. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/list_kubernetes_service_instances.py +0 -0
  177. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/list_tron_namespaces.py +0 -0
  178. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/long_running_service_tools.py +0 -0
  179. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/mac_address.py +0 -0
  180. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/marathon_dashboard.py +0 -0
  181. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/mesos/__init__.py +0 -0
  182. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/mesos/cfg.py +0 -0
  183. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/mesos/cluster.py +0 -0
  184. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/mesos/exceptions.py +0 -0
  185. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/mesos/framework.py +0 -0
  186. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/mesos/log.py +0 -0
  187. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/mesos/master.py +0 -0
  188. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/mesos/mesos_file.py +0 -0
  189. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/mesos/parallel.py +0 -0
  190. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/mesos/slave.py +0 -0
  191. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/mesos/task.py +0 -0
  192. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/mesos/util.py +0 -0
  193. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/mesos/zookeeper.py +0 -0
  194. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/mesos_maintenance.py +0 -0
  195. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/mesos_tools.py +0 -0
  196. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/metrics/__init__.py +0 -0
  197. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/metrics/metastatus_lib.py +0 -0
  198. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/metrics/metrics_lib.py +0 -0
  199. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/monitoring/__init__.py +0 -0
  200. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/monitoring/check_k8s_api_performance.py +0 -0
  201. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/monitoring_tools.py +0 -0
  202. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/monkrelaycluster_tools.py +0 -0
  203. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/nrtsearchservice_tools.py +0 -0
  204. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/nrtsearchserviceeks_tools.py +0 -0
  205. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/oom_logger.py +0 -0
  206. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paasta_deploy_tron_jobs +0 -0
  207. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paasta_execute_docker_command.py +0 -0
  208. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paasta_native_serviceinit.py +0 -0
  209. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paasta_service_config_loader.py +0 -0
  210. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/__init__.py +0 -0
  211. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/api/__init__.py +0 -0
  212. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/api/autoscaler_api.py +0 -0
  213. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/api/default_api.py +0 -0
  214. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/api/remote_run_api.py +0 -0
  215. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/api/resources_api.py +0 -0
  216. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/api/service_api.py +0 -0
  217. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/api_client.py +0 -0
  218. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/apis/__init__.py +0 -0
  219. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/configuration.py +0 -0
  220. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/exceptions.py +0 -0
  221. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/model/__init__.py +0 -0
  222. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/model/adhoc_launch_history.py +0 -0
  223. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/model/autoscaler_count_msg.py +0 -0
  224. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/model/deploy_queue.py +0 -0
  225. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/model/deploy_queue_service_instance.py +0 -0
  226. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/model/envoy_backend.py +0 -0
  227. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/model/envoy_location.py +0 -0
  228. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/model/envoy_status.py +0 -0
  229. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/model/flink_cluster_overview.py +0 -0
  230. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/model/flink_config.py +0 -0
  231. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/model/flink_job.py +0 -0
  232. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/model/flink_job_details.py +0 -0
  233. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/model/flink_jobs.py +0 -0
  234. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/model/float_and_error.py +0 -0
  235. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/model/hpa_metric.py +0 -0
  236. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/model/inline_object.py +0 -0
  237. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/model/inline_response200.py +0 -0
  238. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/model/inline_response2001.py +0 -0
  239. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/model/inline_response403.py +0 -0
  240. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/model/instance_bounce_status.py +0 -0
  241. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/model/instance_mesh_status.py +0 -0
  242. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/model/instance_status.py +0 -0
  243. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/model/instance_status_adhoc.py +0 -0
  244. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/model/instance_status_cassandracluster.py +0 -0
  245. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/model/instance_status_flink.py +0 -0
  246. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/model/instance_status_kafkacluster.py +0 -0
  247. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/model/instance_status_kubernetes.py +0 -0
  248. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/model/instance_status_kubernetes_autoscaling_status.py +0 -0
  249. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/model/instance_status_kubernetes_v2.py +0 -0
  250. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/model/instance_status_tron.py +0 -0
  251. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/model/instance_tasks.py +0 -0
  252. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/model/integer_and_error.py +0 -0
  253. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/model/kubernetes_container.py +0 -0
  254. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/model/kubernetes_container_v2.py +0 -0
  255. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/model/kubernetes_healthcheck.py +0 -0
  256. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/model/kubernetes_pod.py +0 -0
  257. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/model/kubernetes_pod_event.py +0 -0
  258. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/model/kubernetes_pod_v2.py +0 -0
  259. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/model/kubernetes_replica_set.py +0 -0
  260. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/model/kubernetes_version.py +0 -0
  261. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/model/remote_run_outcome.py +0 -0
  262. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/model/remote_run_start.py +0 -0
  263. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/model/remote_run_stop.py +0 -0
  264. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/model/remote_run_token.py +0 -0
  265. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/model/resource.py +0 -0
  266. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/model/resource_item.py +0 -0
  267. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/model/resource_value.py +0 -0
  268. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/model/smartstack_backend.py +0 -0
  269. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/model/smartstack_location.py +0 -0
  270. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/model/smartstack_status.py +0 -0
  271. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/model/task_tail_lines.py +0 -0
  272. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/model_utils.py +0 -0
  273. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/models/__init__.py +0 -0
  274. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/paastaapi/rest.py +0 -0
  275. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/prune_completed_pods.py +0 -0
  276. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/puppet_service_tools.py +0 -0
  277. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/py.typed +0 -0
  278. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/remote_git.py +0 -0
  279. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/run-paasta-api-in-dev-mode.py +0 -0
  280. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/run-paasta-api-playground.py +0 -0
  281. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/secret_providers/__init__.py +0 -0
  282. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/secret_providers/vault.py +0 -0
  283. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/secret_tools.py +0 -0
  284. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/setup_istio_mesh.py +0 -0
  285. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/setup_kubernetes_crd.py +0 -0
  286. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/setup_kubernetes_internal_crd.py +0 -0
  287. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/setup_prometheus_adapter_config.py +0 -0
  288. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/setup_tron_namespace.py +0 -0
  289. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/slack.py +0 -0
  290. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/smartstack_tools.py +0 -0
  291. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/spark_tools.py +0 -0
  292. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/synapse_srv_namespaces_fact.py +0 -0
  293. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/tron/__init__.py +0 -0
  294. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/tron/client.py +0 -0
  295. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/tron/tron_command_context.py +0 -0
  296. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/tron/tron_timeutils.py +0 -0
  297. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/tron_tools.py +0 -0
  298. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/utils.py +0 -0
  299. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools/yaml_tools.py +0 -0
  300. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools.egg-info/SOURCES.txt +0 -0
  301. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools.egg-info/dependency_links.txt +0 -0
  302. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools.egg-info/entry_points.txt +0 -0
  303. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools.egg-info/requires.txt +0 -0
  304. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/paasta_tools.egg-info/top_level.txt +0 -0
  305. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/pyproject.toml +0 -0
  306. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/requirements-minimal.txt +0 -0
  307. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/setup.cfg +0 -0
  308. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/setup.py +0 -0
  309. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/tests/test_adhoc_tools.py +0 -0
  310. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/tests/test_apply_external_resources.py +0 -0
  311. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/tests/test_async_utils.py +0 -0
  312. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/tests/test_bounce_lib.py +0 -0
  313. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/tests/test_check_flink_services_health.py +0 -0
  314. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/tests/test_check_kubernetes_services_replication.py +0 -0
  315. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/tests/test_check_oom_events.py +0 -0
  316. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/tests/test_check_service_replication_tools.py +0 -0
  317. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/tests/test_check_spark_jobs.py +0 -0
  318. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/tests/test_cleanup_kubernetes_jobs.py +0 -0
  319. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/tests/test_config_utils.py +0 -0
  320. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/tests/test_delete_kubernetes_deployments.py +0 -0
  321. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/tests/test_deployment_utils.py +0 -0
  322. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/tests/test_docker_wrapper.py +0 -0
  323. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/tests/test_drain_lib.py +0 -0
  324. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/tests/test_eks_tools.py +0 -0
  325. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/tests/test_envoy_tools.py +0 -0
  326. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/tests/test_firewall.py +0 -0
  327. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/tests/test_firewall_logging.py +0 -0
  328. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/tests/test_firewall_update.py +0 -0
  329. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/tests/test_flink_tools.py +0 -0
  330. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/tests/test_flinkeks_tools.py +0 -0
  331. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/tests/test_generate_authenticating_services.py +0 -0
  332. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/tests/test_generate_deployments_for_service.py +0 -0
  333. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/tests/test_generate_services_file.py +0 -0
  334. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/tests/test_generate_services_yaml.py +0 -0
  335. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/tests/test_hacheck.py +0 -0
  336. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/tests/test_iptables.py +0 -0
  337. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/tests/test_kubernetes_tools.py +0 -0
  338. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/tests/test_list_kubernetes_service_instances.py +0 -0
  339. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/tests/test_long_running_service_tools.py +0 -0
  340. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/tests/test_mac_address.py +0 -0
  341. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/tests/test_mesos_tools.py +0 -0
  342. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/tests/test_monitoring_tools.py +0 -0
  343. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/tests/test_nrtsearchserviceseks_tools.py +0 -0
  344. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/tests/test_oom_logger.py +0 -0
  345. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/tests/test_paasta_execute_docker_command.py +0 -0
  346. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/tests/test_paasta_service_config_loader.py +0 -0
  347. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/tests/test_puppet_service_tools.py +0 -0
  348. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/tests/test_remote_git.py +0 -0
  349. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/tests/test_secret_tools.py +0 -0
  350. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/tests/test_setup_istio_mesh.py +0 -0
  351. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/tests/test_setup_kubernetes_cr.py +0 -0
  352. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/tests/test_setup_kubernetes_job.py +0 -0
  353. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/tests/test_setup_prometheus_adapter_config.py +0 -0
  354. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/tests/test_slack.py +0 -0
  355. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/tests/test_smartstack_tools.py +0 -0
  356. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/tests/test_spark_tools.py +0 -0
  357. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/tests/test_task_processing.py +0 -0
  358. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/tests/test_tron_tools.py +0 -0
  359. {paasta_tools-1.26.0 → paasta_tools-1.27.0}/tests/test_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: paasta-tools
3
- Version: 1.26.0
3
+ Version: 1.27.0
4
4
  Summary: Tools for Yelps SOA infrastructure
5
5
  Author: Compute Infrastructure @ Yelp
6
6
  Author-email: compute-infra@yelp.com
@@ -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.26.0"
20
+ __version__ = "1.27.0"
@@ -322,8 +322,14 @@
322
322
  },
323
323
  "min_instances": {
324
324
  "type": "integer",
325
+ "x-nullable": true,
325
326
  "description": "Minimum number of instances to run"
326
327
  },
328
+ "max_instances": {
329
+ "type": "integer",
330
+ "x-nullable": true,
331
+ "description": "Maximum number of instances to run"
332
+ },
327
333
  "expire_after": {
328
334
  "type": "number",
329
335
  "format": "float",
@@ -1724,17 +1730,24 @@
1724
1730
  "properties": {
1725
1731
  "min_instances": {
1726
1732
  "type": "integer",
1727
- "description": "Minimum number of instances to run",
1728
- "minimum": 1
1733
+ "x-nullable": true,
1734
+ "description": "Minimum number of instances to run"
1735
+ },
1736
+ "max_instances": {
1737
+ "type": "integer",
1738
+ "x-nullable": true,
1739
+ "description": "Maximum number of instances to run"
1729
1740
  },
1730
1741
  "expire_after": {
1731
1742
  "type": "number",
1732
1743
  "format": "float",
1733
- "description": "Unix timestamp when this override is no longer valid"
1744
+ "description": "Unix timestamp when this override is no longer valid",
1745
+ "minimum": 1
1734
1746
  }
1735
1747
  },
1736
1748
  "required": [
1737
1749
  "min_instances",
1750
+ "max_instances",
1738
1751
  "expire_after"
1739
1752
  ]
1740
1753
  },
@@ -136,7 +136,7 @@ def set_autoscaling_override(request):
136
136
  Required parameters:
137
137
  - service: The service name
138
138
  - instance: The instance name
139
- - min_instances: The minimum number of instances to enforce
139
+ - min_instances AND/OR max_instances: The minimum and/or maximum number of instances to enforce
140
140
  - expires_after: unix timestamp after which the override is no longer valid
141
141
  """
142
142
  service = request.swagger_data.get("service")
@@ -156,24 +156,29 @@ def set_autoscaling_override(request):
156
156
 
157
157
  json_body = request.swagger_data.get("json_body", {})
158
158
  min_instances_override = json_body.get("min_instances")
159
- expire_after = json_body.get("expire_after")
159
+ max_instances_override = json_body.get("max_instances")
160
+ expire_after = json_body["expire_after"]
160
161
 
161
- if not isinstance(min_instances_override, int) or min_instances_override < 1:
162
- raise ApiFailure("min_instances must be a positive integer", 400)
162
+ # ideally we'd enforce this in our api spec - but since we're using both swagger and oapi, that's not quite so simple
163
+ if not min_instances_override and not max_instances_override:
164
+ raise ApiFailure(
165
+ "At least one of min_instances or max_instances must be provided", 400
166
+ )
163
167
 
164
- if not expire_after:
165
- raise ApiFailure("expire_after is required", 400)
168
+ # we can't currently enforce this in the API spec since the generator seems to have issues generating a validator
169
+ # for a nullable integer field with a minimum value as we get errors like:
170
+ # `TypeError: '<' not supported between instances of 'NoneType' and 'int'`
171
+ # that said, unless someone is manually crafting requests, this should never happen
172
+ # since the CLI includes a check for this as well
173
+ if min_instances_override is not None and min_instances_override < 1:
174
+ raise ApiFailure("min_instances must be a positive integer", 400)
175
+ if max_instances_override is not None and max_instances_override < 1:
176
+ raise ApiFailure("max_instances must be a positive integer", 400)
166
177
 
167
- max_instances = instance_config.get_max_instances()
168
- if max_instances is None:
178
+ # otherwise, we could have folks accidentally enable autoscaling (using cpu) for a non-autoscaled
179
+ if instance_config.is_autoscaling_enabled() is None:
169
180
  raise ApiFailure(f"Autoscaling is not enabled for {service}.{instance}", 400)
170
181
 
171
- if max_instances < min_instances_override:
172
- raise ApiFailure(
173
- f"min_instances ({min_instances_override}) cannot be greater than max_instances ({max_instances})",
174
- 400,
175
- )
176
-
177
182
  configmap, created = get_or_create_autoscaling_overrides_configmap()
178
183
  if created:
179
184
  log.info("Created new autoscaling overrides ConfigMap")
@@ -182,23 +187,54 @@ def set_autoscaling_override(request):
182
187
  if not configmap.data:
183
188
  configmap.data = {}
184
189
 
185
- override_data = {
186
- "min_instances": min_instances_override,
187
- "created_at": datetime.now(timezone.utc).isoformat(),
188
- # NOTE: we may want to also allow setting a max_instances override in the future, but if we do that
189
- # we'd probably want to force folks to either set one or both and share the same expiration time
190
- "expire_after": expire_after,
191
- }
192
-
193
190
  service_instance = f"{service}.{instance}"
194
191
  existing_overrides = (
195
192
  json.loads(configmap.data[service_instance])
196
193
  if service_instance in configmap.data
197
194
  else {}
198
195
  )
199
- merged_overrides = {**existing_overrides, **override_data}
196
+
197
+ # this is slightly funky as there's a hierarchy of what value to pick:
198
+ # 1. the override value provided in the request - as this should override any existing value
199
+ # 2. the existing override value in the configmap - this is used if we previously only set an override for min or
200
+ # max instances and now want to set a value for the other
201
+ # 3. the value from the instance config - this is used as a final fallback since this means no override is present
202
+ min_instances = (
203
+ min_instances_override
204
+ or existing_overrides.get("min_instances")
205
+ or instance_config.get_min_instances()
206
+ )
207
+ max_instances = (
208
+ max_instances_override
209
+ or existing_overrides.get("max_instances")
210
+ or instance_config.get_max_instances()
211
+ )
212
+
213
+ # NOTE: the max_instances check is unnecessary here, but type-checkers can't see that the is_autoscaling_enabled()
214
+ # check above ensures that max_instances is not None
215
+ if max_instances is None or max_instances < min_instances:
216
+ raise ApiFailure(
217
+ f"min_instances ({min_instances_override}) cannot be greater than max_instances ({max_instances})",
218
+ 400,
219
+ )
220
+
221
+ override_data = {
222
+ "min_instances": min_instances_override,
223
+ "max_instances": max_instances_override,
224
+ "created_at": datetime.now(timezone.utc).isoformat(),
225
+ "expire_after": expire_after,
226
+ }
227
+
228
+ # NOTE: we need to strip out null values from the incoming overrides since otherwise we'd remove existing overrides
229
+ # (since if only --set-min or --set-max is provided, the other will be sent as None)
230
+ merged_overrides = {
231
+ **existing_overrides,
232
+ **{k: v for k, v in override_data.items() if v is not None},
233
+ }
200
234
  serialized_overrides = json.dumps(merged_overrides)
201
235
 
236
+ # note: we can only append with patching - if we ever want to remove overrides outside of the cleanup cronjob,
237
+ # we would need to change this to use replace_namespaced_configmap
202
238
  patch_namespaced_configmap(
203
239
  name=AUTOSCALING_OVERRIDES_CONFIGMAP_NAME,
204
240
  namespace=AUTOSCALING_OVERRIDES_CONFIGMAP_NAMESPACE,
@@ -213,6 +249,7 @@ def set_autoscaling_override(request):
213
249
  "instance": instance,
214
250
  "cluster": cluster,
215
251
  "min_instances": min_instances_override,
252
+ "max_instances": max_instances_override,
216
253
  "expire_after": expire_after,
217
254
  "status": "SUCCESS",
218
255
  }
@@ -75,10 +75,18 @@ def add_subparser(subparsers):
75
75
  else autoscale_parser.error("Minimum instances must be >= 1"),
76
76
  default=None,
77
77
  )
78
+ override_group.add_argument(
79
+ "--set-max",
80
+ help="Set the maximum number of replicas (must be >= 1). Requires --for parameter.",
81
+ type=lambda x: int(x)
82
+ if int(x) >= 1
83
+ else autoscale_parser.error("Maximum instances must be >= 1"),
84
+ default=None,
85
+ )
78
86
  override_group.add_argument(
79
87
  "--for",
80
88
  dest="duration",
81
- help="Duration for the temporary override (e.g. '3h', '30m'). Required when using --set-min.",
89
+ help="Duration for the temporary override (e.g. '3h', '30m'). Required when using --set-min and/or --set-max.",
82
90
  default=None,
83
91
  )
84
92
 
@@ -113,22 +121,24 @@ def paasta_autoscale(args):
113
121
  log.setLevel(logging.DEBUG)
114
122
  service = figure_out_service_name(args)
115
123
 
116
- if args.set_min is not None and not args.duration:
124
+ if (args.set_min is not None or args.set_max is not None) and not args.duration:
117
125
  print(
118
126
  PaastaColors.yellow(
119
- "WARNING: --set-min requires --for parameter to specify duration - defaulting to 30m"
127
+ "WARNING: --set-min/--set-max usage requires --for parameter to specify duration - defaulting to 30m"
120
128
  )
121
129
  )
122
130
  args.duration = "30m"
123
131
 
124
- if args.duration is not None and args.set_min is None:
125
- print(PaastaColors.red("Error: --for requires --set-min parameter"))
132
+ if args.duration is not None and args.set_min is None and args.set_max is None:
133
+ print(
134
+ PaastaColors.red("Error: --for requires --set-min or --set-max parameter")
135
+ )
126
136
  return 1
127
137
 
128
- if args.set is not None and args.set_min is not None:
138
+ if args.set is not None and args.set_min is not None and args.set_max is not None:
129
139
  print(
130
140
  PaastaColors.red(
131
- "Error: Cannot use both --set and --set-min at the same time"
141
+ "Error: Cannot use both --set and --set-min or --set-max at the same time"
132
142
  )
133
143
  )
134
144
  return 1
@@ -159,9 +169,12 @@ def paasta_autoscale(args):
159
169
  print("Could not connect to paasta api. Maybe you misspelled the cluster?")
160
170
  return 1
161
171
 
172
+ # TODO: we should probably also make sure we set a couple other defaults - currently, it's possible for
173
+ # status/res/etc to be unbound in some code paths
174
+ err_reason = None
162
175
  try:
163
176
  # get current autoscaler count
164
- if args.set is None and args.set_min is None:
177
+ if args.set is None and args.set_min is None and args.set_max is None:
165
178
  log.debug("Getting the current autoscaler count...")
166
179
  res, status, _ = api.autoscaler.get_autoscaler_count(
167
180
  service=service, instance=args.instance, _return_http_data_only=False
@@ -187,7 +200,7 @@ def paasta_autoscale(args):
187
200
  )
188
201
 
189
202
  # set lower bound
190
- elif args.set_min is not None:
203
+ elif args.set_min is not None or args.set_max is not None:
191
204
  duration_seconds = parse_duration_to_seconds(args.duration)
192
205
  if not duration_seconds:
193
206
  print(
@@ -202,10 +215,11 @@ def paasta_autoscale(args):
202
215
  expiration_time = time.time() + duration_seconds
203
216
 
204
217
  log.debug(
205
- f"Setting minimum instances to {args.set_min} for duration {args.duration}."
218
+ f"Sending the following overrides for duration {args.duration}: min_instances: {args.set_min}, max_instances: {args.set_max}."
206
219
  )
207
220
  msg = paastamodels.AutoscalingOverride(
208
221
  min_instances=args.set_min,
222
+ max_instances=args.set_max,
209
223
  expire_after=expiration_time,
210
224
  )
211
225
 
@@ -224,28 +238,35 @@ def paasta_autoscale(args):
224
238
  )
225
239
  except api.api_error as exc:
226
240
  status = exc.status
241
+ err_reason = exc.body
227
242
 
228
243
  if not 200 <= status <= 299:
229
244
  print(
230
245
  PaastaColors.red(
231
- f"ERROR: '{args.instance}' is not configured to autoscale OR you set min_instances above the current max_instances, "
246
+ f"ERROR: '{args.instance}' is not configured to autoscale OR you set impossible {{min, max}}_instances, "
232
247
  f"and `paasta autoscale` could not update it. "
233
248
  f"If you want to be able to boost this service, please configure autoscaling for the service "
234
249
  f"in its config file by setting min and max instances appropriately. Example: \n"
235
250
  f"{args.instance}:\n"
236
251
  f" min_instances: 5\n"
237
- f" max_instances: 50"
252
+ f" max_instances: 50\n"
253
+ f"{err_reason}"
238
254
  )
239
255
  )
240
256
  return 0
241
257
 
242
258
  log.debug(f"Res: {res} Http: {status}")
243
- if not args.set_min:
259
+ if not args.set_min and not args.set_max:
244
260
  print(f"Desired instances: {res.desired_instances}")
245
- elif args.set_min:
246
- print(
247
- f"Temporary override set for {args.service}.{args.instance} with minimum instances: {args.set_min}"
248
- )
261
+ else:
262
+ if args.set_min:
263
+ print(
264
+ f"Temporary override set for {args.service}.{args.instance} with minimum instances: {args.set_min}"
265
+ )
266
+ if args.set_max:
267
+ print(
268
+ f"Temporary override set for {args.service}.{args.instance} with maximum instances: {args.set_max}"
269
+ )
249
270
  # folks using this might be in different timezones, so let's convert the expiration time to a few common ones
250
271
  # to make it extra clear when the override will expire
251
272
  epoch_time = datetime.fromtimestamp(res.expire_after)
@@ -301,7 +301,10 @@ class DeploymentWrapper(Application):
301
301
  kube_client=kube_client,
302
302
  namespace=self.item.metadata.namespace,
303
303
  min_instances_override=(
304
- self.hpa_override["min_instances"] if self.hpa_override else None
304
+ self.hpa_override.get("min_instances") if self.hpa_override else None
305
+ ),
306
+ max_instances_override=(
307
+ self.hpa_override.get("max_instances") if self.hpa_override else None
305
308
  ),
306
309
  )
307
310
 
@@ -325,6 +325,7 @@ class DatastoreCredentialsConfig(TypedDict, total=False):
325
325
 
326
326
  class HpaOverride(TypedDict):
327
327
  min_instances: int
328
+ max_instances: int
328
329
  expire_after: str
329
330
 
330
331
 
@@ -899,6 +900,7 @@ class KubernetesDeploymentConfig(LongRunningServiceConfig):
899
900
  kube_client: KubeClient,
900
901
  namespace: str,
901
902
  min_instances_override: Optional[int] = None,
903
+ max_instances_override: Optional[int] = None,
902
904
  ) -> Optional[V2HorizontalPodAutoscaler]:
903
905
  # Returns None if an HPA should not be attached based on the config,
904
906
  # or the config is invalid.
@@ -914,7 +916,7 @@ class KubernetesDeploymentConfig(LongRunningServiceConfig):
914
916
  return None
915
917
 
916
918
  min_replicas = min_instances_override or self.get_min_instances()
917
- max_replicas = self.get_max_instances()
919
+ max_replicas = max_instances_override or self.get_max_instances()
918
920
  if min_replicas == 0 or max_replicas == 0:
919
921
  log.error(
920
922
  f"Invalid value for min or max_instances on {name}: {min_replicas}, {max_replicas}"
@@ -2015,7 +2017,7 @@ class KubernetesDeploymentConfig(LongRunningServiceConfig):
2015
2017
  )
2016
2018
  return None
2017
2019
 
2018
- def get_min_instances(self) -> Optional[int]:
2020
+ def get_min_instances(self) -> int:
2019
2021
  return self.config_dict.get(
2020
2022
  "min_instances",
2021
2023
  1,
@@ -4690,7 +4692,9 @@ def get_namespaced_configmap(
4690
4692
 
4691
4693
  def patch_namespaced_configmap(
4692
4694
  name: str,
4693
- body: Dict[str, str],
4695
+ # NOTE: passing a dict *seems* to work - but we should likely switch to passing a ConfigMap since that seems to be
4696
+ # the most supported option
4697
+ body: Union[V1ConfigMap, Dict[str, Any]],
4694
4698
  *,
4695
4699
  namespace: str,
4696
4700
  kube_client: KubeClient,
@@ -59,9 +59,6 @@ class AutoscalingOverride(ModelNormal):
59
59
  }
60
60
 
61
61
  validations = {
62
- ('min_instances',): {
63
- 'inclusive_minimum': 1,
64
- },
65
62
  }
66
63
 
67
64
  additional_properties_type = None
@@ -79,7 +76,8 @@ class AutoscalingOverride(ModelNormal):
79
76
  and the value is attribute type.
80
77
  """
81
78
  return {
82
- 'min_instances': (int,), # noqa: E501
79
+ 'min_instances': (int, none_type,), # noqa: E501
80
+ 'max_instances': (int, none_type,), # noqa: E501
83
81
  'expire_after': (float,), # noqa: E501
84
82
  }
85
83
 
@@ -90,6 +88,7 @@ class AutoscalingOverride(ModelNormal):
90
88
 
91
89
  attribute_map = {
92
90
  'min_instances': 'min_instances', # noqa: E501
91
+ 'max_instances': 'max_instances', # noqa: E501
93
92
  'expire_after': 'expire_after', # noqa: E501
94
93
  }
95
94
 
@@ -105,11 +104,12 @@ class AutoscalingOverride(ModelNormal):
105
104
  ])
106
105
 
107
106
  @convert_js_args_to_python_args
108
- def __init__(self, min_instances, expire_after, *args, **kwargs): # noqa: E501
107
+ def __init__(self, min_instances, max_instances, expire_after, *args, **kwargs): # noqa: E501
109
108
  """AutoscalingOverride - a model defined in OpenAPI
110
109
 
111
110
  Args:
112
- min_instances (int): Minimum number of instances to run
111
+ min_instances (int, none_type): Minimum number of instances to run
112
+ max_instances (int, none_type): Maximum number of instances to run
113
113
  expire_after (float): Unix timestamp when this override is no longer valid
114
114
 
115
115
  Keyword Args:
@@ -169,6 +169,7 @@ class AutoscalingOverride(ModelNormal):
169
169
  self._visited_composed_classes = _visited_composed_classes + (self.__class__,)
170
170
 
171
171
  self.min_instances = min_instances
172
+ self.max_instances = max_instances
172
173
  self.expire_after = expire_after
173
174
  for var_name, var_value in kwargs.items():
174
175
  if var_name not in self.attribute_map and \
@@ -78,7 +78,8 @@ class InlineResponse202(ModelNormal):
78
78
  return {
79
79
  'service': (str,), # noqa: E501
80
80
  'instance': (str,), # noqa: E501
81
- 'min_instances': (int,), # noqa: E501
81
+ 'min_instances': (int, none_type,), # noqa: E501
82
+ 'max_instances': (int, none_type,), # noqa: E501
82
83
  'expire_after': (float,), # noqa: E501
83
84
  'status': (str,), # noqa: E501
84
85
  }
@@ -92,6 +93,7 @@ class InlineResponse202(ModelNormal):
92
93
  'service': 'service', # noqa: E501
93
94
  'instance': 'instance', # noqa: E501
94
95
  'min_instances': 'min_instances', # noqa: E501
96
+ 'max_instances': 'max_instances', # noqa: E501
95
97
  'expire_after': 'expire_after', # noqa: E501
96
98
  'status': 'status', # noqa: E501
97
99
  }
@@ -144,7 +146,8 @@ class InlineResponse202(ModelNormal):
144
146
  _visited_composed_classes = (Animal,)
145
147
  service (str): Service name. [optional] # noqa: E501
146
148
  instance (str): Instance name. [optional] # noqa: E501
147
- min_instances (int): Minimum number of instances to run. [optional] # noqa: E501
149
+ min_instances (int, none_type): Minimum number of instances to run. [optional] # noqa: E501
150
+ max_instances (int, none_type): Maximum number of instances to run. [optional] # noqa: E501
148
151
  expire_after (float): Unix timestamp after which the override is no longer valid. [optional] # noqa: E501
149
152
  status (str): Status of the operation. [optional] # noqa: E501
150
153
  """
@@ -49,6 +49,7 @@ from paasta_tools.utils import get_config_hash
49
49
  from paasta_tools.utils import get_git_sha_from_dockerurl
50
50
  from paasta_tools.utils import load_all_configs
51
51
  from paasta_tools.utils import load_system_paasta_config
52
+ from paasta_tools.utils import NoDeploymentsAvailable
52
53
 
53
54
 
54
55
  log = logging.getLogger(__name__)
@@ -344,13 +345,19 @@ def reconcile_kubernetes_resource(
344
345
  if instance is not None and instance != inst:
345
346
  continue
346
347
  try:
347
- soa_config = config_handler.loader(
348
- service=service,
349
- instance=inst,
350
- cluster=cluster,
351
- load_deployments=True,
352
- soa_dir=DEFAULT_SOA_DIR,
353
- )
348
+ try:
349
+ soa_config = config_handler.loader(
350
+ service=service,
351
+ instance=inst,
352
+ cluster=cluster,
353
+ load_deployments=True,
354
+ soa_dir=DEFAULT_SOA_DIR,
355
+ )
356
+ except NoDeploymentsAvailable:
357
+ log.warning(
358
+ f"No deployments available for {service}.{inst} in {cluster}, skipping"
359
+ )
360
+ continue
354
361
  git_sha = get_git_sha_from_dockerurl(soa_config.get_docker_url(), long=True)
355
362
  formatted_resource = format_custom_resource(
356
363
  instance_config=config,
@@ -255,27 +255,31 @@ def get_hpa_overrides(kube_client: KubeClient) -> Dict[str, Dict[str, HpaOverrid
255
255
 
256
256
  This function reads the "paasta-autoscaling-overrides" ConfigMap in the "paasta" namespace
257
257
  and extracts all valid (non-expired) overrides to return a dictionary mapping
258
- service.instance pairs to override data (currently, just min_instances and when the
258
+ service.instance pairs to override data (currently, just {min,max_instances} and when the
259
259
  override should expire by).
260
260
 
261
261
  The incoming ConfigMap is expected to have the following format:
262
262
  {
263
263
  $SERVICE_A.$INSTANCE_A: {
264
264
  "min_instances": 2,
265
+ "m_instances": 2,
265
266
  "expire_after": "2023-10-01T00:00:00Z"
266
267
  },
267
268
  $SERVICE_A.$INSTANCE_B: {
268
269
  "min_instances": 3,
270
+ "max_instances": 10,
269
271
  "expire_after": "2023-10-01T00:00:00Z"
270
272
  },
271
273
  ...
272
274
  },
273
275
  $SERVICE_B.$INSTANCE_A: {
274
276
  "min_instances": 1,
277
+ "max_instances": 11,
275
278
  "expire_after": "2023-10-01T00:00:00Z"
276
279
  },
277
280
  $SERVICE_B.$INSTANCE_B: {
278
281
  "min_instances": 2,
282
+ "max_instances": 20,
279
283
  "expire_after": "2023-10-01T00:00:00Z"
280
284
  },
281
285
  ...
@@ -298,19 +302,21 @@ def get_hpa_overrides(kube_client: KubeClient) -> Dict[str, Dict[str, HpaOverrid
298
302
  override_metadata = json.loads(override_json)
299
303
  expire_after = override_metadata.get("expire_after")
300
304
  min_instances = override_metadata.get("min_instances")
305
+ max_instances = override_metadata.get("max_instances")
301
306
 
302
- if expire_after and min_instances:
307
+ if expire_after and (min_instances or max_instances):
303
308
  if current_time < expire_after:
304
309
  if service not in overrides:
305
310
  overrides[service] = {}
306
311
 
307
312
  overrides[service][instance] = {
308
313
  "min_instances": min_instances,
314
+ "max_instances": max_instances,
309
315
  "expire_after": expire_after,
310
316
  }
311
317
  log.info(
312
318
  f"Found valid HPA override for {service}: "
313
- f"{override_metadata.get('min_instances')} (expires at {expire_after})"
319
+ f"min_instances: {max_instances} :: max_instances {min_instances} (expires at {expire_after})"
314
320
  )
315
321
  else:
316
322
  log.info(
@@ -320,7 +326,7 @@ def get_hpa_overrides(kube_client: KubeClient) -> Dict[str, Dict[str, HpaOverrid
320
326
  else:
321
327
  log.warning(
322
328
  f"Invalid HPA override for {service}.{instance}: "
323
- f"missing 'min_instances' or 'expire_after': {override_metadata}"
329
+ f"missing 'min_instances' or 'max_instances' or 'expire_after': {override_metadata}"
324
330
  )
325
331
  except Exception:
326
332
  log.exception(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: paasta-tools
3
- Version: 1.26.0
3
+ Version: 1.27.0
4
4
  Summary: Tools for Yelps SOA infrastructure
5
5
  Author: Compute Infrastructure @ Yelp
6
6
  Author-email: compute-infra@yelp.com
File without changes
File without changes
File without changes