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
|
+
#!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
|
+
#!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,35 @@
|
|
|
1
|
+
#!python
|
|
2
|
+
import argparse
|
|
3
|
+
|
|
4
|
+
from boto3 import session
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def get_client(endpoint):
|
|
8
|
+
s = session.Session(
|
|
9
|
+
region_name="foo", aws_access_key_id="foo", aws_secret_access_key="bar"
|
|
10
|
+
)
|
|
11
|
+
client = s.client(service_name="dynamodb", endpoint_url=endpoint)
|
|
12
|
+
return client
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def create_table(client, table_name):
|
|
16
|
+
return client.create_table(
|
|
17
|
+
TableName=table_name,
|
|
18
|
+
KeySchema=[
|
|
19
|
+
{"AttributeName": "task_id", "KeyType": "HASH"},
|
|
20
|
+
{"AttributeName": "timestamp", "KeyType": "RANGE"},
|
|
21
|
+
],
|
|
22
|
+
AttributeDefinitions=[
|
|
23
|
+
{"AttributeName": "task_id", "AttributeType": "S"},
|
|
24
|
+
{"AttributeName": "timestamp", "AttributeType": "N"},
|
|
25
|
+
],
|
|
26
|
+
ProvisionedThroughput={"ReadCapacityUnits": 123, "WriteCapacityUnits": 123},
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
if __name__ == "__main__":
|
|
31
|
+
parser = argparse.ArgumentParser(description="Create a dummy dynamodb table")
|
|
32
|
+
parser.add_argument("endpoint", type=str, help="the dynamodb endpoint")
|
|
33
|
+
parser.add_argument("table_name", type=str, help="the name of the table to create")
|
|
34
|
+
args = parser.parse_args()
|
|
35
|
+
create_table(get_client(args.endpoint), args.table_name)
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import os
|
|
3
|
+
import socket
|
|
4
|
+
import subprocess
|
|
5
|
+
|
|
6
|
+
from render_template import render_values
|
|
7
|
+
|
|
8
|
+
from paasta_tools.cli.utils import pick_random_port
|
|
9
|
+
from paasta_tools.utils import get_docker_client
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def main():
|
|
13
|
+
config_path = "etc_paasta_playground"
|
|
14
|
+
values_path = "./k8s_itests/deployments/paasta/values.yaml"
|
|
15
|
+
user = os.getenv("USER")
|
|
16
|
+
|
|
17
|
+
# start a local copy of zookeeper on a random port
|
|
18
|
+
zookeeper_port = pick_random_port(f"{user}-paasta-zookeeper")
|
|
19
|
+
ensure_running_local_zookeeper(user, zookeeper_port)
|
|
20
|
+
os.environ["ZOOKEEPER_PORT"] = str(zookeeper_port)
|
|
21
|
+
os.environ["HOST_IP"] = socket.gethostbyname(socket.gethostname())
|
|
22
|
+
|
|
23
|
+
# create an etc_paasta_playground directory if it doesn't exist
|
|
24
|
+
# and copy fake_etc_paasta content into etc_paasta_playground directory
|
|
25
|
+
if not os.path.isdir("etc_paasta_playground"):
|
|
26
|
+
os.mkdir("etc_paasta_playground")
|
|
27
|
+
|
|
28
|
+
render_values(
|
|
29
|
+
src="./k8s_itests/deployments/paasta/fake_etc_paasta",
|
|
30
|
+
dst=config_path,
|
|
31
|
+
values=values_path,
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
# Add in volumes.json
|
|
35
|
+
hacheck_sidecar_volumes = {"volumes": [], "hacheck_sidecar_volumes": []}
|
|
36
|
+
volumes_path = os.path.join(config_path, "volumes.json")
|
|
37
|
+
with open(volumes_path, "w") as f:
|
|
38
|
+
json.dump(hacheck_sidecar_volumes, f)
|
|
39
|
+
|
|
40
|
+
# create a fake_soa_config directory if it doesn't exist
|
|
41
|
+
# and copy fake_soa_config content into soa_config_playground directory
|
|
42
|
+
if not os.path.isdir("soa_config_playground"):
|
|
43
|
+
os.mkdir("soa_config_playground")
|
|
44
|
+
|
|
45
|
+
render_values(
|
|
46
|
+
src="./k8s_itests/deployments/paasta/fake_soa_config",
|
|
47
|
+
dst="soa_config_playground",
|
|
48
|
+
values=values_path,
|
|
49
|
+
overwrite=False,
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def ensure_running_local_zookeeper(user: str, zookeeper_port: int) -> None:
|
|
54
|
+
client = get_docker_client()
|
|
55
|
+
containers = client.containers()
|
|
56
|
+
zookeeper_container = next(
|
|
57
|
+
(
|
|
58
|
+
container
|
|
59
|
+
for container in containers
|
|
60
|
+
if container["Names"] == [f"/{user}-paasta-zookeeper"]
|
|
61
|
+
),
|
|
62
|
+
None,
|
|
63
|
+
)
|
|
64
|
+
if zookeeper_container is None:
|
|
65
|
+
run_zookeeper_container(user, zookeeper_port)
|
|
66
|
+
elif zookeeper_container.get("Status") != "running":
|
|
67
|
+
client.remove_container(zookeeper_container, force=True)
|
|
68
|
+
run_zookeeper_container(user, zookeeper_port)
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def run_zookeeper_container(user: str, zookeeper_port: int) -> None:
|
|
72
|
+
if "yelpcorp.com" in socket.getfqdn():
|
|
73
|
+
subprocess.run(
|
|
74
|
+
[
|
|
75
|
+
"docker",
|
|
76
|
+
"run",
|
|
77
|
+
"-d",
|
|
78
|
+
"-p",
|
|
79
|
+
f"{zookeeper_port}:2181",
|
|
80
|
+
"-e",
|
|
81
|
+
'"ALLOW_ANONYMOUS_LOGIN=yes"',
|
|
82
|
+
"--name",
|
|
83
|
+
f"{user}-paasta-zookeeper",
|
|
84
|
+
"docker-dev.yelpcorp.com/zookeeper-testing",
|
|
85
|
+
]
|
|
86
|
+
)
|
|
87
|
+
else:
|
|
88
|
+
subprocess.run(
|
|
89
|
+
[
|
|
90
|
+
"docker",
|
|
91
|
+
"run",
|
|
92
|
+
"-d",
|
|
93
|
+
"-p",
|
|
94
|
+
f"{zookeeper_port}:2181",
|
|
95
|
+
"-e",
|
|
96
|
+
'"ALLOW_ANONYMOUS_LOGIN=yes"',
|
|
97
|
+
"--name",
|
|
98
|
+
f"{user}-paasta-zookeeper",
|
|
99
|
+
"zookeeper:3.5",
|
|
100
|
+
]
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
if __name__ == "__main__":
|
|
105
|
+
main()
|