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,129 @@
|
|
|
1
|
+
#!/usr/bin/env python3.8
|
|
2
|
+
import argparse
|
|
3
|
+
import os
|
|
4
|
+
import re
|
|
5
|
+
|
|
6
|
+
from paasta_tools import yaml_tools as yaml
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def replace(s, values):
|
|
10
|
+
s = re.sub(
|
|
11
|
+
r"<%(.*?)%>",
|
|
12
|
+
lambda x: values.get(
|
|
13
|
+
x.group(0).replace("<%", "").replace("%>", ""), x.group(0)
|
|
14
|
+
),
|
|
15
|
+
s,
|
|
16
|
+
)
|
|
17
|
+
return re.sub(
|
|
18
|
+
r"\$\((.*?)\)",
|
|
19
|
+
lambda x: os.environ.get(
|
|
20
|
+
x.group(0).replace("$(", "").replace(")", ""), x.group(0)
|
|
21
|
+
),
|
|
22
|
+
s,
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def render_file(src, dst, values, overwrite=True):
|
|
27
|
+
basename = os.path.basename(src)
|
|
28
|
+
new_name = replace(basename, values)
|
|
29
|
+
if not os.path.exists(new_name) or overwrite:
|
|
30
|
+
write_file(dst, new_name, src, values)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def write_file(dst, name, src, values):
|
|
34
|
+
with open(f"{dst}/{name}", "w") as new:
|
|
35
|
+
with open(f"{src}", "r") as old:
|
|
36
|
+
new.write(replace(old.read(), values))
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def render(src, dst, values={}, exclude={}, overwrite=True):
|
|
40
|
+
if os.path.isfile(src):
|
|
41
|
+
render_file(src, dst, values, overwrite)
|
|
42
|
+
return
|
|
43
|
+
for f in os.scandir(src):
|
|
44
|
+
if f.name.startswith(".") or f.path in exclude:
|
|
45
|
+
continue
|
|
46
|
+
if os.path.isfile(f.path):
|
|
47
|
+
render_file(f.path, dst, values, overwrite)
|
|
48
|
+
else:
|
|
49
|
+
new_dst = replace(f"{dst}/{f.name}", values)
|
|
50
|
+
try:
|
|
51
|
+
os.makedirs(new_dst, exist_ok=True)
|
|
52
|
+
except OSError as e:
|
|
53
|
+
if e.errno != os.errno.EEXIST:
|
|
54
|
+
raise
|
|
55
|
+
render(f.path, new_dst, values, exclude, overwrite)
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def parse_args():
|
|
59
|
+
parser = argparse.ArgumentParser(
|
|
60
|
+
description="Replaces all <%%> in all files in src with values provided, and writes the results to dst folder. $() is reserved for environment variables. File/dir that starts with . are ignored"
|
|
61
|
+
)
|
|
62
|
+
parser.add_argument(
|
|
63
|
+
"-s",
|
|
64
|
+
"--src",
|
|
65
|
+
type=str,
|
|
66
|
+
dest="src",
|
|
67
|
+
required=True,
|
|
68
|
+
help="src can be either a valid folder of directory. Note that src directory itself is not rendered. .* files/dirs are ignored.",
|
|
69
|
+
)
|
|
70
|
+
parser.add_argument(
|
|
71
|
+
"-d",
|
|
72
|
+
"--dst",
|
|
73
|
+
type=str,
|
|
74
|
+
dest="dst",
|
|
75
|
+
required=True,
|
|
76
|
+
help="Dst needs to be a directory.",
|
|
77
|
+
)
|
|
78
|
+
parser.add_argument(
|
|
79
|
+
"-v",
|
|
80
|
+
"--values",
|
|
81
|
+
type=str,
|
|
82
|
+
dest="values",
|
|
83
|
+
default=None,
|
|
84
|
+
help="values need to be valid file if provided",
|
|
85
|
+
)
|
|
86
|
+
args = parser.parse_args()
|
|
87
|
+
return args
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def render_values(src: str, dst: str, values: str, overwrite=True) -> None:
|
|
91
|
+
if values is not None:
|
|
92
|
+
values = os.path.abspath(values)
|
|
93
|
+
# Validate src and values. Dst needs to be a directory. src can be either a valid folder of directory. values need to be valid file if provided.
|
|
94
|
+
if not os.path.exists(src):
|
|
95
|
+
raise Exception("src path is invalid")
|
|
96
|
+
if not os.path.exists(dst) or not os.path.isdir(dst):
|
|
97
|
+
raise Exception("dst path is invalid")
|
|
98
|
+
if values and (not os.path.exists(values) or not os.path.isfile(values)):
|
|
99
|
+
raise Exception("values path is invalid")
|
|
100
|
+
# Lookup for values.yaml in src folder if values is not provided
|
|
101
|
+
if os.path.isdir(src) and values is None and os.path.exists(f"{src}/values.yaml"):
|
|
102
|
+
values = f"{src}/values.yaml"
|
|
103
|
+
config_dict = {}
|
|
104
|
+
if values is not None:
|
|
105
|
+
with open(values) as f:
|
|
106
|
+
config_dict = yaml.safe_load(f)
|
|
107
|
+
# Replace environment variables in values.yaml with environment variables
|
|
108
|
+
for k, v in config_dict.items():
|
|
109
|
+
config_dict[k] = re.sub(
|
|
110
|
+
r"\$\((.*?)\)",
|
|
111
|
+
lambda x: os.environ.get(
|
|
112
|
+
x.group(0).replace("$(", "").replace(")", ""), x.group(0)
|
|
113
|
+
),
|
|
114
|
+
v,
|
|
115
|
+
)
|
|
116
|
+
render(src, dst, config_dict, {values}, overwrite)
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
def main():
|
|
120
|
+
args = parse_args()
|
|
121
|
+
src = os.path.abspath(args.src)
|
|
122
|
+
dst = os.path.abspath(args.dst)
|
|
123
|
+
values = args.values
|
|
124
|
+
|
|
125
|
+
render_values(src, dst, values)
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
if __name__ == "__main__":
|
|
129
|
+
main()
|
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
import argparse
|
|
2
|
+
import logging
|
|
3
|
+
from collections import defaultdict
|
|
4
|
+
from typing import Any
|
|
5
|
+
from typing import cast
|
|
6
|
+
from typing import Dict
|
|
7
|
+
from typing import List
|
|
8
|
+
from typing import Literal
|
|
9
|
+
from typing import Optional
|
|
10
|
+
from typing import Set
|
|
11
|
+
from typing import TypedDict
|
|
12
|
+
from typing import Union
|
|
13
|
+
|
|
14
|
+
from paasta_tools.config_utils import AutoConfigUpdater
|
|
15
|
+
from paasta_tools.contrib.paasta_update_soa_memcpu import get_report_from_splunk
|
|
16
|
+
from paasta_tools.kubernetes_tools import SidecarResourceRequirements
|
|
17
|
+
from paasta_tools.utils import AUTO_SOACONFIG_SUBDIR
|
|
18
|
+
from paasta_tools.utils import DEFAULT_SOA_CONFIGS_GIT_URL
|
|
19
|
+
from paasta_tools.utils import format_git_url
|
|
20
|
+
from paasta_tools.utils import load_system_paasta_config
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
log = logging.getLogger(__name__)
|
|
24
|
+
|
|
25
|
+
NULL = "null"
|
|
26
|
+
SUPPORTED_CSV_KEYS = (
|
|
27
|
+
"cpus",
|
|
28
|
+
"mem",
|
|
29
|
+
"disk",
|
|
30
|
+
"hacheck_cpus",
|
|
31
|
+
"cpu_burst_add",
|
|
32
|
+
"min_instances",
|
|
33
|
+
"max_instances",
|
|
34
|
+
)
|
|
35
|
+
HEADER_COMMENT = """
|
|
36
|
+
# This file contains recommended config values for your service generated by
|
|
37
|
+
# automated processes.
|
|
38
|
+
#
|
|
39
|
+
# Your service will use these values if they are not defined in
|
|
40
|
+
# {regular_filename}.
|
|
41
|
+
#
|
|
42
|
+
# If you would like to override a config value defined here, add the config
|
|
43
|
+
# value to {regular_filename} instead of editing this file.
|
|
44
|
+
# ==============================================================================
|
|
45
|
+
{{}}
|
|
46
|
+
"""
|
|
47
|
+
# ^ Needs an empty dict at the end for ruamel to return a non-None value when loading
|
|
48
|
+
# ^ Braces are doubled for escaping in call to .format
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def parse_args():
|
|
52
|
+
parser = argparse.ArgumentParser(description="")
|
|
53
|
+
parser.add_argument(
|
|
54
|
+
"-s",
|
|
55
|
+
"--splunk-creds",
|
|
56
|
+
help="Service credentials for Splunk API, user:pass",
|
|
57
|
+
dest="splunk_creds",
|
|
58
|
+
required=True,
|
|
59
|
+
)
|
|
60
|
+
parser.add_argument(
|
|
61
|
+
"-f",
|
|
62
|
+
"--criteria-filter",
|
|
63
|
+
help="Filter Splunk search results criteria field. Default: *",
|
|
64
|
+
dest="criteria_filter",
|
|
65
|
+
required=False,
|
|
66
|
+
default="*",
|
|
67
|
+
)
|
|
68
|
+
parser.add_argument(
|
|
69
|
+
"-c",
|
|
70
|
+
"--csv-report",
|
|
71
|
+
help="Splunk csv file from which to pull data.",
|
|
72
|
+
required=True,
|
|
73
|
+
dest="csv_report",
|
|
74
|
+
)
|
|
75
|
+
parser.add_argument(
|
|
76
|
+
"--csv-key",
|
|
77
|
+
help="Key(s) to apply to config from the csv. If not specified, applies all supported keys.",
|
|
78
|
+
choices=SUPPORTED_CSV_KEYS,
|
|
79
|
+
required=False,
|
|
80
|
+
nargs="*",
|
|
81
|
+
default=None,
|
|
82
|
+
dest="csv_keys",
|
|
83
|
+
)
|
|
84
|
+
parser.add_argument(
|
|
85
|
+
"--app",
|
|
86
|
+
help="Splunk app of the CSV file",
|
|
87
|
+
default="yelp_computeinfra",
|
|
88
|
+
required=False,
|
|
89
|
+
dest="splunk_app",
|
|
90
|
+
)
|
|
91
|
+
parser.add_argument(
|
|
92
|
+
"--git-remote",
|
|
93
|
+
help="Master git repo for soaconfigs",
|
|
94
|
+
default=None,
|
|
95
|
+
dest="git_remote",
|
|
96
|
+
)
|
|
97
|
+
parser.add_argument(
|
|
98
|
+
"--branch",
|
|
99
|
+
help="Branch name to push to. Defaults to master",
|
|
100
|
+
default="master",
|
|
101
|
+
required=False,
|
|
102
|
+
dest="branch",
|
|
103
|
+
)
|
|
104
|
+
parser.add_argument(
|
|
105
|
+
"--push-to-remote",
|
|
106
|
+
help="Actually push to remote. Otherwise files will only be modified and validated.",
|
|
107
|
+
action="store_true",
|
|
108
|
+
dest="push_to_remote",
|
|
109
|
+
)
|
|
110
|
+
parser.add_argument(
|
|
111
|
+
"--local-dir",
|
|
112
|
+
help="Act on configs in the local directory rather than cloning the git_remote",
|
|
113
|
+
required=False,
|
|
114
|
+
default=None,
|
|
115
|
+
dest="local_dir",
|
|
116
|
+
)
|
|
117
|
+
parser.add_argument(
|
|
118
|
+
"--source-id",
|
|
119
|
+
help="String to attribute the changes in the commit message. Defaults to csv report name",
|
|
120
|
+
required=False,
|
|
121
|
+
default=None,
|
|
122
|
+
dest="source_id",
|
|
123
|
+
)
|
|
124
|
+
parser.add_argument(
|
|
125
|
+
"-v",
|
|
126
|
+
"--verbose",
|
|
127
|
+
help="Logging verbosity",
|
|
128
|
+
action="store_true",
|
|
129
|
+
dest="verbose",
|
|
130
|
+
)
|
|
131
|
+
parser.add_argument(
|
|
132
|
+
"--exclude-clusters",
|
|
133
|
+
required=False,
|
|
134
|
+
default=None,
|
|
135
|
+
nargs="+",
|
|
136
|
+
)
|
|
137
|
+
return parser.parse_args()
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
def get_default_git_remote():
|
|
141
|
+
system_paasta_config = load_system_paasta_config()
|
|
142
|
+
repo_config = system_paasta_config.get_git_repo_config("yelpsoa-configs")
|
|
143
|
+
default_git_remote = format_git_url(
|
|
144
|
+
system_paasta_config.get_git_config()["git_user"],
|
|
145
|
+
repo_config.get("git_server", DEFAULT_SOA_CONFIGS_GIT_URL),
|
|
146
|
+
repo_config["repo_name"],
|
|
147
|
+
)
|
|
148
|
+
return default_git_remote
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
SupportedInstanceType = Literal["kubernetes", "eks", "cassandracluster"]
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
class CassandraRightsizerResult(TypedDict):
|
|
155
|
+
current_cpus: str
|
|
156
|
+
suggested_cpus: str
|
|
157
|
+
|
|
158
|
+
current_disk: str
|
|
159
|
+
suggested_disk: str
|
|
160
|
+
|
|
161
|
+
current_mem: str
|
|
162
|
+
suggested_mem: str
|
|
163
|
+
|
|
164
|
+
current_replicas: str
|
|
165
|
+
suggested_replicas: str
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
class CassandraRecommendation(TypedDict, total=False):
|
|
169
|
+
disk: str
|
|
170
|
+
mem: str
|
|
171
|
+
cpus: float
|
|
172
|
+
replicas: int
|
|
173
|
+
cpu_burst_percent: float
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
class KubernetesRightsizerResult(TypedDict):
|
|
177
|
+
current_cpus: str
|
|
178
|
+
suggested_cpus: str
|
|
179
|
+
|
|
180
|
+
current_disk: str
|
|
181
|
+
suggested_disk: str
|
|
182
|
+
|
|
183
|
+
current_mem: str
|
|
184
|
+
suggested_mem: str
|
|
185
|
+
|
|
186
|
+
suggested_hacheck_cpus: float
|
|
187
|
+
|
|
188
|
+
suggested_cpu_burst_add: float
|
|
189
|
+
|
|
190
|
+
suggested_min_instances: int
|
|
191
|
+
|
|
192
|
+
suggested_max_instances: int
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
class KubernetesRecommendation(TypedDict, total=False):
|
|
196
|
+
disk: float
|
|
197
|
+
mem: float
|
|
198
|
+
cpus: float
|
|
199
|
+
cpu_burst_add: float
|
|
200
|
+
max_instances: int
|
|
201
|
+
min_instances: int
|
|
202
|
+
sidecar_resource_requirements: Dict[str, SidecarResourceRequirements]
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
def get_kubernetes_recommendation_from_result(
|
|
206
|
+
result: KubernetesRightsizerResult, keys_to_apply: List[str]
|
|
207
|
+
) -> KubernetesRecommendation:
|
|
208
|
+
rec: KubernetesRecommendation = {}
|
|
209
|
+
for key in keys_to_apply:
|
|
210
|
+
val: Optional[str] = cast(Optional[str], result.get(key))
|
|
211
|
+
if not val or val == NULL:
|
|
212
|
+
continue
|
|
213
|
+
if key == "cpus":
|
|
214
|
+
rec["cpus"] = float(val)
|
|
215
|
+
elif key == "cpu_burst_add":
|
|
216
|
+
rec["cpu_burst_add"] = min(1, float(val))
|
|
217
|
+
elif key == "mem":
|
|
218
|
+
rec["mem"] = max(128, round(float(val)))
|
|
219
|
+
elif key == "disk":
|
|
220
|
+
rec["disk"] = max(128, round(float(val)))
|
|
221
|
+
elif key == "min_instances":
|
|
222
|
+
rec["min_instances"] = int(val)
|
|
223
|
+
elif key == "max_instances":
|
|
224
|
+
rec["max_instances"] = int(val)
|
|
225
|
+
elif key == "hacheck_cpus":
|
|
226
|
+
hacheck_cpus_value = max(0.1, min(float(val), 1))
|
|
227
|
+
rec["sidecar_resource_requirements"] = {
|
|
228
|
+
"hacheck": {
|
|
229
|
+
"requests": {
|
|
230
|
+
"cpu": hacheck_cpus_value,
|
|
231
|
+
},
|
|
232
|
+
"limits": {
|
|
233
|
+
"cpu": hacheck_cpus_value,
|
|
234
|
+
},
|
|
235
|
+
},
|
|
236
|
+
}
|
|
237
|
+
return rec
|
|
238
|
+
|
|
239
|
+
|
|
240
|
+
def get_cassandra_recommendation_from_result(
|
|
241
|
+
result: CassandraRightsizerResult, keys_to_apply: List[str]
|
|
242
|
+
) -> CassandraRecommendation:
|
|
243
|
+
rec: CassandraRecommendation = {}
|
|
244
|
+
for key in keys_to_apply:
|
|
245
|
+
val: Optional[str] = cast(Optional[str], result.get(key))
|
|
246
|
+
if not val or val == NULL:
|
|
247
|
+
continue
|
|
248
|
+
if key == "cpus":
|
|
249
|
+
rec["cpus"] = float(val)
|
|
250
|
+
elif key == "cpu_burst_percent":
|
|
251
|
+
rec["cpu_burst_percent"] = float(val)
|
|
252
|
+
elif key == "mem":
|
|
253
|
+
rec["mem"] = val
|
|
254
|
+
elif key == "disk":
|
|
255
|
+
rec["disk"] = val
|
|
256
|
+
elif key == "replicas":
|
|
257
|
+
rec["replicas"] = int(val)
|
|
258
|
+
return rec
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
def get_recommendations_by_service_file(
|
|
262
|
+
results,
|
|
263
|
+
keys_to_apply,
|
|
264
|
+
exclude_clusters: Set[str],
|
|
265
|
+
):
|
|
266
|
+
results_by_service_file: Dict[tuple, Dict[str, Any]] = defaultdict(dict)
|
|
267
|
+
for result in results.values():
|
|
268
|
+
# we occasionally want to disable autotune for a cluster (or set of clusters)
|
|
269
|
+
# to do so, we can simply skip getting recommendations for any (service, cluster)
|
|
270
|
+
# pairing that includes the cluster(s) to disable
|
|
271
|
+
if result["cluster"] in exclude_clusters:
|
|
272
|
+
print(
|
|
273
|
+
f"{result['service']}.{result['instance']} in {result['cluster']} skipped due to disabled cluster."
|
|
274
|
+
)
|
|
275
|
+
continue
|
|
276
|
+
|
|
277
|
+
key = (
|
|
278
|
+
result["service"],
|
|
279
|
+
result["cluster"],
|
|
280
|
+
) # e.g. (foo, kubernetes-norcal-stagef)
|
|
281
|
+
instance_type = result["cluster"].split("-", 1)[0]
|
|
282
|
+
rec: Union[KubernetesRecommendation, CassandraRecommendation] = {}
|
|
283
|
+
if instance_type == "cassandracluster":
|
|
284
|
+
rec = get_cassandra_recommendation_from_result(result, keys_to_apply)
|
|
285
|
+
elif instance_type == "kubernetes":
|
|
286
|
+
rec = get_kubernetes_recommendation_from_result(result, keys_to_apply)
|
|
287
|
+
if not rec:
|
|
288
|
+
continue
|
|
289
|
+
results_by_service_file[key][result["instance"]] = rec
|
|
290
|
+
return results_by_service_file
|
|
291
|
+
|
|
292
|
+
|
|
293
|
+
def get_extra_message(splunk_search_string):
|
|
294
|
+
return f"""Updated {AUTO_SOACONFIG_SUBDIR}. This review is based on results from the following Splunk search:\n
|
|
295
|
+
{splunk_search_string}
|
|
296
|
+
"""
|
|
297
|
+
|
|
298
|
+
|
|
299
|
+
def main(args):
|
|
300
|
+
report = get_report_from_splunk(
|
|
301
|
+
args.splunk_creds, args.splunk_app, args.csv_report, args.criteria_filter
|
|
302
|
+
)
|
|
303
|
+
extra_message = get_extra_message(report["search"])
|
|
304
|
+
config_source = args.source_id or args.csv_report
|
|
305
|
+
|
|
306
|
+
keys_to_apply = args.csv_keys or SUPPORTED_CSV_KEYS
|
|
307
|
+
results = get_recommendations_by_service_file(
|
|
308
|
+
report["results"],
|
|
309
|
+
keys_to_apply,
|
|
310
|
+
exclude_clusters={
|
|
311
|
+
f"kubernetes-{cluster}" for cluster in (args.exclude_clusters or [])
|
|
312
|
+
},
|
|
313
|
+
)
|
|
314
|
+
updater = AutoConfigUpdater(
|
|
315
|
+
config_source=config_source,
|
|
316
|
+
git_remote=args.git_remote or get_default_git_remote(),
|
|
317
|
+
branch=args.branch,
|
|
318
|
+
working_dir=args.local_dir or "/nail/tmp",
|
|
319
|
+
do_clone=args.local_dir is None,
|
|
320
|
+
validation_schema_path=AUTO_SOACONFIG_SUBDIR,
|
|
321
|
+
)
|
|
322
|
+
with updater:
|
|
323
|
+
for (
|
|
324
|
+
service,
|
|
325
|
+
instance_type_cluster,
|
|
326
|
+
), instance_recommendations in updater.merge_recommendations(results).items():
|
|
327
|
+
log.info(
|
|
328
|
+
f"Writing configs for {service} to {AUTO_SOACONFIG_SUBDIR}/{instance_type_cluster}.yaml..."
|
|
329
|
+
)
|
|
330
|
+
updater.write_configs(
|
|
331
|
+
service,
|
|
332
|
+
instance_type_cluster,
|
|
333
|
+
instance_recommendations,
|
|
334
|
+
AUTO_SOACONFIG_SUBDIR,
|
|
335
|
+
HEADER_COMMENT,
|
|
336
|
+
)
|
|
337
|
+
|
|
338
|
+
if args.push_to_remote:
|
|
339
|
+
updater.commit_to_remote(extra_message=extra_message)
|
|
340
|
+
else:
|
|
341
|
+
updater.validate()
|
|
342
|
+
|
|
343
|
+
|
|
344
|
+
if __name__ == "__main__":
|
|
345
|
+
args = parse_args()
|
|
346
|
+
if args.verbose:
|
|
347
|
+
logging.basicConfig(level=logging.DEBUG)
|
|
348
|
+
main(args)
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import argparse
|
|
2
|
+
import logging
|
|
3
|
+
|
|
4
|
+
from paasta_tools.config_utils import AutoConfigUpdater
|
|
5
|
+
from paasta_tools.utils import DEFAULT_SOA_CONFIGS_GIT_URL
|
|
6
|
+
from paasta_tools.utils import format_git_url
|
|
7
|
+
from paasta_tools.utils import load_system_paasta_config
|
|
8
|
+
|
|
9
|
+
log = logging.getLogger(__name__)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def get_default_git_remote() -> str:
|
|
13
|
+
system_paasta_config = load_system_paasta_config()
|
|
14
|
+
repo_config = system_paasta_config.get_git_repo_config("yelpsoa-configs")
|
|
15
|
+
default_git_remote = format_git_url(
|
|
16
|
+
system_paasta_config.get_git_config()["git_user"],
|
|
17
|
+
repo_config.get("git_server", DEFAULT_SOA_CONFIGS_GIT_URL),
|
|
18
|
+
repo_config["repo_name"],
|
|
19
|
+
)
|
|
20
|
+
return default_git_remote
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def parse_args():
|
|
24
|
+
parser = argparse.ArgumentParser(description="")
|
|
25
|
+
parser.add_argument(
|
|
26
|
+
"--git-remote",
|
|
27
|
+
help="Master git repo for soaconfigs",
|
|
28
|
+
default=get_default_git_remote(),
|
|
29
|
+
dest="git_remote",
|
|
30
|
+
)
|
|
31
|
+
parser.add_argument(
|
|
32
|
+
"--branch",
|
|
33
|
+
help="Branch name to push to",
|
|
34
|
+
required=True,
|
|
35
|
+
dest="branch",
|
|
36
|
+
)
|
|
37
|
+
parser.add_argument(
|
|
38
|
+
"--local-dir",
|
|
39
|
+
help="Act on configs in the local directory rather than cloning the git_remote",
|
|
40
|
+
required=False,
|
|
41
|
+
default=None,
|
|
42
|
+
dest="local_dir",
|
|
43
|
+
)
|
|
44
|
+
parser.add_argument(
|
|
45
|
+
"-v",
|
|
46
|
+
"--verbose",
|
|
47
|
+
help="Logging verbosity",
|
|
48
|
+
action="store_true",
|
|
49
|
+
dest="verbose",
|
|
50
|
+
)
|
|
51
|
+
parser.add_argument(
|
|
52
|
+
"--source-id",
|
|
53
|
+
help="String to attribute the changes in the commit message.",
|
|
54
|
+
required=False,
|
|
55
|
+
default=None,
|
|
56
|
+
dest="source_id",
|
|
57
|
+
)
|
|
58
|
+
parser.add_argument(
|
|
59
|
+
"--service",
|
|
60
|
+
help="Service to modify",
|
|
61
|
+
required=True,
|
|
62
|
+
dest="service",
|
|
63
|
+
)
|
|
64
|
+
parser.add_argument(
|
|
65
|
+
"--shard-name",
|
|
66
|
+
help="Shard name to remove",
|
|
67
|
+
required=True,
|
|
68
|
+
dest="shard_name",
|
|
69
|
+
)
|
|
70
|
+
parser.add_argument(
|
|
71
|
+
"--superregion",
|
|
72
|
+
nargs="+",
|
|
73
|
+
help="Superregion to remove shard from",
|
|
74
|
+
required=True,
|
|
75
|
+
)
|
|
76
|
+
return parser.parse_args()
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
SUPPERREGION_DEPLOY_MAPPINGS = {
|
|
80
|
+
"norcal-devc": "dev",
|
|
81
|
+
"norcal-stagef": "stage",
|
|
82
|
+
"norcal-stageg": "stage",
|
|
83
|
+
"nova-prod": "prod",
|
|
84
|
+
"pnw-prod": "prod",
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def main(args):
|
|
89
|
+
updater = AutoConfigUpdater(
|
|
90
|
+
config_source=args.source_id,
|
|
91
|
+
git_remote=args.git_remote,
|
|
92
|
+
branch=args.branch,
|
|
93
|
+
working_dir=args.local_dir or "/nail/tmp",
|
|
94
|
+
do_clone=args.local_dir is None,
|
|
95
|
+
)
|
|
96
|
+
with updater:
|
|
97
|
+
deploy_file = updater.get_existing_configs(args.service, "deploy")
|
|
98
|
+
smartstack_file = updater.get_existing_configs(args.service, "smartstack")
|
|
99
|
+
delete_all = set(args.superregion) == set(SUPPERREGION_DEPLOY_MAPPINGS.keys())
|
|
100
|
+
|
|
101
|
+
for superregion in args.superregion:
|
|
102
|
+
# Determine / load configuration (PAASTA-18216)
|
|
103
|
+
eks_config = updater.get_existing_configs(
|
|
104
|
+
args.service, f"eks-{superregion}"
|
|
105
|
+
)
|
|
106
|
+
kube_config = updater.get_existing_configs(
|
|
107
|
+
args.service, f"kubernetes-{superregion}"
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
if eks_config:
|
|
111
|
+
config_file = eks_config
|
|
112
|
+
config_file_suffix = "eks"
|
|
113
|
+
elif kube_config:
|
|
114
|
+
config_file = kube_config
|
|
115
|
+
config_file_suffix = "kubernetes"
|
|
116
|
+
else:
|
|
117
|
+
log.error(f"No EKS or Kubernetes config found for {args.service}")
|
|
118
|
+
continue
|
|
119
|
+
|
|
120
|
+
# Remove shard from deploy pipeline config
|
|
121
|
+
targeted_step = (
|
|
122
|
+
f"{SUPPERREGION_DEPLOY_MAPPINGS[superregion]}.{args.shard_name}"
|
|
123
|
+
)
|
|
124
|
+
deploy_file["pipeline"] = [
|
|
125
|
+
i for i in deploy_file["pipeline"] if i["step"] != targeted_step
|
|
126
|
+
]
|
|
127
|
+
log.info(f"{targeted_step} removed from deploy config")
|
|
128
|
+
updater.write_configs(args.service, "deploy", deploy_file)
|
|
129
|
+
|
|
130
|
+
# Remove shard from corresponding config
|
|
131
|
+
del config_file[args.shard_name]
|
|
132
|
+
updater.write_configs(
|
|
133
|
+
args.service, f"{config_file_suffix}-{superregion}", config_file
|
|
134
|
+
)
|
|
135
|
+
log.info(
|
|
136
|
+
f"{args.shard_name} removed from {config_file_suffix}-{superregion}"
|
|
137
|
+
)
|
|
138
|
+
|
|
139
|
+
# If we are removing the shard from all regions, remove it from smartstack too.
|
|
140
|
+
if delete_all:
|
|
141
|
+
del smartstack_file[args.shard_name]
|
|
142
|
+
updater.write_configs(args.service, "smartstack", smartstack_file)
|
|
143
|
+
log.info(f"{args.shard_name} removed from smartstack")
|
|
144
|
+
else:
|
|
145
|
+
log.info(f"not removing {args.shard_name} from smartstack")
|
|
146
|
+
|
|
147
|
+
updater.commit_to_remote()
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
if __name__ == "__main__":
|
|
151
|
+
args = parse_args()
|
|
152
|
+
if args.verbose:
|
|
153
|
+
logging.basicConfig(level=logging.DEBUG)
|
|
154
|
+
else:
|
|
155
|
+
logging.basicConfig(level=logging.WARNING)
|
|
156
|
+
|
|
157
|
+
main(args)
|