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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (304) hide show
  1. {paasta-tools-1.17.2/paasta_tools.egg-info → paasta-tools-1.19.0}/PKG-INFO +1 -1
  2. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/__init__.py +1 -1
  3. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/api/api_docs/swagger.json +23 -1
  4. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/api/views/remote_run.py +8 -0
  5. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/remote_run.py +57 -20
  6. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/schemas/adhoc_schema.json +12 -0
  7. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/schemas/eks_schema.json +3 -0
  8. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/schemas/kubernetes_schema.json +3 -0
  9. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/kubernetes/remote_run.py +92 -8
  10. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/kubernetes_tools.py +25 -2
  11. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/__init__.py +1 -1
  12. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/api/autoscaler_api.py +1 -1
  13. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/api/default_api.py +1 -1
  14. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/api/remote_run_api.py +18 -2
  15. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/api/resources_api.py +1 -1
  16. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/api/service_api.py +1 -1
  17. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/api_client.py +1 -1
  18. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/configuration.py +2 -2
  19. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/exceptions.py +1 -1
  20. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/adhoc_launch_history.py +1 -1
  21. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/autoscaler_count_msg.py +1 -1
  22. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/deploy_queue.py +1 -1
  23. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/deploy_queue_service_instance.py +1 -1
  24. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/envoy_backend.py +1 -1
  25. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/envoy_location.py +1 -1
  26. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/envoy_status.py +1 -1
  27. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/flink_cluster_overview.py +1 -1
  28. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/flink_config.py +1 -1
  29. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/flink_job.py +1 -1
  30. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/flink_job_details.py +1 -1
  31. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/flink_jobs.py +1 -1
  32. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/float_and_error.py +1 -1
  33. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/hpa_metric.py +1 -1
  34. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/inline_object.py +1 -1
  35. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/inline_response200.py +1 -1
  36. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/inline_response2001.py +1 -1
  37. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/instance_bounce_status.py +1 -1
  38. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/instance_mesh_status.py +1 -1
  39. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/instance_status.py +1 -1
  40. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/instance_status_adhoc.py +1 -1
  41. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/instance_status_cassandracluster.py +1 -1
  42. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/instance_status_flink.py +1 -1
  43. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/instance_status_kafkacluster.py +1 -1
  44. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/instance_status_kubernetes.py +1 -1
  45. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/instance_status_kubernetes_autoscaling_status.py +1 -1
  46. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/instance_status_kubernetes_v2.py +1 -1
  47. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/instance_status_tron.py +1 -1
  48. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/instance_tasks.py +1 -1
  49. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/integer_and_error.py +1 -1
  50. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/kubernetes_container.py +1 -1
  51. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/kubernetes_container_v2.py +1 -1
  52. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/kubernetes_healthcheck.py +1 -1
  53. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/kubernetes_pod.py +1 -1
  54. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/kubernetes_pod_event.py +1 -1
  55. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/kubernetes_pod_v2.py +1 -1
  56. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/kubernetes_replica_set.py +1 -1
  57. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/kubernetes_version.py +1 -1
  58. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/remote_run_outcome.py +4 -1
  59. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/remote_run_start.py +4 -1
  60. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/remote_run_stop.py +4 -1
  61. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/remote_run_token.py +1 -1
  62. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/resource.py +1 -1
  63. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/resource_item.py +1 -1
  64. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/resource_value.py +1 -1
  65. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/smartstack_backend.py +1 -1
  66. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/smartstack_location.py +1 -1
  67. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/smartstack_status.py +1 -1
  68. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/task_tail_lines.py +1 -1
  69. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model_utils.py +1 -1
  70. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/rest.py +1 -1
  71. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/utils.py +6 -0
  72. {paasta-tools-1.17.2 → paasta-tools-1.19.0/paasta_tools.egg-info}/PKG-INFO +1 -1
  73. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/LICENSE +0 -0
  74. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/MANIFEST.in +0 -0
  75. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/README.md +0 -0
  76. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/k8s_itests/__init__.py +0 -0
  77. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/k8s_itests/test_autoscaling.py +0 -0
  78. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/k8s_itests/utils.py +0 -0
  79. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/adhoc_tools.py +0 -0
  80. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/api/__init__.py +0 -0
  81. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/api/api.py +0 -0
  82. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/api/client.py +0 -0
  83. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/api/settings.py +0 -0
  84. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/api/tweens/__init__.py +0 -0
  85. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/api/tweens/auth.py +0 -0
  86. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/api/tweens/profiling.py +0 -0
  87. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/api/tweens/request_logger.py +0 -0
  88. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/api/views/__init__.py +0 -0
  89. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/api/views/autoscaler.py +0 -0
  90. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/api/views/exception.py +0 -0
  91. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/api/views/flink.py +0 -0
  92. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/api/views/instance.py +0 -0
  93. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/api/views/pause_autoscaler.py +0 -0
  94. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/api/views/resources.py +0 -0
  95. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/api/views/service.py +0 -0
  96. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/api/views/version.py +0 -0
  97. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/apply_external_resources.py +0 -0
  98. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/async_utils.py +0 -0
  99. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/autoscaling/__init__.py +0 -0
  100. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/autoscaling/autoscaling_service_lib.py +0 -0
  101. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/autoscaling/forecasting.py +0 -0
  102. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/autoscaling/max_all_k8s_services.py +0 -0
  103. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/autoscaling/pause_service_autoscaler.py +0 -0
  104. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/autoscaling/utils.py +0 -0
  105. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/bounce_lib.py +0 -0
  106. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/broadcast_log_to_services.py +0 -0
  107. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cassandracluster_tools.py +0 -0
  108. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/check_autoscaler_max_instances.py +0 -0
  109. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/check_cassandracluster_services_replication.py +0 -0
  110. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/check_flink_services_health.py +0 -0
  111. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/check_kubernetes_api.py +0 -0
  112. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/check_kubernetes_services_replication.py +0 -0
  113. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/check_oom_events.py +0 -0
  114. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/check_services_replication_tools.py +0 -0
  115. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/check_spark_jobs.py +0 -0
  116. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cleanup_kubernetes_cr.py +0 -0
  117. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cleanup_kubernetes_crd.py +0 -0
  118. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cleanup_kubernetes_jobs.py +0 -0
  119. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cleanup_tron_namespaces.py +0 -0
  120. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/__init__.py +0 -0
  121. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/authentication.py +0 -0
  122. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/cli.py +0 -0
  123. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/__init__.py +0 -0
  124. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/autoscale.py +0 -0
  125. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/check.py +0 -0
  126. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/cook_image.py +0 -0
  127. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/get_docker_image.py +0 -0
  128. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/get_image_version.py +0 -0
  129. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/get_latest_deployment.py +0 -0
  130. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/info.py +0 -0
  131. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/itest.py +0 -0
  132. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/list.py +0 -0
  133. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/list_clusters.py +0 -0
  134. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/list_deploy_queue.py +0 -0
  135. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/list_namespaces.py +0 -0
  136. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/local_run.py +0 -0
  137. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/logs.py +0 -0
  138. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/mark_for_deployment.py +0 -0
  139. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/mesh_status.py +0 -0
  140. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/pause_service_autoscaler.py +0 -0
  141. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/push_to_registry.py +0 -0
  142. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/rollback.py +0 -0
  143. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/secret.py +0 -0
  144. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/security_check.py +0 -0
  145. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/spark_run.py +0 -0
  146. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/start_stop_restart.py +0 -0
  147. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/status.py +0 -0
  148. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/validate.py +0 -0
  149. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/wait_for_deployment.py +0 -0
  150. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/fsm/__init__.py +0 -0
  151. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/fsm/autosuggest.py +0 -0
  152. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/fsm/template/README.md +0 -0
  153. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/fsm/template/cookiecutter.json +0 -0
  154. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/fsm/template/{{cookiecutter.service}}/kubernetes-PROD.yaml +0 -0
  155. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/fsm/template/{{cookiecutter.service}}/monitoring.yaml +0 -0
  156. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/fsm/template/{{cookiecutter.service}}/service.yaml +0 -0
  157. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/fsm/template/{{cookiecutter.service}}/smartstack.yaml +0 -0
  158. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/fsm_cmd.py +0 -0
  159. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/paasta_tabcomplete.sh +0 -0
  160. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/schemas/autoscaling_schema.json +0 -0
  161. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/schemas/autotuned_defaults/cassandracluster_schema.json +0 -0
  162. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/schemas/autotuned_defaults/kubernetes_schema.json +0 -0
  163. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/schemas/deploy_schema.json +0 -0
  164. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/schemas/rollback_schema.json +0 -0
  165. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/schemas/service_schema.json +0 -0
  166. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/schemas/smartstack_schema.json +0 -0
  167. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/schemas/tron_schema.json +0 -0
  168. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/utils.py +0 -0
  169. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/clusterman.py +0 -0
  170. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/config_utils.py +0 -0
  171. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/contrib/__init__.py +0 -0
  172. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/contrib/bounce_log_latency_parser.py +0 -0
  173. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/contrib/check_manual_oapi_changes.sh +0 -0
  174. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/contrib/check_orphans.py +0 -0
  175. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/contrib/create_dynamodb_table.py +0 -0
  176. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/contrib/create_paasta_playground.py +0 -0
  177. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/contrib/emit_allocated_cpu_metrics.py +0 -0
  178. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/contrib/get_running_task_allocation.py +0 -0
  179. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/contrib/habitat_fixer.py +0 -0
  180. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/contrib/ide_helper.py +0 -0
  181. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/contrib/is_pod_healthy_in_proxy.py +0 -0
  182. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/contrib/is_pod_healthy_in_smartstack.py +0 -0
  183. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/contrib/kill_bad_containers.py +0 -0
  184. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/contrib/mass-deploy-tag.sh +0 -0
  185. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/contrib/mock_patch_checker.py +0 -0
  186. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/contrib/paasta_update_soa_memcpu.py +0 -0
  187. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/contrib/render_template.py +0 -0
  188. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/contrib/rightsizer_soaconfigs_update.py +0 -0
  189. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/contrib/service_shard_remove.py +0 -0
  190. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/contrib/service_shard_update.py +0 -0
  191. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/contrib/shared_ip_check.py +0 -0
  192. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/contrib/timeouts_metrics_prom.py +0 -0
  193. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/delete_kubernetes_deployments.py +0 -0
  194. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/deployment_utils.py +0 -0
  195. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/docker_wrapper.py +0 -0
  196. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/docker_wrapper_imports.py +0 -0
  197. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/drain_lib.py +0 -0
  198. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/dump_locally_running_services.py +0 -0
  199. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/eks_tools.py +0 -0
  200. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/envoy_tools.py +0 -0
  201. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/firewall.py +0 -0
  202. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/firewall_logging.py +0 -0
  203. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/firewall_update.py +0 -0
  204. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/flink_tools.py +0 -0
  205. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/flinkeks_tools.py +0 -0
  206. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/frameworks/__init__.py +0 -0
  207. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/frameworks/adhoc_scheduler.py +0 -0
  208. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/frameworks/constraints.py +0 -0
  209. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/frameworks/native_scheduler.py +0 -0
  210. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/frameworks/native_service_config.py +0 -0
  211. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/frameworks/task_store.py +0 -0
  212. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/generate_all_deployments +0 -0
  213. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/generate_authenticating_services.py +0 -0
  214. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/generate_deployments_for_service.py +0 -0
  215. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/generate_services_file.py +0 -0
  216. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/generate_services_yaml.py +0 -0
  217. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/hacheck.py +0 -0
  218. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/instance/__init__.py +0 -0
  219. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/instance/hpa_metrics_parser.py +0 -0
  220. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/instance/kubernetes.py +0 -0
  221. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/iptables.py +0 -0
  222. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/kafkacluster_tools.py +0 -0
  223. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/kubernetes/__init__.py +0 -0
  224. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/kubernetes/application/__init__.py +0 -0
  225. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/kubernetes/application/controller_wrappers.py +0 -0
  226. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/kubernetes/application/tools.py +0 -0
  227. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/kubernetes/bin/__init__.py +0 -0
  228. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/kubernetes/bin/kubernetes_remove_evicted_pods.py +0 -0
  229. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/kubernetes/bin/paasta_cleanup_remote_run_resources.py +0 -0
  230. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/kubernetes/bin/paasta_cleanup_stale_nodes.py +0 -0
  231. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/kubernetes/bin/paasta_secrets_sync.py +0 -0
  232. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/list_kubernetes_service_instances.py +0 -0
  233. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/list_tron_namespaces.py +0 -0
  234. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/long_running_service_tools.py +0 -0
  235. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/mac_address.py +0 -0
  236. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/marathon_dashboard.py +0 -0
  237. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/mesos/__init__.py +0 -0
  238. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/mesos/cfg.py +0 -0
  239. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/mesos/cluster.py +0 -0
  240. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/mesos/exceptions.py +0 -0
  241. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/mesos/framework.py +0 -0
  242. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/mesos/log.py +0 -0
  243. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/mesos/master.py +0 -0
  244. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/mesos/mesos_file.py +0 -0
  245. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/mesos/parallel.py +0 -0
  246. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/mesos/slave.py +0 -0
  247. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/mesos/task.py +0 -0
  248. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/mesos/util.py +0 -0
  249. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/mesos/zookeeper.py +0 -0
  250. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/mesos_maintenance.py +0 -0
  251. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/mesos_tools.py +0 -0
  252. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/metrics/__init__.py +0 -0
  253. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/metrics/metastatus_lib.py +0 -0
  254. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/metrics/metrics_lib.py +0 -0
  255. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/monitoring/__init__.py +0 -0
  256. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/monitoring/check_k8s_api_performance.py +0 -0
  257. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/monitoring_tools.py +0 -0
  258. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/monkrelaycluster_tools.py +0 -0
  259. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/nrtsearchservice_tools.py +0 -0
  260. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/nrtsearchserviceeks_tools.py +0 -0
  261. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/oom_logger.py +0 -0
  262. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paasta_deploy_tron_jobs +0 -0
  263. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paasta_execute_docker_command.py +0 -0
  264. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paasta_native_serviceinit.py +0 -0
  265. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paasta_service_config_loader.py +0 -0
  266. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/api/__init__.py +0 -0
  267. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/apis/__init__.py +0 -0
  268. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/__init__.py +0 -0
  269. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/models/__init__.py +0 -0
  270. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/prune_completed_pods.py +0 -0
  271. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/puppet_service_tools.py +0 -0
  272. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/py.typed +0 -0
  273. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/remote_git.py +0 -0
  274. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/run-paasta-api-in-dev-mode.py +0 -0
  275. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/run-paasta-api-playground.py +0 -0
  276. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/secret_providers/__init__.py +0 -0
  277. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/secret_providers/vault.py +0 -0
  278. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/secret_tools.py +0 -0
  279. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/setup_istio_mesh.py +0 -0
  280. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/setup_kubernetes_cr.py +0 -0
  281. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/setup_kubernetes_crd.py +0 -0
  282. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/setup_kubernetes_internal_crd.py +0 -0
  283. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/setup_kubernetes_job.py +0 -0
  284. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/setup_prometheus_adapter_config.py +0 -0
  285. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/setup_tron_namespace.py +0 -0
  286. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/slack.py +0 -0
  287. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/smartstack_tools.py +0 -0
  288. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/spark_tools.py +0 -0
  289. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/synapse_srv_namespaces_fact.py +0 -0
  290. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/tron/__init__.py +0 -0
  291. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/tron/client.py +0 -0
  292. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/tron/tron_command_context.py +0 -0
  293. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/tron/tron_timeutils.py +0 -0
  294. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/tron_tools.py +0 -0
  295. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/yaml_tools.py +0 -0
  296. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools.egg-info/SOURCES.txt +0 -0
  297. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools.egg-info/dependency_links.txt +0 -0
  298. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools.egg-info/entry_points.txt +0 -0
  299. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools.egg-info/requires.txt +0 -0
  300. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools.egg-info/top_level.txt +0 -0
  301. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/pyproject.toml +0 -0
  302. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/requirements-minimal.txt +0 -0
  303. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/setup.cfg +0 -0
  304. {paasta-tools-1.17.2 → paasta-tools-1.19.0}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 1.2
