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,373 @@
|
|
|
1
|
+
import argparse
|
|
2
|
+
import logging
|
|
3
|
+
import sys
|
|
4
|
+
|
|
5
|
+
from paasta_tools.cli.utils import trigger_deploys
|
|
6
|
+
from paasta_tools.config_utils import AutoConfigUpdater
|
|
7
|
+
from paasta_tools.utils import DEFAULT_SOA_CONFIGS_GIT_URL
|
|
8
|
+
from paasta_tools.utils import format_git_url
|
|
9
|
+
from paasta_tools.utils import load_system_paasta_config
|
|
10
|
+
|
|
11
|
+
log = logging.getLogger(__name__)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def parse_args():
|
|
15
|
+
parser = argparse.ArgumentParser(description="")
|
|
16
|
+
parser.add_argument(
|
|
17
|
+
"--git-remote",
|
|
18
|
+
help="Master git repo for soaconfigs",
|
|
19
|
+
default=None,
|
|
20
|
+
dest="git_remote",
|
|
21
|
+
)
|
|
22
|
+
parser.add_argument(
|
|
23
|
+
"--branch",
|
|
24
|
+
help="Branch name to push to",
|
|
25
|
+
required=True,
|
|
26
|
+
dest="branch",
|
|
27
|
+
)
|
|
28
|
+
parser.add_argument(
|
|
29
|
+
"--local-dir",
|
|
30
|
+
help="Act on configs in the local directory rather than cloning the git_remote",
|
|
31
|
+
required=False,
|
|
32
|
+
default=None,
|
|
33
|
+
dest="local_dir",
|
|
34
|
+
)
|
|
35
|
+
parser.add_argument(
|
|
36
|
+
"-v",
|
|
37
|
+
"--verbose",
|
|
38
|
+
help="Logging verbosity",
|
|
39
|
+
action="store_true",
|
|
40
|
+
dest="verbose",
|
|
41
|
+
)
|
|
42
|
+
parser.add_argument(
|
|
43
|
+
"-d",
|
|
44
|
+
"--dry-run",
|
|
45
|
+
help="Do not commit changes to git",
|
|
46
|
+
action="store_true",
|
|
47
|
+
dest="dry_run",
|
|
48
|
+
)
|
|
49
|
+
parser.add_argument(
|
|
50
|
+
"--source-id",
|
|
51
|
+
help="String to attribute the changes in the commit message.",
|
|
52
|
+
required=False,
|
|
53
|
+
default=None,
|
|
54
|
+
dest="source_id",
|
|
55
|
+
)
|
|
56
|
+
parser.add_argument(
|
|
57
|
+
"--service",
|
|
58
|
+
help="Service to modify",
|
|
59
|
+
required=True,
|
|
60
|
+
dest="service",
|
|
61
|
+
)
|
|
62
|
+
parser.add_argument(
|
|
63
|
+
"--min-instance-count",
|
|
64
|
+
help="If a deploy group is added, the min_instance count to create it with",
|
|
65
|
+
required=False,
|
|
66
|
+
default=1,
|
|
67
|
+
dest="min_instance_count",
|
|
68
|
+
)
|
|
69
|
+
parser.add_argument(
|
|
70
|
+
"--prod-max-instance-count",
|
|
71
|
+
help="If a deploy group is added, the prod max_instance count to create it with",
|
|
72
|
+
required=False,
|
|
73
|
+
default=100,
|
|
74
|
+
type=int,
|
|
75
|
+
dest="prod_max_instance_count",
|
|
76
|
+
)
|
|
77
|
+
parser.add_argument(
|
|
78
|
+
"--non-prod-max-instance-count",
|
|
79
|
+
help="If a deploy group is added, the non-prod max_instance count to create it with",
|
|
80
|
+
required=False,
|
|
81
|
+
default=5,
|
|
82
|
+
type=int,
|
|
83
|
+
dest="non_prod_max_instance_count",
|
|
84
|
+
)
|
|
85
|
+
parser.add_argument(
|
|
86
|
+
"--cpus",
|
|
87
|
+
help="If a deploy group is added, the cpu value to create it with",
|
|
88
|
+
required=False,
|
|
89
|
+
type=float,
|
|
90
|
+
dest="cpus",
|
|
91
|
+
)
|
|
92
|
+
parser.add_argument(
|
|
93
|
+
"--mem",
|
|
94
|
+
help="If a deploy group is added, the mem value to create it with",
|
|
95
|
+
required=False,
|
|
96
|
+
type=int,
|
|
97
|
+
dest="mem",
|
|
98
|
+
)
|
|
99
|
+
parser.add_argument(
|
|
100
|
+
"--setpoint",
|
|
101
|
+
help="If a deploy group is added, the autoscaling.setpoint value to create it with",
|
|
102
|
+
required=False,
|
|
103
|
+
type=float,
|
|
104
|
+
dest="setpoint",
|
|
105
|
+
)
|
|
106
|
+
parser.add_argument(
|
|
107
|
+
"--shard-name",
|
|
108
|
+
help="Shard name to add if it does not exist",
|
|
109
|
+
required=True,
|
|
110
|
+
dest="shard_name",
|
|
111
|
+
)
|
|
112
|
+
parser.add_argument(
|
|
113
|
+
"--metrics-provider",
|
|
114
|
+
help="Autoscaling metrics provider",
|
|
115
|
+
required=False,
|
|
116
|
+
dest="metrics_provider",
|
|
117
|
+
)
|
|
118
|
+
parser.add_argument(
|
|
119
|
+
"--timeout-server-ms",
|
|
120
|
+
help="smartstack server timeout",
|
|
121
|
+
required=False,
|
|
122
|
+
type=int,
|
|
123
|
+
dest="timeout_server_ms",
|
|
124
|
+
)
|
|
125
|
+
parser.add_argument(
|
|
126
|
+
"--autotune-min-cpus",
|
|
127
|
+
help="Minimum number of CPUs Autotune should give the shard",
|
|
128
|
+
required=False,
|
|
129
|
+
type=float,
|
|
130
|
+
dest="autotune_min_cpus",
|
|
131
|
+
)
|
|
132
|
+
parser.add_argument(
|
|
133
|
+
"--autotune-max-cpus",
|
|
134
|
+
help="Maximum number of CPUs Autotune should give the shard",
|
|
135
|
+
required=False,
|
|
136
|
+
type=float,
|
|
137
|
+
dest="autotune_max_cpus",
|
|
138
|
+
)
|
|
139
|
+
parser.add_argument(
|
|
140
|
+
"--autotune-min-mem",
|
|
141
|
+
help="Minimum amount of memory Autotune should give the shard",
|
|
142
|
+
required=False,
|
|
143
|
+
type=int,
|
|
144
|
+
dest="autotune_min_mem",
|
|
145
|
+
)
|
|
146
|
+
parser.add_argument(
|
|
147
|
+
"--autotune-max-mem",
|
|
148
|
+
help="Maximum amount of memory Autotune should give the shard",
|
|
149
|
+
required=False,
|
|
150
|
+
type=int,
|
|
151
|
+
dest="autotune_max_mem",
|
|
152
|
+
)
|
|
153
|
+
parser.add_argument(
|
|
154
|
+
"--autotune-min-disk",
|
|
155
|
+
help="Minimum amount of disk Autotune should give the shard",
|
|
156
|
+
required=False,
|
|
157
|
+
type=int,
|
|
158
|
+
dest="autotune_min_disk",
|
|
159
|
+
)
|
|
160
|
+
parser.add_argument(
|
|
161
|
+
"--autotune-max-disk",
|
|
162
|
+
help="Maximum amount of disk Autotune should give the shard",
|
|
163
|
+
required=False,
|
|
164
|
+
type=int,
|
|
165
|
+
dest="autotune_max_disk",
|
|
166
|
+
)
|
|
167
|
+
parser.add_argument(
|
|
168
|
+
"--iam-role",
|
|
169
|
+
help="IAM role to use for the shard",
|
|
170
|
+
required=False,
|
|
171
|
+
type=str,
|
|
172
|
+
dest="iam_role",
|
|
173
|
+
)
|
|
174
|
+
parser.add_argument(
|
|
175
|
+
"--environment",
|
|
176
|
+
help="Environment to deploy in, defaults to all environments if not specified",
|
|
177
|
+
required=False,
|
|
178
|
+
choices=DEPLOY_MAPPINGS.keys(),
|
|
179
|
+
dest="environment",
|
|
180
|
+
)
|
|
181
|
+
return parser.parse_args()
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
def get_default_git_remote():
|
|
185
|
+
system_paasta_config = load_system_paasta_config()
|
|
186
|
+
repo_config = system_paasta_config.get_git_repo_config("yelpsoa-configs")
|
|
187
|
+
default_git_remote = format_git_url(
|
|
188
|
+
system_paasta_config.get_git_config()["git_user"],
|
|
189
|
+
repo_config.get("git_server", DEFAULT_SOA_CONFIGS_GIT_URL),
|
|
190
|
+
repo_config["repo_name"],
|
|
191
|
+
)
|
|
192
|
+
return default_git_remote
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
DEPLOY_MAPPINGS = {
|
|
196
|
+
"dev": ["norcal-devc"],
|
|
197
|
+
"stage": ["norcal-stagef", "norcal-stageg"],
|
|
198
|
+
"prod": ["nova-prod", "pnw-prod"],
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
def main(args):
|
|
203
|
+
changes_made = False
|
|
204
|
+
updater = AutoConfigUpdater(
|
|
205
|
+
config_source=args.source_id,
|
|
206
|
+
git_remote=args.git_remote or get_default_git_remote(),
|
|
207
|
+
branch=args.branch,
|
|
208
|
+
working_dir=args.local_dir or "/nail/tmp",
|
|
209
|
+
do_clone=args.local_dir is None,
|
|
210
|
+
)
|
|
211
|
+
deploy_environments = (
|
|
212
|
+
{args.environment: DEPLOY_MAPPINGS[args.environment]}
|
|
213
|
+
if args.environment
|
|
214
|
+
else DEPLOY_MAPPINGS
|
|
215
|
+
)
|
|
216
|
+
|
|
217
|
+
with updater:
|
|
218
|
+
deploy_file = updater.get_existing_configs(args.service, "deploy")
|
|
219
|
+
smartstack_file = updater.get_existing_configs(args.service, "smartstack")
|
|
220
|
+
shard_deploy_groups = {
|
|
221
|
+
f"{prefix}.{args.shard_name}" for prefix in deploy_environments.keys()
|
|
222
|
+
}
|
|
223
|
+
pipeline_steps = {step["step"] for step in deploy_file["pipeline"]}
|
|
224
|
+
|
|
225
|
+
if not shard_deploy_groups.issubset(pipeline_steps):
|
|
226
|
+
changes_made = True
|
|
227
|
+
steps_to_add = shard_deploy_groups - pipeline_steps
|
|
228
|
+
|
|
229
|
+
# If the pipeline does not contain deploy groups for the service shard
|
|
230
|
+
# Add the missing steps and write to deploy config
|
|
231
|
+
for step in steps_to_add:
|
|
232
|
+
deploy_file["pipeline"].append(
|
|
233
|
+
{
|
|
234
|
+
"step": step,
|
|
235
|
+
"wait_for_deployment": True,
|
|
236
|
+
"disabled": True,
|
|
237
|
+
}
|
|
238
|
+
)
|
|
239
|
+
log.info(f"{step} added to deploy config")
|
|
240
|
+
updater.write_configs(args.service, "deploy", deploy_file)
|
|
241
|
+
|
|
242
|
+
for deploy_prefix, config_paths in deploy_environments.items():
|
|
243
|
+
for config_path in config_paths:
|
|
244
|
+
# Determine configuration suffix (PAASTA-18216)
|
|
245
|
+
eks_config = updater.get_existing_configs(
|
|
246
|
+
args.service, f"eks-{config_path}"
|
|
247
|
+
)
|
|
248
|
+
kube_config = updater.get_existing_configs(
|
|
249
|
+
args.service, f"kubernetes-{config_path}"
|
|
250
|
+
)
|
|
251
|
+
|
|
252
|
+
if eks_config:
|
|
253
|
+
config_file = eks_config
|
|
254
|
+
config_prefix = "eks-"
|
|
255
|
+
elif kube_config:
|
|
256
|
+
config_file = kube_config
|
|
257
|
+
config_prefix = "kubernetes-"
|
|
258
|
+
else:
|
|
259
|
+
log.error(
|
|
260
|
+
f"No EKS or Kubernetes config found for {args.service}"
|
|
261
|
+
)
|
|
262
|
+
continue
|
|
263
|
+
|
|
264
|
+
instance_config = {
|
|
265
|
+
"deploy_group": f"{deploy_prefix}.{args.shard_name}",
|
|
266
|
+
"min_instances": args.min_instance_count,
|
|
267
|
+
"max_instances": (
|
|
268
|
+
args.prod_max_instance_count
|
|
269
|
+
if deploy_prefix == "prod"
|
|
270
|
+
else args.non_prod_max_instance_count
|
|
271
|
+
),
|
|
272
|
+
"env": {
|
|
273
|
+
"PAASTA_SECRET_BUGSNAG_API_KEY": "SECRET(bugsnag_api_key)",
|
|
274
|
+
},
|
|
275
|
+
}
|
|
276
|
+
if args.metrics_provider is not None or args.setpoint is not None:
|
|
277
|
+
instance_config["autoscaling"] = {"metrics_providers": []}
|
|
278
|
+
metrics_provider_config = {}
|
|
279
|
+
if args.metrics_provider is not None:
|
|
280
|
+
metrics_provider_config["type"] = args.metrics_provider
|
|
281
|
+
if args.setpoint is not None:
|
|
282
|
+
metrics_provider_config["setpoint"] = args.setpoint
|
|
283
|
+
instance_config["autoscaling"]["metrics_providers"].append(
|
|
284
|
+
metrics_provider_config
|
|
285
|
+
)
|
|
286
|
+
|
|
287
|
+
if args.iam_role is not None:
|
|
288
|
+
instance_config["iam_role"] = args.iam_role
|
|
289
|
+
if args.cpus is not None:
|
|
290
|
+
instance_config["cpus"] = args.cpus
|
|
291
|
+
if args.mem is not None:
|
|
292
|
+
instance_config["mem"] = args.mem
|
|
293
|
+
if any(
|
|
294
|
+
(
|
|
295
|
+
args.autotune_min_cpus,
|
|
296
|
+
args.autotune_max_cpus,
|
|
297
|
+
args.autotune_min_mem,
|
|
298
|
+
args.autotune_max_mem,
|
|
299
|
+
args.autotune_min_disk,
|
|
300
|
+
args.autotune_max_disk,
|
|
301
|
+
)
|
|
302
|
+
):
|
|
303
|
+
limit_config = {}
|
|
304
|
+
limit_config["cpus"] = {
|
|
305
|
+
"min": args.autotune_min_cpus,
|
|
306
|
+
"max": args.autotune_max_cpus,
|
|
307
|
+
}
|
|
308
|
+
limit_config["mem"] = {
|
|
309
|
+
"min": args.autotune_min_mem,
|
|
310
|
+
"max": args.autotune_max_mem,
|
|
311
|
+
}
|
|
312
|
+
limit_config["disk"] = {
|
|
313
|
+
"min": args.autotune_min_disk,
|
|
314
|
+
"max": args.autotune_max_disk,
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
# remove any None values to keep the config clean
|
|
318
|
+
for resource in list(limit_config):
|
|
319
|
+
for key in list(limit_config[resource]):
|
|
320
|
+
if limit_config[resource][key] is None:
|
|
321
|
+
del limit_config[resource][key]
|
|
322
|
+
if len(limit_config[resource]) == 0:
|
|
323
|
+
del limit_config[resource]
|
|
324
|
+
|
|
325
|
+
if len(limit_config) > 0:
|
|
326
|
+
instance_config["autotune_limits"] = limit_config
|
|
327
|
+
# If the service config does not contain definitions for the shard in each ecosystem
|
|
328
|
+
# Add the missing definition and write to the corresponding config
|
|
329
|
+
if args.shard_name not in config_file.keys():
|
|
330
|
+
config_file[args.shard_name] = instance_config
|
|
331
|
+
|
|
332
|
+
updater.write_configs(
|
|
333
|
+
args.service, f"{config_prefix}{config_path}", config_file
|
|
334
|
+
)
|
|
335
|
+
log.info(
|
|
336
|
+
f"{deploy_prefix}.{args.shard_name} added to {config_prefix}{config_path}"
|
|
337
|
+
)
|
|
338
|
+
else:
|
|
339
|
+
log.info(f"{args.shard_name} is in deploy config already.")
|
|
340
|
+
|
|
341
|
+
# If the service shard is not defined in smartstack
|
|
342
|
+
# Add the definition with a suggested proxy port
|
|
343
|
+
if args.shard_name not in smartstack_file.keys():
|
|
344
|
+
changes_made = True
|
|
345
|
+
smartstack_file[args.shard_name] = {
|
|
346
|
+
"proxy_port": None,
|
|
347
|
+
"extra_advertise": {"ecosystem:devc": ["ecosystem:devc"]},
|
|
348
|
+
}
|
|
349
|
+
if args.timeout_server_ms:
|
|
350
|
+
smartstack_file[args.shard_name][
|
|
351
|
+
"timeout_server_ms"
|
|
352
|
+
] = args.timeout_server_ms
|
|
353
|
+
updater.write_configs(args.service, "smartstack", smartstack_file)
|
|
354
|
+
else:
|
|
355
|
+
log.info(f"{args.shard_name} is in smartstack config already, skipping.")
|
|
356
|
+
|
|
357
|
+
# Only commit to remote if changes were made
|
|
358
|
+
if changes_made and not args.dry_run:
|
|
359
|
+
updater.commit_to_remote()
|
|
360
|
+
trigger_deploys(args.service)
|
|
361
|
+
else:
|
|
362
|
+
# exit with code to indicate nothing was changed
|
|
363
|
+
sys.exit(129)
|
|
364
|
+
|
|
365
|
+
|
|
366
|
+
if __name__ == "__main__":
|
|
367
|
+
args = parse_args()
|
|
368
|
+
if args.verbose:
|
|
369
|
+
logging.basicConfig(level=logging.DEBUG)
|
|
370
|
+
else:
|
|
371
|
+
logging.basicConfig(level=logging.WARNING)
|
|
372
|
+
|
|
373
|
+
main(args)
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
#!/usr/bin/env python3.8
|
|
2
|
+
import sys
|
|
3
|
+
from collections import defaultdict
|
|
4
|
+
|
|
5
|
+
import iptc
|
|
6
|
+
|
|
7
|
+
from paasta_tools import iptables
|
|
8
|
+
from paasta_tools.utils import get_docker_client
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def list_docker_nat_rules():
|
|
12
|
+
chain_name = "DOCKER"
|
|
13
|
+
table = iptc.Table(iptc.Table.NAT)
|
|
14
|
+
chain = iptc.Chain(table, chain_name)
|
|
15
|
+
for rule in chain.rules:
|
|
16
|
+
yield iptables.Rule.from_iptc(rule)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def main():
|
|
20
|
+
docker_client = get_docker_client()
|
|
21
|
+
ip_to_containers = defaultdict(list)
|
|
22
|
+
|
|
23
|
+
for container in docker_client.containers():
|
|
24
|
+
networks = container["NetworkSettings"]["Networks"]
|
|
25
|
+
if "bridge" in networks:
|
|
26
|
+
ip = networks["bridge"]["IPAddress"]
|
|
27
|
+
if ip:
|
|
28
|
+
ip_to_containers[ip].append(container)
|
|
29
|
+
|
|
30
|
+
output = []
|
|
31
|
+
for ip, containers in ip_to_containers.items():
|
|
32
|
+
if len(containers) > 1:
|
|
33
|
+
output.append(f"{ip} shared by the following containers:")
|
|
34
|
+
for container in containers:
|
|
35
|
+
output.append(" Image: {}".format(container["Image"]))
|
|
36
|
+
output.append(" ID: {}".format(container["Id"]))
|
|
37
|
+
output.append(" State: {}".format(container["State"]))
|
|
38
|
+
output.append(" Status: {}".format(container["Status"]))
|
|
39
|
+
output.append("")
|
|
40
|
+
|
|
41
|
+
if output:
|
|
42
|
+
print(
|
|
43
|
+
"CRITICAL - There are multiple Docker containers assigned to the same IP."
|
|
44
|
+
)
|
|
45
|
+
print(
|
|
46
|
+
"There should only be one per IP. Choose one to keep and try stopping the others."
|
|
47
|
+
)
|
|
48
|
+
print("\n".join(output))
|
|
49
|
+
return 2
|
|
50
|
+
else:
|
|
51
|
+
print("OK - No Docker containers sharing an IP on this host.")
|
|
52
|
+
|
|
53
|
+
targets_seen = {}
|
|
54
|
+
duplicates_found = False
|
|
55
|
+
for rule in list_docker_nat_rules():
|
|
56
|
+
target = rule.target_parameters
|
|
57
|
+
if target not in targets_seen:
|
|
58
|
+
targets_seen[target] = rule
|
|
59
|
+
else:
|
|
60
|
+
print(
|
|
61
|
+
"This is the second time we've seen a rule with the same target_parameters!"
|
|
62
|
+
)
|
|
63
|
+
print(rule)
|
|
64
|
+
print("The other rule with that target is:")
|
|
65
|
+
print(targets_seen[target])
|
|
66
|
+
duplicates_found = True
|
|
67
|
+
if duplicates_found is True:
|
|
68
|
+
print(
|
|
69
|
+
"CRITICAL - Duplicate iptables rules found! This will route traffic to the wrong service!"
|
|
70
|
+
)
|
|
71
|
+
return 2
|
|
72
|
+
else:
|
|
73
|
+
print("OK - No duplicate Docker iptables rules detected")
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
if __name__ == "__main__":
|
|
77
|
+
sys.exit(main())
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
#!/opt/venvs/paasta-tools/bin/python
|
|
2
|
+
"""
|
|
3
|
+
The goal is to walk through all smartstack.yaml in yelpsoa directories
|
|
4
|
+
and convert timeout values to the prometheus format.
|
|
5
|
+
|
|
6
|
+
For every upstream and path, if endpoint timeout is specified, we record
|
|
7
|
+
per endpoint timeout value. If timeout_server_ms is specified,
|
|
8
|
+
we record timeout_server_ms value in path `/`. Otherwise, we record the default
|
|
9
|
+
timeout_server_ms 1000.
|
|
10
|
+
|
|
11
|
+
Example output:
|
|
12
|
+
# HELP endpoint timeout value defined in yelpsoa-config.
|
|
13
|
+
# TYPE TYPE yelpsoaconfig_endpoint_timeouts_ms gauge
|
|
14
|
+
yelpsoaconfig_endpoint_timeouts_ms{path="/consumer_app/devices/braze/info",upstream="push_notifications.main.egress_cluster"} 10000.0
|
|
15
|
+
yelpsoaconfig_endpoint_timeouts_ms{path="/",upstream="mysql_read_security.main.egress_cluster"} 100.0
|
|
16
|
+
"""
|
|
17
|
+
import os
|
|
18
|
+
|
|
19
|
+
from prometheus_client import CollectorRegistry
|
|
20
|
+
from prometheus_client import Gauge
|
|
21
|
+
from prometheus_client import write_to_textfile
|
|
22
|
+
from prometheus_client.metrics import MetricWrapperBase
|
|
23
|
+
|
|
24
|
+
from paasta_tools import yaml_tools as yaml
|
|
25
|
+
from paasta_tools.utils import DEFAULT_SOA_DIR
|
|
26
|
+
|
|
27
|
+
PROM_OUTPUT_FILE = f"{DEFAULT_SOA_DIR}/.autotune_timeouts.prom"
|
|
28
|
+
DEFAULT_TIMEOUT = 1000
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def read_and_write_timeouts_metrics(
|
|
32
|
+
root: str, service: str, prom_metric: MetricWrapperBase
|
|
33
|
+
) -> None:
|
|
34
|
+
with open(os.path.join(root, "smartstack.yaml")) as smartstack_file:
|
|
35
|
+
smartstack_yaml = yaml.safe_load(smartstack_file)
|
|
36
|
+
for instance_name, info in smartstack_yaml.items():
|
|
37
|
+
upstream = f"{service}.{instance_name}.egress_cluster"
|
|
38
|
+
if "endpoint_timeouts" in info:
|
|
39
|
+
for path, endpoint_timeout in info["endpoint_timeouts"].items():
|
|
40
|
+
prom_metric.labels(path, upstream).set(endpoint_timeout)
|
|
41
|
+
# always record default timeout
|
|
42
|
+
default_timeout = info.get("timeout_server_ms", DEFAULT_TIMEOUT)
|
|
43
|
+
prom_metric.labels("/", upstream).set(default_timeout)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
if __name__ == "__main__":
|
|
47
|
+
registry = CollectorRegistry()
|
|
48
|
+
prom_metric = Gauge(
|
|
49
|
+
"yelpsoaconfig_endpoint_timeouts_ms",
|
|
50
|
+
"endpoint timeout value defined in yelpsoa-config",
|
|
51
|
+
["path", "upstream"],
|
|
52
|
+
registry=registry,
|
|
53
|
+
)
|
|
54
|
+
# Walk through soa config dir and filter smartstack yaml
|
|
55
|
+
for root, dirs, files in os.walk(DEFAULT_SOA_DIR):
|
|
56
|
+
service = root.split("/")[-1]
|
|
57
|
+
# Avoid confusion of the smartstacks.yaml under autotuned_defaults/ in the future
|
|
58
|
+
if "autotuned_defaults" == service:
|
|
59
|
+
continue
|
|
60
|
+
for f in files:
|
|
61
|
+
if f == "smartstack.yaml":
|
|
62
|
+
read_and_write_timeouts_metrics(root, service, prom_metric)
|
|
63
|
+
|
|
64
|
+
write_to_textfile(PROM_OUTPUT_FILE, registry)
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
# Copyright 2015-2016 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: ./delete_paasta_contract_monitor.py <service.instance> [options]
|
|
17
|
+
|
|
18
|
+
The following script is a setup on a cron job in k8s masters. This is responsible for deleting
|
|
19
|
+
paasta-contract-monitor deployments and its services. By deleting the deployment itself,
|
|
20
|
+
setup_kubernetes_job.py will be able to reschedule the deployment and its pods on different nodes.
|
|
21
|
+
"""
|
|
22
|
+
import argparse
|
|
23
|
+
import logging
|
|
24
|
+
import sys
|
|
25
|
+
|
|
26
|
+
from paasta_tools.kubernetes_tools import delete_deployment
|
|
27
|
+
from paasta_tools.kubernetes_tools import ensure_namespace
|
|
28
|
+
from paasta_tools.kubernetes_tools import get_kubernetes_app_name
|
|
29
|
+
from paasta_tools.kubernetes_tools import KubeClient
|
|
30
|
+
from paasta_tools.utils import decompose_job_id
|
|
31
|
+
from paasta_tools.utils import InvalidJobNameError
|
|
32
|
+
from paasta_tools.utils import SPACER
|
|
33
|
+
|
|
34
|
+
log = logging.getLogger(__name__)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def parse_args(args=None) -> argparse.Namespace:
|
|
38
|
+
parser = argparse.ArgumentParser(description="Deletes list of deployments.")
|
|
39
|
+
parser.add_argument(
|
|
40
|
+
"service_instance_list",
|
|
41
|
+
nargs="+",
|
|
42
|
+
help="The list of service instances to delete",
|
|
43
|
+
metavar=f"SERVICE{SPACER}INSTANCE",
|
|
44
|
+
)
|
|
45
|
+
args = parser.parse_args(args=args)
|
|
46
|
+
return args
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def get_deployment_names_from_list(service_instance_list):
|
|
50
|
+
app_names = []
|
|
51
|
+
for service_instance in service_instance_list:
|
|
52
|
+
try:
|
|
53
|
+
service, instance, _, __ = decompose_job_id(service_instance)
|
|
54
|
+
app_name = get_kubernetes_app_name(service, instance)
|
|
55
|
+
app_names.append(app_name)
|
|
56
|
+
except InvalidJobNameError:
|
|
57
|
+
log.error(
|
|
58
|
+
f"Invalid service instance specified. Format is service{SPACER}instance."
|
|
59
|
+
)
|
|
60
|
+
sys.exit(1)
|
|
61
|
+
return app_names
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def main(args=None) -> None:
|
|
65
|
+
args = parse_args(args=args)
|
|
66
|
+
service_instance_list = args.service_instance_list
|
|
67
|
+
deployment_names = get_deployment_names_from_list(service_instance_list)
|
|
68
|
+
|
|
69
|
+
log.debug(f"Deleting deployments: {deployment_names}")
|
|
70
|
+
kube_client = KubeClient()
|
|
71
|
+
ensure_namespace(kube_client=kube_client, namespace="paasta")
|
|
72
|
+
|
|
73
|
+
for deployment_name in deployment_names:
|
|
74
|
+
try:
|
|
75
|
+
log.debug(f"Deleting {deployment_name}")
|
|
76
|
+
delete_deployment(
|
|
77
|
+
kube_client=kube_client,
|
|
78
|
+
deployment_name=deployment_name,
|
|
79
|
+
namespace="paasta",
|
|
80
|
+
)
|
|
81
|
+
except Exception as err:
|
|
82
|
+
log.error(f"Unable to delete {deployment_name}: {err}")
|
|
83
|
+
sys.exit(1)
|
|
84
|
+
|
|
85
|
+
sys.exit(0)
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
if __name__ == "__main__":
|
|
89
|
+
main()
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
# Copyright 2015-2016 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
|
+
from typing import Optional
|
|
16
|
+
|
|
17
|
+
from paasta_tools.utils import DEFAULT_SOA_DIR
|
|
18
|
+
from paasta_tools.utils import DeploymentVersion
|
|
19
|
+
from paasta_tools.utils import load_v2_deployments_json
|
|
20
|
+
from paasta_tools.utils import NoDeploymentsAvailable
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def get_currently_deployed_sha(service, deploy_group, soa_dir=DEFAULT_SOA_DIR):
|
|
24
|
+
"""Tries to determine the currently deployed sha for a service and deploy_group,
|
|
25
|
+
returns None if there isn't one ready yet"""
|
|
26
|
+
try:
|
|
27
|
+
deployments = load_v2_deployments_json(service=service, soa_dir=soa_dir)
|
|
28
|
+
return deployments.get_git_sha_for_deploy_group(deploy_group=deploy_group)
|
|
29
|
+
except NoDeploymentsAvailable:
|
|
30
|
+
return None
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def get_currently_deployed_version(
|
|
34
|
+
service, deploy_group, soa_dir=DEFAULT_SOA_DIR
|
|
35
|
+
) -> Optional[DeploymentVersion]:
|
|
36
|
+
"""Tries to determine the currently deployed version for a service and deploy_group,
|
|
37
|
+
returns None if there isn't one ready yet"""
|
|
38
|
+
try:
|
|
39
|
+
deployments = load_v2_deployments_json(service=service, soa_dir=soa_dir)
|
|
40
|
+
return deployments.get_deployment_version_for_deploy_group(
|
|
41
|
+
deploy_group=deploy_group
|
|
42
|
+
)
|
|
43
|
+
except NoDeploymentsAvailable:
|
|
44
|
+
return None
|