paasta-tools 1.21.4__tar.gz → 1.23.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 (358) hide show
  1. {paasta_tools-1.21.4/paasta_tools.egg-info → paasta_tools-1.23.0}/PKG-INFO +2 -2
  2. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/__init__.py +1 -1
  3. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/api/api.py +5 -0
  4. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/api/api_docs/swagger.json +95 -0
  5. paasta_tools-1.23.0/paasta_tools/api/views/autoscaler.py +222 -0
  6. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/cli/cmds/autoscale.py +126 -7
  7. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/cli/cmds/remote_run.py +40 -4
  8. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/cli/cmds/spark_run.py +15 -0
  9. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/kubernetes/application/controller_wrappers.py +16 -2
  10. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/kubernetes/remote_run.py +2 -0
  11. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/kubernetes_tools.py +77 -1
  12. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/api/autoscaler_api.py +140 -1
  13. paasta_tools-1.23.0/paasta_tools/paastaapi/model/autoscaling_override.py +180 -0
  14. paasta_tools-1.23.0/paasta_tools/paastaapi/model/inline_response202.py +182 -0
  15. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/models/__init__.py +2 -0
  16. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/setup_kubernetes_job.py +105 -1
  17. {paasta_tools-1.21.4 → paasta_tools-1.23.0/paasta_tools.egg-info}/PKG-INFO +2 -2
  18. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools.egg-info/SOURCES.txt +2 -0
  19. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools.egg-info/requires.txt +1 -1
  20. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/requirements-minimal.txt +1 -1
  21. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/tests/test_setup_kubernetes_job.py +12 -3
  22. paasta_tools-1.21.4/paasta_tools/api/views/autoscaler.py +0 -100
  23. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/LICENSE +0 -0
  24. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/MANIFEST.in +0 -0
  25. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/README.md +0 -0
  26. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/k8s_itests/__init__.py +0 -0
  27. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/k8s_itests/test_autoscaling.py +0 -0
  28. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/k8s_itests/utils.py +0 -0
  29. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/adhoc_tools.py +0 -0
  30. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/api/__init__.py +0 -0
  31. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/api/client.py +0 -0
  32. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/api/settings.py +0 -0
  33. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/api/tweens/__init__.py +0 -0
  34. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/api/tweens/auth.py +0 -0
  35. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/api/tweens/profiling.py +0 -0
  36. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/api/tweens/request_logger.py +0 -0
  37. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/api/views/__init__.py +0 -0
  38. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/api/views/exception.py +0 -0
  39. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/api/views/flink.py +0 -0
  40. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/api/views/instance.py +0 -0
  41. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/api/views/pause_autoscaler.py +0 -0
  42. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/api/views/remote_run.py +0 -0
  43. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/api/views/resources.py +0 -0
  44. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/api/views/service.py +0 -0
  45. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/api/views/version.py +0 -0
  46. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/apply_external_resources.py +0 -0
  47. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/async_utils.py +0 -0
  48. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/autoscaling/__init__.py +0 -0
  49. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/autoscaling/autoscaling_service_lib.py +0 -0
  50. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/autoscaling/forecasting.py +0 -0
  51. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/autoscaling/max_all_k8s_services.py +0 -0
  52. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/autoscaling/pause_service_autoscaler.py +0 -0
  53. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/autoscaling/utils.py +0 -0
  54. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/bounce_lib.py +0 -0
  55. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/broadcast_log_to_services.py +0 -0
  56. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/cassandracluster_tools.py +0 -0
  57. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/check_autoscaler_max_instances.py +0 -0
  58. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/check_cassandracluster_services_replication.py +0 -0
  59. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/check_flink_services_health.py +0 -0
  60. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/check_kubernetes_api.py +0 -0
  61. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/check_kubernetes_services_replication.py +0 -0
  62. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/check_oom_events.py +0 -0
  63. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/check_services_replication_tools.py +0 -0
  64. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/check_spark_jobs.py +0 -0
  65. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/cleanup_kubernetes_cr.py +0 -0
  66. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/cleanup_kubernetes_crd.py +0 -0
  67. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/cleanup_kubernetes_jobs.py +0 -0
  68. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/cleanup_tron_namespaces.py +0 -0
  69. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/cli/__init__.py +0 -0
  70. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/cli/authentication.py +0 -0
  71. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/cli/cli.py +0 -0
  72. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/cli/cmds/__init__.py +0 -0
  73. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/cli/cmds/check.py +0 -0
  74. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/cli/cmds/cook_image.py +0 -0
  75. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/cli/cmds/get_docker_image.py +0 -0
  76. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/cli/cmds/get_image_version.py +0 -0
  77. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/cli/cmds/get_latest_deployment.py +0 -0
  78. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/cli/cmds/info.py +0 -0
  79. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/cli/cmds/itest.py +0 -0
  80. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/cli/cmds/list.py +0 -0
  81. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/cli/cmds/list_clusters.py +0 -0
  82. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/cli/cmds/list_deploy_queue.py +0 -0
  83. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/cli/cmds/list_namespaces.py +0 -0
  84. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/cli/cmds/local_run.py +0 -0
  85. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/cli/cmds/logs.py +0 -0
  86. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/cli/cmds/mark_for_deployment.py +0 -0
  87. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/cli/cmds/mesh_status.py +0 -0
  88. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/cli/cmds/pause_service_autoscaler.py +0 -0
  89. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/cli/cmds/push_to_registry.py +0 -0
  90. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/cli/cmds/rollback.py +0 -0
  91. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/cli/cmds/secret.py +0 -0
  92. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/cli/cmds/security_check.py +0 -0
  93. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/cli/cmds/start_stop_restart.py +0 -0
  94. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/cli/cmds/status.py +0 -0
  95. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/cli/cmds/validate.py +0 -0
  96. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/cli/cmds/wait_for_deployment.py +0 -0
  97. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/cli/fsm/__init__.py +0 -0
  98. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/cli/fsm/autosuggest.py +0 -0
  99. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/cli/fsm/template/README.md +0 -0
  100. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/cli/fsm/template/cookiecutter.json +0 -0
  101. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/cli/fsm/template/{{cookiecutter.service}}/kubernetes-PROD.yaml +0 -0
  102. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/cli/fsm/template/{{cookiecutter.service}}/monitoring.yaml +0 -0
  103. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/cli/fsm/template/{{cookiecutter.service}}/service.yaml +0 -0
  104. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/cli/fsm/template/{{cookiecutter.service}}/smartstack.yaml +0 -0
  105. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/cli/fsm_cmd.py +0 -0
  106. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/cli/paasta_tabcomplete.sh +0 -0
  107. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/cli/schemas/adhoc_schema.json +0 -0
  108. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/cli/schemas/autoscaling_schema.json +0 -0
  109. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/cli/schemas/autotuned_defaults/cassandracluster_schema.json +0 -0
  110. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/cli/schemas/autotuned_defaults/kubernetes_schema.json +0 -0
  111. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/cli/schemas/deploy_schema.json +0 -0
  112. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/cli/schemas/eks_schema.json +0 -0
  113. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/cli/schemas/kubernetes_schema.json +0 -0
  114. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/cli/schemas/rollback_schema.json +0 -0
  115. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/cli/schemas/service_schema.json +0 -0
  116. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/cli/schemas/smartstack_schema.json +0 -0
  117. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/cli/schemas/tron_schema.json +0 -0
  118. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/cli/utils.py +0 -0
  119. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/clusterman.py +0 -0
  120. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/config_utils.py +0 -0
  121. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/contrib/__init__.py +0 -0
  122. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/contrib/bounce_log_latency_parser.py +0 -0
  123. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/contrib/check_manual_oapi_changes.sh +0 -0
  124. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/contrib/check_orphans.py +0 -0
  125. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/contrib/create_dynamodb_table.py +0 -0
  126. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/contrib/create_paasta_playground.py +0 -0
  127. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/contrib/emit_allocated_cpu_metrics.py +0 -0
  128. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/contrib/get_running_task_allocation.py +0 -0
  129. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/contrib/habitat_fixer.py +0 -0
  130. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/contrib/ide_helper.py +0 -0
  131. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/contrib/is_pod_healthy_in_proxy.py +0 -0
  132. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/contrib/is_pod_healthy_in_smartstack.py +0 -0
  133. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/contrib/kill_bad_containers.py +0 -0
  134. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/contrib/mass-deploy-tag.sh +0 -0
  135. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/contrib/mock_patch_checker.py +0 -0
  136. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/contrib/paasta_update_soa_memcpu.py +0 -0
  137. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/contrib/render_template.py +0 -0
  138. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/contrib/rightsizer_soaconfigs_update.py +0 -0
  139. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/contrib/service_shard_remove.py +0 -0
  140. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/contrib/service_shard_update.py +0 -0
  141. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/contrib/shared_ip_check.py +0 -0
  142. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/contrib/timeouts_metrics_prom.py +0 -0
  143. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/delete_kubernetes_deployments.py +0 -0
  144. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/deployment_utils.py +0 -0
  145. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/docker_wrapper.py +0 -0
  146. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/docker_wrapper_imports.py +0 -0
  147. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/drain_lib.py +0 -0
  148. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/dump_locally_running_services.py +0 -0
  149. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/eks_tools.py +0 -0
  150. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/envoy_tools.py +0 -0
  151. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/firewall.py +0 -0
  152. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/firewall_logging.py +0 -0
  153. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/firewall_update.py +0 -0
  154. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/flink_tools.py +0 -0
  155. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/flinkeks_tools.py +0 -0
  156. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/frameworks/__init__.py +0 -0
  157. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/frameworks/adhoc_scheduler.py +0 -0
  158. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/frameworks/constraints.py +0 -0
  159. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/frameworks/native_scheduler.py +0 -0
  160. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/frameworks/native_service_config.py +0 -0
  161. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/frameworks/task_store.py +0 -0
  162. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/generate_all_deployments +0 -0
  163. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/generate_authenticating_services.py +0 -0
  164. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/generate_deployments_for_service.py +0 -0
  165. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/generate_services_file.py +0 -0
  166. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/generate_services_yaml.py +0 -0
  167. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/hacheck.py +0 -0
  168. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/instance/__init__.py +0 -0
  169. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/instance/hpa_metrics_parser.py +0 -0
  170. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/instance/kubernetes.py +0 -0
  171. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/iptables.py +0 -0
  172. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/kafkacluster_tools.py +0 -0
  173. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/kubernetes/__init__.py +0 -0
  174. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/kubernetes/application/__init__.py +0 -0
  175. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/kubernetes/application/tools.py +0 -0
  176. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/kubernetes/bin/__init__.py +0 -0
  177. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/kubernetes/bin/kubernetes_remove_evicted_pods.py +0 -0
  178. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/kubernetes/bin/paasta_cleanup_remote_run_resources.py +0 -0
  179. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/kubernetes/bin/paasta_cleanup_stale_nodes.py +0 -0
  180. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/kubernetes/bin/paasta_secrets_sync.py +0 -0
  181. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/list_kubernetes_service_instances.py +0 -0
  182. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/list_tron_namespaces.py +0 -0
  183. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/long_running_service_tools.py +0 -0
  184. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/mac_address.py +0 -0
  185. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/marathon_dashboard.py +0 -0
  186. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/mesos/__init__.py +0 -0
  187. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/mesos/cfg.py +0 -0
  188. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/mesos/cluster.py +0 -0
  189. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/mesos/exceptions.py +0 -0
  190. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/mesos/framework.py +0 -0
  191. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/mesos/log.py +0 -0
  192. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/mesos/master.py +0 -0
  193. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/mesos/mesos_file.py +0 -0
  194. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/mesos/parallel.py +0 -0
  195. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/mesos/slave.py +0 -0
  196. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/mesos/task.py +0 -0
  197. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/mesos/util.py +0 -0
  198. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/mesos/zookeeper.py +0 -0
  199. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/mesos_maintenance.py +0 -0
  200. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/mesos_tools.py +0 -0
  201. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/metrics/__init__.py +0 -0
  202. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/metrics/metastatus_lib.py +0 -0
  203. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/metrics/metrics_lib.py +0 -0
  204. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/monitoring/__init__.py +0 -0
  205. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/monitoring/check_k8s_api_performance.py +0 -0
  206. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/monitoring_tools.py +0 -0
  207. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/monkrelaycluster_tools.py +0 -0
  208. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/nrtsearchservice_tools.py +0 -0
  209. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/nrtsearchserviceeks_tools.py +0 -0
  210. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/oom_logger.py +0 -0
  211. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paasta_deploy_tron_jobs +0 -0
  212. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paasta_execute_docker_command.py +0 -0
  213. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paasta_native_serviceinit.py +0 -0
  214. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paasta_service_config_loader.py +0 -0
  215. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/__init__.py +0 -0
  216. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/api/__init__.py +0 -0
  217. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/api/default_api.py +0 -0
  218. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/api/remote_run_api.py +0 -0
  219. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/api/resources_api.py +0 -0
  220. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/api/service_api.py +0 -0
  221. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/api_client.py +0 -0
  222. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/apis/__init__.py +0 -0
  223. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/configuration.py +0 -0
  224. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/exceptions.py +0 -0
  225. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/model/__init__.py +0 -0
  226. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/model/adhoc_launch_history.py +0 -0
  227. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/model/autoscaler_count_msg.py +0 -0
  228. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/model/deploy_queue.py +0 -0
  229. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/model/deploy_queue_service_instance.py +0 -0
  230. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/model/envoy_backend.py +0 -0
  231. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/model/envoy_location.py +0 -0
  232. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/model/envoy_status.py +0 -0
  233. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/model/flink_cluster_overview.py +0 -0
  234. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/model/flink_config.py +0 -0
  235. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/model/flink_job.py +0 -0
  236. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/model/flink_job_details.py +0 -0
  237. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/model/flink_jobs.py +0 -0
  238. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/model/float_and_error.py +0 -0
  239. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/model/hpa_metric.py +0 -0
  240. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/model/inline_object.py +0 -0
  241. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/model/inline_response200.py +0 -0
  242. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/model/inline_response2001.py +0 -0
  243. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/model/instance_bounce_status.py +0 -0
  244. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/model/instance_mesh_status.py +0 -0
  245. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/model/instance_status.py +0 -0
  246. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/model/instance_status_adhoc.py +0 -0
  247. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/model/instance_status_cassandracluster.py +0 -0
  248. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/model/instance_status_flink.py +0 -0
  249. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/model/instance_status_kafkacluster.py +0 -0
  250. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/model/instance_status_kubernetes.py +0 -0
  251. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/model/instance_status_kubernetes_autoscaling_status.py +0 -0
  252. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/model/instance_status_kubernetes_v2.py +0 -0
  253. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/model/instance_status_tron.py +0 -0
  254. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/model/instance_tasks.py +0 -0
  255. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/model/integer_and_error.py +0 -0
  256. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/model/kubernetes_container.py +0 -0
  257. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/model/kubernetes_container_v2.py +0 -0
  258. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/model/kubernetes_healthcheck.py +0 -0
  259. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/model/kubernetes_pod.py +0 -0
  260. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/model/kubernetes_pod_event.py +0 -0
  261. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/model/kubernetes_pod_v2.py +0 -0
  262. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/model/kubernetes_replica_set.py +0 -0
  263. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/model/kubernetes_version.py +0 -0
  264. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/model/remote_run_outcome.py +0 -0
  265. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/model/remote_run_start.py +0 -0
  266. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/model/remote_run_stop.py +0 -0
  267. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/model/remote_run_token.py +0 -0
  268. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/model/resource.py +0 -0
  269. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/model/resource_item.py +0 -0
  270. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/model/resource_value.py +0 -0
  271. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/model/smartstack_backend.py +0 -0
  272. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/model/smartstack_location.py +0 -0
  273. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/model/smartstack_status.py +0 -0
  274. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/model/task_tail_lines.py +0 -0
  275. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/model_utils.py +0 -0
  276. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/paastaapi/rest.py +0 -0
  277. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/prune_completed_pods.py +0 -0
  278. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/puppet_service_tools.py +0 -0
  279. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/py.typed +0 -0
  280. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/remote_git.py +0 -0
  281. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/run-paasta-api-in-dev-mode.py +0 -0
  282. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/run-paasta-api-playground.py +0 -0
  283. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/secret_providers/__init__.py +0 -0
  284. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/secret_providers/vault.py +0 -0
  285. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/secret_tools.py +0 -0
  286. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/setup_istio_mesh.py +0 -0
  287. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/setup_kubernetes_cr.py +0 -0
  288. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/setup_kubernetes_crd.py +0 -0
  289. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/setup_kubernetes_internal_crd.py +0 -0
  290. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/setup_prometheus_adapter_config.py +0 -0
  291. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/setup_tron_namespace.py +0 -0
  292. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/slack.py +0 -0
  293. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/smartstack_tools.py +0 -0
  294. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/spark_tools.py +0 -0
  295. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/synapse_srv_namespaces_fact.py +0 -0
  296. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/tron/__init__.py +0 -0
  297. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/tron/client.py +0 -0
  298. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/tron/tron_command_context.py +0 -0
  299. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/tron/tron_timeutils.py +0 -0
  300. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/tron_tools.py +0 -0
  301. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/utils.py +0 -0
  302. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools/yaml_tools.py +0 -0
  303. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools.egg-info/dependency_links.txt +0 -0
  304. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools.egg-info/entry_points.txt +0 -0
  305. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/paasta_tools.egg-info/top_level.txt +0 -0
  306. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/pyproject.toml +0 -0
  307. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/setup.cfg +0 -0
  308. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/setup.py +0 -0
  309. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/tests/test_adhoc_tools.py +0 -0
  310. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/tests/test_apply_external_resources.py +0 -0
  311. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/tests/test_async_utils.py +0 -0
  312. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/tests/test_bounce_lib.py +0 -0
  313. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/tests/test_check_flink_services_health.py +0 -0
  314. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/tests/test_check_kubernetes_services_replication.py +0 -0
  315. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/tests/test_check_oom_events.py +0 -0
  316. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/tests/test_check_service_replication_tools.py +0 -0
  317. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/tests/test_check_spark_jobs.py +0 -0
  318. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/tests/test_cleanup_kubernetes_jobs.py +0 -0
  319. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/tests/test_config_utils.py +0 -0
  320. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/tests/test_delete_kubernetes_deployments.py +0 -0
  321. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/tests/test_deployment_utils.py +0 -0
  322. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/tests/test_docker_wrapper.py +0 -0
  323. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/tests/test_drain_lib.py +0 -0
  324. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/tests/test_eks_tools.py +0 -0
  325. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/tests/test_envoy_tools.py +0 -0
  326. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/tests/test_firewall.py +0 -0
  327. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/tests/test_firewall_logging.py +0 -0
  328. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/tests/test_firewall_update.py +0 -0
  329. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/tests/test_flink_tools.py +0 -0
  330. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/tests/test_flinkeks_tools.py +0 -0
  331. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/tests/test_generate_authenticating_services.py +0 -0
  332. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/tests/test_generate_deployments_for_service.py +0 -0
  333. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/tests/test_generate_services_file.py +0 -0
  334. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/tests/test_generate_services_yaml.py +0 -0
  335. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/tests/test_hacheck.py +0 -0
  336. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/tests/test_iptables.py +0 -0
  337. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/tests/test_kubernetes_tools.py +0 -0
  338. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/tests/test_list_kubernetes_service_instances.py +0 -0
  339. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/tests/test_long_running_service_tools.py +0 -0
  340. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/tests/test_mac_address.py +0 -0
  341. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/tests/test_mesos_tools.py +0 -0
  342. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/tests/test_monitoring_tools.py +0 -0
  343. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/tests/test_nrtsearchserviceseks_tools.py +0 -0
  344. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/tests/test_oom_logger.py +0 -0
  345. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/tests/test_paasta_execute_docker_command.py +0 -0
  346. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/tests/test_paasta_service_config_loader.py +0 -0
  347. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/tests/test_puppet_service_tools.py +0 -0
  348. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/tests/test_remote_git.py +0 -0
  349. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/tests/test_secret_tools.py +0 -0
  350. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/tests/test_setup_istio_mesh.py +0 -0
  351. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/tests/test_setup_kubernetes_cr.py +0 -0
  352. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/tests/test_setup_prometheus_adapter_config.py +0 -0
  353. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/tests/test_slack.py +0 -0
  354. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/tests/test_smartstack_tools.py +0 -0
  355. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/tests/test_spark_tools.py +0 -0
  356. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/tests/test_task_processing.py +0 -0
  357. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/tests/test_tron_tools.py +0 -0
  358. {paasta_tools-1.21.4 → paasta_tools-1.23.0}/tests/test_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: paasta-tools