2
2
  Name: paasta-tools
3
- Version: 1.17.2
3
+ Version: 1.19.0
4
4
  Summary: Tools for Yelps SOA infrastructure
5
5
  Home-page: UNKNOWN
6
6
  Author: Compute Infrastructure @ Yelp
@@ -17,4 +17,4 @@
17
17
  # setup phase, the dependencies may not exist on disk yet.
18
18
  #
19
19
  # Don't bump version manually. See `make release` docs in ./Makefile
20
- __version__ = "1.17.2"
20
+ __version__ = "1.19.0"
@@ -2,7 +2,7 @@
2
2
  "swagger": "2.0",
3
3
  "info": {
4
4
  "title": "Paasta API",
5
- "version": "1.1.1"
5
+ "version": "1.2.0"
6
6
  },
7
7
  "basePath": "/v1",
8
8
  "schemes": [
@@ -994,6 +994,19 @@
994
994
  "name": "job_name",
995
995
  "required": true,
996
996
  "type": "string"
997
+ },
998
+ {
999
+ "in": "query",
1000
+ "description": "User requesting the job",
1001
+ "name": "user",
1002
+ "required": true,
1003
+ "type": "string"
1004
+ },
1005
+ {
1006
+ "in": "query",
1007
+ "description": "Whether this is a toolbox job",
1008
+ "name": "toolbox",
1009
+ "type": "boolean"
997
1010
  }
