paasta-tools 1.21.3__py3-none-any.whl
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.
- k8s_itests/__init__.py +0 -0
- k8s_itests/test_autoscaling.py +23 -0
- k8s_itests/utils.py +38 -0
- paasta_tools/__init__.py +20 -0
- paasta_tools/adhoc_tools.py +142 -0
- paasta_tools/api/__init__.py +13 -0
- paasta_tools/api/api.py +330 -0
- paasta_tools/api/api_docs/swagger.json +2323 -0
- paasta_tools/api/client.py +106 -0
- paasta_tools/api/settings.py +33 -0
- paasta_tools/api/tweens/__init__.py +6 -0
- paasta_tools/api/tweens/auth.py +125 -0
- paasta_tools/api/tweens/profiling.py +108 -0
- paasta_tools/api/tweens/request_logger.py +124 -0
- paasta_tools/api/views/__init__.py +13 -0
- paasta_tools/api/views/autoscaler.py +100 -0
- paasta_tools/api/views/exception.py +45 -0
- paasta_tools/api/views/flink.py +73 -0
- paasta_tools/api/views/instance.py +395 -0
- paasta_tools/api/views/pause_autoscaler.py +71 -0
- paasta_tools/api/views/remote_run.py +113 -0
- paasta_tools/api/views/resources.py +76 -0
- paasta_tools/api/views/service.py +35 -0
- paasta_tools/api/views/version.py +25 -0
- paasta_tools/apply_external_resources.py +79 -0
- paasta_tools/async_utils.py +109 -0
- paasta_tools/autoscaling/__init__.py +0 -0
- paasta_tools/autoscaling/autoscaling_service_lib.py +57 -0
- paasta_tools/autoscaling/forecasting.py +106 -0
- paasta_tools/autoscaling/max_all_k8s_services.py +41 -0
- paasta_tools/autoscaling/pause_service_autoscaler.py +77 -0
- paasta_tools/autoscaling/utils.py +52 -0
- paasta_tools/bounce_lib.py +184 -0
- paasta_tools/broadcast_log_to_services.py +62 -0
- paasta_tools/cassandracluster_tools.py +210 -0
- paasta_tools/check_autoscaler_max_instances.py +212 -0
- paasta_tools/check_cassandracluster_services_replication.py +35 -0
- paasta_tools/check_flink_services_health.py +203 -0
- paasta_tools/check_kubernetes_api.py +57 -0
- paasta_tools/check_kubernetes_services_replication.py +141 -0
- paasta_tools/check_oom_events.py +244 -0
- paasta_tools/check_services_replication_tools.py +324 -0
- paasta_tools/check_spark_jobs.py +234 -0
- paasta_tools/cleanup_kubernetes_cr.py +138 -0
- paasta_tools/cleanup_kubernetes_crd.py +145 -0
- paasta_tools/cleanup_kubernetes_jobs.py +344 -0
- paasta_tools/cleanup_tron_namespaces.py +96 -0
- paasta_tools/cli/__init__.py +13 -0
- paasta_tools/cli/authentication.py +85 -0
- paasta_tools/cli/cli.py +260 -0
- paasta_tools/cli/cmds/__init__.py +13 -0
- paasta_tools/cli/cmds/autoscale.py +143 -0
- paasta_tools/cli/cmds/check.py +334 -0
- paasta_tools/cli/cmds/cook_image.py +147 -0
- paasta_tools/cli/cmds/get_docker_image.py +76 -0
- paasta_tools/cli/cmds/get_image_version.py +172 -0
- paasta_tools/cli/cmds/get_latest_deployment.py +93 -0
- paasta_tools/cli/cmds/info.py +155 -0
- paasta_tools/cli/cmds/itest.py +117 -0
- paasta_tools/cli/cmds/list.py +66 -0
- paasta_tools/cli/cmds/list_clusters.py +42 -0
- paasta_tools/cli/cmds/list_deploy_queue.py +171 -0
- paasta_tools/cli/cmds/list_namespaces.py +84 -0
- paasta_tools/cli/cmds/local_run.py +1396 -0
- paasta_tools/cli/cmds/logs.py +1601 -0
- paasta_tools/cli/cmds/mark_for_deployment.py +1988 -0
- paasta_tools/cli/cmds/mesh_status.py +174 -0
- paasta_tools/cli/cmds/pause_service_autoscaler.py +107 -0
- paasta_tools/cli/cmds/push_to_registry.py +275 -0
- paasta_tools/cli/cmds/remote_run.py +252 -0
- paasta_tools/cli/cmds/rollback.py +347 -0
- paasta_tools/cli/cmds/secret.py +549 -0
- paasta_tools/cli/cmds/security_check.py +59 -0
- paasta_tools/cli/cmds/spark_run.py +1400 -0
- paasta_tools/cli/cmds/start_stop_restart.py +401 -0
- paasta_tools/cli/cmds/status.py +2302 -0
- paasta_tools/cli/cmds/validate.py +1012 -0
- paasta_tools/cli/cmds/wait_for_deployment.py +275 -0
- paasta_tools/cli/fsm/__init__.py +13 -0
- paasta_tools/cli/fsm/autosuggest.py +82 -0
- paasta_tools/cli/fsm/template/README.md +8 -0
- paasta_tools/cli/fsm/template/cookiecutter.json +7 -0
- paasta_tools/cli/fsm/template/{{cookiecutter.service}}/kubernetes-PROD.yaml +91 -0
- paasta_tools/cli/fsm/template/{{cookiecutter.service}}/monitoring.yaml +20 -0
- paasta_tools/cli/fsm/template/{{cookiecutter.service}}/service.yaml +8 -0
- paasta_tools/cli/fsm/template/{{cookiecutter.service}}/smartstack.yaml +6 -0
- paasta_tools/cli/fsm_cmd.py +121 -0
- paasta_tools/cli/paasta_tabcomplete.sh +23 -0
- paasta_tools/cli/schemas/adhoc_schema.json +199 -0
- paasta_tools/cli/schemas/autoscaling_schema.json +91 -0
- paasta_tools/cli/schemas/autotuned_defaults/cassandracluster_schema.json +37 -0
- paasta_tools/cli/schemas/autotuned_defaults/kubernetes_schema.json +89 -0
- paasta_tools/cli/schemas/deploy_schema.json +173 -0
- paasta_tools/cli/schemas/eks_schema.json +970 -0
- paasta_tools/cli/schemas/kubernetes_schema.json +970 -0
- paasta_tools/cli/schemas/rollback_schema.json +160 -0
- paasta_tools/cli/schemas/service_schema.json +25 -0
- paasta_tools/cli/schemas/smartstack_schema.json +322 -0
- paasta_tools/cli/schemas/tron_schema.json +699 -0
- paasta_tools/cli/utils.py +1118 -0
- paasta_tools/clusterman.py +21 -0
- paasta_tools/config_utils.py +385 -0
- paasta_tools/contrib/__init__.py +0 -0
- paasta_tools/contrib/bounce_log_latency_parser.py +68 -0
- paasta_tools/contrib/check_manual_oapi_changes.sh +24 -0
- paasta_tools/contrib/check_orphans.py +306 -0
- paasta_tools/contrib/create_dynamodb_table.py +35 -0
- paasta_tools/contrib/create_paasta_playground.py +105 -0
- paasta_tools/contrib/emit_allocated_cpu_metrics.py +50 -0
- paasta_tools/contrib/get_running_task_allocation.py +346 -0
- paasta_tools/contrib/habitat_fixer.py +86 -0
- paasta_tools/contrib/ide_helper.py +316 -0
- paasta_tools/contrib/is_pod_healthy_in_proxy.py +139 -0
- paasta_tools/contrib/is_pod_healthy_in_smartstack.py +50 -0
- paasta_tools/contrib/kill_bad_containers.py +109 -0
- paasta_tools/contrib/mass-deploy-tag.sh +44 -0
- paasta_tools/contrib/mock_patch_checker.py +86 -0
- paasta_tools/contrib/paasta_update_soa_memcpu.py +520 -0
- paasta_tools/contrib/render_template.py +129 -0
- paasta_tools/contrib/rightsizer_soaconfigs_update.py +348 -0
- paasta_tools/contrib/service_shard_remove.py +157 -0
- paasta_tools/contrib/service_shard_update.py +373 -0
- paasta_tools/contrib/shared_ip_check.py +77 -0
- paasta_tools/contrib/timeouts_metrics_prom.py +64 -0
- paasta_tools/delete_kubernetes_deployments.py +89 -0
- paasta_tools/deployment_utils.py +44 -0
- paasta_tools/docker_wrapper.py +234 -0
- paasta_tools/docker_wrapper_imports.py +13 -0
- paasta_tools/drain_lib.py +351 -0
- paasta_tools/dump_locally_running_services.py +71 -0
- paasta_tools/eks_tools.py +119 -0
- paasta_tools/envoy_tools.py +373 -0
- paasta_tools/firewall.py +504 -0
- paasta_tools/firewall_logging.py +154 -0
- paasta_tools/firewall_update.py +172 -0
- paasta_tools/flink_tools.py +345 -0
- paasta_tools/flinkeks_tools.py +90 -0
- paasta_tools/frameworks/__init__.py +0 -0
- paasta_tools/frameworks/adhoc_scheduler.py +71 -0
- paasta_tools/frameworks/constraints.py +87 -0
- paasta_tools/frameworks/native_scheduler.py +652 -0
- paasta_tools/frameworks/native_service_config.py +301 -0
- paasta_tools/frameworks/task_store.py +245 -0
- paasta_tools/generate_all_deployments +9 -0
- paasta_tools/generate_authenticating_services.py +94 -0
- paasta_tools/generate_deployments_for_service.py +255 -0
- paasta_tools/generate_services_file.py +114 -0
- paasta_tools/generate_services_yaml.py +30 -0
- paasta_tools/hacheck.py +76 -0
- paasta_tools/instance/__init__.py +0 -0
- paasta_tools/instance/hpa_metrics_parser.py +122 -0
- paasta_tools/instance/kubernetes.py +1362 -0
- paasta_tools/iptables.py +240 -0
- paasta_tools/kafkacluster_tools.py +143 -0
- paasta_tools/kubernetes/__init__.py +0 -0
- paasta_tools/kubernetes/application/__init__.py +0 -0
- paasta_tools/kubernetes/application/controller_wrappers.py +476 -0
- paasta_tools/kubernetes/application/tools.py +90 -0
- paasta_tools/kubernetes/bin/__init__.py +0 -0
- paasta_tools/kubernetes/bin/kubernetes_remove_evicted_pods.py +164 -0
- paasta_tools/kubernetes/bin/paasta_cleanup_remote_run_resources.py +135 -0
- paasta_tools/kubernetes/bin/paasta_cleanup_stale_nodes.py +181 -0
- paasta_tools/kubernetes/bin/paasta_secrets_sync.py +758 -0
- paasta_tools/kubernetes/remote_run.py +558 -0
- paasta_tools/kubernetes_tools.py +4679 -0
- paasta_tools/list_kubernetes_service_instances.py +128 -0
- paasta_tools/list_tron_namespaces.py +60 -0
- paasta_tools/long_running_service_tools.py +678 -0
- paasta_tools/mac_address.py +44 -0
- paasta_tools/marathon_dashboard.py +0 -0
- paasta_tools/mesos/__init__.py +0 -0
- paasta_tools/mesos/cfg.py +46 -0
- paasta_tools/mesos/cluster.py +60 -0
- paasta_tools/mesos/exceptions.py +59 -0
- paasta_tools/mesos/framework.py +77 -0
- paasta_tools/mesos/log.py +48 -0
- paasta_tools/mesos/master.py +306 -0
- paasta_tools/mesos/mesos_file.py +169 -0
- paasta_tools/mesos/parallel.py +52 -0
- paasta_tools/mesos/slave.py +115 -0
- paasta_tools/mesos/task.py +94 -0
- paasta_tools/mesos/util.py +69 -0
- paasta_tools/mesos/zookeeper.py +37 -0
- paasta_tools/mesos_maintenance.py +848 -0
- paasta_tools/mesos_tools.py +1051 -0
- paasta_tools/metrics/__init__.py +0 -0
- paasta_tools/metrics/metastatus_lib.py +1110 -0
- paasta_tools/metrics/metrics_lib.py +217 -0
- paasta_tools/monitoring/__init__.py +13 -0
- paasta_tools/monitoring/check_k8s_api_performance.py +110 -0
- paasta_tools/monitoring_tools.py +652 -0
- paasta_tools/monkrelaycluster_tools.py +146 -0
- paasta_tools/nrtsearchservice_tools.py +143 -0
- paasta_tools/nrtsearchserviceeks_tools.py +68 -0
- paasta_tools/oom_logger.py +321 -0
- paasta_tools/paasta_deploy_tron_jobs +3 -0
- paasta_tools/paasta_execute_docker_command.py +123 -0
- paasta_tools/paasta_native_serviceinit.py +21 -0
- paasta_tools/paasta_service_config_loader.py +201 -0
- paasta_tools/paastaapi/__init__.py +29 -0
- paasta_tools/paastaapi/api/__init__.py +3 -0
- paasta_tools/paastaapi/api/autoscaler_api.py +302 -0
- paasta_tools/paastaapi/api/default_api.py +569 -0
- paasta_tools/paastaapi/api/remote_run_api.py +604 -0
- paasta_tools/paastaapi/api/resources_api.py +157 -0
- paasta_tools/paastaapi/api/service_api.py +1736 -0
- paasta_tools/paastaapi/api_client.py +818 -0
- paasta_tools/paastaapi/apis/__init__.py +22 -0
- paasta_tools/paastaapi/configuration.py +455 -0
- paasta_tools/paastaapi/exceptions.py +137 -0
- paasta_tools/paastaapi/model/__init__.py +5 -0
- paasta_tools/paastaapi/model/adhoc_launch_history.py +176 -0
- paasta_tools/paastaapi/model/autoscaler_count_msg.py +176 -0
- paasta_tools/paastaapi/model/deploy_queue.py +178 -0
- paasta_tools/paastaapi/model/deploy_queue_service_instance.py +194 -0
- paasta_tools/paastaapi/model/envoy_backend.py +185 -0
- paasta_tools/paastaapi/model/envoy_location.py +184 -0
- paasta_tools/paastaapi/model/envoy_status.py +181 -0
- paasta_tools/paastaapi/model/flink_cluster_overview.py +188 -0
- paasta_tools/paastaapi/model/flink_config.py +173 -0
- paasta_tools/paastaapi/model/flink_job.py +186 -0
- paasta_tools/paastaapi/model/flink_job_details.py +192 -0
- paasta_tools/paastaapi/model/flink_jobs.py +175 -0
- paasta_tools/paastaapi/model/float_and_error.py +173 -0
- paasta_tools/paastaapi/model/hpa_metric.py +176 -0
- paasta_tools/paastaapi/model/inline_object.py +170 -0
- paasta_tools/paastaapi/model/inline_response200.py +170 -0
- paasta_tools/paastaapi/model/inline_response2001.py +170 -0
- paasta_tools/paastaapi/model/instance_bounce_status.py +200 -0
- paasta_tools/paastaapi/model/instance_mesh_status.py +186 -0
- paasta_tools/paastaapi/model/instance_status.py +220 -0
- paasta_tools/paastaapi/model/instance_status_adhoc.py +187 -0
- paasta_tools/paastaapi/model/instance_status_cassandracluster.py +173 -0
- paasta_tools/paastaapi/model/instance_status_flink.py +173 -0
- paasta_tools/paastaapi/model/instance_status_kafkacluster.py +173 -0
- paasta_tools/paastaapi/model/instance_status_kubernetes.py +263 -0
- paasta_tools/paastaapi/model/instance_status_kubernetes_autoscaling_status.py +187 -0
- paasta_tools/paastaapi/model/instance_status_kubernetes_v2.py +197 -0
- paasta_tools/paastaapi/model/instance_status_tron.py +204 -0
- paasta_tools/paastaapi/model/instance_tasks.py +182 -0
- paasta_tools/paastaapi/model/integer_and_error.py +173 -0
- paasta_tools/paastaapi/model/kubernetes_container.py +178 -0
- paasta_tools/paastaapi/model/kubernetes_container_v2.py +219 -0
- paasta_tools/paastaapi/model/kubernetes_healthcheck.py +176 -0
- paasta_tools/paastaapi/model/kubernetes_pod.py +201 -0
- paasta_tools/paastaapi/model/kubernetes_pod_event.py +176 -0
- paasta_tools/paastaapi/model/kubernetes_pod_v2.py +213 -0
- paasta_tools/paastaapi/model/kubernetes_replica_set.py +185 -0
- paasta_tools/paastaapi/model/kubernetes_version.py +202 -0
- paasta_tools/paastaapi/model/remote_run_outcome.py +189 -0
- paasta_tools/paastaapi/model/remote_run_start.py +185 -0
- paasta_tools/paastaapi/model/remote_run_stop.py +176 -0
- paasta_tools/paastaapi/model/remote_run_token.py +173 -0
- paasta_tools/paastaapi/model/resource.py +187 -0
- paasta_tools/paastaapi/model/resource_item.py +187 -0
- paasta_tools/paastaapi/model/resource_value.py +176 -0
- paasta_tools/paastaapi/model/smartstack_backend.py +191 -0
- paasta_tools/paastaapi/model/smartstack_location.py +181 -0
- paasta_tools/paastaapi/model/smartstack_status.py +181 -0
- paasta_tools/paastaapi/model/task_tail_lines.py +176 -0
- paasta_tools/paastaapi/model_utils.py +1879 -0
- paasta_tools/paastaapi/models/__init__.py +62 -0
- paasta_tools/paastaapi/rest.py +287 -0
- paasta_tools/prune_completed_pods.py +220 -0
- paasta_tools/puppet_service_tools.py +59 -0
- paasta_tools/py.typed +1 -0
- paasta_tools/remote_git.py +127 -0
- paasta_tools/run-paasta-api-in-dev-mode.py +57 -0
- paasta_tools/run-paasta-api-playground.py +51 -0
- paasta_tools/secret_providers/__init__.py +66 -0
- paasta_tools/secret_providers/vault.py +214 -0
- paasta_tools/secret_tools.py +277 -0
- paasta_tools/setup_istio_mesh.py +353 -0
- paasta_tools/setup_kubernetes_cr.py +412 -0
- paasta_tools/setup_kubernetes_crd.py +138 -0
- paasta_tools/setup_kubernetes_internal_crd.py +154 -0
- paasta_tools/setup_kubernetes_job.py +353 -0
- paasta_tools/setup_prometheus_adapter_config.py +1028 -0
- paasta_tools/setup_tron_namespace.py +248 -0
- paasta_tools/slack.py +75 -0
- paasta_tools/smartstack_tools.py +676 -0
- paasta_tools/spark_tools.py +283 -0
- paasta_tools/synapse_srv_namespaces_fact.py +42 -0
- paasta_tools/tron/__init__.py +0 -0
- paasta_tools/tron/client.py +158 -0
- paasta_tools/tron/tron_command_context.py +194 -0
- paasta_tools/tron/tron_timeutils.py +101 -0
- paasta_tools/tron_tools.py +1448 -0
- paasta_tools/utils.py +4307 -0
- paasta_tools/yaml_tools.py +44 -0
- paasta_tools-1.21.3.data/scripts/apply_external_resources.py +79 -0
- paasta_tools-1.21.3.data/scripts/bounce_log_latency_parser.py +68 -0
- paasta_tools-1.21.3.data/scripts/check_autoscaler_max_instances.py +212 -0
- paasta_tools-1.21.3.data/scripts/check_cassandracluster_services_replication.py +35 -0
- paasta_tools-1.21.3.data/scripts/check_flink_services_health.py +203 -0
- paasta_tools-1.21.3.data/scripts/check_kubernetes_api.py +57 -0
- paasta_tools-1.21.3.data/scripts/check_kubernetes_services_replication.py +141 -0
- paasta_tools-1.21.3.data/scripts/check_manual_oapi_changes.sh +24 -0
- paasta_tools-1.21.3.data/scripts/check_oom_events.py +244 -0
- paasta_tools-1.21.3.data/scripts/check_orphans.py +306 -0
- paasta_tools-1.21.3.data/scripts/check_spark_jobs.py +234 -0
- paasta_tools-1.21.3.data/scripts/cleanup_kubernetes_cr.py +138 -0
- paasta_tools-1.21.3.data/scripts/cleanup_kubernetes_crd.py +145 -0
- paasta_tools-1.21.3.data/scripts/cleanup_kubernetes_jobs.py +344 -0
- paasta_tools-1.21.3.data/scripts/create_dynamodb_table.py +35 -0
- paasta_tools-1.21.3.data/scripts/create_paasta_playground.py +105 -0
- paasta_tools-1.21.3.data/scripts/delete_kubernetes_deployments.py +89 -0
- paasta_tools-1.21.3.data/scripts/emit_allocated_cpu_metrics.py +50 -0
- paasta_tools-1.21.3.data/scripts/generate_all_deployments +9 -0
- paasta_tools-1.21.3.data/scripts/generate_authenticating_services.py +94 -0
- paasta_tools-1.21.3.data/scripts/generate_deployments_for_service.py +255 -0
- paasta_tools-1.21.3.data/scripts/generate_services_file.py +114 -0
- paasta_tools-1.21.3.data/scripts/generate_services_yaml.py +30 -0
- paasta_tools-1.21.3.data/scripts/get_running_task_allocation.py +346 -0
- paasta_tools-1.21.3.data/scripts/habitat_fixer.py +86 -0
- paasta_tools-1.21.3.data/scripts/ide_helper.py +316 -0
- paasta_tools-1.21.3.data/scripts/is_pod_healthy_in_proxy.py +139 -0
- paasta_tools-1.21.3.data/scripts/is_pod_healthy_in_smartstack.py +50 -0
- paasta_tools-1.21.3.data/scripts/kill_bad_containers.py +109 -0
- paasta_tools-1.21.3.data/scripts/kubernetes_remove_evicted_pods.py +164 -0
- paasta_tools-1.21.3.data/scripts/mass-deploy-tag.sh +44 -0
- paasta_tools-1.21.3.data/scripts/mock_patch_checker.py +86 -0
- paasta_tools-1.21.3.data/scripts/paasta_cleanup_remote_run_resources.py +135 -0
- paasta_tools-1.21.3.data/scripts/paasta_cleanup_stale_nodes.py +181 -0
- paasta_tools-1.21.3.data/scripts/paasta_deploy_tron_jobs +3 -0
- paasta_tools-1.21.3.data/scripts/paasta_execute_docker_command.py +123 -0
- paasta_tools-1.21.3.data/scripts/paasta_secrets_sync.py +758 -0
- paasta_tools-1.21.3.data/scripts/paasta_tabcomplete.sh +23 -0
- paasta_tools-1.21.3.data/scripts/paasta_update_soa_memcpu.py +520 -0
- paasta_tools-1.21.3.data/scripts/render_template.py +129 -0
- paasta_tools-1.21.3.data/scripts/rightsizer_soaconfigs_update.py +348 -0
- paasta_tools-1.21.3.data/scripts/service_shard_remove.py +157 -0
- paasta_tools-1.21.3.data/scripts/service_shard_update.py +373 -0
- paasta_tools-1.21.3.data/scripts/setup_istio_mesh.py +353 -0
- paasta_tools-1.21.3.data/scripts/setup_kubernetes_cr.py +412 -0
- paasta_tools-1.21.3.data/scripts/setup_kubernetes_crd.py +138 -0
- paasta_tools-1.21.3.data/scripts/setup_kubernetes_internal_crd.py +154 -0
- paasta_tools-1.21.3.data/scripts/setup_kubernetes_job.py +353 -0
- paasta_tools-1.21.3.data/scripts/setup_prometheus_adapter_config.py +1028 -0
- paasta_tools-1.21.3.data/scripts/shared_ip_check.py +77 -0
- paasta_tools-1.21.3.data/scripts/synapse_srv_namespaces_fact.py +42 -0
- paasta_tools-1.21.3.data/scripts/timeouts_metrics_prom.py +64 -0
- paasta_tools-1.21.3.dist-info/LICENSE +201 -0
- paasta_tools-1.21.3.dist-info/METADATA +74 -0
- paasta_tools-1.21.3.dist-info/RECORD +348 -0
- paasta_tools-1.21.3.dist-info/WHEEL +5 -0
- paasta_tools-1.21.3.dist-info/entry_points.txt +20 -0
- paasta_tools-1.21.3.dist-info/top_level.txt +2 -0
|
@@ -0,0 +1,558 @@
|
|
|
1
|
+
# Copyright 2015-2016 Yelp Inc.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
import hashlib
|
|
15
|
+
import logging
|
|
16
|
+
from time import sleep
|
|
17
|
+
from typing import List
|
|
18
|
+
from typing import Optional
|
|
19
|
+
from typing import Sequence
|
|
20
|
+
from typing import TypedDict
|
|
21
|
+
|
|
22
|
+
from kubernetes.client import AuthenticationV1TokenRequest
|
|
23
|
+
from kubernetes.client import V1Job
|
|
24
|
+
from kubernetes.client import V1ObjectMeta
|
|
25
|
+
from kubernetes.client import V1Pod
|
|
26
|
+
from kubernetes.client import V1PolicyRule
|
|
27
|
+
from kubernetes.client import V1Role
|
|
28
|
+
from kubernetes.client import V1RoleBinding
|
|
29
|
+
from kubernetes.client import V1RoleRef
|
|
30
|
+
from kubernetes.client import V1ServiceAccount
|
|
31
|
+
from kubernetes.client import V1Subject
|
|
32
|
+
from kubernetes.client import V1TokenRequestSpec
|
|
33
|
+
from kubernetes.client.exceptions import ApiException
|
|
34
|
+
|
|
35
|
+
from paasta_tools.adhoc_tools import load_adhoc_job_config
|
|
36
|
+
from paasta_tools.eks_tools import EksDeploymentConfig
|
|
37
|
+
from paasta_tools.eks_tools import load_eks_service_config
|
|
38
|
+
from paasta_tools.kubernetes.application.controller_wrappers import (
|
|
39
|
+
get_application_wrapper,
|
|
40
|
+
)
|
|
41
|
+
from paasta_tools.kubernetes_tools import get_all_service_accounts
|
|
42
|
+
from paasta_tools.kubernetes_tools import JOB_TYPE_LABEL_NAME
|
|
43
|
+
from paasta_tools.kubernetes_tools import KubeClient
|
|
44
|
+
from paasta_tools.kubernetes_tools import limit_size_with_hash
|
|
45
|
+
from paasta_tools.kubernetes_tools import paasta_prefixed
|
|
46
|
+
from paasta_tools.utils import load_system_paasta_config
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
logger = logging.getLogger(__name__)
|
|
50
|
+
REMOTE_RUN_JOB_LABEL = "remote-run"
|
|
51
|
+
POD_OWNER_LABEL = paasta_prefixed("pod_owner")
|
|
52
|
+
TOOLBOX_MOCK_SERVICE = "prod-toolbox"
|
|
53
|
+
DEFAULT_MAX_DURATION_LIMIT = 8 * 60 * 60 # 8 hours
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
class RemoteRunError(Exception):
|
|
57
|
+
pass
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
class RemoteRunOutcome(TypedDict, total=False):
|
|
61
|
+
status: int
|
|
62
|
+
message: str
|
|
63
|
+
job_name: str
|
|
64
|
+
pod_name: str
|
|
65
|
+
pod_address: str
|
|
66
|
+
namespace: str
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def _format_remote_run_job_name(
|
|
70
|
+
job: V1Job,
|
|
71
|
+
user: str,
|
|
72
|
+
) -> str:
|
|
73
|
+
"""Format name for remote run job
|
|
74
|
+
|
|
75
|
+
:param V1Job job: job definition
|
|
76
|
+
:param str user: the user requesting the remote-run
|
|
77
|
+
:return: job name
|
|
78
|
+
"""
|
|
79
|
+
return limit_size_with_hash(f"remote-run-{user}-{job.metadata.name}")
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def remote_run_start(
|
|
83
|
+
service: str,
|
|
84
|
+
instance: str,
|
|
85
|
+
cluster: str,
|
|
86
|
+
user: str,
|
|
87
|
+
interactive: bool,
|
|
88
|
+
recreate: bool,
|
|
89
|
+
max_duration: int,
|
|
90
|
+
is_toolbox: bool,
|
|
91
|
+
) -> RemoteRunOutcome:
|
|
92
|
+
"""Trigger remote-run job
|
|
93
|
+
|
|
94
|
+
:param str service: service name
|
|
95
|
+
:param str instance: service instance
|
|
96
|
+
:param str cluster: paasta cluster
|
|
97
|
+
:param str user: the user requesting the remote-run sandbox
|
|
98
|
+
:param bool interactive: whether it is expected to access the remote-run job interactively
|
|
99
|
+
:param bool recreate: whether to recreate remote-run job if existing
|
|
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
|
|
102
|
+
:return: outcome of the operation, and resulting Kubernetes pod information
|
|
103
|
+
"""
|
|
104
|
+
kube_client = KubeClient()
|
|
105
|
+
|
|
106
|
+
# Load the service deployment settings
|
|
107
|
+
deployment_config = (
|
|
108
|
+
generate_toolbox_deployment(service, cluster, user)
|
|
109
|
+
if is_toolbox
|
|
110
|
+
else load_eks_service_config(service, instance, cluster)
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
# Set to interactive mode
|
|
114
|
+
if interactive and not is_toolbox:
|
|
115
|
+
deployment_config.config_dict["cmd"] = f"sleep {max_duration}"
|
|
116
|
+
|
|
117
|
+
# Create the app with a new name
|
|
118
|
+
formatted_job = deployment_config.format_kubernetes_job(
|
|
119
|
+
job_label=REMOTE_RUN_JOB_LABEL,
|
|
120
|
+
deadline_seconds=max_duration,
|
|
121
|
+
keep_routable_ip=is_toolbox,
|
|
122
|
+
)
|
|
123
|
+
job_name = _format_remote_run_job_name(formatted_job, user)
|
|
124
|
+
formatted_job.metadata.name = job_name
|
|
125
|
+
app_wrapper = get_application_wrapper(formatted_job)
|
|
126
|
+
app_wrapper.soa_config = deployment_config
|
|
127
|
+
|
|
128
|
+
# Launch pod
|
|
129
|
+
logger.info(f"Starting {job_name}")
|
|
130
|
+
try:
|
|
131
|
+
app_wrapper.create(kube_client)
|
|
132
|
+
except ApiException as e:
|
|
133
|
+
if e.status != 409:
|
|
134
|
+
raise
|
|
135
|
+
if recreate:
|
|
136
|
+
remote_run_stop(
|
|
137
|
+
service=service,
|
|
138
|
+
instance=instance,
|
|
139
|
+
cluster=cluster,
|
|
140
|
+
user=user,
|
|
141
|
+
is_toolbox=is_toolbox,
|
|
142
|
+
)
|
|
143
|
+
return remote_run_start(
|
|
144
|
+
service=service,
|
|
145
|
+
instance=instance,
|
|
146
|
+
cluster=cluster,
|
|
147
|
+
user=user,
|
|
148
|
+
interactive=interactive,
|
|
149
|
+
recreate=False,
|
|
150
|
+
max_duration=max_duration,
|
|
151
|
+
is_toolbox=is_toolbox,
|
|
152
|
+
)
|
|
153
|
+
|
|
154
|
+
return {
|
|
155
|
+
"status": 200,
|
|
156
|
+
"message": "Remote run sandbox started",
|
|
157
|
+
"job_name": job_name,
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
def remote_run_ready(
|
|
162
|
+
service: str,
|
|
163
|
+
instance: str,
|
|
164
|
+
cluster: str,
|
|
165
|
+
job_name: str,
|
|
166
|
+
user: str,
|
|
167
|
+
is_toolbox: bool,
|
|
168
|
+
) -> RemoteRunOutcome:
|
|
169
|
+
"""Check if remote-run pod is ready
|
|
170
|
+
|
|
171
|
+
:param str service: service name
|
|
172
|
+
:param str instance: service instance
|
|
173
|
+
:param str cluster: paasta cluster
|
|
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
|
|
176
|
+
:return: job status, with pod info
|
|
177
|
+
"""
|
|
178
|
+
kube_client = KubeClient()
|
|
179
|
+
|
|
180
|
+
# Load the service deployment settings
|
|
181
|
+
deployment_config = (
|
|
182
|
+
generate_toolbox_deployment(service, cluster, user)
|
|
183
|
+
if is_toolbox
|
|
184
|
+
else load_eks_service_config(service, instance, cluster)
|
|
185
|
+
)
|
|
186
|
+
namespace = deployment_config.get_namespace()
|
|
187
|
+
|
|
188
|
+
pod = find_job_pod(kube_client, namespace, job_name)
|
|
189
|
+
if not pod:
|
|
190
|
+
return {"status": 404, "message": "No pod found"}
|
|
191
|
+
if pod.status.phase == "Running":
|
|
192
|
+
result: RemoteRunOutcome = {
|
|
193
|
+
"status": 200,
|
|
194
|
+
"message": "Pod ready",
|
|
195
|
+
"pod_name": pod.metadata.name,
|
|
196
|
+
"namespace": namespace,
|
|
197
|
+
}
|
|
198
|
+
if is_toolbox:
|
|
199
|
+
result["pod_address"] = pod.status.pod_ip
|
|
200
|
+
return result
|
|
201
|
+
return {
|
|
202
|
+
"status": 204,
|
|
203
|
+
"message": "Pod not ready",
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
def remote_run_stop(
|
|
208
|
+
service: str,
|
|
209
|
+
instance: str,
|
|
210
|
+
cluster: str,
|
|
211
|
+
user: str,
|
|
212
|
+
is_toolbox: bool,
|
|
213
|
+
) -> RemoteRunOutcome:
|
|
214
|
+
"""Stop remote-run job
|
|
215
|
+
|
|
216
|
+
:param str service: service name
|
|
217
|
+
:param str instance: service instance
|
|
218
|
+
:param str cluster: paasta cluster
|
|
219
|
+
:param str user: the user requesting the remote-run sandbox
|
|
220
|
+
:param bool is_toolbox: requested job is for a toolbox container
|
|
221
|
+
:return: outcome of the operation
|
|
222
|
+
"""
|
|
223
|
+
kube_client = KubeClient()
|
|
224
|
+
|
|
225
|
+
# Load the service deployment settings
|
|
226
|
+
deployment_config = (
|
|
227
|
+
generate_toolbox_deployment(service, cluster, user)
|
|
228
|
+
if is_toolbox
|
|
229
|
+
else load_eks_service_config(service, instance, cluster)
|
|
230
|
+
)
|
|
231
|
+
|
|
232
|
+
# Rebuild the job metadata
|
|
233
|
+
formatted_job = deployment_config.format_kubernetes_job(
|
|
234
|
+
job_label=REMOTE_RUN_JOB_LABEL
|
|
235
|
+
)
|
|
236
|
+
job_name = _format_remote_run_job_name(formatted_job, user)
|
|
237
|
+
formatted_job.metadata.name = job_name
|
|
238
|
+
|
|
239
|
+
# Stop the job
|
|
240
|
+
logger.info(f"Stopping {job_name}")
|
|
241
|
+
app_wrapper = get_application_wrapper(formatted_job)
|
|
242
|
+
app_wrapper.soa_config = deployment_config
|
|
243
|
+
app_wrapper.deep_delete(kube_client)
|
|
244
|
+
|
|
245
|
+
return {"status": 200, "message": "Job successfully removed"}
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
def remote_run_token(
|
|
249
|
+
service: str,
|
|
250
|
+
instance: str,
|
|
251
|
+
cluster: str,
|
|
252
|
+
user: str,
|
|
253
|
+
) -> str:
|
|
254
|
+
"""Creates a short lived token for execing into a pod
|
|
255
|
+
|
|
256
|
+
:param str service: service name
|
|
257
|
+
:param str instance: service instance
|
|
258
|
+
:param str cluster: paasta cluster
|
|
259
|
+
:param str user: the user requesting the remote-run sandbox
|
|
260
|
+
"""
|
|
261
|
+
kube_client = KubeClient()
|
|
262
|
+
|
|
263
|
+
# Load the service deployment settings
|
|
264
|
+
deployment_config = load_eks_service_config(service, instance, cluster)
|
|
265
|
+
namespace = deployment_config.get_namespace()
|
|
266
|
+
|
|
267
|
+
# Rebuild the job metadata
|
|
268
|
+
formatted_job = deployment_config.format_kubernetes_job(
|
|
269
|
+
job_label=REMOTE_RUN_JOB_LABEL
|
|
270
|
+
)
|
|
271
|
+
job_name = _format_remote_run_job_name(formatted_job, user)
|
|
272
|
+
|
|
273
|
+
# Find pod and create exec token for it
|
|
274
|
+
pod = find_job_pod(kube_client, namespace, job_name)
|
|
275
|
+
if not pod:
|
|
276
|
+
raise RemoteRunError(f"Pod for {job_name} not found")
|
|
277
|
+
pod_name = pod.metadata.name
|
|
278
|
+
logger.info(f"Generating temporary service account token for {pod_name}")
|
|
279
|
+
service_account = create_remote_run_service_account(
|
|
280
|
+
kube_client, namespace, pod_name, user
|
|
281
|
+
)
|
|
282
|
+
role = create_pod_scoped_role(kube_client, namespace, pod_name, user)
|
|
283
|
+
bind_role_to_service_account(kube_client, namespace, service_account, role, user)
|
|
284
|
+
return create_temp_exec_token(kube_client, namespace, service_account)
|
|
285
|
+
|
|
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
|
+
|
|
331
|
+
def find_job_pod(
|
|
332
|
+
kube_client: KubeClient,
|
|
333
|
+
namespace: str,
|
|
334
|
+
job_name: str,
|
|
335
|
+
job_label: str = REMOTE_RUN_JOB_LABEL,
|
|
336
|
+
retries: int = 3,
|
|
337
|
+
) -> Optional[V1Pod]:
|
|
338
|
+
"""Locate pod for remote-run job
|
|
339
|
+
|
|
340
|
+
:param KubeClient kube_client: Kubernetes client
|
|
341
|
+
:param str namespace: the pod namespace
|
|
342
|
+
:param str job_name: remote-run job name
|
|
343
|
+
:param int retries: maximum number of attemps
|
|
344
|
+
:return: pod object if found
|
|
345
|
+
"""
|
|
346
|
+
selectors = (
|
|
347
|
+
f"{paasta_prefixed(JOB_TYPE_LABEL_NAME)}={job_label}",
|
|
348
|
+
f"job-name={job_name}",
|
|
349
|
+
)
|
|
350
|
+
for _ in range(retries):
|
|
351
|
+
pod_list = kube_client.core.list_namespaced_pod(
|
|
352
|
+
namespace,
|
|
353
|
+
label_selector=",".join(selectors),
|
|
354
|
+
)
|
|
355
|
+
if pod_list.items:
|
|
356
|
+
return pod_list.items[0]
|
|
357
|
+
sleep(0.5)
|
|
358
|
+
return None
|
|
359
|
+
|
|
360
|
+
|
|
361
|
+
def create_temp_exec_token(
|
|
362
|
+
kube_client: KubeClient,
|
|
363
|
+
namespace: str,
|
|
364
|
+
service_account: str,
|
|
365
|
+
) -> str:
|
|
366
|
+
"""Create a short lived token for service account
|
|
367
|
+
|
|
368
|
+
:param KubeClient kube_client: Kubernetes client
|
|
369
|
+
:param str namespace: service account namespace
|
|
370
|
+
:param str service_account: service account name
|
|
371
|
+
:return: token value
|
|
372
|
+
"""
|
|
373
|
+
token_spec = V1TokenRequestSpec(
|
|
374
|
+
expiration_seconds=600, # minimum allowed by k8s
|
|
375
|
+
audiences=[],
|
|
376
|
+
)
|
|
377
|
+
request = AuthenticationV1TokenRequest(spec=token_spec)
|
|
378
|
+
response = kube_client.core.create_namespaced_service_account_token(
|
|
379
|
+
service_account, namespace, request
|
|
380
|
+
)
|
|
381
|
+
return response.status.token
|
|
382
|
+
|
|
383
|
+
|
|
384
|
+
def get_remote_run_service_accounts(
|
|
385
|
+
kube_client: KubeClient, namespace: str, user: str = ""
|
|
386
|
+
) -> Sequence[V1ServiceAccount]:
|
|
387
|
+
"""List all temporary service account related to remote-run
|
|
388
|
+
|
|
389
|
+
:param KubeClient kube_client: Kubernetes client
|
|
390
|
+
:param str namespace: pod namespace
|
|
391
|
+
:param str user: optionally filter by owning user
|
|
392
|
+
:return: list of service accounts
|
|
393
|
+
"""
|
|
394
|
+
return get_all_service_accounts(
|
|
395
|
+
kube_client,
|
|
396
|
+
namespace=namespace,
|
|
397
|
+
label_selector=(f"{POD_OWNER_LABEL}={user}" if user else POD_OWNER_LABEL),
|
|
398
|
+
)
|
|
399
|
+
|
|
400
|
+
|
|
401
|
+
def create_remote_run_service_account(
|
|
402
|
+
kube_client: KubeClient,
|
|
403
|
+
namespace: str,
|
|
404
|
+
pod_name: str,
|
|
405
|
+
user: str,
|
|
406
|
+
) -> str:
|
|
407
|
+
"""Create service account to exec into remote-run pod
|
|
408
|
+
|
|
409
|
+
:param KubeClient kube_client: Kubernetes client
|
|
410
|
+
:param str namespace: pod namespace
|
|
411
|
+
:param str pod_name: pod name
|
|
412
|
+
:param str user: user requiring credentials
|
|
413
|
+
"""
|
|
414
|
+
pod_name_hash = hashlib.sha1(pod_name.encode("utf-8")).hexdigest()[:12]
|
|
415
|
+
service_account_name = limit_size_with_hash(f"remote-run-{user}-{pod_name_hash}")
|
|
416
|
+
service_accounts = get_remote_run_service_accounts(kube_client, namespace, user)
|
|
417
|
+
if any(item.metadata.name == service_account_name for item in service_accounts):
|
|
418
|
+
return service_account_name
|
|
419
|
+
service_account = V1ServiceAccount(
|
|
420
|
+
metadata=V1ObjectMeta(
|
|
421
|
+
name=service_account_name,
|
|
422
|
+
namespace=namespace,
|
|
423
|
+
labels={POD_OWNER_LABEL: user},
|
|
424
|
+
)
|
|
425
|
+
)
|
|
426
|
+
kube_client.core.create_namespaced_service_account(
|
|
427
|
+
namespace=namespace, body=service_account
|
|
428
|
+
)
|
|
429
|
+
return service_account_name
|
|
430
|
+
|
|
431
|
+
|
|
432
|
+
def create_pod_scoped_role(
|
|
433
|
+
kube_client: KubeClient,
|
|
434
|
+
namespace: str,
|
|
435
|
+
pod_name: str,
|
|
436
|
+
user: str,
|
|
437
|
+
) -> str:
|
|
438
|
+
"""Create role with execution access to specific pod
|
|
439
|
+
|
|
440
|
+
:param KubeClient kube_client: Kubernetes client
|
|
441
|
+
:param str namespace: pod namespace
|
|
442
|
+
:param str pod_name: pod name
|
|
443
|
+
:param str user: user requiring the role
|
|
444
|
+
:return: name of the role
|
|
445
|
+
"""
|
|
446
|
+
pod_name_hash = hashlib.sha1(pod_name.encode("utf-8")).hexdigest()[:12]
|
|
447
|
+
role_name = f"remote-run-role-{pod_name_hash}"
|
|
448
|
+
policy = V1PolicyRule(
|
|
449
|
+
verbs=["create", "get"],
|
|
450
|
+
resources=["pods", "pods/exec"],
|
|
451
|
+
resource_names=[pod_name],
|
|
452
|
+
api_groups=[""],
|
|
453
|
+
)
|
|
454
|
+
role = V1Role(
|
|
455
|
+
rules=[policy],
|
|
456
|
+
metadata=V1ObjectMeta(
|
|
457
|
+
name=role_name,
|
|
458
|
+
labels={POD_OWNER_LABEL: user},
|
|
459
|
+
),
|
|
460
|
+
)
|
|
461
|
+
try:
|
|
462
|
+
kube_client.rbac.create_namespaced_role(namespace=namespace, body=role)
|
|
463
|
+
except ApiException as e:
|
|
464
|
+
if e.status != 409:
|
|
465
|
+
raise
|
|
466
|
+
return role_name
|
|
467
|
+
|
|
468
|
+
|
|
469
|
+
def bind_role_to_service_account(
|
|
470
|
+
kube_client: KubeClient,
|
|
471
|
+
namespace: str,
|
|
472
|
+
service_account: str,
|
|
473
|
+
role: str,
|
|
474
|
+
user: str,
|
|
475
|
+
) -> None:
|
|
476
|
+
"""Bind service account to role
|
|
477
|
+
|
|
478
|
+
:param KubeClient kube_client: Kubernetes client
|
|
479
|
+
:param str namespace: service account namespace
|
|
480
|
+
:param str service_account: service account name
|
|
481
|
+
:param str role: role name
|
|
482
|
+
:param str user: user requiring the role
|
|
483
|
+
"""
|
|
484
|
+
role_binding = V1RoleBinding(
|
|
485
|
+
metadata=V1ObjectMeta(
|
|
486
|
+
name=limit_size_with_hash(f"remote-run-binding-{role}"),
|
|
487
|
+
namespace=namespace,
|
|
488
|
+
labels={POD_OWNER_LABEL: user},
|
|
489
|
+
),
|
|
490
|
+
role_ref=V1RoleRef(
|
|
491
|
+
api_group="rbac.authorization.k8s.io",
|
|
492
|
+
kind="Role",
|
|
493
|
+
name=role,
|
|
494
|
+
),
|
|
495
|
+
subjects=[
|
|
496
|
+
V1Subject(
|
|
497
|
+
kind="ServiceAccount",
|
|
498
|
+
name=service_account,
|
|
499
|
+
),
|
|
500
|
+
],
|
|
501
|
+
)
|
|
502
|
+
try:
|
|
503
|
+
kube_client.rbac.create_namespaced_role_binding(
|
|
504
|
+
namespace=namespace,
|
|
505
|
+
body=role_binding,
|
|
506
|
+
)
|
|
507
|
+
except ApiException as e:
|
|
508
|
+
if e.status != 409:
|
|
509
|
+
raise
|
|
510
|
+
|
|
511
|
+
|
|
512
|
+
def get_remote_run_roles(kube_client: KubeClient, namespace: str) -> List[V1Role]:
|
|
513
|
+
"""List all temporary roles related to remote-run
|
|
514
|
+
|
|
515
|
+
:param KubeClient kube_client: Kubernetes client
|
|
516
|
+
:param str namespace: role namespace
|
|
517
|
+
:return: list of roles
|
|
518
|
+
"""
|
|
519
|
+
return kube_client.rbac.list_namespaced_role(
|
|
520
|
+
namespace,
|
|
521
|
+
label_selector=POD_OWNER_LABEL,
|
|
522
|
+
).items
|
|
523
|
+
|
|
524
|
+
|
|
525
|
+
def get_remote_run_role_bindings(
|
|
526
|
+
kube_client: KubeClient, namespace: str
|
|
527
|
+
) -> List[V1RoleBinding]:
|
|
528
|
+
"""List all temporary role bindings related to remote-run
|
|
529
|
+
|
|
530
|
+
:param KubeClient kube_client: Kubernetes client
|
|
531
|
+
:param str namespace: role namespace
|
|
532
|
+
:return: list of roles
|
|
533
|
+
"""
|
|
534
|
+
return kube_client.rbac.list_namespaced_role_binding(
|
|
535
|
+
namespace,
|
|
536
|
+
label_selector=POD_OWNER_LABEL,
|
|
537
|
+
).items
|
|
538
|
+
|
|
539
|
+
|
|
540
|
+
def get_remote_run_jobs(kube_client: KubeClient, namespace: str) -> List[V1Job]:
|
|
541
|
+
"""List all remote-run jobs
|
|
542
|
+
|
|
543
|
+
:param KubeClient kube_client: Kubernetes client
|
|
544
|
+
:param str namespace: job namespace
|
|
545
|
+
"""
|
|
546
|
+
return kube_client.batches.list_namespaced_job(
|
|
547
|
+
namespace,
|
|
548
|
+
label_selector=f"{paasta_prefixed(JOB_TYPE_LABEL_NAME)}={REMOTE_RUN_JOB_LABEL}",
|
|
549
|
+
).items
|
|
550
|
+
|
|
551
|
+
|
|
552
|
+
def get_max_job_duration_limit() -> int:
|
|
553
|
+
"""Get maximum configured duration for a remote run job
|
|
554
|
+
|
|
555
|
+
:return: max duration in seconds
|
|
556
|
+
"""
|
|
557
|
+
system_config = load_system_paasta_config()
|
|
558
|
+
return system_config.get_remote_run_duration_limit(DEFAULT_MAX_DURATION_LIMIT)
|