3
- Version: 1.21.4
3
+ Version: 1.23.0
4
4
  Summary: Tools for Yelps SOA infrastructure
5
5
  Author: Compute Infrastructure @ Yelp
6
6
  Author-email: compute-infra@yelp.com
@@ -58,7 +58,7 @@ Requires-Dist: requests-cache>=0.4.10
58
58
  Requires-Dist: retry
59
59
  Requires-Dist: ruamel.yaml
60
60
  Requires-Dist: sensu-plugin
61
- Requires-Dist: service-configuration-lib>=3.3.2
61
+ Requires-Dist: service-configuration-lib>=3.3.3
62
62
  Requires-Dist: signalfx
63
63
  Requires-Dist: slackclient>=1.2.1
64
64
  Requires-Dist: sticht>=1.1.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.21.4"
20
+ __version__ = "1.23.0"
@@ -189,6 +189,11 @@ def make_app(global_config=None):
189
189
  "/v1/service_autoscaler/pause",
190
190
  request_method="GET",
191
191
  )
192
+ config.add_route(
193
+ "service_autoscaler.autoscaling_override.post",
194
+ "/v1/service_autoscaler/{service}/{instance}/autoscaling_override",
195
+ request_method="POST",
196
+ )
192
197
  config.add_route(
193
198
  "remote_run.start",
194
199
  "/v1/remote_run/{service}/{instance}/start",
@@ -279,6 +279,79 @@
279
279
  "operationId": "delete_service_autoscaler_pause"
280
280
  }
