paasta-tools 1.30.9__tar.gz → 1.35.4__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 (353) hide show
  1. {paasta_tools-1.30.9/paasta_tools.egg-info → paasta_tools-1.35.4}/PKG-INFO +2 -2
  2. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/__init__.py +1 -1
  3. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/api/api_docs/swagger.json +5 -0
  4. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/cmds/local_run.py +111 -23
  5. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/cmds/mark_for_deployment.py +9 -1
  6. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/cmds/remote_run.py +9 -0
  7. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/cmds/secret.py +2 -2
  8. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/cmds/spark_run.py +2 -0
  9. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/cmds/status.py +29 -6
  10. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/cmds/validate.py +222 -1
  11. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/schemas/autoscaling_schema.json +3 -2
  12. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/schemas/eks_schema.json +23 -1
  13. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/schemas/smartstack_schema.json +12 -0
  14. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/instance/hpa_metrics_parser.py +3 -5
  15. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/instance/kubernetes.py +58 -25
  16. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/kubernetes/application/controller_wrappers.py +23 -2
  17. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/kubernetes/remote_run.py +2 -2
  18. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/kubernetes_tools.py +37 -66
  19. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/long_running_service_tools.py +8 -1
  20. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/kubernetes_version.py +3 -0
  21. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/setup_prometheus_adapter_config.py +82 -0
  22. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/tron_tools.py +3 -0
  23. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/utils.py +25 -8
  24. {paasta_tools-1.30.9 → paasta_tools-1.35.4/paasta_tools.egg-info}/PKG-INFO +2 -2
  25. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools.egg-info/requires.txt +1 -1
  26. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/requirements-minimal.txt +2 -1
  27. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_kubernetes_tools.py +544 -26
  28. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_setup_prometheus_adapter_config.py +65 -0
  29. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_tron_tools.py +1 -0
  30. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/LICENSE +0 -0
  31. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/MANIFEST.in +0 -0
  32. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/README.md +0 -0
  33. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/k8s_itests/__init__.py +0 -0
  34. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/k8s_itests/test_autoscaling.py +0 -0
  35. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/k8s_itests/utils.py +0 -0
  36. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/adhoc_tools.py +0 -0
  37. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/api/__init__.py +0 -0
  38. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/api/api.py +0 -0
  39. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/api/client.py +0 -0
  40. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/api/settings.py +0 -0
  41. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/api/tweens/__init__.py +0 -0
  42. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/api/tweens/auth.py +0 -0
  43. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/api/tweens/profiling.py +0 -0
  44. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/api/tweens/request_logger.py +0 -0
  45. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/api/views/__init__.py +0 -0
  46. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/api/views/autoscaler.py +0 -0
  47. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/api/views/exception.py +0 -0
  48. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/api/views/flink.py +0 -0
  49. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/api/views/instance.py +0 -0
  50. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/api/views/pause_autoscaler.py +0 -0
  51. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/api/views/remote_run.py +0 -0
  52. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/api/views/resources.py +0 -0
  53. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/api/views/service.py +0 -0
  54. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/api/views/version.py +0 -0
  55. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/apply_external_resources.py +0 -0
  56. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/async_utils.py +0 -0
  57. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/autoscaling/__init__.py +0 -0
  58. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/autoscaling/autoscaling_service_lib.py +0 -0
  59. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/autoscaling/forecasting.py +0 -0
  60. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/autoscaling/max_all_k8s_services.py +0 -0
  61. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/autoscaling/pause_service_autoscaler.py +0 -0
  62. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/autoscaling/utils.py +0 -0
  63. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/bounce_lib.py +0 -0
  64. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/broadcast_log_to_services.py +0 -0
  65. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cassandracluster_tools.py +0 -0
  66. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/check_autoscaler_max_instances.py +0 -0
  67. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/check_cassandracluster_services_replication.py +0 -0
  68. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/check_flink_services_health.py +0 -0
  69. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/check_kubernetes_api.py +0 -0
  70. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/check_kubernetes_services_replication.py +0 -0
  71. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/check_oom_events.py +0 -0
  72. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/check_services_replication_tools.py +0 -0
  73. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/check_spark_jobs.py +0 -0
  74. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cleanup_expired_autoscaling_overrides.py +0 -0
  75. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cleanup_kubernetes_cr.py +0 -0
  76. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cleanup_kubernetes_crd.py +0 -0
  77. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cleanup_kubernetes_jobs.py +0 -0
  78. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cleanup_tron_namespaces.py +0 -0
  79. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/__init__.py +0 -0
  80. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/authentication.py +0 -0
  81. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/cli.py +0 -0
  82. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/cmds/__init__.py +0 -0
  83. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/cmds/autoscale.py +0 -0
  84. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/cmds/check.py +0 -0
  85. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/cmds/cook_image.py +0 -0
  86. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/cmds/get_docker_image.py +0 -0
  87. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/cmds/get_image_version.py +0 -0
  88. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/cmds/get_latest_deployment.py +0 -0
  89. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/cmds/info.py +0 -0
  90. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/cmds/itest.py +0 -0
  91. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/cmds/list.py +0 -0
  92. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/cmds/list_clusters.py +0 -0
  93. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/cmds/list_deploy_queue.py +0 -0
  94. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/cmds/list_namespaces.py +0 -0
  95. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/cmds/logs.py +0 -0
  96. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/cmds/mesh_status.py +0 -0
  97. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/cmds/pause_service_autoscaler.py +0 -0
  98. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/cmds/push_to_registry.py +0 -0
  99. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/cmds/rollback.py +0 -0
  100. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/cmds/security_check.py +0 -0
  101. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/cmds/start_stop_restart.py +0 -0
  102. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/cmds/wait_for_deployment.py +0 -0
  103. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/fsm/__init__.py +0 -0
  104. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/fsm/autosuggest.py +0 -0
  105. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/fsm/template/README.md +0 -0
  106. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/fsm/template/cookiecutter.json +0 -0
  107. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/fsm/template/{{cookiecutter.service}}/kubernetes-PROD.yaml +0 -0
  108. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/fsm/template/{{cookiecutter.service}}/monitoring.yaml +0 -0
  109. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/fsm/template/{{cookiecutter.service}}/service.yaml +0 -0
  110. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/fsm/template/{{cookiecutter.service}}/smartstack.yaml +0 -0
  111. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/fsm_cmd.py +0 -0
  112. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/paasta_tabcomplete.sh +0 -0
  113. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/schemas/adhoc_schema.json +0 -0
  114. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/schemas/autotuned_defaults/cassandracluster_schema.json +0 -0
  115. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/schemas/autotuned_defaults/kubernetes_schema.json +0 -0
  116. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/schemas/deploy_schema.json +0 -0
  117. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/schemas/kubernetes_schema.json +0 -0
  118. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/schemas/rollback_schema.json +0 -0
  119. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/schemas/service_schema.json +0 -0
  120. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/schemas/tron_schema.json +0 -0
  121. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/utils.py +0 -0
  122. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/clusterman.py +0 -0
  123. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/config_utils.py +0 -0
  124. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/contrib/__init__.py +0 -0
  125. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/contrib/bounce_log_latency_parser.py +0 -0
  126. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/contrib/check_manual_oapi_changes.sh +0 -0
  127. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/contrib/check_orphans.py +0 -0
  128. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/contrib/create_dynamodb_table.py +0 -0
  129. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/contrib/create_paasta_playground.py +0 -0
  130. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/contrib/emit_allocated_cpu_metrics.py +0 -0
  131. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/contrib/get_running_task_allocation.py +0 -0
  132. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/contrib/habitat_fixer.py +0 -0
  133. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/contrib/ide_helper.py +0 -0
  134. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/contrib/is_pod_healthy_in_proxy.py +0 -0
  135. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/contrib/is_pod_healthy_in_smartstack.py +0 -0
  136. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/contrib/kill_bad_containers.py +0 -0
  137. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/contrib/mass-deploy-tag.sh +0 -0
  138. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/contrib/mock_patch_checker.py +0 -0
  139. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/contrib/paasta_update_soa_memcpu.py +0 -0
  140. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/contrib/render_template.py +0 -0
  141. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/contrib/rightsizer_soaconfigs_update.py +0 -0
  142. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/contrib/service_shard_remove.py +0 -0
  143. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/contrib/service_shard_update.py +0 -0
  144. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/contrib/shared_ip_check.py +0 -0
  145. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/contrib/timeouts_metrics_prom.py +0 -0
  146. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/delete_kubernetes_deployments.py +0 -0
  147. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/deployment_utils.py +0 -0
  148. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/docker_wrapper.py +0 -0
  149. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/docker_wrapper_imports.py +0 -0
  150. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/drain_lib.py +0 -0
  151. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/dump_locally_running_services.py +0 -0
  152. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/eks_tools.py +0 -0
  153. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/envoy_tools.py +0 -0
  154. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/firewall.py +0 -0
  155. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/firewall_logging.py +0 -0
  156. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/firewall_update.py +0 -0
  157. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/flink_tools.py +0 -0
  158. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/flinkeks_tools.py +0 -0
  159. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/frameworks/__init__.py +0 -0
  160. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/frameworks/constraints.py +0 -0
  161. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/frameworks/native_service_config.py +0 -0
  162. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/generate_all_deployments +0 -0
  163. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/generate_authenticating_services.py +0 -0
  164. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/generate_deployments_for_service.py +0 -0
  165. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/generate_services_file.py +0 -0
  166. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/generate_services_yaml.py +0 -0
  167. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/hacheck.py +0 -0
  168. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/instance/__init__.py +0 -0
  169. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/iptables.py +0 -0
  170. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/kafkacluster_tools.py +0 -0
  171. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/kubernetes/__init__.py +0 -0
  172. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/kubernetes/application/__init__.py +0 -0
  173. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/kubernetes/application/tools.py +0 -0
  174. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/kubernetes/bin/__init__.py +0 -0
  175. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/kubernetes/bin/kubernetes_remove_evicted_pods.py +0 -0
  176. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/kubernetes/bin/paasta_cleanup_remote_run_resources.py +0 -0
  177. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/kubernetes/bin/paasta_cleanup_stale_nodes.py +0 -0
  178. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/kubernetes/bin/paasta_secrets_sync.py +0 -0
  179. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/list_kubernetes_service_instances.py +0 -0
  180. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/list_tron_namespaces.py +0 -0
  181. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/mac_address.py +0 -0
  182. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/marathon_dashboard.py +0 -0
  183. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/mesos/__init__.py +0 -0
  184. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/mesos/cfg.py +0 -0
  185. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/mesos/cluster.py +0 -0
  186. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/mesos/exceptions.py +0 -0
  187. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/mesos/framework.py +0 -0
  188. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/mesos/log.py +0 -0
  189. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/mesos/master.py +0 -0
  190. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/mesos/mesos_file.py +0 -0
  191. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/mesos/parallel.py +0 -0
  192. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/mesos/slave.py +0 -0
  193. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/mesos/task.py +0 -0
  194. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/mesos/util.py +0 -0
  195. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/mesos/zookeeper.py +0 -0
  196. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/mesos_tools.py +0 -0
  197. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/metrics/__init__.py +0 -0
  198. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/metrics/metastatus_lib.py +0 -0
  199. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/metrics/metrics_lib.py +0 -0
  200. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/monitoring/__init__.py +0 -0
  201. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/monitoring/check_k8s_api_performance.py +0 -0
  202. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/monitoring_tools.py +0 -0
  203. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/monkrelaycluster_tools.py +0 -0
  204. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/nrtsearchservice_tools.py +0 -0
  205. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/nrtsearchserviceeks_tools.py +0 -0
  206. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/oom_logger.py +0 -0
  207. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paasta_deploy_tron_jobs +0 -0
  208. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paasta_execute_docker_command.py +0 -0
  209. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paasta_service_config_loader.py +0 -0
  210. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/__init__.py +0 -0
  211. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/api/__init__.py +0 -0
  212. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/api/autoscaler_api.py +0 -0
  213. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/api/default_api.py +0 -0
  214. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/api/remote_run_api.py +0 -0
  215. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/api/resources_api.py +0 -0
  216. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/api/service_api.py +0 -0
  217. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/api_client.py +0 -0
  218. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/apis/__init__.py +0 -0
  219. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/configuration.py +0 -0
  220. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/exceptions.py +0 -0
  221. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/__init__.py +0 -0
  222. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/adhoc_launch_history.py +0 -0
  223. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/autoscaler_count_msg.py +0 -0
  224. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/autoscaling_override.py +0 -0
  225. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/deploy_queue.py +0 -0
  226. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/deploy_queue_service_instance.py +0 -0
  227. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/envoy_backend.py +0 -0
  228. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/envoy_location.py +0 -0
  229. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/envoy_status.py +0 -0
  230. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/flink_cluster_overview.py +0 -0
  231. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/flink_config.py +0 -0
  232. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/flink_job.py +0 -0
  233. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/flink_job_details.py +0 -0
  234. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/flink_jobs.py +0 -0
  235. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/float_and_error.py +0 -0
  236. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/hpa_metric.py +0 -0
  237. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/inline_object.py +0 -0
  238. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/inline_response200.py +0 -0
  239. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/inline_response2001.py +0 -0
  240. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/inline_response202.py +0 -0
  241. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/inline_response403.py +0 -0
  242. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/instance_bounce_status.py +0 -0
  243. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/instance_mesh_status.py +0 -0
  244. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/instance_status.py +0 -0
  245. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/instance_status_adhoc.py +0 -0
  246. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/instance_status_cassandracluster.py +0 -0
  247. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/instance_status_flink.py +0 -0
  248. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/instance_status_kafkacluster.py +0 -0
  249. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/instance_status_kubernetes.py +0 -0
  250. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/instance_status_kubernetes_autoscaling_status.py +0 -0
  251. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/instance_status_kubernetes_v2.py +0 -0
  252. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/instance_status_tron.py +0 -0
  253. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/instance_tasks.py +0 -0
  254. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/integer_and_error.py +0 -0
  255. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/kubernetes_container.py +0 -0
  256. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/kubernetes_container_v2.py +0 -0
  257. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/kubernetes_healthcheck.py +0 -0
  258. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/kubernetes_pod.py +0 -0
  259. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/kubernetes_pod_event.py +0 -0
  260. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/kubernetes_pod_v2.py +0 -0
  261. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/kubernetes_replica_set.py +0 -0
  262. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/remote_run_outcome.py +0 -0
  263. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/remote_run_start.py +0 -0
  264. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/remote_run_stop.py +0 -0
  265. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/remote_run_token.py +0 -0
  266. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/resource.py +0 -0
  267. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/resource_item.py +0 -0
  268. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/resource_value.py +0 -0
  269. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/smartstack_backend.py +0 -0
  270. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/smartstack_location.py +0 -0
  271. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/smartstack_status.py +0 -0
  272. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/task_tail_lines.py +0 -0
  273. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model_utils.py +0 -0
  274. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/models/__init__.py +0 -0
  275. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/rest.py +0 -0
  276. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/prune_completed_pods.py +0 -0
  277. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/puppet_service_tools.py +0 -0
  278. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/py.typed +0 -0
  279. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/remote_git.py +0 -0
  280. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/run-paasta-api-in-dev-mode.py +0 -0
  281. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/run-paasta-api-playground.py +0 -0
  282. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/secret_providers/__init__.py +0 -0
  283. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/secret_providers/vault.py +0 -0
  284. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/secret_tools.py +0 -0
  285. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/setup_istio_mesh.py +0 -0
  286. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/setup_kubernetes_cr.py +0 -0
  287. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/setup_kubernetes_crd.py +0 -0
  288. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/setup_kubernetes_internal_crd.py +0 -0
  289. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/setup_kubernetes_job.py +0 -0
  290. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/setup_tron_namespace.py +0 -0
  291. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/slack.py +0 -0
  292. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/smartstack_tools.py +0 -0
  293. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/spark_tools.py +0 -0
  294. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/synapse_srv_namespaces_fact.py +0 -0
  295. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/tron/__init__.py +0 -0
  296. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/tron/client.py +0 -0
  297. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/tron/tron_command_context.py +0 -0
  298. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/tron/tron_timeutils.py +0 -0
  299. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/yaml_tools.py +0 -0
  300. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools.egg-info/SOURCES.txt +0 -0
  301. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools.egg-info/dependency_links.txt +0 -0
  302. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools.egg-info/entry_points.txt +0 -0
  303. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools.egg-info/top_level.txt +0 -0
  304. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/pyproject.toml +0 -0
  305. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/setup.cfg +0 -0
  306. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/setup.py +0 -0
  307. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_adhoc_tools.py +0 -0
  308. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_apply_external_resources.py +0 -0
  309. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_async_utils.py +0 -0
  310. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_bounce_lib.py +0 -0
  311. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_check_flink_services_health.py +0 -0
  312. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_check_kubernetes_services_replication.py +0 -0
  313. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_check_oom_events.py +0 -0
  314. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_check_service_replication_tools.py +0 -0
  315. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_check_spark_jobs.py +0 -0
  316. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_cleanup_kubernetes_jobs.py +0 -0
  317. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_config_utils.py +0 -0
  318. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_delete_kubernetes_deployments.py +0 -0
  319. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_deployment_utils.py +0 -0
  320. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_docker_wrapper.py +0 -0
  321. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_drain_lib.py +0 -0
  322. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_eks_tools.py +0 -0
  323. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_envoy_tools.py +0 -0
  324. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_firewall.py +0 -0
  325. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_firewall_logging.py +0 -0
  326. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_firewall_update.py +0 -0
  327. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_flink_tools.py +0 -0
  328. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_flinkeks_tools.py +0 -0
  329. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_generate_authenticating_services.py +0 -0
  330. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_generate_deployments_for_service.py +0 -0
  331. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_generate_services_file.py +0 -0
  332. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_generate_services_yaml.py +0 -0
  333. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_hacheck.py +0 -0
  334. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_iptables.py +0 -0
  335. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_list_kubernetes_service_instances.py +0 -0
  336. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_long_running_service_tools.py +0 -0
  337. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_mac_address.py +0 -0
  338. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_mesos_tools.py +0 -0
  339. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_monitoring_tools.py +0 -0
  340. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_nrtsearchserviceseks_tools.py +0 -0
  341. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_oom_logger.py +0 -0
  342. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_paasta_execute_docker_command.py +0 -0
  343. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_paasta_service_config_loader.py +0 -0
  344. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_puppet_service_tools.py +0 -0
  345. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_remote_git.py +0 -0
  346. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_secret_tools.py +0 -0
  347. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_setup_istio_mesh.py +0 -0
  348. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_setup_kubernetes_cr.py +0 -0
  349. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_setup_kubernetes_job.py +0 -0
  350. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_slack.py +0 -0
  351. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_smartstack_tools.py +0 -0
  352. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_spark_tools.py +0 -0
  353. {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: paasta-tools
3
- Version: 1.30.9
3
+ Version: 1.35.4
4
4
  Summary: Tools for Yelps SOA infrastructure
5
5
  Author: Compute Infrastructure @ Yelp
6
6
  Author-email: compute-infra@yelp.com
@@ -34,7 +34,7 @@ Requires-Dist: ipaddress>=1.0.22
34
34
  Requires-Dist: isodate>=0.7.2
35
35
  Requires-Dist: jsonschema[format]
36
36
  Requires-Dist: kazoo>=2.0.0
37
- Requires-Dist: kubernetes<26.0.0,>=18.20.0
37
+ Requires-Dist: kubernetes<35.0.0,>=29.0.0
38
38
  Requires-Dist: ldap3
39
39
  Requires-Dist: manhole
40
40
  Requires-Dist: mypy-extensions>=0.3.0
@@ -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.30.9"
20
+ __version__ = "1.35.4"
@@ -1788,6 +1788,11 @@
1788
1788
  "KubernetesVersion": {
1789
1789
  "type": "object",
1790
1790
  "properties": {
1791
+ "container_port": {
1792
+ "description": "Port the container is expecting to receive traffic on",
1793
+ "type": "integer",
1794
+ "format": "int32"
1795
+ },
1791
1796
  "type": {
1792
1797
  "description": "Type of version (ReplicaSet or ControllerRevision)",
1793
1798
  "type": "string"
@@ -12,6 +12,7 @@
12
12
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
+ import base64
15
16
  import datetime
16
17
  import json
17
18
  import os
@@ -31,7 +32,9 @@ from urllib.parse import urlparse
31
32
  import boto3
32
33
  import requests
33
34
  from docker import errors
35
+ from docker.api.client import APIClient
34
36
  from mypy_extensions import TypedDict
37
+ from service_configuration_lib import read_service_configuration
35
38
 
36
39
  from paasta_tools.adhoc_tools import get_default_interactive_config
37
40
  from paasta_tools.cli.authentication import get_service_auth_token
@@ -612,26 +615,83 @@ class LostContainerException(Exception):
612
615
  pass
613
616
 
614
617
 
615
- def docker_pull_image(docker_url):
616
- """Pull an image via ``docker pull``. Uses the actual pull command instead of the python
617
- bindings due to the docker auth/registry transition. Once we are past Docker 1.6
618
- we can use better credential management, but for now this function assumes the
619
- user running the command has already been authorized for the registry"""
618
+ class DockerAuthConfig(TypedDict):
619
+ username: str
620
+ password: str
621
+
622
+
623
+ def get_readonly_docker_registry_auth_config(
624
+ docker_url: str,
625
+ ) -> DockerAuthConfig | None:
626
+ system_paasta_config = load_system_paasta_config()
627
+ config_path = system_paasta_config.get_readonly_docker_registry_auth_file()
628
+
629
+ try:
630
+ with open(config_path) as f:
631
+ docker_config = json.load(f)
632
+ except Exception:
633
+ print(
634
+ PaastaColors.yellow(
635
+ "Warning: unable to load read-only docker registry credentials."
636
+ ),
637
+ file=sys.stderr,
638
+ )
639
+ # the best we can do is try to pull with whatever auth the user has configured locally
640
+ # i.e., root-owned docker config in /root/.docker/config.json
641
+ return None
642
+ registry = docker_url.split("/")[0]
643
+
644
+ # find matching auth config - our usual ro config will have at least two entries
645
+ # at the time this comment was written
646
+ auths = docker_config
647
+ for auth_url, auth_data in auths.items():
648
+ if registry in auth_url:
649
+ # Decode the base64 auth string if present
650
+ if "auth" in auth_data:
651
+ auth_string = base64.b64decode(auth_data["auth"]).decode("utf-8")
652
+ username, password = auth_string.split(":", 1)
653
+ return {"username": username, "password": password}
654
+
655
+ # we'll hit this for registries like docker-dev or extra-private internal registries
656
+ return None
657
+
658
+
659
+ def docker_pull_image(docker_client: APIClient, docker_url: str) -> None:
660
+ """Pull an image using the docker-py library with read-only registry credentials"""
620
661
  print(
621
- "Please wait while the image (%s) is pulled (times out after 30m)..."
622
- % docker_url,
662
+ f"Please wait while the image ({docker_url}) is pulled (times out after 30m)...",
623
663
  file=sys.stderr,
624
664
  )
625
- with Timeout(
626
- seconds=1800, error_message=f"Timed out pulling docker image from {docker_url}"
627
- ), open(os.devnull, mode="wb") as DEVNULL:
628
- ret, _ = _run("docker pull %s" % docker_url, stream=True, stdin=DEVNULL)
629
- if ret != 0:
630
- print(
631
- "\nPull failed. Are you authorized to run docker commands?",
632
- file=sys.stderr,
633
- )
634
- sys.exit(ret)
665
+
666
+ auth_config = get_readonly_docker_registry_auth_config(docker_url)
667
+ if not auth_config:
668
+ print(
669
+ PaastaColors.yellow(
670
+ "Warning: No read-only docker registry credentials found, attempting to pull without them."
671
+ ),
672
+ file=sys.stderr,
673
+ )
674
+
675
+ try:
676
+ with Timeout(
677
+ seconds=1800,
678
+ error_message=f"Timed out pulling docker image from {docker_url}",
679
+ ):
680
+ # this is slightly funky since pull() returns the output line-by-line, but as a dict
681
+ # ...that we then need to format back to the usual `docker pull` output
682
+ # :p
683
+ for line in docker_client.pull(
684
+ docker_url, auth_config=auth_config, stream=True, decode=True
685
+ ):
686
+ # not all lines have an 'id' key :(
687
+ id_prefix = f"{line['id']}: " if "id" in line else ""
688
+ print(f"{id_prefix}{line['status']}", file=sys.stderr)
689
+ except Exception as e:
690
+ print(
691
+ f"\nPull failed. Error: {e}",
692
+ file=sys.stderr,
693
+ )
694
+ sys.exit(1)
635
695
 
636
696
 
637
697
  def get_container_id(docker_client, container_name):
@@ -1226,7 +1286,7 @@ def configure_and_run_docker_container(
1226
1286
  return 1
1227
1287
 
1228
1288
  if pull_image:
1229
- docker_pull_image(docker_url)
1289
+ docker_pull_image(docker_client, docker_url)
1230
1290
 
1231
1291
  for volume in instance_config.get_volumes(
1232
1292
  system_paasta_config.get_volumes(),
@@ -1302,10 +1362,40 @@ def docker_config_available():
1302
1362
  )
1303
1363
 
1304
1364
 
1365
+ def should_reexec_as_root(
1366
+ service: str, skip_secrets: bool, action: str, soa_dir: str = DEFAULT_SOA_DIR
1367
+ ) -> bool:
1368
+ # local-run can't pull secrets from Vault in prod without a root-owned token
1369
+ need_vault_token = not skip_secrets and action == "pull"
1370
+
1371
+ # there are some special teams with their own private docker registries and no ro creds
1372
+ # however, we don't know what registry is to be used without loading the service config
1373
+ service_info = read_service_configuration(service, soa_dir)
1374
+ # technically folks can set the standard registry as a value here, but atm no one is doing that :p
1375
+ registry_override = service_info.get("docker_registry")
1376
+ # note: we could also have a list of registries that have ro creds, but this seems fine for now
1377
+ uses_private_registry = (
1378
+ registry_override
1379
+ and registry_override
1380
+ in load_system_paasta_config().get_private_docker_registries()
1381
+ )
1382
+ need_docker_config = uses_private_registry and action == "pull"
1383
+
1384
+ return (need_vault_token or need_docker_config) and os.geteuid() != 0
1385
+
1386
+
1305
1387
  def paasta_local_run(args):
1306
- if args.action == "pull" and os.geteuid() != 0 and not docker_config_available():
1307
- print("Re-executing paasta local-run --pull with sudo..")
1308
- os.execvp("sudo", ["sudo", "-H"] + sys.argv)
1388
+ service = figure_out_service_name(args, soa_dir=args.yelpsoa_config_root)
1389
+ if should_reexec_as_root(
1390
+ service, args.skip_secrets, args.action, args.yelpsoa_config_root
1391
+ ):
1392
+ # XXX: we should re-architect this to not need sudo, but for now,
1393
+ # re-exec ourselves with sudo to get access to the paasta vault token
1394
+ # NOTE: once we do that, we can also remove the venv check above :)
1395
+ print(
1396
+ "Re-executing paasta local-run --pull with sudo for Vault/Docker registry access..."
1397
+ )
1398
+ os.execvp("sudo", ["sudo", "-H", "/usr/bin/paasta"] + sys.argv[1:])
1309
1399
  if args.action == "build" and not makefile_responds_to("cook-image"):
1310
1400
  print(
1311
1401
  "A local Makefile with a 'cook-image' target is required for --build",
@@ -1332,8 +1422,6 @@ def paasta_local_run(args):
1332
1422
 
1333
1423
  local_run_config = system_paasta_config.get_local_run_config()
1334
1424
 
1335
- service = figure_out_service_name(args, soa_dir=args.yelpsoa_config_root)
1336
-
1337
1425
  if args.cluster:
1338
1426
  cluster = args.cluster
1339
1427
  else:
@@ -1264,7 +1264,15 @@ class MarkForDeploymentProcess(RollbackSlackDeploymentProcess):
1264
1264
  self.ping_authors()
1265
1265
 
1266
1266
  def send_manual_rollback_instructions(self) -> None:
1267
- if self.deployment_version != self.old_deployment_version:
1267
+ # NOTE: new deploy groups are not exactly a particularly frequent occurrence, but
1268
+ # we want to prevent sending messages that look like
1269
+ # `If you need to roll back manually, run: paasta rollback --service $S --deploy-group $G --commit None`
1270
+ # since that's not actually valid/actionable.
1271
+ # thus the seemingly out-of-nowhere old_git_sha check: new deploy groups won't have value set there.
1272
+ if (
1273
+ self.deployment_version != self.old_deployment_version
1274
+ and self.old_git_sha is not None
1275
+ ):
1268
1276
  extra_rollback_args = ""
1269
1277
  if self.old_deployment_version.image_version:
1270
1278
  extra_rollback_args = (
@@ -295,11 +295,19 @@ def paasta_remote_run_stop(
295
295
 
296
296
 
297
297
  def add_common_args_to_parser(parser: argparse.ArgumentParser):
298
+ def _validate_service_name(name: str) -> str:
299
+ if name not in _list_services_and_toolboxes():
300
+ raise ValueError(f"{name} is not a known service name")
301
+ return name
302
+
298
303
  service_arg = parser.add_argument(
299
304
  "-s",
300
305
  "--service",
301
306
  help="The name of the service you wish to inspect. Required.",
302
307
  required=True,
308
+ # not using `choices` for validation to avoid the help text
309
+ # for the command being incredibly large
310
+ type=_validate_service_name,
303
311
  )
304
312
  service_arg.completer = lazy_choices_completer(_list_services_and_toolboxes) # type: ignore
305
313
  instance_or_toolbox = parser.add_mutually_exclusive_group()
@@ -323,6 +331,7 @@ def add_common_args_to_parser(parser: argparse.ArgumentParser):
323
331
  "--cluster",
324
332
  help="The name of the cluster you wish to run your task on. Required.",
325
333
  required=True,
334
+ choices=list_clusters(),
326
335
  )
327
336
  cluster_arg.completer = lazy_choices_completer(list_clusters) # type: ignore
328
337
 
@@ -212,7 +212,7 @@ def _add_vault_auth_args(parser: argparse.ArgumentParser):
212
212
  dest="vault_auth_method",
213
213
  required=False,
214
214
  default="token",
215
- choices=["token", "ldap"],
215
+ choices=["token", "okta"],
216
216
  )
217
217
  parser.add_argument(
218
218
  "--vault-token-file",
@@ -456,7 +456,7 @@ def paasta_secret(args):
456
456
  "vault_token_file": args.vault_token_file,
457
457
  # best solution so far is to change the below string to "token",
458
458
  # so that token file is picked up from argparse
459
- "vault_auth_method": "ldap", # must have LDAP to get 2FA push for prod
459
+ "vault_auth_method": "okta", # must use Okta to get 2FA push
460
460
  },
461
461
  )
462
462
  secret_provider.write_secret(
@@ -897,6 +897,8 @@ def configure_and_run_docker_container(
897
897
  )
898
898
  ) # type:ignore
899
899
  environment.update(extra_driver_envs)
900
+ if "jupyter-lab" == args.cmd:
901
+ environment["SPARK_DRIVER_TYPE"] = "jupyter"
900
902
 
901
903
  if args.use_service_auth_token:
902
904
  environment["YELP_SVC_AUTHZ_TOKEN"] = get_service_auth_token()
@@ -917,11 +917,13 @@ def _print_flink_status_from_job_manager(
917
917
  else f"{pod_evicted_count}"
918
918
  )
919
919
 
920
+ pods_total_count = pod_running_count + pod_evicted_count + pod_other_count
920
921
  output.append(
921
922
  " Pods:"
922
923
  f" {pod_running_count} running,"
923
924
  f" {evicted} evicted,"
924
- f" {pod_other_count} other"
925
+ f" {pod_other_count} other,"
926
+ f" {pods_total_count} total"
925
927
  )
926
928
 
927
929
  if not should_job_info_be_shown(status["state"]):
@@ -944,12 +946,19 @@ def _print_flink_status_from_job_manager(
944
946
  output.append(str(e))
945
947
  return 1
946
948
 
949
+ jobs_total_count = (
950
+ overview.jobs_running
951
+ + overview.jobs_finished
952
+ + overview.jobs_failed
953
+ + overview.jobs_cancelled
954
+ )
947
955
  output.append(
948
956
  " Jobs:"
949
957
  f" {overview.jobs_running} running,"
950
958
  f" {overview.jobs_finished} finished,"
951
959
  f" {overview.jobs_failed} failed,"
952
- f" {overview.jobs_cancelled} cancelled"
960
+ f" {overview.jobs_cancelled} cancelled,"
961
+ f" {jobs_total_count} total"
953
962
  )
954
963
  output.append(
955
964
  " "
@@ -1313,7 +1322,9 @@ def get_version_table_entry(
1313
1322
  for state in ReplicaState
1314
1323
  if state in replica_state_counts
1315
1324
  ]
1316
- entry.append(f" Replica States: {' / '.join(replica_state_display)}")
1325
+ entry.append(
1326
+ f" Replica States: {' / '.join(replica_state_display)} / {replica_state_counts.total()} total"
1327
+ )
1317
1328
  if not verbose:
1318
1329
  unhealthy_replicas = [
1319
1330
  (state, pod) for state, pod in replica_states if state.is_unhealthy()
@@ -1321,13 +1332,23 @@ def get_version_table_entry(
1321
1332
  if unhealthy_replicas:
1322
1333
  entry.append(" Unhealthy Replicas:")
1323
1334
  replica_table = create_replica_table(
1324
- unhealthy_replicas, service, instance, cluster, verbose
1335
+ unhealthy_replicas,
1336
+ service,
1337
+ instance,
1338
+ cluster,
1339
+ version.container_port,
1340
+ verbose,
1325
1341
  )
1326
1342
  for line in replica_table:
1327
1343
  entry.append(f" {line}")
1328
1344
  else:
1329
1345
  replica_table = create_replica_table(
1330
- replica_states, service, instance, cluster, verbose
1346
+ replica_states,
1347
+ service,
1348
+ instance,
1349
+ cluster,
1350
+ version.container_port,
1351
+ verbose,
1331
1352
  )
1332
1353
  for line in replica_table:
1333
1354
  entry.append(f" {line}")
@@ -1467,6 +1488,7 @@ def create_replica_table(
1467
1488
  service: str,
1468
1489
  instance: str,
1469
1490
  cluster: str,
1491
+ container_port: int,
1470
1492
  verbose: int = 0,
1471
1493
  ) -> List[str]:
1472
1494
  header = ["ID", "IP/Port", "Host deployed to", "Started at what localtime", "State"]
@@ -1474,9 +1496,10 @@ def create_replica_table(
1474
1496
  for state, pod in pods:
1475
1497
  start_datetime = datetime.fromtimestamp(pod.create_timestamp)
1476
1498
  humanized_start_time = humanize.naturaltime(start_datetime)
1499
+
1477
1500
  row = [
1478
1501
  pod.name,
1479
- f"{pod.ip}:8888" if pod.ip else "None",
1502
+ f"{pod.ip}:{container_port}" if pod.ip else "None",
1480
1503
  pod.host or "None",
1481
1504
  humanized_start_time,
1482
1505
  state.formatted_message,
@@ -22,6 +22,7 @@ from datetime import datetime
22
22
  from functools import lru_cache
23
23
  from functools import partial
24
24
  from glob import glob
25
+ from pathlib import Path
25
26
  from typing import Any
26
27
  from typing import Callable
27
28
  from typing import cast
@@ -34,6 +35,9 @@ from typing import Union
34
35
 
35
36
  import pytz
36
37
  from croniter import croniter
38
+ from environment_tools.type_utils import available_location_types
39
+ from environment_tools.type_utils import compare_types
40
+ from environment_tools.type_utils import convert_location_type
37
41
  from jsonschema import Draft4Validator
38
42
  from jsonschema import exceptions
39
43
  from jsonschema import FormatChecker
@@ -64,6 +68,7 @@ from paasta_tools.long_running_service_tools import METRICS_PROVIDER_PISCINA
64
68
  from paasta_tools.long_running_service_tools import METRICS_PROVIDER_PROMQL
65
69
  from paasta_tools.long_running_service_tools import METRICS_PROVIDER_UWSGI
66
70
  from paasta_tools.long_running_service_tools import METRICS_PROVIDER_UWSGI_V2
71
+ from paasta_tools.long_running_service_tools import METRICS_PROVIDER_WORKER_LOAD
67
72
  from paasta_tools.secret_tools import get_secret_name_from_ref
68
73
  from paasta_tools.secret_tools import is_secret_ref
69
74
  from paasta_tools.secret_tools import is_shared_secret
@@ -120,6 +125,7 @@ SCHEMA_TYPES = {
120
125
  "rollback", # automatic rollbacks during deployments
121
126
  "tron", # batch workloads
122
127
  "eks", # eks workloads
128
+ "smartstack", # mesh configs
123
129
  "autotuned_defaults/kubernetes",
124
130
  "autotuned_defaults/cassandracluster",
125
131
  }
@@ -163,9 +169,33 @@ INVALID_AUTOSCALING_FIELDS = {
163
169
  "desired_active_requests_per_replica",
164
170
  "prometheus-adapter-config",
165
171
  },
172
+ METRICS_PROVIDER_WORKER_LOAD: {
173
+ "desired_active_requests_per_replica",
174
+ "prometheus-adapter-config",
175
+ },
166
176
  METRICS_PROVIDER_PROMQL: {"desired_active_requests_per_replica"},
167
177
  }
168
178
 
179
+ # Listener names in Envoy cannot exceed 128 characters and use the
180
+ # following format:
181
+ # service_name.namespace.listener
182
+ # This naming scheme leaves 128 - 10 = 118 characters
183
+ # for the Smartstack service name and namespace.
184
+ # See COREBACK-6303 for more context.
185
+ MAX_ENVOY_NAME_LEN = 118
186
+
187
+ # Socket names cannot exceed 108 characters, and the longest socket
188
+ # name generated by HAProxy uses the following format:
189
+ # /var/run/synapse/sockets/service_name.namespace.LONGPID.sock.tmp
190
+ # This naming scheme leaves 108 - 43 = 65 characters combined for the
191
+ # Smartstack service name and namespace. We leave a generous buffer
192
+ # to arrive at a maximum name length of 55, in case e.g. the .sock
193
+ # suffix is renamed to a longer name for certain sockets.
194
+ # See SMTSTK-204 for more context.
195
+ # NOTE: the above is mostly still true - but the path we use is now /var/run/envoy/sockets/...
196
+ # so we may want to adjust this a tad in the future ;)
197
+ MAX_SMARTSTACK_NAME_LEN = 55
198
+
169
199
 
170
200
  class ConditionConfig(TypedDict, total=False):
171
201
  """
@@ -978,6 +1008,191 @@ def validate_cpu_burst(service_path: str) -> bool:
978
1008
  return returncode
979
1009
 
980
1010
 
1011
+ def _check_smartstack_name_length_envoy(service: str, namespace: str) -> None:
1012
+ """Ensures that Smartstack service name and namespace does not
1013
+ exceed the limit on the length of Envoy's listener names
1014
+ """
1015
+ if len(service) + len(namespace) > MAX_ENVOY_NAME_LEN:
1016
+ raise ValueError(
1017
+ "Service name and namespace exceeds max listener name length in Envoy. Note that the full listener name "
1018
+ 'is "{}.{}.listener". Please rename so that the combined length of the service name and namespace does '
1019
+ "not exceed {} characters".format(service, namespace, MAX_ENVOY_NAME_LEN),
1020
+ )
1021
+
1022
+
1023
+ def _check_smartstack_name_length(service: str, namespace: str) -> None:
1024
+ """Ensure that Smartstack name does not
1025
+ exceed limits on HAProxy socket name
1026
+ """
1027
+ if len(service + namespace) > MAX_SMARTSTACK_NAME_LEN:
1028
+ socket_name = "/var/run/synapse/sockets/{}.{}.sock.LONGPID.tmp".format(
1029
+ service,
1030
+ namespace,
1031
+ )
1032
+ raise ValueError(
1033
+ "Name exceeds max socket name length. Note that the full socket name under the HAProxy naming scheme "
1034
+ 'is "{}". Please rename so that the combined length of the service name and namespace does not '
1035
+ "exceed {} characters".format(socket_name, MAX_SMARTSTACK_NAME_LEN),
1036
+ )
1037
+
1038
+
1039
+ @lru_cache()
1040
+ def _get_etc_services() -> list[str]:
1041
+ with open("/etc/services") as f:
1042
+ return f.read().splitlines()
1043
+
1044
+
1045
+ @lru_cache()
1046
+ def _get_etc_services_entry(port_lookup: int) -> str | None:
1047
+ entries = _get_etc_services()
1048
+ for entry in entries:
1049
+ try:
1050
+ service = entry.split()[0]
1051
+ port = entry.split()[1]
1052
+ if port.startswith("%s/" % str(port_lookup)):
1053
+ return service
1054
+ except IndexError:
1055
+ continue
1056
+ return None
1057
+
1058
+
1059
+ def _check_proxy_port_in_use(service: str, namespace: str, port: int) -> bool:
1060
+ if port is None:
1061
+ return False
1062
+
1063
+ # TODO(luisp): this should probably check the distributed /nail/etc/services
1064
+ # smartstack.yamls OR we should more automatically manage /etc/services
1065
+ etc_services_entry = _get_etc_services_entry(port)
1066
+ if etc_services_entry is None:
1067
+ return False
1068
+ elif f"{service}.{namespace}" == etc_services_entry:
1069
+ return False
1070
+ else:
1071
+ raise ValueError(
1072
+ (
1073
+ "port {} is already in use by {} according to /etc/services, it cannot be used by "
1074
+ "{}.{}. Please either pick a different port or update /etc/services via puppet"
1075
+ ).format(port, etc_services_entry, service, namespace),
1076
+ )
1077
+
1078
+
1079
+ def _check_advertise_discover(
1080
+ smartstack_data: dict[str, Any]
1081
+ ) -> None: # XXX: we should use a TypedDict here
1082
+ """Need to ensure a few properties about smartstack files
1083
+ 1) discover is a member of advertise
1084
+ 2) discovery and advertise contain valid locations
1085
+ 3) extra_advertise contains valid locations
1086
+ 4) rhs of extra_advertise are >= discover type
1087
+ """
1088
+
1089
+ def assert_valid_type(location_type: str) -> None:
1090
+ if location_type not in available_location_types():
1091
+ raise ValueError(
1092
+ 'Location type "{}" not a valid Yelp location type'.format(
1093
+ location_type,
1094
+ ),
1095
+ )
1096
+
1097
+ def assert_valid_location(location_string: str) -> None:
1098
+ try:
1099
+ typ, loc = location_string.split(":")
1100
+ assert len(convert_location_type(loc, typ, typ)) == 1
1101
+ except Exception:
1102
+ raise ValueError(
1103
+ 'Location string "{}" not a valid Yelp location'.format(
1104
+ location_string,
1105
+ ),
1106
+ )
1107
+
1108
+ advertise = smartstack_data.get("advertise", ["region"])
1109
+ discover = smartstack_data.get("discover", "region")
1110
+ if discover not in advertise:
1111
+ raise ValueError(
1112
+ 'discover key "{}" not a member of advertise "{}"'.format(
1113
+ discover,
1114
+ advertise,
1115
+ ),
1116
+ )
1117
+ for location_type in [discover] + advertise:
1118
+ assert_valid_type(location_type)
1119
+
1120
+ extra_advertisements = smartstack_data.get("extra_advertise", {})
1121
+ for source, destinations in extra_advertisements.items():
1122
+ assert_valid_location(source)
1123
+ for destination in destinations:
1124
+ assert_valid_location(destination)
1125
+ dest_type = destination.split(":")[0]
1126
+ if compare_types(dest_type, discover) > 0:
1127
+ raise ValueError(
1128
+ 'Right hand side "{}" less general than discover type "{}". Your advertisement would potentially '
1129
+ "result in more hosts seeing your service than intended. Please change the type of your RHS to be "
1130
+ ">= the discover type".format(destination, discover),
1131
+ )
1132
+
1133
+
1134
+ def _check_smartstack_valid_proxy(proxied_through: str, soa_dir: str) -> None:
1135
+ """Checks whether its parameter is a valid Smartstack namespace. Can be used for proxied_through or clb_proxy."""
1136
+ proxy_service, proxy_namespace = proxied_through.split(".")
1137
+ proxy_smartstack_filename = Path(soa_dir) / proxy_service / "smartstack.yaml"
1138
+ try:
1139
+ yaml_data = get_config_file_dict(proxy_smartstack_filename)
1140
+ if proxy_namespace not in yaml_data:
1141
+ raise ValueError(
1142
+ f"{proxied_through} is not a valid Smartstack namespace to proxy through: "
1143
+ f"{proxy_namespace} not found in {proxy_smartstack_filename}.",
1144
+ )
1145
+ except FileNotFoundError:
1146
+ raise ValueError(
1147
+ f"{proxied_through} is not a valid Smartstack namespace to proxy through: "
1148
+ f"{proxy_smartstack_filename} does not exist.",
1149
+ )
1150
+
1151
+
1152
+ def _check_smartstack_proxied_through(
1153
+ smartstack_data: dict[str, Any],
1154
+ soa_dir: str,
1155
+ ) -> None: # XXX: we should use a TypedDict here
1156
+ """Checks the proxied_through field of a Smartstack namespace refers to another valid Smartstack namespace"""
1157
+ if "proxied_through" not in smartstack_data:
1158
+ return
1159
+
1160
+ proxied_through = smartstack_data["proxied_through"]
1161
+ _check_smartstack_valid_proxy(proxied_through, soa_dir)
1162
+
1163
+
1164
+ def validate_smartstack(service_path: str) -> bool:
1165
+ if not os.path.exists(os.path.join(service_path, "smartstack.yaml")):
1166
+ # not every service is mesh-registered, exit early if this is the case
1167
+ return True
1168
+
1169
+ config = get_config_file_dict(os.path.join(service_path, "smartstack.yaml"))
1170
+ if not config:
1171
+ print(
1172
+ failure(
1173
+ "smartstack.yaml is empty - if this service is not mesh-registered, please remove this file.",
1174
+ "http://paasta.readthedocs.io/en/latest/yelpsoa_configs.html",
1175
+ )
1176
+ )
1177
+ return False
1178
+
1179
+ soa_dir, service = path_to_soa_dir_service(service_path)
1180
+ for namespace, namespace_config in config.items():
1181
+ # XXX(luisp): these should all really either return bools or be enforced in the schema
1182
+ # ...i'm mostly leaving these as-is since i'm trying to remove some internal code that
1183
+ # duplicates a bunch of paasta validate checks (i.e., py-gitolite)
1184
+ _check_smartstack_name_length_envoy(service, namespace)
1185
+ if namespace_config["proxy_port"]:
1186
+ _check_smartstack_name_length(service, namespace)
1187
+ proxy_port = namespace_config["proxy_port"]
1188
+ _check_proxy_port_in_use(service, namespace, proxy_port)
1189
+ _check_advertise_discover(namespace_config)
1190
+ _check_smartstack_proxied_through(namespace_config, soa_dir)
1191
+
1192
+ print(success("All SmartStack configs are valid"))
1193
+ return True
1194
+
1195
+
981
1196
  def paasta_validate_soa_configs(
982
1197
  service: str, service_path: str, verbose: bool = False
983
1198
  ) -> bool:
@@ -1000,6 +1215,7 @@ def paasta_validate_soa_configs(
1000
1215
  validate_secrets,
1001
1216
  validate_min_max_instances,
1002
1217
  validate_cpu_burst,
1218
+ validate_smartstack,
1003
1219
  ]
1004
1220
 
1005
1221
  # NOTE: we're explicitly passing a list comprehension to all()
@@ -1013,8 +1229,13 @@ def paasta_validate(args):
1013
1229
 
1014
1230
  :param args: argparse.Namespace obj created from sys.args by cli
1015
1231
  """
1016
- service_path = get_service_path(args.service, args.yelpsoa_config_root)
1017
1232
  service = args.service or guess_service_name()
1233
+ service_path = get_service_path(service, args.yelpsoa_config_root)
1234
+
1235
+ # not much we can do if we have no path to inspect ;)
1236
+ if not service_path:
1237
+ return 1
1238
+
1018
1239
  if not paasta_validate_soa_configs(service, service_path, args.verbose):
1019
1240
  print("Invalid configs found. Please try again.")
1020
1241
  return 1
@@ -10,8 +10,9 @@
10
10
  "cpu",
11
11
  "piscina",
12
12
  "gunicorn",
13
- "arbitrary_promql",
14
- "active-requests"
13
+ "active-requests",
14
+ "arbitrary-promql",
15
+ "worker-load"
15
16
  ]
16
17
  },
17
18
  "decision_policy": {