paasta-tools 1.18.0__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.18.0/paasta_tools.egg-info → paasta-tools-1.19.0}/PKG-INFO +1 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/__init__.py +1 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/api/api_docs/swagger.json +23 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/api/views/remote_run.py +8 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/remote_run.py +57 -20
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/cli/schemas/adhoc_schema.json +12 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/kubernetes/remote_run.py +92 -8
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/kubernetes_tools.py +13 -2
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/__init__.py +1 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/api/autoscaler_api.py +1 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/api/default_api.py +1 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/api/remote_run_api.py +18 -2
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/api/resources_api.py +1 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/api/service_api.py +1 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/api_client.py +1 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/configuration.py +2 -2
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/exceptions.py +1 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/adhoc_launch_history.py +1 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/autoscaler_count_msg.py +1 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/deploy_queue.py +1 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/deploy_queue_service_instance.py +1 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/envoy_backend.py +1 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/envoy_location.py +1 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/envoy_status.py +1 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/flink_cluster_overview.py +1 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/flink_config.py +1 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/flink_job.py +1 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/flink_job_details.py +1 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/flink_jobs.py +1 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/float_and_error.py +1 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/hpa_metric.py +1 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/inline_object.py +1 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/inline_response200.py +1 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/inline_response2001.py +1 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/instance_bounce_status.py +1 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/instance_mesh_status.py +1 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/instance_status.py +1 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/instance_status_adhoc.py +1 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/instance_status_cassandracluster.py +1 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/instance_status_flink.py +1 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/instance_status_kafkacluster.py +1 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/instance_status_kubernetes.py +1 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/instance_status_kubernetes_autoscaling_status.py +1 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/instance_status_kubernetes_v2.py +1 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/instance_status_tron.py +1 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/instance_tasks.py +1 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/integer_and_error.py +1 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/kubernetes_container.py +1 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/kubernetes_container_v2.py +1 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/kubernetes_healthcheck.py +1 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/kubernetes_pod.py +1 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/kubernetes_pod_event.py +1 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/kubernetes_pod_v2.py +1 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/kubernetes_replica_set.py +1 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/kubernetes_version.py +1 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/remote_run_outcome.py +4 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/remote_run_start.py +4 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/remote_run_stop.py +4 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/remote_run_token.py +1 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/resource.py +1 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/resource_item.py +1 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/resource_value.py +1 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/smartstack_backend.py +1 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/smartstack_location.py +1 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/smartstack_status.py +1 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/task_tail_lines.py +1 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model_utils.py +1 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/rest.py +1 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/utils.py +6 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0/paasta_tools.egg-info}/PKG-INFO +1 -1
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/LICENSE +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/MANIFEST.in +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/README.md +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/k8s_itests/__init__.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/k8s_itests/test_autoscaling.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/k8s_itests/utils.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/adhoc_tools.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/api/__init__.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/api/api.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/api/client.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/api/settings.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/api/tweens/__init__.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/api/tweens/auth.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/api/tweens/profiling.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/api/tweens/request_logger.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/api/views/__init__.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/api/views/autoscaler.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/api/views/exception.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/api/views/flink.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/api/views/instance.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/api/views/pause_autoscaler.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/api/views/resources.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/api/views/service.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/api/views/version.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/apply_external_resources.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/async_utils.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/autoscaling/__init__.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/autoscaling/autoscaling_service_lib.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/autoscaling/forecasting.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/autoscaling/max_all_k8s_services.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/autoscaling/pause_service_autoscaler.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/autoscaling/utils.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/bounce_lib.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/broadcast_log_to_services.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/cassandracluster_tools.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/check_autoscaler_max_instances.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/check_cassandracluster_services_replication.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/check_flink_services_health.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/check_kubernetes_api.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/check_kubernetes_services_replication.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/check_oom_events.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/check_services_replication_tools.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/check_spark_jobs.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/cleanup_kubernetes_cr.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/cleanup_kubernetes_crd.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/cleanup_kubernetes_jobs.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/cleanup_tron_namespaces.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/cli/__init__.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/cli/authentication.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/cli/cli.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/__init__.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/autoscale.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/check.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/cook_image.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/get_docker_image.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/get_image_version.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/get_latest_deployment.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/info.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/itest.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/list.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/list_clusters.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/list_deploy_queue.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/list_namespaces.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/local_run.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/logs.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/mark_for_deployment.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/mesh_status.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/pause_service_autoscaler.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/push_to_registry.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/rollback.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/secret.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/security_check.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/spark_run.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/start_stop_restart.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/status.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/validate.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/cli/cmds/wait_for_deployment.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/cli/fsm/__init__.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/cli/fsm/autosuggest.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/cli/fsm/template/README.md +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/cli/fsm/template/cookiecutter.json +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/cli/fsm/template/{{cookiecutter.service}}/kubernetes-PROD.yaml +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/cli/fsm/template/{{cookiecutter.service}}/monitoring.yaml +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/cli/fsm/template/{{cookiecutter.service}}/service.yaml +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/cli/fsm/template/{{cookiecutter.service}}/smartstack.yaml +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/cli/fsm_cmd.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/cli/paasta_tabcomplete.sh +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/cli/schemas/autoscaling_schema.json +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/cli/schemas/autotuned_defaults/cassandracluster_schema.json +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/cli/schemas/autotuned_defaults/kubernetes_schema.json +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/cli/schemas/deploy_schema.json +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/cli/schemas/eks_schema.json +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/cli/schemas/kubernetes_schema.json +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/cli/schemas/rollback_schema.json +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/cli/schemas/service_schema.json +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/cli/schemas/smartstack_schema.json +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/cli/schemas/tron_schema.json +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/cli/utils.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/clusterman.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/config_utils.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/contrib/__init__.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/contrib/bounce_log_latency_parser.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/contrib/check_manual_oapi_changes.sh +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/contrib/check_orphans.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/contrib/create_dynamodb_table.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/contrib/create_paasta_playground.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/contrib/emit_allocated_cpu_metrics.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/contrib/get_running_task_allocation.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/contrib/habitat_fixer.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/contrib/ide_helper.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/contrib/is_pod_healthy_in_proxy.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/contrib/is_pod_healthy_in_smartstack.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/contrib/kill_bad_containers.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/contrib/mass-deploy-tag.sh +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/contrib/mock_patch_checker.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/contrib/paasta_update_soa_memcpu.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/contrib/render_template.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/contrib/rightsizer_soaconfigs_update.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/contrib/service_shard_remove.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/contrib/service_shard_update.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/contrib/shared_ip_check.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/contrib/timeouts_metrics_prom.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/delete_kubernetes_deployments.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/deployment_utils.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/docker_wrapper.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/docker_wrapper_imports.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/drain_lib.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/dump_locally_running_services.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/eks_tools.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/envoy_tools.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/firewall.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/firewall_logging.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/firewall_update.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/flink_tools.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/flinkeks_tools.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/frameworks/__init__.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/frameworks/adhoc_scheduler.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/frameworks/constraints.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/frameworks/native_scheduler.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/frameworks/native_service_config.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/frameworks/task_store.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/generate_all_deployments +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/generate_authenticating_services.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/generate_deployments_for_service.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/generate_services_file.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/generate_services_yaml.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/hacheck.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/instance/__init__.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/instance/hpa_metrics_parser.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/instance/kubernetes.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/iptables.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/kafkacluster_tools.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/kubernetes/__init__.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/kubernetes/application/__init__.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/kubernetes/application/controller_wrappers.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/kubernetes/application/tools.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/kubernetes/bin/__init__.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/kubernetes/bin/kubernetes_remove_evicted_pods.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/kubernetes/bin/paasta_cleanup_remote_run_resources.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/kubernetes/bin/paasta_cleanup_stale_nodes.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/kubernetes/bin/paasta_secrets_sync.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/list_kubernetes_service_instances.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/list_tron_namespaces.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/long_running_service_tools.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/mac_address.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/marathon_dashboard.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/mesos/__init__.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/mesos/cfg.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/mesos/cluster.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/mesos/exceptions.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/mesos/framework.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/mesos/log.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/mesos/master.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/mesos/mesos_file.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/mesos/parallel.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/mesos/slave.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/mesos/task.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/mesos/util.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/mesos/zookeeper.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/mesos_maintenance.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/mesos_tools.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/metrics/__init__.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/metrics/metastatus_lib.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/metrics/metrics_lib.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/monitoring/__init__.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/monitoring/check_k8s_api_performance.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/monitoring_tools.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/monkrelaycluster_tools.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/nrtsearchservice_tools.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/nrtsearchserviceeks_tools.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/oom_logger.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paasta_deploy_tron_jobs +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paasta_execute_docker_command.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paasta_native_serviceinit.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paasta_service_config_loader.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/api/__init__.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/apis/__init__.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/model/__init__.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/paastaapi/models/__init__.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/prune_completed_pods.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/puppet_service_tools.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/py.typed +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/remote_git.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/run-paasta-api-in-dev-mode.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/run-paasta-api-playground.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/secret_providers/__init__.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/secret_providers/vault.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/secret_tools.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/setup_istio_mesh.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/setup_kubernetes_cr.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/setup_kubernetes_crd.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/setup_kubernetes_internal_crd.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/setup_kubernetes_job.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/setup_prometheus_adapter_config.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/setup_tron_namespace.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/slack.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/smartstack_tools.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/spark_tools.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/synapse_srv_namespaces_fact.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/tron/__init__.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/tron/client.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/tron/tron_command_context.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/tron/tron_timeutils.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/tron_tools.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools/yaml_tools.py +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools.egg-info/SOURCES.txt +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools.egg-info/dependency_links.txt +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools.egg-info/entry_points.txt +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools.egg-info/requires.txt +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/paasta_tools.egg-info/top_level.txt +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/pyproject.toml +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/requirements-minimal.txt +0 -0
- {paasta-tools-1.18.0 → paasta-tools-1.19.0}/setup.cfg +0 -0
- {paasta-tools-1.18.0 → 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,
|
|
@@ -1420,8 +1420,18 @@ class KubernetesDeploymentConfig(LongRunningServiceConfig):
|
|
|
1420
1420
|
|
|
1421
1421
|
def get_security_context(self) -> Optional[V1SecurityContext]:
|
|
1422
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
|
+
)
|
|
1423
1430
|
if cap_add is None:
|
|
1424
|
-
return V1SecurityContext(
|
|
1431
|
+
return V1SecurityContext(
|
|
1432
|
+
capabilities=V1Capabilities(drop=CAPS_DROP),
|
|
1433
|
+
**context_kwargs,
|
|
1434
|
+
)
|
|
1425
1435
|
else:
|
|
1426
1436
|
return V1SecurityContext(
|
|
1427
1437
|
# XXX: we should probably generally work in sets, but V1Capabilities is typed as accepting
|
|
@@ -1434,7 +1444,8 @@ class KubernetesDeploymentConfig(LongRunningServiceConfig):
|
|
|
1434
1444
|
# WARNING: this must be sorted - otherwise the order of the capabilities will be different
|
|
1435
1445
|
# on every setup_kubernetes_job run and cause unnecessary redeployments
|
|
1436
1446
|
drop=sorted(list(set(CAPS_DROP) - set(cap_add))),
|
|
1437
|
-
)
|
|
1447
|
+
),
|
|
1448
|
+
**context_kwargs,
|
|
1438
1449
|
)
|
|
1439
1450
|
|
|
1440
1451
|
def get_kubernetes_containers(
|
|
@@ -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
|
|
|
@@ -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
|
|
|
@@ -46,6 +46,7 @@ class RemoteRunApi(object):
|
|
|
46
46
|
service,
|
|
47
47
|
instance,
|
|
48
48
|
job_name,
|
|
49
|
+
user,
|
|
49
50
|
**kwargs
|
|
50
51
|
):
|
|
51
52
|
"""Check if remote run pod is ready # noqa: E501
|
|
@@ -53,15 +54,17 @@ class RemoteRunApi(object):
|
|
|
53
54
|
This method makes a synchronous HTTP request by default. To make an
|
|
54
55
|
asynchronous HTTP request, please pass async_req=True
|
|
55
56
|
|
|
56
|
-
>>> thread = api.remote_run_poll(service, instance, job_name, async_req=True)
|
|
57
|
+
>>> thread = api.remote_run_poll(service, instance, job_name, user, async_req=True)
|
|
57
58
|
>>> result = thread.get()
|
|
58
59
|
|
|
59
60
|
Args:
|
|
60
61
|
service (str): Service name
|
|
61
62
|
instance (str): Instance name
|
|
62
63
|
job_name (str): Job name
|
|
64
|
+
user (str): User requesting job
|
|
63
65
|
|
|
64
66
|
Keyword Args:
|
|
67
|
+
toolbox (bool): Whether this is a toolbox job. [optional]
|
|
65
68
|
_return_http_data_only (bool): response data without head status
|
|
66
69
|
code and headers. Default is True.
|
|
67
70
|
_preload_content (bool): if False, the urllib3.HTTPResponse object
|
|
@@ -112,6 +115,8 @@ class RemoteRunApi(object):
|
|
|
112
115
|
instance
|
|
113
116
|
kwargs['job_name'] = \
|
|
114
117
|
job_name
|
|
118
|
+
kwargs['user'] = \
|
|
119
|
+
user
|
|
115
120
|
return self.call_with_http_info(**kwargs)
|
|
116
121
|
|
|
117
122
|
self.remote_run_poll = Endpoint(
|
|
@@ -128,11 +133,14 @@ class RemoteRunApi(object):
|
|
|
128
133
|
'service',
|
|
129
134
|
'instance',
|
|
130
135
|
'job_name',
|
|
136
|
+
'user',
|
|
137
|
+
'toolbox',
|
|
131
138
|
],
|
|
132
139
|
'required': [
|
|
133
140
|
'service',
|
|
134
141
|
'instance',
|
|
135
142
|
'job_name',
|
|
143
|
+
'user',
|
|
136
144
|
],
|
|
137
145
|
'nullable': [
|
|
138
146
|
],
|
|
@@ -153,16 +161,24 @@ class RemoteRunApi(object):
|
|
|
153
161
|
(str,),
|
|
154
162
|
'job_name':
|
|
155
163
|
(str,),
|
|
164
|
+
'user':
|
|
165
|
+
(str,),
|
|
166
|
+
'toolbox':
|
|
167
|
+
(bool,),
|
|
156
168
|
},
|
|
157
169
|
'attribute_map': {
|
|
158
170
|
'service': 'service',
|
|
159
171
|
'instance': 'instance',
|
|
160
172
|
'job_name': 'job_name',
|
|
173
|
+
'user': 'user',
|
|
174
|
+
'toolbox': 'toolbox',
|
|
161
175
|
},
|
|
162
176
|
'location_map': {
|
|
163
177
|
'service': 'path',
|
|
164
178
|
'instance': 'path',
|
|
165
179
|
'job_name': 'query',
|
|
180
|
+
'user': 'query',
|
|
181
|
+
'toolbox': 'query',
|
|
166
182
|
},
|
|
167
183
|
'collection_format_map': {
|
|
168
184
|
}
|
|
@@ -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
|
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) # noqa: E501
|
|
6
6
|
|
|
7
|
-
The version of the OpenAPI document: 1.
|
|
7
|
+
The version of the OpenAPI document: 1.2.0
|
|
8
8
|
Generated by: https://openapi-generator.tech
|
|
9
9
|
"""
|
|
10
10
|
|