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,145 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
# Copyright 2015-2019 Yelp Inc.
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
"""
|
|
16
|
+
Usage: ./cleanup_kubernetes_crd.py [options]
|
|
17
|
+
|
|
18
|
+
Command line options:
|
|
19
|
+
|
|
20
|
+
- -d <SOA_DIR>, --soa-dir <SOA_DIR>: Specify a SOA config dir to read from
|
|
21
|
+
- -c <cluster>, --cluster <cluster>: Specify a kubernetes cluster name
|
|
22
|
+
- -v, --verbose: Verbose output
|
|
23
|
+
- -n, --dry-run: Only report what would have been deleted
|
|
24
|
+
"""
|
|
25
|
+
import argparse
|
|
26
|
+
import logging
|
|
27
|
+
import sys
|
|
28
|
+
|
|
29
|
+
import service_configuration_lib
|
|
30
|
+
from kubernetes.client import V1DeleteOptions
|
|
31
|
+
from kubernetes.client.rest import ApiException
|
|
32
|
+
|
|
33
|
+
from paasta_tools.kubernetes_tools import KubeClient
|
|
34
|
+
from paasta_tools.kubernetes_tools import paasta_prefixed
|
|
35
|
+
from paasta_tools.utils import DEFAULT_SOA_DIR
|
|
36
|
+
from paasta_tools.utils import load_system_paasta_config
|
|
37
|
+
|
|
38
|
+
log = logging.getLogger(__name__)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def parse_args() -> argparse.Namespace:
|
|
42
|
+
parser = argparse.ArgumentParser(description="Removes stale kubernetes CRDs.")
|
|
43
|
+
parser.add_argument(
|
|
44
|
+
"-c",
|
|
45
|
+
"--cluster",
|
|
46
|
+
dest="cluster",
|
|
47
|
+
metavar="CLUSTER",
|
|
48
|
+
default=None,
|
|
49
|
+
help="Kubernetes cluster name",
|
|
50
|
+
)
|
|
51
|
+
parser.add_argument(
|
|
52
|
+
"-d",
|
|
53
|
+
"--soa-dir",
|
|
54
|
+
dest="soa_dir",
|
|
55
|
+
metavar="SOA_DIR",
|
|
56
|
+
default=DEFAULT_SOA_DIR,
|
|
57
|
+
help="define a different soa config directory",
|
|
58
|
+
)
|
|
59
|
+
parser.add_argument(
|
|
60
|
+
"-v", "--verbose", action="store_true", dest="verbose", default=False
|
|
61
|
+
)
|
|
62
|
+
parser.add_argument(
|
|
63
|
+
"-n", "--dry-run", action="store_true", dest="dry_run", default=False
|
|
64
|
+
)
|
|
65
|
+
args = parser.parse_args()
|
|
66
|
+
return args
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def main() -> None:
|
|
70
|
+
args = parse_args()
|
|
71
|
+
soa_dir = args.soa_dir
|
|
72
|
+
if args.verbose:
|
|
73
|
+
logging.basicConfig(level=logging.DEBUG)
|
|
74
|
+
else:
|
|
75
|
+
logging.basicConfig(level=logging.WARNING)
|
|
76
|
+
|
|
77
|
+
if args.cluster:
|
|
78
|
+
cluster = args.cluster
|
|
79
|
+
else:
|
|
80
|
+
system_paasta_config = load_system_paasta_config()
|
|
81
|
+
cluster = system_paasta_config.get_cluster()
|
|
82
|
+
|
|
83
|
+
kube_client = KubeClient()
|
|
84
|
+
|
|
85
|
+
success = cleanup_kube_crd(
|
|
86
|
+
kube_client=kube_client, cluster=cluster, soa_dir=soa_dir, dry_run=args.dry_run
|
|
87
|
+
)
|
|
88
|
+
sys.exit(0 if success else 1)
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def cleanup_kube_crd(
|
|
92
|
+
kube_client: KubeClient,
|
|
93
|
+
cluster: str,
|
|
94
|
+
soa_dir: str = DEFAULT_SOA_DIR,
|
|
95
|
+
dry_run: bool = False,
|
|
96
|
+
) -> bool:
|
|
97
|
+
service_attr = paasta_prefixed("service")
|
|
98
|
+
existing_crds = kube_client.apiextensions.list_custom_resource_definition(
|
|
99
|
+
label_selector=service_attr
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
success = True
|
|
103
|
+
for crd in existing_crds.items:
|
|
104
|
+
service = crd.metadata.labels[service_attr]
|
|
105
|
+
if not service:
|
|
106
|
+
log.error(f"CRD {crd.metadata.name} has empty {service_attr} label")
|
|
107
|
+
continue
|
|
108
|
+
|
|
109
|
+
protected_attr = paasta_prefixed("protected")
|
|
110
|
+
if crd.metadata.labels.get(protected_attr) is not None:
|
|
111
|
+
log.info(
|
|
112
|
+
f"CRD {crd.metadata.name} has {protected_attr} label set - skipping."
|
|
113
|
+
)
|
|
114
|
+
continue
|
|
115
|
+
|
|
116
|
+
crd_config = service_configuration_lib.read_extra_service_information(
|
|
117
|
+
service, f"crd-{cluster}", soa_dir=soa_dir
|
|
118
|
+
)
|
|
119
|
+
if crd_config:
|
|
120
|
+
log.debug(f"CRD {crd.metadata.name} declaration found in {service}")
|
|
121
|
+
continue
|
|
122
|
+
|
|
123
|
+
log.info(f"CRD {crd.metadata.name} not found in {service} service")
|
|
124
|
+
if dry_run:
|
|
125
|
+
log.info("not deleting in dry-run mode")
|
|
126
|
+
continue
|
|
127
|
+
|
|
128
|
+
try:
|
|
129
|
+
kube_client.apiextensions.delete_custom_resource_definition(
|
|
130
|
+
name=crd.metadata.name, body=V1DeleteOptions()
|
|
131
|
+
)
|
|
132
|
+
log.info(f"deleted {crd.metadata.name} for {cluster}:{service}")
|
|
133
|
+
except ApiException as exc:
|
|
134
|
+
log.error(
|
|
135
|
+
f"error deploying crd for {cluster}:{service}, "
|
|
136
|
+
f"status: {exc.status}, reason: {exc.reason}"
|
|
137
|
+
)
|
|
138
|
+
log.debug(exc.body)
|
|
139
|
+
success = False
|
|
140
|
+
|
|
141
|
+
return success
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
if __name__ == "__main__":
|
|
145
|
+
main()
|
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
# Copyright 2019-2020 Yelp Inc.
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License at
|
|
7
|
+
#
|
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
"""
|
|
16
|
+
Usage: ./cleanup_kubernetes_jobs.py [options]
|
|
17
|
+
|
|
18
|
+
Clean up kubernetes apps that aren't supposed to run on this cluster by deleting them.
|
|
19
|
+
|
|
20
|
+
Gets the current app list from kubernetes, and then a 'valid_app_list'
|
|
21
|
+
via utils.get_services_for_cluster
|
|
22
|
+
|
|
23
|
+
If an app in the kubernetes app list isn't in the valid_app_list, it's
|
|
24
|
+
deleted.
|
|
25
|
+
|
|
26
|
+
Command line options:
|
|
27
|
+
|
|
28
|
+
- -d <SOA_DIR>, --soa-dir <SOA_DIR>: Specify a SOA config dir to read from
|
|
29
|
+
- -v, --verbose: Verbose output
|
|
30
|
+
- -t <KILL_THRESHOLD>, --kill-threshold: The decimal fraction of apps we think
|
|
31
|
+
is sane to kill when this job runs
|
|
32
|
+
- -f, --force: Force the killing of apps if we breach the threshold
|
|
33
|
+
- -c, --cluster: Specifies the paasta cluster to check
|
|
34
|
+
- --eks: This flag cleans up only k8 services that shouldn't be running on EKS leaving instances from eks-*.yaml files
|
|
35
|
+
"""
|
|
36
|
+
import argparse
|
|
37
|
+
import logging
|
|
38
|
+
import sys
|
|
39
|
+
import traceback
|
|
40
|
+
from contextlib import contextmanager
|
|
41
|
+
from typing import Dict
|
|
42
|
+
from typing import Generator
|
|
43
|
+
from typing import List
|
|
44
|
+
from typing import Set
|
|
45
|
+
from typing import Tuple
|
|
46
|
+
from typing import Union
|
|
47
|
+
|
|
48
|
+
from kubernetes.client import V1Deployment
|
|
49
|
+
from kubernetes.client import V1StatefulSet
|
|
50
|
+
from pysensu_yelp import Status
|
|
51
|
+
|
|
52
|
+
from paasta_tools.eks_tools import EksDeploymentConfig
|
|
53
|
+
from paasta_tools.eks_tools import load_eks_service_config
|
|
54
|
+
from paasta_tools.kubernetes.application.controller_wrappers import DeploymentWrapper
|
|
55
|
+
from paasta_tools.kubernetes.application.controller_wrappers import StatefulSetWrapper
|
|
56
|
+
from paasta_tools.kubernetes.application.tools import Application
|
|
57
|
+
from paasta_tools.kubernetes.application.tools import list_all_applications
|
|
58
|
+
from paasta_tools.kubernetes_tools import KubeClient
|
|
59
|
+
from paasta_tools.kubernetes_tools import KubernetesDeploymentConfig
|
|
60
|
+
from paasta_tools.kubernetes_tools import load_kubernetes_service_config
|
|
61
|
+
from paasta_tools.monitoring_tools import send_event
|
|
62
|
+
from paasta_tools.utils import _log
|
|
63
|
+
from paasta_tools.utils import DEFAULT_SOA_DIR
|
|
64
|
+
from paasta_tools.utils import get_services_for_cluster
|
|
65
|
+
from paasta_tools.utils import load_system_paasta_config
|
|
66
|
+
|
|
67
|
+
log = logging.getLogger(__name__)
|
|
68
|
+
APPLICATION_TYPES = [V1StatefulSet, V1Deployment]
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
class DontKillEverythingError(Exception):
|
|
72
|
+
pass
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
class StatefulSetsAreNotSupportedError(Exception):
|
|
76
|
+
pass
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
@contextmanager
|
|
80
|
+
def alert_state_change(application: Application, cluster: str) -> Generator:
|
|
81
|
+
service = application.kube_deployment.service
|
|
82
|
+
instance = application.kube_deployment.instance
|
|
83
|
+
try:
|
|
84
|
+
yield
|
|
85
|
+
log_line = (
|
|
86
|
+
"Deleted stale Kubernetes apps that looks lost: %s"
|
|
87
|
+
% application.item.metadata.name
|
|
88
|
+
)
|
|
89
|
+
_log(
|
|
90
|
+
service=service,
|
|
91
|
+
component="deploy",
|
|
92
|
+
level="event",
|
|
93
|
+
cluster=cluster,
|
|
94
|
+
instance=instance,
|
|
95
|
+
line=log_line,
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
except Exception:
|
|
99
|
+
loglines = ["Exception raised during cleanup of service %s:" % application]
|
|
100
|
+
loglines.extend(traceback.format_exc().rstrip().split("\n"))
|
|
101
|
+
for logline in loglines:
|
|
102
|
+
_log(
|
|
103
|
+
service=service,
|
|
104
|
+
component="deploy",
|
|
105
|
+
level="debug",
|
|
106
|
+
cluster=cluster,
|
|
107
|
+
instance=instance,
|
|
108
|
+
line=logline,
|
|
109
|
+
)
|
|
110
|
+
raise
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
def instance_is_not_bouncing(
|
|
114
|
+
instance_config: Union[KubernetesDeploymentConfig, EksDeploymentConfig],
|
|
115
|
+
applications: List[Application],
|
|
116
|
+
) -> bool:
|
|
117
|
+
"""
|
|
118
|
+
|
|
119
|
+
:param instance_config: a KubernetesDeploymentConfig or an EksDeploymentConfig with the configuration of the instance
|
|
120
|
+
:param applications: a list of all deployments or stateful sets on the cluster that match the service
|
|
121
|
+
and instance of provided instance_config
|
|
122
|
+
"""
|
|
123
|
+
for application in applications:
|
|
124
|
+
if isinstance(application, DeploymentWrapper):
|
|
125
|
+
existing_app = application.item
|
|
126
|
+
if (
|
|
127
|
+
(
|
|
128
|
+
existing_app.metadata.namespace != instance_config.get_namespace()
|
|
129
|
+
and (instance_config.get_bounce_method() == "downthenup")
|
|
130
|
+
)
|
|
131
|
+
or (
|
|
132
|
+
existing_app.metadata.namespace == instance_config.get_namespace()
|
|
133
|
+
and (
|
|
134
|
+
instance_config.get_instances()
|
|
135
|
+
<= (existing_app.status.ready_replicas or 0)
|
|
136
|
+
)
|
|
137
|
+
)
|
|
138
|
+
) or instance_config.get_desired_state() == "stop":
|
|
139
|
+
return True
|
|
140
|
+
|
|
141
|
+
elif (
|
|
142
|
+
isinstance(application, StatefulSetWrapper)
|
|
143
|
+
and application.item.metadata.namespace != instance_config.get_namespace()
|
|
144
|
+
):
|
|
145
|
+
log.critical(
|
|
146
|
+
"Paasta detected a StatefulSet that was migrated to a new namespace"
|
|
147
|
+
"StatefulSet bouncing across namespaces is not supported"
|
|
148
|
+
)
|
|
149
|
+
raise StatefulSetsAreNotSupportedError
|
|
150
|
+
return False
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
def get_applications_to_kill(
|
|
154
|
+
applications_dict: Dict[Tuple[str, str], List[Application]],
|
|
155
|
+
cluster: str,
|
|
156
|
+
valid_services: Set[Tuple[str, str]],
|
|
157
|
+
soa_dir: str,
|
|
158
|
+
eks: bool = False,
|
|
159
|
+
) -> List[Application]:
|
|
160
|
+
"""
|
|
161
|
+
|
|
162
|
+
:param applications_dict: A dictionary with (service, instance) as keys and a list of applications for each tuple
|
|
163
|
+
:param cluster: paasta cluster
|
|
164
|
+
:param valid_services: a set with the valid (service, instance) tuples for this cluster
|
|
165
|
+
:param soa_dir: The SOA config directory to read from
|
|
166
|
+
:return: list of applications to kill
|
|
167
|
+
"""
|
|
168
|
+
log.info("Determining apps to be killed")
|
|
169
|
+
|
|
170
|
+
applications_to_kill: List[Application] = []
|
|
171
|
+
for (service, instance), applications in applications_dict.items():
|
|
172
|
+
if len(applications) >= 1:
|
|
173
|
+
if (service, instance) not in valid_services:
|
|
174
|
+
applications_to_kill.extend(applications)
|
|
175
|
+
else:
|
|
176
|
+
instance_config: Union[KubernetesDeploymentConfig, EksDeploymentConfig]
|
|
177
|
+
if eks:
|
|
178
|
+
instance_config = load_eks_service_config(
|
|
179
|
+
cluster=cluster,
|
|
180
|
+
service=service,
|
|
181
|
+
instance=instance,
|
|
182
|
+
soa_dir=soa_dir,
|
|
183
|
+
)
|
|
184
|
+
else:
|
|
185
|
+
instance_config = load_kubernetes_service_config(
|
|
186
|
+
cluster=cluster,
|
|
187
|
+
service=service,
|
|
188
|
+
instance=instance,
|
|
189
|
+
soa_dir=soa_dir,
|
|
190
|
+
)
|
|
191
|
+
try:
|
|
192
|
+
not_bouncing = instance_is_not_bouncing(
|
|
193
|
+
instance_config, applications
|
|
194
|
+
)
|
|
195
|
+
except StatefulSetsAreNotSupportedError:
|
|
196
|
+
overrides = {
|
|
197
|
+
"page": True,
|
|
198
|
+
"alert_after": 0,
|
|
199
|
+
"tip": f"Revert {service}.{instance} in soa-configs to not include the namespace key.",
|
|
200
|
+
"runbook": "y/rb-paasta-namespace",
|
|
201
|
+
"ticket": True,
|
|
202
|
+
}
|
|
203
|
+
send_event(
|
|
204
|
+
service=service,
|
|
205
|
+
check_name=f"statefulset_bounce_{service}.{instance}",
|
|
206
|
+
overrides=overrides,
|
|
207
|
+
status=Status.CRITICAL, # type: ignore
|
|
208
|
+
output=f"Unsupported bounce: {service}.{instance}. PaaSTA managed StatefulSets do not support custom namespace",
|
|
209
|
+
soa_dir=soa_dir,
|
|
210
|
+
)
|
|
211
|
+
else:
|
|
212
|
+
for application in applications:
|
|
213
|
+
if (
|
|
214
|
+
application.kube_deployment.namespace
|
|
215
|
+
!= instance_config.get_namespace()
|
|
216
|
+
and not_bouncing
|
|
217
|
+
):
|
|
218
|
+
applications_to_kill.append(application)
|
|
219
|
+
return applications_to_kill
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
def cleanup_unused_apps(
|
|
223
|
+
soa_dir: str,
|
|
224
|
+
cluster: str,
|
|
225
|
+
kill_threshold: float = 0.5,
|
|
226
|
+
force: bool = False,
|
|
227
|
+
eks: bool = False,
|
|
228
|
+
) -> None:
|
|
229
|
+
"""Clean up old or invalid jobs/apps from kubernetes. Retrieves
|
|
230
|
+
both a list of apps currently in kubernetes and a list of valid
|
|
231
|
+
app ids in order to determine what to kill.
|
|
232
|
+
|
|
233
|
+
:param soa_dir: The SOA config directory to read from
|
|
234
|
+
:param cluster: paasta cluster to clean
|
|
235
|
+
:param kill_threshold: The decimal fraction of apps we think is
|
|
236
|
+
sane to kill when this job runs.
|
|
237
|
+
:param force: Force the cleanup if we are above the kill_threshold"""
|
|
238
|
+
log.info("Creating KubeClient")
|
|
239
|
+
kube_client = KubeClient()
|
|
240
|
+
|
|
241
|
+
log.info("Loading running Kubernetes apps")
|
|
242
|
+
applications_dict = list_all_applications(kube_client, APPLICATION_TYPES)
|
|
243
|
+
log.info("Retrieving valid apps from yelpsoa_configs")
|
|
244
|
+
valid_services = set(
|
|
245
|
+
get_services_for_cluster(
|
|
246
|
+
instance_type="eks" if eks else "kubernetes", soa_dir=soa_dir
|
|
247
|
+
)
|
|
248
|
+
)
|
|
249
|
+
|
|
250
|
+
applications_to_kill: List[Application] = get_applications_to_kill(
|
|
251
|
+
applications_dict, cluster, valid_services, soa_dir, eks
|
|
252
|
+
)
|
|
253
|
+
|
|
254
|
+
log.debug("Running apps: %s" % list(applications_dict))
|
|
255
|
+
log.debug("Valid apps: %s" % valid_services)
|
|
256
|
+
log.debug("Terminating: %s" % applications_to_kill)
|
|
257
|
+
if applications_to_kill:
|
|
258
|
+
above_kill_threshold = float(len(applications_to_kill)) / float(
|
|
259
|
+
len(applications_dict)
|
|
260
|
+
) > float(kill_threshold)
|
|
261
|
+
if above_kill_threshold and not force:
|
|
262
|
+
log.critical(
|
|
263
|
+
"Paasta was about to kill more than %s of the running services, this "
|
|
264
|
+
"is probably a BAD mistake!, run again with --force if you "
|
|
265
|
+
"really need to destroy everything" % kill_threshold
|
|
266
|
+
)
|
|
267
|
+
raise DontKillEverythingError
|
|
268
|
+
|
|
269
|
+
for applicaton in applications_to_kill:
|
|
270
|
+
with alert_state_change(applicaton, cluster):
|
|
271
|
+
applicaton.deep_delete(kube_client)
|
|
272
|
+
|
|
273
|
+
|
|
274
|
+
def parse_args(argv):
|
|
275
|
+
parser = argparse.ArgumentParser(description="Cleans up stale kubernetes jobs.")
|
|
276
|
+
parser.add_argument(
|
|
277
|
+
"-d",
|
|
278
|
+
"--soa-dir",
|
|
279
|
+
dest="soa_dir",
|
|
280
|
+
metavar="SOA_DIR",
|
|
281
|
+
default=DEFAULT_SOA_DIR,
|
|
282
|
+
help="define a different soa config directory",
|
|
283
|
+
)
|
|
284
|
+
parser.add_argument(
|
|
285
|
+
"-c",
|
|
286
|
+
"--cluster",
|
|
287
|
+
dest="cluster",
|
|
288
|
+
default=load_system_paasta_config().get_cluster(),
|
|
289
|
+
help="paasta cluster",
|
|
290
|
+
)
|
|
291
|
+
parser.add_argument(
|
|
292
|
+
"-t",
|
|
293
|
+
"--kill-threshold",
|
|
294
|
+
dest="kill_threshold",
|
|
295
|
+
default=0.5,
|
|
296
|
+
help="The decimal fraction of apps we think is "
|
|
297
|
+
"sane to kill when this job runs",
|
|
298
|
+
)
|
|
299
|
+
parser.add_argument(
|
|
300
|
+
"-v", "--verbose", action="store_true", dest="verbose", default=False
|
|
301
|
+
)
|
|
302
|
+
parser.add_argument(
|
|
303
|
+
"-f",
|
|
304
|
+
"--force",
|
|
305
|
+
action="store_true",
|
|
306
|
+
dest="force",
|
|
307
|
+
default=False,
|
|
308
|
+
help="Force the cleanup if we are above the " "kill_threshold",
|
|
309
|
+
)
|
|
310
|
+
parser.add_argument(
|
|
311
|
+
"--eks",
|
|
312
|
+
help="This flag cleans up only k8 services that shouldn't be running on EKS leaving instances from eks-*.yaml files",
|
|
313
|
+
dest="eks",
|
|
314
|
+
action="store_true",
|
|
315
|
+
default=False,
|
|
316
|
+
)
|
|
317
|
+
return parser.parse_args(argv)
|
|
318
|
+
|
|
319
|
+
|
|
320
|
+
def main(argv=None) -> None:
|
|
321
|
+
args = parse_args(argv)
|
|
322
|
+
soa_dir = args.soa_dir
|
|
323
|
+
kill_threshold = args.kill_threshold
|
|
324
|
+
force = args.force
|
|
325
|
+
cluster = args.cluster
|
|
326
|
+
eks = args.eks
|
|
327
|
+
if args.verbose:
|
|
328
|
+
logging.basicConfig(level=logging.DEBUG)
|
|
329
|
+
else:
|
|
330
|
+
logging.basicConfig(level=logging.WARNING)
|
|
331
|
+
try:
|
|
332
|
+
cleanup_unused_apps(
|
|
333
|
+
soa_dir,
|
|
334
|
+
cluster=cluster,
|
|
335
|
+
kill_threshold=kill_threshold,
|
|
336
|
+
force=force,
|
|
337
|
+
eks=eks,
|
|
338
|
+
)
|
|
339
|
+
except DontKillEverythingError:
|
|
340
|
+
sys.exit(1)
|
|
341
|
+
|
|
342
|
+
|
|
343
|
+
if __name__ == "__main__":
|
|
344
|
+
main()
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
# Copyright 2015-2018 Yelp Inc.
|
|
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
|
+
"""
|
|
15
|
+
Usage: ./cleanup_tron_namespaces.py [options]
|
|
16
|
+
|
|
17
|
+
Delete namespaces that aren't configured in SOA configs for a Tron cluster.
|
|
18
|
+
|
|
19
|
+
Gets the list of namespaces from Tron, then compares to the namespaces
|
|
20
|
+
defined in SOA configs.
|
|
21
|
+
|
|
22
|
+
- -d <SOA_DIR>, --soa-dir <SOA_DIR>: Specify a SOA config dir to read from
|
|
23
|
+
- --dry-run: Print namespaces to be deleted instead of deleting them
|
|
24
|
+
"""
|
|
25
|
+
import argparse
|
|
26
|
+
import sys
|
|
27
|
+
|
|
28
|
+
from paasta_tools import tron_tools
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def parse_args():
|
|
32
|
+
parser = argparse.ArgumentParser(description="Cleans up stale Tron namespaces.")
|
|
33
|
+
parser.add_argument(
|
|
34
|
+
"-d",
|
|
35
|
+
"--soa-dir",
|
|
36
|
+
dest="soa_dir",
|
|
37
|
+
metavar="SOA_DIR",
|
|
38
|
+
default=tron_tools.DEFAULT_SOA_DIR,
|
|
39
|
+
help="Use a different soa config directory",
|
|
40
|
+
)
|
|
41
|
+
parser.add_argument(
|
|
42
|
+
"--dry-run",
|
|
43
|
+
dest="dry_run",
|
|
44
|
+
action="store_true",
|
|
45
|
+
help="Print namespaces to be deleted, instead of deleting them",
|
|
46
|
+
)
|
|
47
|
+
args = parser.parse_args()
|
|
48
|
+
return args
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def main():
|
|
52
|
+
args = parse_args()
|
|
53
|
+
|
|
54
|
+
cluster = tron_tools.load_tron_config().get_cluster_name()
|
|
55
|
+
client = tron_tools.get_tron_client()
|
|
56
|
+
namespaces = client.list_namespaces()
|
|
57
|
+
expected_namespaces = tron_tools.get_tron_namespaces(
|
|
58
|
+
cluster=cluster, soa_dir=args.soa_dir
|
|
59
|
+
)
|
|
60
|
+
to_delete = set(namespaces) - set(expected_namespaces) - {"MASTER"}
|
|
61
|
+
|
|
62
|
+
if not to_delete:
|
|
63
|
+
print("No Tron namespaces to remove")
|
|
64
|
+
sys.exit(0)
|
|
65
|
+
|
|
66
|
+
if args.dry_run:
|
|
67
|
+
print("Dry run, would have removed namespaces:\n " + "\n ".join(to_delete))
|
|
68
|
+
sys.exit(0)
|
|
69
|
+
|
|
70
|
+
successes = []
|
|
71
|
+
errors = []
|
|
72
|
+
for namespace in to_delete:
|
|
73
|
+
try:
|
|
74
|
+
client.update_namespace(namespace, "")
|
|
75
|
+
successes.append(namespace)
|
|
76
|
+
except Exception as e:
|
|
77
|
+
errors.append((namespace, e))
|
|
78
|
+
|
|
79
|
+
if successes:
|
|
80
|
+
print("Successfully removed namespaces:\n", "\n ".join(successes))
|
|
81
|
+
|
|
82
|
+
if errors:
|
|
83
|
+
print(
|
|
84
|
+
"Failed to remove namespaces:\n "
|
|
85
|
+
+ "\n ".join(
|
|
86
|
+
[
|
|
87
|
+
"{namespace}: {error}".format(namespace=namespace, error=str(error))
|
|
88
|
+
for namespace, error in errors
|
|
89
|
+
]
|
|
90
|
+
)
|
|
91
|
+
)
|
|
92
|
+
sys.exit(1)
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
if __name__ == "__main__":
|
|
96
|
+
main()
|
|
@@ -0,0 +1,13 @@
|
|
|
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.
|
|
@@ -0,0 +1,85 @@
|
|
|
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
|
+
from functools import lru_cache
|
|
15
|
+
|
|
16
|
+
from botocore.credentials import InstanceMetadataFetcher
|
|
17
|
+
from botocore.credentials import InstanceMetadataProvider
|
|
18
|
+
|
|
19
|
+
from paasta_tools.utils import load_system_paasta_config
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
try:
|
|
23
|
+
from vault_tools.paasta_secret import get_client as get_vault_client
|
|
24
|
+
from vault_tools.paasta_secret import get_vault_url
|
|
25
|
+
from vault_tools.paasta_secret import get_vault_ca
|
|
26
|
+
from okta_auth import get_and_cache_jwt_default
|
|
27
|
+
except ImportError:
|
|
28
|
+
|
|
29
|
+
def get_vault_client(url: str, capath: str) -> None:
|
|
30
|
+
pass
|
|
31
|
+
|
|
32
|
+
def get_vault_url(ecosystem: str) -> str:
|
|
33
|
+
return ""
|
|
34
|
+
|
|
35
|
+
def get_vault_ca(ecosystem: str) -> str:
|
|
36
|
+
return ""
|
|
37
|
+
|
|
38
|
+
def get_and_cache_jwt_default(client_id: str) -> str:
|
|
39
|
+
return ""
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def get_current_ecosystem() -> str:
|
|
43
|
+
"""Get current ecosystem from host configs, defaults to dev if no config is found"""
|
|
44
|
+
try:
|
|
45
|
+
with open("/nail/etc/ecosystem") as f:
|
|
46
|
+
return f.read().strip()
|
|
47
|
+
except IOError:
|
|
48
|
+
pass
|
|
49
|
+
return "devc"
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
@lru_cache(maxsize=1)
|
|
53
|
+
def get_service_auth_token() -> str:
|
|
54
|
+
"""Uses instance profile to authenticate with Vault and generate token for service authentication"""
|
|
55
|
+
ecosystem = get_current_ecosystem()
|
|
56
|
+
vault_client = get_vault_client(get_vault_url(ecosystem), get_vault_ca(ecosystem))
|
|
57
|
+
vault_role = load_system_paasta_config().get_service_auth_vault_role()
|
|
58
|
+
metadata_provider = InstanceMetadataProvider(
|
|
59
|
+
iam_role_fetcher=InstanceMetadataFetcher(),
|
|
60
|
+
)
|
|
61
|
+
instance_credentials = metadata_provider.load().get_frozen_credentials()
|
|
62
|
+
vault_client.auth.aws.iam_login(
|
|
63
|
+
instance_credentials.access_key,
|
|
64
|
+
instance_credentials.secret_key,
|
|
65
|
+
instance_credentials.token,
|
|
66
|
+
mount_point="aws-iam",
|
|
67
|
+
role=vault_role,
|
|
68
|
+
use_token=True,
|
|
69
|
+
)
|
|
70
|
+
response = vault_client.secrets.identity.generate_signed_id_token(name=vault_role)
|
|
71
|
+
return response["data"]["token"]
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def get_sso_auth_token(paasta_apis: bool = False) -> str:
|
|
75
|
+
"""Generate an authentication token for the calling user from the Single Sign On provider
|
|
76
|
+
|
|
77
|
+
:param bool paasta_apis: authenticate for PaaSTA APIs
|
|
78
|
+
"""
|
|
79
|
+
system_config = load_system_paasta_config()
|
|
80
|
+
client_id = (
|
|
81
|
+
system_config.get_api_auth_sso_oidc_client_id()
|
|
82
|
+
if paasta_apis
|
|
83
|
+
else system_config.get_service_auth_sso_oidc_client_id()
|
|
84
|
+
)
|
|
85
|
+
return get_and_cache_jwt_default(client_id)
|