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.
- {paasta-tools-1.17.2/paasta_tools.egg-info → paasta-tools-1.19.0}/PKG-INFO +1 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/__init__.py +1 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/api/api_docs/swagger.json +23 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/api/views/remote_run.py +8 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/remote_run.py +57 -20
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/schemas/adhoc_schema.json +12 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/schemas/eks_schema.json +3 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/schemas/kubernetes_schema.json +3 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/kubernetes/remote_run.py +92 -8
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/kubernetes_tools.py +25 -2
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/__init__.py +1 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/api/autoscaler_api.py +1 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/api/default_api.py +1 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/api/remote_run_api.py +18 -2
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/api/resources_api.py +1 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/api/service_api.py +1 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/api_client.py +1 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/configuration.py +2 -2
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/exceptions.py +1 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/adhoc_launch_history.py +1 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/autoscaler_count_msg.py +1 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/deploy_queue.py +1 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/deploy_queue_service_instance.py +1 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/envoy_backend.py +1 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/envoy_location.py +1 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/envoy_status.py +1 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/flink_cluster_overview.py +1 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/flink_config.py +1 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/flink_job.py +1 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/flink_job_details.py +1 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/flink_jobs.py +1 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/float_and_error.py +1 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/hpa_metric.py +1 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/inline_object.py +1 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/inline_response200.py +1 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/inline_response2001.py +1 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/instance_bounce_status.py +1 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/instance_mesh_status.py +1 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/instance_status.py +1 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/instance_status_adhoc.py +1 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/instance_status_cassandracluster.py +1 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/instance_status_flink.py +1 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/instance_status_kafkacluster.py +1 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/instance_status_kubernetes.py +1 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/instance_status_kubernetes_autoscaling_status.py +1 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/instance_status_kubernetes_v2.py +1 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/instance_status_tron.py +1 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/instance_tasks.py +1 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/integer_and_error.py +1 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/kubernetes_container.py +1 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/kubernetes_container_v2.py +1 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/kubernetes_healthcheck.py +1 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/kubernetes_pod.py +1 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/kubernetes_pod_event.py +1 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/kubernetes_pod_v2.py +1 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/kubernetes_replica_set.py +1 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/kubernetes_version.py +1 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/remote_run_outcome.py +4 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/remote_run_start.py +4 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/remote_run_stop.py +4 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/remote_run_token.py +1 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/resource.py +1 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/resource_item.py +1 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/resource_value.py +1 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/smartstack_backend.py +1 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/smartstack_location.py +1 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/smartstack_status.py +1 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/task_tail_lines.py +1 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model_utils.py +1 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/rest.py +1 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/utils.py +6 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0/paasta_tools.egg-info}/PKG-INFO +1 -1
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/LICENSE +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/MANIFEST.in +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/README.md +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/k8s_itests/__init__.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/k8s_itests/test_autoscaling.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/k8s_itests/utils.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/adhoc_tools.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/api/__init__.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/api/api.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/api/client.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/api/settings.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/api/tweens/__init__.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/api/tweens/auth.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/api/tweens/profiling.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/api/tweens/request_logger.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/api/views/__init__.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/api/views/autoscaler.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/api/views/exception.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/api/views/flink.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/api/views/instance.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/api/views/pause_autoscaler.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/api/views/resources.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/api/views/service.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/api/views/version.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/apply_external_resources.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/async_utils.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/autoscaling/__init__.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/autoscaling/autoscaling_service_lib.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/autoscaling/forecasting.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/autoscaling/max_all_k8s_services.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/autoscaling/pause_service_autoscaler.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/autoscaling/utils.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/bounce_lib.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/broadcast_log_to_services.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cassandracluster_tools.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/check_autoscaler_max_instances.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/check_cassandracluster_services_replication.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/check_flink_services_health.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/check_kubernetes_api.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/check_kubernetes_services_replication.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/check_oom_events.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/check_services_replication_tools.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/check_spark_jobs.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cleanup_kubernetes_cr.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cleanup_kubernetes_crd.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cleanup_kubernetes_jobs.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cleanup_tron_namespaces.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/__init__.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/authentication.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/cli.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/__init__.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/autoscale.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/check.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/cook_image.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/get_docker_image.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/get_image_version.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/get_latest_deployment.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/info.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/itest.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/list.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/list_clusters.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/list_deploy_queue.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/list_namespaces.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/local_run.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/logs.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/mark_for_deployment.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/mesh_status.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/pause_service_autoscaler.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/push_to_registry.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/rollback.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/secret.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/security_check.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/spark_run.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/start_stop_restart.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/status.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/validate.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/wait_for_deployment.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/fsm/__init__.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/fsm/autosuggest.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/fsm/template/README.md +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/fsm/template/cookiecutter.json +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/fsm/template/{{cookiecutter.service}}/kubernetes-PROD.yaml +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/fsm/template/{{cookiecutter.service}}/monitoring.yaml +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/fsm/template/{{cookiecutter.service}}/service.yaml +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/fsm/template/{{cookiecutter.service}}/smartstack.yaml +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/fsm_cmd.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/paasta_tabcomplete.sh +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/schemas/autoscaling_schema.json +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/schemas/autotuned_defaults/cassandracluster_schema.json +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/schemas/autotuned_defaults/kubernetes_schema.json +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/schemas/deploy_schema.json +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/schemas/rollback_schema.json +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/schemas/service_schema.json +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/schemas/smartstack_schema.json +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/schemas/tron_schema.json +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/cli/utils.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/clusterman.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/config_utils.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/contrib/__init__.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/contrib/bounce_log_latency_parser.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/contrib/check_manual_oapi_changes.sh +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/contrib/check_orphans.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/contrib/create_dynamodb_table.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/contrib/create_paasta_playground.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/contrib/emit_allocated_cpu_metrics.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/contrib/get_running_task_allocation.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/contrib/habitat_fixer.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/contrib/ide_helper.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/contrib/is_pod_healthy_in_proxy.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/contrib/is_pod_healthy_in_smartstack.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/contrib/kill_bad_containers.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/contrib/mass-deploy-tag.sh +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/contrib/mock_patch_checker.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/contrib/paasta_update_soa_memcpu.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/contrib/render_template.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/contrib/rightsizer_soaconfigs_update.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/contrib/service_shard_remove.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/contrib/service_shard_update.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/contrib/shared_ip_check.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/contrib/timeouts_metrics_prom.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/delete_kubernetes_deployments.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/deployment_utils.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/docker_wrapper.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/docker_wrapper_imports.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/drain_lib.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/dump_locally_running_services.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/eks_tools.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/envoy_tools.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/firewall.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/firewall_logging.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/firewall_update.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/flink_tools.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/flinkeks_tools.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/frameworks/__init__.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/frameworks/adhoc_scheduler.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/frameworks/constraints.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/frameworks/native_scheduler.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/frameworks/native_service_config.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/frameworks/task_store.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/generate_all_deployments +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/generate_authenticating_services.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/generate_deployments_for_service.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/generate_services_file.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/generate_services_yaml.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/hacheck.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/instance/__init__.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/instance/hpa_metrics_parser.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/instance/kubernetes.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/iptables.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/kafkacluster_tools.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/kubernetes/__init__.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/kubernetes/application/__init__.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/kubernetes/application/controller_wrappers.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/kubernetes/application/tools.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/kubernetes/bin/__init__.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/kubernetes/bin/kubernetes_remove_evicted_pods.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/kubernetes/bin/paasta_cleanup_remote_run_resources.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/kubernetes/bin/paasta_cleanup_stale_nodes.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/kubernetes/bin/paasta_secrets_sync.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/list_kubernetes_service_instances.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/list_tron_namespaces.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/long_running_service_tools.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/mac_address.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/marathon_dashboard.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/mesos/__init__.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/mesos/cfg.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/mesos/cluster.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/mesos/exceptions.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/mesos/framework.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/mesos/log.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/mesos/master.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/mesos/mesos_file.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/mesos/parallel.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/mesos/slave.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/mesos/task.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/mesos/util.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/mesos/zookeeper.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/mesos_maintenance.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/mesos_tools.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/metrics/__init__.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/metrics/metastatus_lib.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/metrics/metrics_lib.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/monitoring/__init__.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/monitoring/check_k8s_api_performance.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/monitoring_tools.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/monkrelaycluster_tools.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/nrtsearchservice_tools.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/nrtsearchserviceeks_tools.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/oom_logger.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paasta_deploy_tron_jobs +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paasta_execute_docker_command.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paasta_native_serviceinit.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paasta_service_config_loader.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/api/__init__.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/apis/__init__.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/__init__.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/paastaapi/models/__init__.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/prune_completed_pods.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/puppet_service_tools.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/py.typed +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/remote_git.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/run-paasta-api-in-dev-mode.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/run-paasta-api-playground.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/secret_providers/__init__.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/secret_providers/vault.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/secret_tools.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/setup_istio_mesh.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/setup_kubernetes_cr.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/setup_kubernetes_crd.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/setup_kubernetes_internal_crd.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/setup_kubernetes_job.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/setup_prometheus_adapter_config.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/setup_tron_namespace.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/slack.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/smartstack_tools.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/spark_tools.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/synapse_srv_namespaces_fact.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/tron/__init__.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/tron/client.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/tron/tron_command_context.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/tron/tron_timeutils.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/tron_tools.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools/yaml_tools.py +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools.egg-info/SOURCES.txt +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools.egg-info/dependency_links.txt +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools.egg-info/entry_points.txt +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools.egg-info/requires.txt +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/paasta_tools.egg-info/top_level.txt +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/pyproject.toml +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/requirements-minimal.txt +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/setup.cfg +0 -0
- {paasta-tools-1.17.2 → paasta-tools-1.19.0}/setup.py +0 -0
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"swagger": "2.0",
|
|
3
3
|
"info": {
|
|
4
4
|
"title": "Paasta API",
|
|
5
|
-
"version": "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
|
-
|
|
90
|
-
|
|
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,
|
|
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(
|
|
132
|
-
parser.
|
|
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
|
-
|
|
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
|
}
|
|
@@ -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 =
|
|
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(
|
|
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,
|
|
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 =
|
|
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
|
-
|
|
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,
|
|
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 =
|
|
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(
|
|
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.
|
|
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.
|
|
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.
|
|
8
|
+
The version of the OpenAPI document: 1.2.0
|
|
9
9
|
Generated by: https://openapi-generator.tech
|
|
10
10
|
"""
|
|
11
11
|
|