281
281
  },
282
+ "/service_autoscaler/{service}/{instance}/autoscaling_override": {
283
+ "post": {
284
+ "operationId": "set_autoscaling_override",
285
+ "parameters": [
286
+ {
287
+ "description": "Service name",
288
+ "in": "path",
289
+ "name": "service",
290
+ "required": true,
291
+ "type": "string"
292
+ },
293
+ {
294
+ "description": "Instance name",
295
+ "in": "path",
296
+ "name": "instance",
297
+ "required": true,
298
+ "type": "string"
299
+ },
300
+ {
301
+ "in": "body",
302
+ "name": "json_body",
303
+ "required": true,
304
+ "schema": {
305
+ "$ref": "#/definitions/AutoscalingOverride"
306
+ }
307
+ }
308
+ ],
309
+ "responses": {
310
+ "202": {
311
+ "description": "Successfully set autoscaling override",
312
+ "schema": {
313
+ "type": "object",
314
+ "properties": {
315
+ "service": {
316
+ "type": "string",
317
+ "description": "Service name"
318
+ },
319
+ "instance": {
320
+ "type": "string",
321
+ "description": "Instance name"
322
+ },
323
+ "min_instances": {
324
+ "type": "integer",
325
+ "description": "Minimum number of instances to run"
326
+ },
327
+ "expire_after": {
328
+ "type": "number",
329
+ "format": "float",
330
+ "description": "Unix timestamp after which the override is no longer valid"
331
+ },
332
+ "status": {
333
+ "type": "string",
334
+ "description": "Status of the operation"
335
+ }
336
+ }
337
+ }
338
+ },
339
+ "400": {
340
+ "description": "Invalid request parameters"
341
+ },
342
+ "501": {
343
+ "description": "Autoscaling not supported for this instance type"
344
+ },
345
+ "500": {
346
+ "description": "Failed to set autoscaling override"
347
+ }
348
+ },
349
+ "summary": "Set a temporary autoscaling override for a service instance",
350
+ "tags": [
351
+ "autoscaler"
352
+ ]
353
+ }
354
+ },
282
355
  "/resources/utilization": {
283
356
  "get": {
284
357
  "responses": {
@@ -964,6 +1037,9 @@
964
1037
  "404": {
965
1038
  "description": "Service instance not found"
966
1039
  },
1040
+ "409": {
1041
+ "description": "A pod was found but is currently being terminated"
1042
+ },
967
1043
  "500": {
968
1044
  "description": "Failure"
969
1045
  }
@@ -1627,6 +1703,25 @@
1627
1703
  }
1628
1704
  }
1629
1705
  },