998
1011
  ]
999
1012
  }
@@ -2184,6 +2197,9 @@
2184
2197
  },
2185
2198
  "max_duration": {
2186
2199
  "type": "integer"
2200
+ },
2201
+ "toolbox": {
2202
+ "type": "boolean"
2187
2203
  }
2188
2204
  },
2189
2205
  "required": [
@@ -2195,6 +2211,9 @@
2195
2211
  "properties": {
2196
2212
  "user": {
2197
2213
  "type": "string"
2214
+ },
2215
+ "toolbox": {
2216
+ "type": "boolean"
2198
2217
  }
2199
2218
  },
2200
2219
  "required": [
@@ -2213,6 +2232,9 @@
2213
2232
  "pod_name": {
2214
2233
  "type": "string"
2215
2234
  },
2235
+ "pod_address": {
2236
+ "type": "string"
2237
+ },
2216
2238
  "job_name": {
2217
2239
  "type": "string"
2218
2240
  },
@@ -34,6 +34,7 @@ def view_remote_run_start(request):
34
34
  user = request.swagger_data["json_body"]["user"]
35
35
  interactive = request.swagger_data["json_body"].get("interactive", True)
36
36
  recreate = request.swagger_data["json_body"].get("recreate", False)
37
+ is_toolbox = request.swagger_data["json_body"].get("toolbox", False)
37
38
  max_duration = min(
38
39
  request.swagger_data["json_body"].get("max_duration", DEFAULT_MAX_DURATION),
39
40
  get_max_job_duration_limit(),
@@ -47,6 +48,7 @@ def view_remote_run_start(request):
47
48
  interactive=interactive,
48
49
  recreate=recreate,
49
50
  max_duration=max_duration,
51
+ is_toolbox=is_toolbox,
50
52
  )
51
53
  except Exception:
52
54
  error_message = traceback.format_exc()
@@ -58,12 +60,16 @@ def view_remote_run_poll(request):
58
60
  service = request.swagger_data["service"]
59
61
  instance = request.swagger_data["instance"]
60
62
  job_name = request.swagger_data["job_name"]
63
+ user = request.swagger_data["user"]
64
+ is_toolbox = request.swagger_data.get("toolbox", False)
61
65
  try:
62
66
  return remote_run_ready(
63
67
  service=service,
64
68
  instance=instance,
65
69
  cluster=settings.cluster,
66
70
  job_name=job_name,
71
+ user=user,
72
+ is_toolbox=is_toolbox,
67
73
  )
68
74
  except Exception:
69
75
  error_message = traceback.format_exc()
@@ -75,12 +81,14 @@ def view_remote_run_stop(request):
75
81
  service = request.swagger_data["service"]
76
82
  instance = request.swagger_data["instance"]
77
83
  user = request.swagger_data["json_body"]["user"]
84
+ is_toolbox = request.swagger_data["json_body"].get("toolbox", False)
78
85
  try:
79
86
  return remote_run_stop(
80
87
  service=service,
81
88
  instance=instance,
82
89
  cluster=settings.cluster,
83
90
  user=user,
91
+ is_toolbox=is_toolbox,
84
92
  )
85
93
  except Exception:
86
94
  error_message = traceback.format_exc()
@@ -15,14 +15,17 @@
15
15
  import argparse
16
16
  import shutil
17
17
  import time
18
+ from typing import List
18
19
 
19
20
  from paasta_tools.cli.utils import get_paasta_oapi_api_clustername
20
21
  from paasta_tools.cli.utils import get_paasta_oapi_client_with_auth
21
22
  from paasta_tools.cli.utils import lazy_choices_completer
22
23
  from paasta_tools.cli.utils import run_interactive_cli
24
+ from paasta_tools.kubernetes.remote_run import TOOLBOX_MOCK_SERVICE
23
25
  from paasta_tools.paastaapi.model.remote_run_start import RemoteRunStart
24
26
  from paasta_tools.paastaapi.model.remote_run_stop import RemoteRunStop
25
27
  from paasta_tools.utils import get_username
28
+ from paasta_tools.utils import list_all_instances_for_service
26
29
  from paasta_tools.utils import list_clusters
27
30
  from paasta_tools.utils import list_services
28
31
  from paasta_tools.utils import load_system_paasta_config
@@ -34,6 +37,21 @@ KUBECTL_CMD_TEMPLATE = (
34
37
  )
35
38
 
36
39
 
40
+ def _list_services_and_toolboxes() -> List[str]:
41
+ try:
42
+ toolbox_instances = list_all_instances_for_service(
43
+ TOOLBOX_MOCK_SERVICE, instance_type="adhoc"
44
+ )
45
+ except Exception:
46
+ toolbox_instances = set()
47
+ # NOTE: API authorization is enforced by service, and we want different rules
48
+ # for each toolbox, so we combine service and instance in this case to properly
49
+ # allow that to happen.
50
+ return list(list_services()) + sorted(
51
+ f"{TOOLBOX_MOCK_SERVICE}-{instance}" for instance in toolbox_instances
52
+ )
53
+
54
+
37
55
  def paasta_remote_run_start(
38
56
  args: argparse.Namespace,
39
57
  system_paasta_config: SystemPaastaConfig,
@@ -55,6 +73,7 @@ def paasta_remote_run_start(
55
73
  interactive=args.interactive,
56
74
  recreate=args.recreate,
57
75
  max_duration=args.max_duration,
76
+ toolbox=args.toolbox,
58
77
  ),
59
78
  )
60
79
  if start_response.status >= 300:
@@ -67,9 +86,11 @@ def paasta_remote_run_start(
67
86
  start_time = time.time()
68
87
  while time.time() - start_time < args.timeout:
69
88
  poll_response = client.remote_run.remote_run_poll(
70
- args.service,
71
- args.instance,
72
- start_response.job_name,
89
+ service=args.service,
90
+ instance=args.instance,
91
+ job_name=start_response.job_name,
92
+ user=user,
93
+ toolbox=args.toolbox,
73
94
  )
74
95
  if poll_response.status == 200:
75
96
  print("")
@@ -80,25 +101,32 @@ def paasta_remote_run_start(
80
101
  print("Timed out while waiting for job to start")
81
102
  return 1
82
103
 
83
- if not args.interactive:
104
+ if not args.interactive and not args.toolbox:
84
105
  print("Successfully started remote-run job")
85
106
  return 0
86
107
 
87
108
  print("Pod ready, establishing interactive session...")
88
109
 
89
- token_response = client.remote_run.remote_run_token(
90
- args.service, args.instance, user
91
- )
110
+ if args.toolbox:
111
+ # NOTE: we only do this for toolbox containers since those images are built with interactive
112
+ # access in mind, and SSH sessions provide better auditability of user actions.
113
+ # I.e., being `nobody` is fine in a normal remote-run, but in toolbox containers
114
+ # we will require knowing the real user (and some tools may need that too).
115
+ exec_command = f"ssh -A {poll_response.pod_address}"
116
+ else:
117
+ token_response = client.remote_run.remote_run_token(
118
+ args.service, args.instance, user
119
+ )
120
+ kubectl_wrapper = f"kubectl-eks-{args.cluster}"
121
+ if not shutil.which(kubectl_wrapper):
122
+ kubectl_wrapper = f"kubectl-{args.cluster}"
123
+ exec_command = KUBECTL_CMD_TEMPLATE.format(
124
+ kubectl_wrapper=kubectl_wrapper,
125
+ namespace=poll_response.namespace,
126
+ pod=poll_response.pod_name,
127
+ token=token_response.token,
128
+ )
92
129
 
93
- kubectl_wrapper = f"kubectl-eks-{args.cluster}"
94
- if not shutil.which(kubectl_wrapper):
95
- kubectl_wrapper = f"kubectl-{args.cluster}"
96
- exec_command = KUBECTL_CMD_TEMPLATE.format(
97
- kubectl_wrapper=kubectl_wrapper,
98
- namespace=poll_response.namespace,
99
- pod=poll_response.pod_name,
100
- token=token_response.token,
101
- )
102
130
  run_interactive_cli(exec_command)
103
131
  return 0
104
132
 
@@ -115,7 +143,9 @@ def paasta_remote_run_stop(
115
143
  print("Cannot get a paasta-api client")
116
144
  return 1
117
145
  response = client.remote_run.remote_run_stop(
118
- args.service, args.instance, RemoteRunStop(user=get_username())
146
+ args.service,
147
+ args.instance,
148
+ RemoteRunStop(user=get_username(), toolbox=args.toolbox),
119
149
  )
120
150
  print(response.message)
121
151
  return 0 if response.status < 300 else 1
@@ -128,15 +158,22 @@ def add_common_args_to_parser(parser: argparse.ArgumentParser):
128
158
  help="The name of the service you wish to inspect. Required.",
129
159
  required=True,
130
160
  )
131
- service_arg.completer = lazy_choices_completer(list_services) # type: ignore
132
- parser.add_argument(
161
+ service_arg.completer = lazy_choices_completer(_list_services_and_toolboxes) # type: ignore
162
+ instance_or_toolbox = parser.add_mutually_exclusive_group()
163
+ instance_or_toolbox.add_argument(
133
164
  "-i",
134
165
  "--instance",
135
166
  help=(
136
167
  "Simulate a docker run for a particular instance of the "
137
168
  "service, like 'main' or 'canary'. Required."
138
169
  ),
139
- required=True,
170
+ default="main",
171
+ )
172
+ instance_or_toolbox.add_argument(
173
+ "--toolbox",
174
+ help="The selected service is a 'toolbox' container",
175
+ action="store_true",
176
+ default=False,
140
177
  )
141
178
  cluster_arg = parser.add_argument(
142
179
  "-c",
@@ -158,6 +158,9 @@
158
158
  "type": "string"
159
159
  }
160
160
  },
161
+ "privileged": {
162
+ "type": "boolean"
163
+ },
161
164
  "cfs_period_us": {
162
165
  "type": "integer",
163
166
  "minimum": 1000,
@@ -180,6 +183,15 @@
180
183
  },
181
184
  "role": {
182
185
  "type": "string"
186
+ },
187
+ "namespace": {
188
+ "type": "string"
189
+ },
190
+ "container_port": {
191
+ "type": "integer"
192
+ },
193
+ "docker_url": {
194
+ "type": "string"
183
195
  }
184
196
  }
185
197
  }
@@ -837,6 +837,9 @@
837
837
  "routable_ip": {
838
838
  "type": "boolean"
839
839
  },
840
+ "enable_aws_lb_readiness_gate": {
841
+ "type": "boolean"
842
+ },
840
843
  "lifecycle": {
841
844
  "type": "object",
842
845
  "properties": {
@@ -837,6 +837,9 @@
837
837
  "routable_ip": {
838
838
  "type": "boolean"
839
839
  },
840
+ "enable_aws_lb_readiness_gate": {
841
+ "type": "boolean"
842
+ },
840
843
  "lifecycle": {
841
844
  "type": "object",
842
845
  "properties": {
@@ -32,6 +32,8 @@ from kubernetes.client import V1Subject
32
32
  from kubernetes.client import V1TokenRequestSpec
33
33
  from kubernetes.client.exceptions import ApiException
34
34
 
35
+ from paasta_tools.adhoc_tools import load_adhoc_job_config
36
+ from paasta_tools.eks_tools import EksDeploymentConfig
35
37
  from paasta_tools.eks_tools import load_eks_service_config
36
38
  from paasta_tools.kubernetes.application.controller_wrappers import (
37
39
  get_application_wrapper,
@@ -47,6 +49,7 @@ from paasta_tools.utils import load_system_paasta_config
47
49
  logger = logging.getLogger(__name__)
48
50
  REMOTE_RUN_JOB_LABEL = "remote-run"
49
51
  POD_OWNER_LABEL = paasta_prefixed("pod_owner")
52
+ TOOLBOX_MOCK_SERVICE = "prod-toolbox"
50
53
  DEFAULT_MAX_DURATION_LIMIT = 8 * 60 * 60 # 8 hours
51
54
 
52
55
 
@@ -59,6 +62,7 @@ class RemoteRunOutcome(TypedDict, total=False):
59
62
  message: str
60
63
  job_name: str
61
64
  pod_name: str
65
+ pod_address: str
62
66
  namespace: str
63
67
 
64
68
 
@@ -83,6 +87,7 @@ def remote_run_start(
83
87
  interactive: bool,
84
88
  recreate: bool,
85
89
  max_duration: int,
90
+ is_toolbox: bool,
86
91
  ) -> RemoteRunOutcome:
87
92
  """Trigger remote-run job
88
93
 
@@ -93,21 +98,27 @@ def remote_run_start(
93
98
  :param bool interactive: whether it is expected to access the remote-run job interactively
94
99
  :param bool recreate: whether to recreate remote-run job if existing
95
100
  :param int max_duration: maximum allowed duration for the remote-ruh job
101
+ :param bool is_toolbox: requested job is for a toolbox container
96
102
  :return: outcome of the operation, and resulting Kubernetes pod information
97
103
  """
98
104
  kube_client = KubeClient()
99
105
 
100
106
  # Load the service deployment settings
101
- deployment_config = load_eks_service_config(service, instance, cluster)
107
+ deployment_config = (
108
+ generate_toolbox_deployment(service, cluster, user)
109
+ if is_toolbox
110
+ else load_eks_service_config(service, instance, cluster)
111
+ )
102
112
 
103
113
  # Set to interactive mode
104
- if interactive:
114
+ if interactive and not is_toolbox:
105
115
  deployment_config.config_dict["cmd"] = f"sleep {max_duration}"
106
116
 
107
117
  # Create the app with a new name
108
118
  formatted_job = deployment_config.format_kubernetes_job(
109
119
  job_label=REMOTE_RUN_JOB_LABEL,
110
120
  deadline_seconds=max_duration,
121
+ keep_routable_ip=is_toolbox,
111
122
  )
112
123
  job_name = _format_remote_run_job_name(formatted_job, user)
113
124
  formatted_job.metadata.name = job_name
@@ -122,7 +133,13 @@ def remote_run_start(
122
133
  if e.status != 409:
123
134
  raise
124
135
  if recreate:
125
- remote_run_stop(service, instance, cluster, user)
136
+ remote_run_stop(
137
+ service=service,
138
+ instance=instance,
139
+ cluster=cluster,
140
+ user=user,
141
+ is_toolbox=is_toolbox,
142
+ )
126
143
  return remote_run_start(
127
144
  service=service,
128
145
  instance=instance,
@@ -131,6 +148,7 @@ def remote_run_start(
131
148
  interactive=interactive,
132
149
  recreate=False,
133
150
  max_duration=max_duration,
151
+ is_toolbox=is_toolbox,
134
152
  )
135
153
 
136
154
  return {
@@ -141,7 +159,12 @@ def remote_run_start(
141
159
 
142
160
 
143
161
  def remote_run_ready(
144
- service: str, instance: str, cluster: str, job_name: str
162
+ service: str,
163
+ instance: str,
164
+ cluster: str,
165
+ job_name: str,
166
+ user: str,
167
+ is_toolbox: bool,
145
168
  ) -> RemoteRunOutcome:
146
169
  """Check if remote-run pod is ready
147
170
 
@@ -149,24 +172,32 @@ def remote_run_ready(
149
172
  :param str instance: service instance
150
173
  :param str cluster: paasta cluster
151
174
  :param str job_name: name of the remote-run job to check
175
+ :param bool is_toolbox: requested job is for a toolbox container
152
176
  :return: job status, with pod info
153
177
  """
154
178
  kube_client = KubeClient()
155
179
 
156
180
  # Load the service deployment settings
157
- deployment_config = load_eks_service_config(service, instance, cluster)
181
+ deployment_config = (
182
+ generate_toolbox_deployment(service, cluster, user)
183
+ if is_toolbox
184
+ else load_eks_service_config(service, instance, cluster)
185
+ )
158
186
  namespace = deployment_config.get_namespace()
159
187
 
160
188
  pod = find_job_pod(kube_client, namespace, job_name)
161
189
  if not pod:
162
190
  return {"status": 404, "message": "No pod found"}
163
191
  if pod.status.phase == "Running":
164
- return {
192
+ result: RemoteRunOutcome = {
165
193
  "status": 200,
166
194
  "message": "Pod ready",
167
195
  "pod_name": pod.metadata.name,
168
196
  "namespace": namespace,
169
197
  }
198
+ if is_toolbox:
199
+ result["pod_address"] = pod.status.pod_ip
200
+ return result
170
201
  return {
171
202
  "status": 204,
172
203
  "message": "Pod not ready",
@@ -174,7 +205,11 @@ def remote_run_ready(
174
205
 
175
206
 
176
207
  def remote_run_stop(
177
- service: str, instance: str, cluster: str, user: str
208
+ service: str,
209
+ instance: str,
210
+ cluster: str,
211
+ user: str,
212
+ is_toolbox: bool,
178
213
  ) -> RemoteRunOutcome:
179
214
  """Stop remote-run job
180
215
 
@@ -182,12 +217,17 @@ def remote_run_stop(
182
217
  :param str instance: service instance
183
218
  :param str cluster: paasta cluster
184
219
  :param str user: the user requesting the remote-run sandbox
220
+ :param bool is_toolbox: requested job is for a toolbox container
185
221
  :return: outcome of the operation
186
222
  """
187
223
  kube_client = KubeClient()
188
224
 
189
225
  # Load the service deployment settings
190
- deployment_config = load_eks_service_config(service, instance, cluster)
226
+ deployment_config = (
227
+ generate_toolbox_deployment(service, cluster, user)
228
+ if is_toolbox
229
+ else load_eks_service_config(service, instance, cluster)
230
+ )
191
231
 
192
232
  # Rebuild the job metadata
193
233
  formatted_job = deployment_config.format_kubernetes_job(
@@ -244,6 +284,50 @@ def remote_run_token(
244
284
  return create_temp_exec_token(kube_client, namespace, service_account)
245
285
 
246
286
 
287
+ def generate_toolbox_deployment(
288
+ service: str, cluster: str, user: str
289
+ ) -> EksDeploymentConfig:
290
+ """Creates virtual EKS deployment for toolbox containers starting from adhoc configuration
291
+
292
+ :param str service: toolbox name
293
+ :param str cluster: target deployment cluster
294
+ :param str user: user requesting the toolbox
295
+ :return: deployment configuration
296
+ """
297
+ if not user.isalnum():
298
+ raise RemoteRunError(
299
+ f"Provided username contains non-alphanumeric characters: {user}"
300
+ )
301
+ # NOTE: API authorization is enforced by service, and we want different rules
302
+ # for each toolbox, so clients send a combined service-instance string, and then
303
+ # we split it here to load the correct instance settings.
304
+ adhoc_instance = service[len(TOOLBOX_MOCK_SERVICE) + 1 :]
305
+ adhoc_deployment = load_adhoc_job_config(
306
+ TOOLBOX_MOCK_SERVICE,
307
+ adhoc_instance,
308
+ cluster,
309
+ load_deployments=False,
310
+ )
311
+ # NOTE: we're explicitly dynamically mounting a single user's public keys
312
+ # as we want these pods to only be usable by said user.
313
+ adhoc_deployment.config_dict.setdefault("extra_volumes", []).append(
314
+ {
315
+ "containerPath": f"/etc/authorized_keys.d/{user}.pub",
316
+ "hostPath": f"/etc/authorized_keys.d/{user}.pub",
317
+ "mode": "RO",
318
+ },
319
+ )
320
+ adhoc_deployment.config_dict.setdefault("env", {})["SANDBOX_USER"] = user
321
+ adhoc_deployment.config_dict["routable_ip"] = True
322
+ return EksDeploymentConfig(
323
+ service=service,
324
+ cluster=cluster,
325
+ instance="main",
326
+ config_dict=adhoc_deployment.config_dict,
327
+ branch_dict=adhoc_deployment.branch_dict,
328
+ )
329
+
330
+
247
331
  def find_job_pod(
248
332
  kube_client: KubeClient,
249
333
  namespace: str,
@@ -374,6 +374,7 @@ KubePodLabels = TypedDict(
374
374
  "paasta.yelp.com/weight": str,
375
375
  "yelp.com/owner": str,
376
376
  "paasta.yelp.com/managed": str,
377
+ "elbv2.k8s.aws/pod-readiness-gate-inject": str,
377
378
  },
378
379
  total=False,
379
380
  )
@@ -439,6 +440,7 @@ class KubernetesDeploymentConfigDict(LongRunningServiceConfigDict, total=False):
439
440
  crypto_keys: CryptoKeyConfig
440
441
  datastore_credentials: DatastoreCredentialsConfig
441
442
  topology_spread_constraints: List[TopologySpreadConstraintDict]
443
+ enable_aws_lb_readiness_gate: bool
442
444
 
443
445
 
444
446
  def load_kubernetes_service_config_no_cache(
@@ -1418,8 +1420,18 @@ class KubernetesDeploymentConfig(LongRunningServiceConfig):
1418
1420
 
1419
1421
  def get_security_context(self) -> Optional[V1SecurityContext]:
1420
1422
  cap_add = self.config_dict.get("cap_add", None)
1423
+ context_kwargs = (
1424
+ # passing parameter like this to avoid all services to bounce
1425
+ # when this change is released
1426
+ {"privileged": self.config_dict["privileged"]}
1427
+ if "privileged" in self.config_dict
1428
+ else {}
1429
+ )
1421
1430
  if cap_add is None:
1422
- return V1SecurityContext(capabilities=V1Capabilities(drop=CAPS_DROP))
1431
+ return V1SecurityContext(
1432
+ capabilities=V1Capabilities(drop=CAPS_DROP),
1433
+ **context_kwargs,
1434
+ )
1423
1435
  else:
1424
1436
  return V1SecurityContext(
1425
1437
  # XXX: we should probably generally work in sets, but V1Capabilities is typed as accepting
@@ -1432,7 +1444,8 @@ class KubernetesDeploymentConfig(LongRunningServiceConfig):
1432
1444
  # WARNING: this must be sorted - otherwise the order of the capabilities will be different
1433
1445
  # on every setup_kubernetes_job run and cause unnecessary redeployments
1434
1446
  drop=sorted(list(set(CAPS_DROP) - set(cap_add))),
1435
- )
1447
+ ),
1448
+ **context_kwargs,
1436
1449
  )
1437
1450
 
1438
1451
  def get_kubernetes_containers(
@@ -2216,6 +2229,9 @@ class KubernetesDeploymentConfig(LongRunningServiceConfig):
2216
2229
  return "true"
2217
2230
  return "false"
2218
2231
 
2232
+ def should_enable_aws_lb_readiness_gate(self) -> bool:
2233
+ return self.config_dict.get("enable_aws_lb_readiness_gate", False)
2234
+
2219
2235
  def get_pod_template_spec(
2220
2236
  self,
2221
2237
  git_sha: str,
@@ -2398,6 +2414,13 @@ class KubernetesDeploymentConfig(LongRunningServiceConfig):
2398
2414
  labels["paasta.yelp.com/deploy_group"] = self.get_deploy_group()
2399
2415
  labels["paasta.yelp.com/scrape_gunicorn_prometheus"] = "true"
2400
2416
 
2417
+ # the default AWS LB Controller behavior is to enable this by-namespace
2418
+ # ...but that's kinda annoying to do in a toggleable way - so let's instead
2419
+ # toggle based on pod labels (which of course, will require changing the controller
2420
+ # settings :p)
2421
+ if self.should_enable_aws_lb_readiness_gate():
2422
+ labels["elbv2.k8s.aws/pod-readiness-gate-inject"] = "enabled"
2423
+
2401
2424
  return V1PodTemplateSpec(
2402
2425
  metadata=V1ObjectMeta(
2403
2426
  labels=labels,
@@ -7,7 +7,7 @@
7
7
 
8
8
  No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) # noqa: E501
9
9
 
10
- The version of the OpenAPI document: 1.1.1
10
+ The version of the OpenAPI document: 1.2.0
11
11
  Generated by: https://openapi-generator.tech
12
12
  """
13
13
 
@@ -5,7 +5,7 @@
5
5
 
6
6
  No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) # noqa: E501
7
7
 
8
- The version of the OpenAPI document: 1.1.1
8
+ The version of the OpenAPI document: 1.2.0
9
9
  Generated by: https://openapi-generator.tech
10
10
  """
11
11
 
@@ -5,7 +5,7 @@
5
5
 
6
6
  No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) # noqa: E501
7
7
 
8
- The version of the OpenAPI document: 1.1.1
8
+ The version of the OpenAPI document: 1.2.0
9
9
  Generated by: https://openapi-generator.tech
10
10
  """
11
11