1706
+ "AutoscalingOverride": {
1707
+ "type": "object",
1708
+ "properties": {
1709
+ "min_instances": {
1710
+ "type": "integer",
1711
+ "description": "Minimum number of instances to run",
1712
+ "minimum": 1
1713
+ },
1714
+ "expire_after": {
1715
+ "type": "number",
1716
+ "format": "float",
1717
+ "description": "Unix timestamp when this override is no longer valid"
1718
+ }
1719
+ },
1720
+ "required": [
1721
+ "min_instances",
1722
+ "expire_after"
1723
+ ]
1724
+ },
1630
1725
  "KubernetesReplicaSet": {
1631
1726
  "type": "object",
1632
1727
  "properties": {
@@ -0,0 +1,222 @@
1
+ #!/usr/bin/env python
2
+ # Copyright 2015-2016 Yelp Inc.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ """
16
+ PaaSTA service list (instances) etc.
17
+ """
18
+ import json
19
+ import logging
20
+ from datetime import datetime
21
+ from datetime import timezone
22
+ from typing import Tuple
23
+
24
+ from kubernetes.client import V1ConfigMap
25
+ from pyramid.response import Response
26
+ from pyramid.view import view_config
27
+
28
+ from paasta_tools.api import settings
29
+ from paasta_tools.api.views.exception import ApiFailure
30
+ from paasta_tools.cli.utils import get_instance_config
31
+ from paasta_tools.kubernetes_tools import AUTOSCALING_OVERRIDES_CONFIGMAP_NAME
32
+ from paasta_tools.kubernetes_tools import AUTOSCALING_OVERRIDES_CONFIGMAP_NAMESPACE
33
+ from paasta_tools.kubernetes_tools import get_or_create_namespaced_configmap
34
+ from paasta_tools.kubernetes_tools import KubernetesDeploymentConfig
35
+ from paasta_tools.kubernetes_tools import patch_namespaced_configmap
36
+
37
+
38
+ log = logging.getLogger(__name__)
39
+
40
+
41
+ @view_config(route_name="service.autoscaler.get", request_method="GET", renderer="json")
42
+ def get_autoscaler_count(request):
43
+ service = request.swagger_data.get("service")
44
+ instance = request.swagger_data.get("instance")
45
+ cluster = settings.cluster
46
+ soa_dir = settings.soa_dir
47
+
48
+ instance_config = get_instance_config(service, instance, cluster, soa_dir)
49
+ if not isinstance(instance_config, (KubernetesDeploymentConfig)):
50
+ error_message = (
51
+ f"Autoscaling is not supported for {service}.{instance} because instance type is not "
52
+ f"kubernetes."
53
+ )
54
+ raise ApiFailure(error_message, 501)
55
+
56
+ response_body = {
57
+ "desired_instances": instance_config.get_instances(),
58
+ "calculated_instances": instance_config.get_instances(with_limit=False),
59
+ }
60
+ return Response(json_body=response_body, status_code=200)
61
+
62
+
63
+ @view_config(
64
+ route_name="service.autoscaler.post", request_method="POST", renderer="json"
65
+ )
66
+ def update_autoscaler_count(request):
67
+ service = request.swagger_data.get("service")
68
+ instance = request.swagger_data.get("instance")
69
+ cluster = settings.cluster
70
+ soa_dir = settings.soa_dir
71
+ desired_instances = request.swagger_data.get("json_body")["desired_instances"]
72
+ if not isinstance(desired_instances, int):
73
+ error_message = 'The provided body does not have an integer value for "desired_instances": {}'.format(
74
+ request.swagger_data.get("json_body")
75
+ )
76
+ raise ApiFailure(error_message, 500)
77
+
78
+ instance_config = get_instance_config(service, instance, cluster, soa_dir, True)
79
+ if not isinstance(instance_config, (KubernetesDeploymentConfig)):
80
+ error_message = (
81
+ f"Autoscaling is not supported for {service}.{instance} because instance type is not "
82
+ f"kubernetes."
83
+ )
84
+ raise ApiFailure(error_message, 501)
85
+
86
+ max_instances = instance_config.get_max_instances()
87
+ if max_instances is None:
88
+ error_message = f"Autoscaling is not enabled for {service}.{instance}"
89
+ raise ApiFailure(error_message, 404)
90
+ min_instances = instance_config.get_min_instances()
91
+
92
+ status = "SUCCESS"
93
+ if desired_instances > max_instances:
94
+ desired_instances = max_instances
95
+ status = (
96
+ "WARNING desired_instances is greater than max_instances %d" % max_instances
97
+ )
98
+ elif desired_instances < min_instances:
99
+ desired_instances = min_instances
100
+ status = (
101
+ "WARNING desired_instances is less than min_instances %d" % min_instances
102
+ )
103
+ try:
104
+ if isinstance(instance_config, KubernetesDeploymentConfig):
105
+ instance_config.set_autoscaled_instances(
106
+ instance_count=desired_instances, kube_client=settings.kubernetes_client
107
+ )
108
+ else:
109
+ instance_config.set_autoscaled_instances(instance_count=desired_instances)
110
+ except Exception as err:
111
+ raise ApiFailure(err, 500)
112
+
113
+ response_body = {"desired_instances": desired_instances, "status": status}
114
+ return Response(json_body=response_body, status_code=202)
115
+
116
+
117
+ def get_or_create_autoscaling_overrides_configmap() -> Tuple[V1ConfigMap, bool]:
118
+ return get_or_create_namespaced_configmap(
119
+ AUTOSCALING_OVERRIDES_CONFIGMAP_NAME,
120
+ namespace=AUTOSCALING_OVERRIDES_CONFIGMAP_NAMESPACE,
121
+ kube_client=settings.kubernetes_client,
122
+ )
123
+
124
+
125
+ @view_config(
126
+ route_name="service_autoscaler.autoscaling_override.post",
127
+ request_method="POST",
128
+ renderer="json",
129
+ )
130
+ def set_autoscaling_override(request):
131
+ """Set a temporary autoscaling override for a service/instance.
132
+
133
+ This endpoint creates or updates a ConfigMap entry with override information
134
+ including expiration time. The override will be applied by the autoscaler.
135
+
136
+ Required parameters:
137
+ - service: The service name
138
+ - instance: The instance name
139
+ - min_instances: The minimum number of instances to enforce
140
+ - expires_after: unix timestamp after which the override is no longer valid
141
+ """
142
+ service = request.swagger_data.get("service")
143
+ instance = request.swagger_data.get("instance")
144
+ cluster = settings.cluster
145
+ soa_dir = settings.soa_dir
146
+
147
+ instance_config = get_instance_config(
148
+ service, instance, cluster, soa_dir, load_deployments=False
149
+ )
150
+ if not isinstance(instance_config, KubernetesDeploymentConfig):
151
+ error_message = (
152
+ f"Autoscaling is not supported for {service}.{instance} because instance type is not "
153
+ f"kubernetes."
154
+ )
155
+ raise ApiFailure(error_message, 501)
156
+
157
+ json_body = request.swagger_data.get("json_body", {})
158
+ min_instances_override = json_body.get("min_instances")
159
+ expire_after = json_body.get("expire_after")
160
+
161
+ if not isinstance(min_instances_override, int) or min_instances_override < 1:
162
+ raise ApiFailure("min_instances must be a positive integer", 400)
163
+
164
+ if not expire_after:
165
+ raise ApiFailure("expire_after is required", 400)
166
+
167
+ max_instances = instance_config.get_max_instances()
168
+ if max_instances is None:
169
+ raise ApiFailure(f"Autoscaling is not enabled for {service}.{instance}", 400)
170
+
171
+ if max_instances < min_instances_override:
172
+ raise ApiFailure(
173
+ f"min_instances ({min_instances_override}) cannot be greater than max_instances ({max_instances})",
174
+ 400,
175
+ )
176
+
177
+ configmap, created = get_or_create_autoscaling_overrides_configmap()
178
+ if created:
179
+ log.info("Created new autoscaling overrides ConfigMap")
180
+ # i dunno why this is necessary, but a newly created configmap doesn't have a data field
181
+ # even when we set it in the create call
182
+ if not configmap.data:
183
+ configmap.data = {}
184
+
185
+ override_data = {
186
+ "min_instances": min_instances_override,
187
+ "created_at": datetime.now(timezone.utc).isoformat(),
188
+ # NOTE: we may want to also allow setting a max_instances override in the future, but if we do that
189
+ # we'd probably want to force folks to either set one or both and share the same expiration time
190
+ "expire_after": expire_after,
191
+ }
192
+
193
+ service_instance = f"{service}.{instance}"
194
+ existing_overrides = (
195
+ json.loads(configmap.data[service_instance])
196
+ if service_instance in configmap.data
197
+ else {}
198
+ )
199
+ merged_overrides = {**existing_overrides, **override_data}
200
+ serialized_overrides = json.dumps(merged_overrides)
201
+
202
+ patch_namespaced_configmap(
203
+ name=AUTOSCALING_OVERRIDES_CONFIGMAP_NAME,
204
+ namespace=AUTOSCALING_OVERRIDES_CONFIGMAP_NAMESPACE,
205
+ # this should only update the single entry for the $service.$instance key
206
+ # ain't k8s grand?
207
+ body={"data": {service_instance: serialized_overrides}},
208
+ kube_client=settings.kubernetes_client,
209
+ )
210
+
211
+ response_body = {
212
+ "service": service,
213
+ "instance": instance,
214
+ "cluster": cluster,
215
+ "min_instances": min_instances_override,
216
+ "expire_after": expire_after,
217
+ "status": "SUCCESS",
218
+ }
219
+ # NOTE: this is an HTTP 202 since actually updating the HPA happens asynchronously
220
+ # through setup_kubernetes_job
221
+ # XXX: should we try to patch things here as well?
222
+ return Response(json_body=response_body, status_code=202)
@@ -13,6 +13,12 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
  import logging
16
+ import time
17
+ from datetime import datetime
18
+ from typing import Optional
19
+
20
+ import pytz
21
+ from pytimeparse.timeparse import timeparse
16
22
 
17
23
  import paasta_tools.paastaapi.models as paastamodels
18
24
  from paasta_tools.api import client
@@ -58,6 +64,24 @@ def add_subparser(subparsers):
58
64
  autoscale_parser.add_argument(
59
65
  "--set", help="Set the number to scale to. Must be an Int.", type=int
60
66
  )
67
+
68
+ # Temporary override options
69
+ override_group = autoscale_parser.add_argument_group("Temporary Override Options")
70
+ override_group.add_argument(
71
+ "--set-min",
72
+ help="Set the minimum number of replicas (must be >= 1). Requires --for parameter.",
73
+ type=lambda x: int(x)
74
+ if int(x) >= 1
75
+ else autoscale_parser.error("Minimum instances must be >= 1"),
76
+ default=None,
77
+ )
78
+ override_group.add_argument(
79
+ "--for",
80
+ dest="duration",
81
+ help="Duration for the temporary override (e.g. '3h', '30m'). Required when using --set-min.",
82
+ default=None,
83
+ )
84
+
61
85
  autoscale_parser.add_argument(
62
86
  "-d",
63
87
  "--soa-dir",
@@ -69,9 +93,46 @@ def add_subparser(subparsers):
69
93
  autoscale_parser.set_defaults(command=paasta_autoscale)
70
94
 
71
95
 
96
+ def parse_duration_to_seconds(duration: str) -> Optional[int]:
97
+ """Parse a duration string like '3h' or '30m' into seconds.
98
+
99
+ Args:
100
+ duration_str: A string representing a duration (e.g., "3h", "30m", "1d")
101
+
102
+ Returns:
103
+ The duration in seconds, or None if parsing failed
104
+ """
105
+ if not duration:
106
+ return None
107
+
108
+ seconds = timeparse(duration)
109
+ return seconds
110
+
111
+
72
112
  def paasta_autoscale(args):
73
113
  log.setLevel(logging.DEBUG)
74
114
  service = figure_out_service_name(args)
115
+
116
+ if args.set_min is not None and not args.duration:
117
+ print(
118
+ PaastaColors.yellow(
119
+ "WARNING: --set-min requires --for parameter to specify duration - defaulting to 30m"
120
+ )
121
+ )
122
+ args.duration = "30m"
123
+
124
+ if args.duration is not None and args.set_min is None:
125
+ print(PaastaColors.red("Error: --for requires --set-min parameter"))
126
+ return 1
127
+
128
+ if args.set is not None and args.set_min is not None:
129
+ print(
130
+ PaastaColors.red(
131
+ "Error: Cannot use both --set and --set-min at the same time"
132
+ )
133
+ )
134
+ return 1
135
+
75
136
  instance_config = next(
76
137
  get_instance_configs_for_service(
77
138
  service=service,
@@ -83,7 +144,7 @@ def paasta_autoscale(args):
83
144
  )
84
145
  if not instance_config:
85
146
  print(
86
- "Could not find config files for this service instance in soaconfigs. Maybe you mispelled an argument?"
147
+ "Could not find config files for this service instance in soaconfigs. Maybe you misspelled an argument?"
87
148
  )
88
149
  return 1
89
150
 
@@ -99,12 +160,15 @@ def paasta_autoscale(args):
99
160
  return 1
100
161
 
101
162
  try:
102
- if args.set is None:
163
+ # get current autoscaler count
164
+ if args.set is None and args.set_min is None:
103
165
  log.debug("Getting the current autoscaler count...")
104
166
  res, status, _ = api.autoscaler.get_autoscaler_count(
105
167
  service=service, instance=args.instance, _return_http_data_only=False
106
168
  )
107
- else:
169
+
170
+ # set desired instances
171
+ elif args.set is not None:
108
172
  log.debug(f"Setting desired instances to {args.set}.")
109
173
  msg = paastamodels.AutoscalerCountMsg(desired_instances=int(args.set))
110
174
  res, status, _ = api.autoscaler.update_autoscaler_count(
@@ -121,16 +185,53 @@ def paasta_autoscale(args):
121
185
  instance=args.instance,
122
186
  cluster=args.cluster,
123
187
  )
188
+
189
+ # set lower bound
190
+ elif args.set_min is not None:
191
+ duration_seconds = parse_duration_to_seconds(args.duration)
192
+ if not duration_seconds:
193
+ print(
194
+ PaastaColors.red(
195
+ f"Error: Invalid duration format '{args.duration}'. "
196
+ f"Please use a format like '3h' or '30m'."
197
+ )
198
+ )
199
+ return 1
200
+ # NOTE: this is explicitly using time.time() since we're doing everything using epoch time
201
+ # for simplicity
202
+ expiration_time = time.time() + duration_seconds
203
+
204
+ log.debug(
205
+ f"Setting minimum instances to {args.set_min} for duration {args.duration}."
206
+ )
207
+ msg = paastamodels.AutoscalingOverride(
208
+ min_instances=args.set_min,
209
+ expire_after=expiration_time,
210
+ )
211
+
212
+ res, status, _ = api.autoscaler.set_autoscaling_override(
213
+ service=service,
214
+ instance=args.instance,
215
+ autoscaling_override=msg,
216
+ _return_http_data_only=False,
217
+ )
218
+ _log_audit(
219
+ action="manual-autoscale-override",
220
+ action_details=str(msg),
221
+ service=service,
222
+ instance=args.instance,
223
+ cluster=args.cluster,
224
+ )
124
225
  except api.api_error as exc:
125
226
  status = exc.status
126
227
 
127
228
  if not 200 <= status <= 299:
128
229
  print(
129
230
  PaastaColors.red(
130
- f"ERROR: '{args.instance}' is not configured to autoscale, "
131
- f"so paasta autoscale could not scale it up on demand. "
231
+ f"ERROR: '{args.instance}' is not configured to autoscale OR you set min_instances above the current max_instances, "
232
+ f"and `paasta autoscale` could not update it. "
132
233
  f"If you want to be able to boost this service, please configure autoscaling for the service "
133
- f"in its config file by setting min and max instances. Example: \n"
234
+ f"in its config file by setting min and max instances appropriately. Example: \n"
134
235
  f"{args.instance}:\n"
135
236
  f" min_instances: 5\n"
136
237
  f" max_instances: 50"
@@ -139,5 +240,23 @@ def paasta_autoscale(args):
139
240
  return 0
140
241
 
141
242
  log.debug(f"Res: {res} Http: {status}")
142
- print(res.desired_instances)
243
+ if not args.set_min:
244
+ print(f"Desired instances: {res.desired_instances}")
245
+ elif args.set_min:
246
+ print(
247
+ f"Temporary override set for {args.service}.{args.instance} with minimum instances: {args.set_min}"
248
+ )
249
+ # folks using this might be in different timezones, so let's convert the expiration time to a few common ones
250
+ # to make it extra clear when the override will expire
251
+ epoch_time = datetime.fromtimestamp(res.expire_after)
252
+ eastern_time = epoch_time.astimezone(pytz.timezone("US/Eastern"))
253
+ pacific_time = epoch_time.astimezone(pytz.timezone("US/Pacific"))
254
+ london_time = epoch_time.astimezone(pytz.timezone("Europe/London"))
255
+
256
+ time_format = "%Y-%m-%d %H:%M:%S %Z%z"
257
+ print(f"The {args.duration} override will expire at:")
258
+ print(f"Eastern Time: {eastern_time.strftime(time_format)}")
259
+ print(f"Pacific Time: {pacific_time.strftime(time_format)}")
260
+ print(f"London Time: {london_time.strftime(time_format)}")
261
+
143
262
  return 0
@@ -14,6 +14,8 @@
14
14
  # limitations under the License.
15
15
  import argparse
16
16
  import shutil
17
+ import subprocess
18
+ import sys
17
19
  import time
18
20
  from typing import List
19
21
 
@@ -32,9 +34,12 @@ from paasta_tools.utils import load_system_paasta_config
32
34
  from paasta_tools.utils import SystemPaastaConfig
33
35
 
34
36
 
35
- KUBECTL_CMD_TEMPLATE = (
37
+ KUBECTL_EXEC_CMD_TEMPLATE = (
36
38
  "{kubectl_wrapper} --token {token} exec -it -n {namespace} {pod} -- /bin/bash"
37
39
  )
40
+ KUBECTL_CP_CMD_TEMPLATE = (
41
+ "{kubectl_wrapper} --token {token} -n {namespace} cp {filename} {pod}:/tmp/"
42
+ )
38
43
 
39
44
 
40
45
  def _list_services_and_toolboxes() -> List[str]:
@@ -55,7 +60,9 @@ def _list_services_and_toolboxes() -> List[str]:
55
60
  def paasta_remote_run_start(
56
61
  args: argparse.Namespace,
57
62
  system_paasta_config: SystemPaastaConfig,
63
+ recursed: bool = False,
58
64
  ) -> int:
65
+ status_prefix = "\x1b[2K\r" # Clear line, carriage return
59
66
  client = get_paasta_oapi_client_with_auth(
60
67
  cluster=get_paasta_oapi_api_clustername(cluster=args.cluster, is_eks=True),
61
68
  system_paasta_config=system_paasta_config,
@@ -95,10 +102,18 @@ def paasta_remote_run_start(
95
102
  if poll_response.status == 200:
96
103
  print("")
97
104
  break
98
- print(f"\rStatus: {poll_response.message}", end="")
105
+ print(f"{status_prefix}Status: {poll_response.message}", end="")
106
+ if poll_response.status == 404:
107
+ # Probably indicates a pod was terminating. Now that its gone, retry the whole process
108
+ if not recursed:
109
+ print("\nPod finished terminating. Rerunning")
110
+ return paasta_remote_run_start(args, system_paasta_config, True)
111
+ else:
112
+ print("\nSomething went wrong. Pod still not found.")
113
+ return 1
99
114
  time.sleep(10)
100
115
  else:
101
- print("Timed out while waiting for job to start")
116
+ print(f"{status_prefix}Timed out while waiting for job to start")
102
117
  return 1
103
118
 
104
119
  if not args.interactive and not args.toolbox:
@@ -120,13 +135,28 @@ def paasta_remote_run_start(
120
135
  kubectl_wrapper = f"kubectl-eks-{args.cluster}"
121
136
  if not shutil.which(kubectl_wrapper):
122
137
  kubectl_wrapper = f"kubectl-{args.cluster}"
123
- exec_command = KUBECTL_CMD_TEMPLATE.format(
138
+ exec_command = KUBECTL_EXEC_CMD_TEMPLATE.format(
124
139
  kubectl_wrapper=kubectl_wrapper,
125
140
  namespace=poll_response.namespace,
126
141
  pod=poll_response.pod_name,
127
142
  token=token_response.token,
128
143
  )
129
144
 
145
+ if args.copy_file:
146
+ for filename in args.copy_file:
147
+ cp_command = KUBECTL_CP_CMD_TEMPLATE.format(
148
+ kubectl_wrapper=kubectl_wrapper,
149
+ namespace=poll_response.namespace,
150
+ pod=poll_response.pod_name,
151
+ filename=filename,
152
+ token=token_response.token,
153
+ ).split(" ")
154
+ call = subprocess.run(cp_command, capture_output=True)
155
+ if call.returncode != 0:
156
+ print("Error copying file to remote-run pod: ", file=sys.stderr)
157
+ print(call.stderr.decode("utf-8"), file=sys.stderr)
158
+ return 1
159
+
130
160
  run_interactive_cli(exec_command)
131
161
  return 0
132
162
 
@@ -232,6 +262,12 @@ def add_subparser(subparsers: argparse._SubParsersAction) -> None:
232
262
  type=int,
233
263
  default=600,
234
264
  )
265
+ start_parser.add_argument(
266
+ "--copy-file",
267
+ help="Adds a local file to /tmp inside the pod",
268
+ type=str,
269
+ action="append",
270
+ )
235
271
  stop_parser = subparsers.add_parser(
236
272
  "stop",
237
273
  help="Stop your remote-run job if it exists",