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,89 @@
|
|
|
1
|
+
#!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,50 @@
|
|
|
1
|
+
#!python
|
|
2
|
+
import logging
|
|
3
|
+
|
|
4
|
+
import yelp_meteorite
|
|
5
|
+
|
|
6
|
+
from paasta_tools.cli.utils import get_instance_config
|
|
7
|
+
from paasta_tools.utils import get_services_for_cluster
|
|
8
|
+
from paasta_tools.utils import load_system_paasta_config
|
|
9
|
+
|
|
10
|
+
log = logging.getLogger(__name__)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def emit_metrics_for_type(instance_type):
|
|
14
|
+
cluster = load_system_paasta_config().get_cluster()
|
|
15
|
+
instances = get_services_for_cluster(cluster=cluster, instance_type=instance_type)
|
|
16
|
+
|
|
17
|
+
for service, instance in instances:
|
|
18
|
+
service_instance_config = get_instance_config(
|
|
19
|
+
service=service, instance=instance, cluster=cluster
|
|
20
|
+
)
|
|
21
|
+
dimensions = {
|
|
22
|
+
"paasta_service": service_instance_config.service,
|
|
23
|
+
"paasta_cluster": service_instance_config.cluster,
|
|
24
|
+
"paasta_instance": service_instance_config.instance,
|
|
25
|
+
"paasta_pool": service_instance_config.get_pool(),
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
log.info(f"Emitting paasta.service.* with dimensions {dimensions}")
|
|
29
|
+
gauge = yelp_meteorite.create_gauge("paasta.service.cpus", dimensions)
|
|
30
|
+
gauge.set(service_instance_config.get_cpus())
|
|
31
|
+
gauge = yelp_meteorite.create_gauge("paasta.service.mem", dimensions)
|
|
32
|
+
gauge.set(service_instance_config.get_mem())
|
|
33
|
+
gauge = yelp_meteorite.create_gauge("paasta.service.disk", dimensions)
|
|
34
|
+
gauge.set(service_instance_config.get_disk())
|
|
35
|
+
if hasattr(service_instance_config, "get_instances"):
|
|
36
|
+
if service_instance_config.get_max_instances() is None:
|
|
37
|
+
gauge = yelp_meteorite.create_gauge(
|
|
38
|
+
"paasta.service.instances", dimensions
|
|
39
|
+
)
|
|
40
|
+
gauge.set(service_instance_config.get_instances())
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def main():
|
|
44
|
+
logging.basicConfig(level=logging.INFO)
|
|
45
|
+
for thing in ["adhoc"]:
|
|
46
|
+
emit_metrics_for_type(thing)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
if __name__ == "__main__":
|
|
50
|
+
main()
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
#!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
|
+
A simple script to enumerate all services participating in authenticated
|
|
17
|
+
communications, and list them in a YAML/JSON file.
|
|
18
|
+
"""
|
|
19
|
+
import argparse
|
|
20
|
+
import glob
|
|
21
|
+
import logging
|
|
22
|
+
import os
|
|
23
|
+
from typing import Dict
|
|
24
|
+
from typing import List
|
|
25
|
+
from typing import Set
|
|
26
|
+
|
|
27
|
+
from paasta_tools import yaml_tools as yaml
|
|
28
|
+
from paasta_tools.utils import DEFAULT_SOA_DIR
|
|
29
|
+
from paasta_tools.utils import load_system_paasta_config
|
|
30
|
+
from paasta_tools.utils import write_json_configuration_file
|
|
31
|
+
from paasta_tools.utils import write_yaml_configuration_file
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
AUTHORIZATION_CONFIG_FILE = "authorization.yaml"
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def list_services_in_authz_config(config_path: str) -> Set[str]:
|
|
38
|
+
auth_config: dict = {}
|
|
39
|
+
try:
|
|
40
|
+
with open(config_path) as f:
|
|
41
|
+
auth_config = yaml.safe_load(f)
|
|
42
|
+
except Exception as e:
|
|
43
|
+
logging.warning(f"Issue loading {config_path}: {e}")
|
|
44
|
+
return {
|
|
45
|
+
service
|
|
46
|
+
for rule in auth_config.get("authorization", {}).get("rules", [])
|
|
47
|
+
for service in rule.get("identity_groups", {}).get("services", [])
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def enumerate_authenticating_services() -> Dict[str, List[str]]:
|
|
52
|
+
result = set()
|
|
53
|
+
config_path_pattern = os.path.join(DEFAULT_SOA_DIR, "*", AUTHORIZATION_CONFIG_FILE)
|
|
54
|
+
for authz_config in glob.glob(config_path_pattern):
|
|
55
|
+
result.update(list_services_in_authz_config(authz_config))
|
|
56
|
+
result.update(load_system_paasta_config().get_always_authenticating_services())
|
|
57
|
+
return {"services": sorted(result)}
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def parse_args():
|
|
61
|
+
parser = argparse.ArgumentParser(description="")
|
|
62
|
+
parser.add_argument(
|
|
63
|
+
"-o",
|
|
64
|
+
"--output",
|
|
65
|
+
help="Output filepath",
|
|
66
|
+
dest="output_filename",
|
|
67
|
+
required=True,
|
|
68
|
+
)
|
|
69
|
+
parser.add_argument(
|
|
70
|
+
"-f",
|
|
71
|
+
"--format",
|
|
72
|
+
help="Output format. Defaults to %(default)s",
|
|
73
|
+
dest="output_format",
|
|
74
|
+
choices=["yaml", "json"],
|
|
75
|
+
default="yaml",
|
|
76
|
+
)
|
|
77
|
+
args = parser.parse_args()
|
|
78
|
+
return args
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def main():
|
|
82
|
+
args = parse_args()
|
|
83
|
+
if args.output_format == "yaml":
|
|
84
|
+
writer = write_yaml_configuration_file
|
|
85
|
+
elif args.output_format == "json":
|
|
86
|
+
writer = write_json_configuration_file
|
|
87
|
+
else:
|
|
88
|
+
raise NotImplementedError(f"Unknown format: {args.output_format}")
|
|
89
|
+
configuration = enumerate_authenticating_services()
|
|
90
|
+
writer(filename=args.output_filename, configuration=configuration)
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
if __name__ == "__main__":
|
|
94
|
+
main()
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
#!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
|
+
r"""
|
|
16
|
+
Creates a deployments.json file in the specified SOA configuration directory.
|
|
17
|
+
This file contains a dictionary of k/v pairs representing a map between remote
|
|
18
|
+
deploy groups of a service's Git repository and the current SHA at the tip of that deploy group.
|
|
19
|
+
This is done by specifying a 'deploy_group' key in a service instance's configuration,
|
|
20
|
+
or if there is no 'docker_image' key in the configuration, a deploy group name
|
|
21
|
+
is assumed to be paasta-{cluster}-{instance}, where cluster is the cluster
|
|
22
|
+
the configuration is for and instance is the instance name.
|
|
23
|
+
|
|
24
|
+
For example, if the service paasta_test has an instance called main with no
|
|
25
|
+
deploy group in its configuration in the hab cluster, then this script
|
|
26
|
+
will create a key/value pair of 'paasta_test:paasta-hab.main': 'services-paasta_test:paasta-SHA',
|
|
27
|
+
where SHA is the current SHA at the tip of the branch named hab in
|
|
28
|
+
git@github.yelpcorp.com:services/paasta_test.git. If main had a deploy_group key with
|
|
29
|
+
a value of 'master', the key would be paasta_test:master instead, and the SHA
|
|
30
|
+
would be the SHA at the tip of master.
|
|
31
|
+
|
|
32
|
+
This is done for all services in the SOA configuration directory, across any
|
|
33
|
+
service configuration files (filename is 'kubernetes-\*.yaml').
|
|
34
|
+
|
|
35
|
+
Command line options:
|
|
36
|
+
|
|
37
|
+
- -d <SOA_DIR>, --soa-dir <SOA_DIR>: Specify a SOA config dir to read from
|
|
38
|
+
- -v, --verbose: Verbose output
|
|
39
|
+
"""
|
|
40
|
+
import argparse
|
|
41
|
+
import concurrent.futures
|
|
42
|
+
import json
|
|
43
|
+
import logging
|
|
44
|
+
import os
|
|
45
|
+
import re
|
|
46
|
+
from typing import Any
|
|
47
|
+
from typing import Dict
|
|
48
|
+
from typing import List
|
|
49
|
+
from typing import Optional
|
|
50
|
+
from typing import Tuple
|
|
51
|
+
|
|
52
|
+
from mypy_extensions import TypedDict
|
|
53
|
+
|
|
54
|
+
from paasta_tools import remote_git
|
|
55
|
+
from paasta_tools.cli.utils import get_instance_configs_for_service
|
|
56
|
+
from paasta_tools.utils import atomic_file_write
|
|
57
|
+
from paasta_tools.utils import DEFAULT_SOA_DIR
|
|
58
|
+
from paasta_tools.utils import get_git_url
|
|
59
|
+
from paasta_tools.utils import get_latest_deployment_tag
|
|
60
|
+
|
|
61
|
+
log = logging.getLogger(__name__)
|
|
62
|
+
TARGET_FILE = "deployments.json"
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
V1_Mapping = TypedDict(
|
|
66
|
+
"V1_Mapping", {"docker_image": str, "desired_state": str, "force_bounce": str}
|
|
67
|
+
)
|
|
68
|
+
V2_Deployment = TypedDict(
|
|
69
|
+
"V2_Deployment",
|
|
70
|
+
{"docker_image": str, "git_sha": str, "image_version": Optional[str]},
|
|
71
|
+
)
|
|
72
|
+
V2_Control = TypedDict("V2_Control", {"desired_state": str, "force_bounce": str})
|
|
73
|
+
V2_Mappings = TypedDict(
|
|
74
|
+
"V2_Mappings",
|
|
75
|
+
{"deployments": Dict[str, V2_Deployment], "controls": Dict[str, V2_Control]},
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
DeploymentsDict = TypedDict(
|
|
80
|
+
"DeploymentsDict", {"v1": Dict[str, V1_Mapping], "v2": V2_Mappings}
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def parse_args() -> argparse.Namespace:
|
|
85
|
+
parser = argparse.ArgumentParser(
|
|
86
|
+
description="Creates deployments.json for paasta services."
|
|
87
|
+
)
|
|
88
|
+
parser.add_argument(
|
|
89
|
+
"-d",
|
|
90
|
+
"--soa-dir",
|
|
91
|
+
dest="soa_dir",
|
|
92
|
+
metavar="SOA_DIR",
|
|
93
|
+
default=DEFAULT_SOA_DIR,
|
|
94
|
+
help="define a different soa config directory",
|
|
95
|
+
)
|
|
96
|
+
parser.add_argument(
|
|
97
|
+
"-v", "--verbose", action="store_true", dest="verbose", default=False
|
|
98
|
+
)
|
|
99
|
+
parser.add_argument(
|
|
100
|
+
"-s",
|
|
101
|
+
"--service",
|
|
102
|
+
required=True,
|
|
103
|
+
help="Service name to make the deployments.json for",
|
|
104
|
+
)
|
|
105
|
+
args = parser.parse_args()
|
|
106
|
+
return args
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def get_deploy_group_mappings(
|
|
110
|
+
soa_dir: str, service: str
|
|
111
|
+
) -> Tuple[Dict[str, V1_Mapping], V2_Mappings]:
|
|
112
|
+
"""Gets mappings from service:deploy_group to services-service:paasta-hash-image_version,
|
|
113
|
+
where hash is the current SHA at the HEAD of branch_name and image_version
|
|
114
|
+
can be used to provide additional version information for the Docker image.
|
|
115
|
+
This is done for all services in soa_dir.
|
|
116
|
+
|
|
117
|
+
:param soa_dir: The SOA configuration directory to read from
|
|
118
|
+
:returns: A dictionary mapping service:deploy_group to a dictionary
|
|
119
|
+
containing:
|
|
120
|
+
|
|
121
|
+
- 'docker_image': something like "services-service:paasta-hash". This is
|
|
122
|
+
relative to the paasta docker registry.
|
|
123
|
+
- 'desired_state': either 'start' or 'stop'. Says whether this branch
|
|
124
|
+
should be running.
|
|
125
|
+
- 'force_bounce': An arbitrary value, which may be None. A change in this
|
|
126
|
+
value should trigger a bounce, even if the other properties of this app
|
|
127
|
+
have not changed.
|
|
128
|
+
"""
|
|
129
|
+
mappings: Dict[str, V1_Mapping] = {}
|
|
130
|
+
v2_mappings: V2_Mappings = {"deployments": {}, "controls": {}}
|
|
131
|
+
git_url = get_git_url(service=service, soa_dir=soa_dir)
|
|
132
|
+
|
|
133
|
+
# Most of the time of this function is in two parts:
|
|
134
|
+
# 1. getting remote refs from git. (Mostly IO, just waiting for git to get back to us.)
|
|
135
|
+
# 2. loading instance configs. (Mostly CPU, copy.deepcopying yaml over and over again)
|
|
136
|
+
# Let's do these two things in parallel.
|
|
137
|
+
|
|
138
|
+
executor = concurrent.futures.ThreadPoolExecutor(max_workers=1)
|
|
139
|
+
remote_refs_future = executor.submit(remote_git.list_remote_refs, git_url)
|
|
140
|
+
|
|
141
|
+
service_configs = get_instance_configs_for_service(soa_dir=soa_dir, service=service)
|
|
142
|
+
|
|
143
|
+
deploy_group_branch_mappings = {
|
|
144
|
+
config.get_branch(): config.get_deploy_group() for config in service_configs
|
|
145
|
+
}
|
|
146
|
+
if not deploy_group_branch_mappings:
|
|
147
|
+
log.info("Service %s has no valid deploy groups. Skipping.", service)
|
|
148
|
+
return mappings, v2_mappings
|
|
149
|
+
|
|
150
|
+
remote_refs = remote_refs_future.result()
|
|
151
|
+
|
|
152
|
+
tag_by_deploy_group = {
|
|
153
|
+
dg: get_latest_deployment_tag(remote_refs, dg)
|
|
154
|
+
for dg in set(deploy_group_branch_mappings.values())
|
|
155
|
+
}
|
|
156
|
+
state_by_branch_and_sha = get_desired_state_by_branch_and_sha(remote_refs)
|
|
157
|
+
|
|
158
|
+
for control_branch, deploy_group in deploy_group_branch_mappings.items():
|
|
159
|
+
(deploy_ref_name, deploy_ref_sha, image_version) = tag_by_deploy_group[
|
|
160
|
+
deploy_group
|
|
161
|
+
]
|
|
162
|
+
if deploy_ref_name in remote_refs:
|
|
163
|
+
commit_sha = remote_refs[deploy_ref_name]
|
|
164
|
+
control_branch_alias = f"{service}:paasta-{control_branch}"
|
|
165
|
+
control_branch_alias_v2 = f"{service}:{control_branch}"
|
|
166
|
+
docker_image = build_docker_image_name(service, commit_sha, image_version)
|
|
167
|
+
desired_state, force_bounce = state_by_branch_and_sha.get(
|
|
168
|
+
(control_branch, deploy_ref_sha), ("start", None)
|
|
169
|
+
)
|
|
170
|
+
log.info("Mapping %s to docker image %s", control_branch, docker_image)
|
|
171
|
+
|
|
172
|
+
v2_mappings["deployments"][deploy_group] = {
|
|
173
|
+
"docker_image": docker_image,
|
|
174
|
+
"git_sha": commit_sha,
|
|
175
|
+
"image_version": image_version,
|
|
176
|
+
}
|
|
177
|
+
mappings[control_branch_alias] = {
|
|
178
|
+
"docker_image": docker_image,
|
|
179
|
+
"desired_state": desired_state,
|
|
180
|
+
"force_bounce": force_bounce,
|
|
181
|
+
}
|
|
182
|
+
v2_mappings["controls"][control_branch_alias_v2] = {
|
|
183
|
+
"desired_state": desired_state,
|
|
184
|
+
"force_bounce": force_bounce,
|
|
185
|
+
}
|
|
186
|
+
return mappings, v2_mappings
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
def build_docker_image_name(
|
|
190
|
+
service: str, sha: str, image_version: Optional[str] = None
|
|
191
|
+
) -> str:
|
|
192
|
+
image_name = f"services-{service}:paasta-{sha}"
|
|
193
|
+
if image_version is not None:
|
|
194
|
+
image_name += f"-{image_version}"
|
|
195
|
+
|
|
196
|
+
return image_name
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
def get_desired_state_by_branch_and_sha(
|
|
200
|
+
remote_refs: Dict[str, str]
|
|
201
|
+
) -> Dict[Tuple[str, str], Tuple[str, Any]]:
|
|
202
|
+
tag_pattern = r"^refs/tags/(?:paasta-){0,2}(?P<branch>[a-zA-Z0-9-_.]+)-(?P<force_bounce>[^-]+)-(?P<state>(start|stop))$"
|
|
203
|
+
|
|
204
|
+
states_by_branch_and_sha: Dict[Tuple[str, str], List[Tuple[str, Any]]] = {}
|
|
205
|
+
|
|
206
|
+
for ref_name, sha in remote_refs.items():
|
|
207
|
+
match = re.match(tag_pattern, ref_name)
|
|
208
|
+
if match:
|
|
209
|
+
gd = match.groupdict()
|
|
210
|
+
states_by_branch_and_sha.setdefault((gd["branch"], sha), []).append(
|
|
211
|
+
(gd["state"], gd["force_bounce"])
|
|
212
|
+
)
|
|
213
|
+
|
|
214
|
+
return {
|
|
215
|
+
(branch, sha): sorted(states, key=lambda x: x[1])[-1]
|
|
216
|
+
for ((branch, sha), states) in states_by_branch_and_sha.items()
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
def get_deployments_dict_from_deploy_group_mappings(
|
|
221
|
+
deploy_group_mappings: Dict[str, V1_Mapping], v2_deploy_group_mappings: V2_Mappings
|
|
222
|
+
) -> DeploymentsDict:
|
|
223
|
+
return {"v1": deploy_group_mappings, "v2": v2_deploy_group_mappings}
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
def generate_deployments_for_service(service: str, soa_dir: str) -> None:
|
|
227
|
+
try:
|
|
228
|
+
with open(os.path.join(soa_dir, service, TARGET_FILE), "r") as oldf:
|
|
229
|
+
old_deployments_dict = json.load(oldf)
|
|
230
|
+
except (IOError, ValueError):
|
|
231
|
+
old_deployments_dict = {}
|
|
232
|
+
mappings, v2_mappings = get_deploy_group_mappings(soa_dir=soa_dir, service=service)
|
|
233
|
+
|
|
234
|
+
deployments_dict = get_deployments_dict_from_deploy_group_mappings(
|
|
235
|
+
mappings, v2_mappings
|
|
236
|
+
)
|
|
237
|
+
if deployments_dict != old_deployments_dict:
|
|
238
|
+
with atomic_file_write(os.path.join(soa_dir, service, TARGET_FILE)) as newf:
|
|
239
|
+
json.dump(deployments_dict, newf)
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
def main() -> None:
|
|
243
|
+
args = parse_args()
|
|
244
|
+
soa_dir = os.path.abspath(args.soa_dir)
|
|
245
|
+
service = args.service
|
|
246
|
+
if args.verbose:
|
|
247
|
+
logging.basicConfig(level=logging.DEBUG)
|
|
248
|
+
else:
|
|
249
|
+
logging.basicConfig(level=logging.WARNING)
|
|
250
|
+
|
|
251
|
+
generate_deployments_for_service(service=service, soa_dir=soa_dir)
|
|
252
|
+
|
|
253
|
+
|
|
254
|
+
if __name__ == "__main__":
|
|
255
|
+
main()
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
#!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
|
+
A simple script to enumerate all smartstack namespaces and output
|
|
17
|
+
a /etc/services compatible file
|
|
18
|
+
"""
|
|
19
|
+
import argparse
|
|
20
|
+
import os
|
|
21
|
+
|
|
22
|
+
import service_configuration_lib
|
|
23
|
+
|
|
24
|
+
from paasta_tools.long_running_service_tools import get_all_namespaces
|
|
25
|
+
from paasta_tools.long_running_service_tools import get_all_namespaces_for_service
|
|
26
|
+
from paasta_tools.utils import atomic_file_write
|
|
27
|
+
from paasta_tools.utils import compose_job_id
|
|
28
|
+
from paasta_tools.utils import DEFAULT_SOA_DIR
|
|
29
|
+
from paasta_tools.utils import write_json_configuration_file
|
|
30
|
+
from paasta_tools.utils import write_yaml_configuration_file
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
YOCALHOST = "169.254.255.254"
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def parse_args():
|
|
37
|
+
parser = argparse.ArgumentParser(description="")
|
|
38
|
+
parser.add_argument(
|
|
39
|
+
"-o", "--output", help="Output filename.", dest="output_filename", required=True
|
|
40
|
+
)
|
|
41
|
+
parser.add_argument(
|
|
42
|
+
"-f",
|
|
43
|
+
"--format",
|
|
44
|
+
help="Output format. Defaults to %(default)s",
|
|
45
|
+
dest="output_format",
|
|
46
|
+
choices=["rfc1700", "yaml", "json"],
|
|
47
|
+
default="rfc1700",
|
|
48
|
+
)
|
|
49
|
+
args = parser.parse_args()
|
|
50
|
+
return args
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def get_service_lines_for_service(service):
|
|
54
|
+
lines = []
|
|
55
|
+
config = service_configuration_lib.read_service_configuration(service)
|
|
56
|
+
port = config.get("port", None)
|
|
57
|
+
description = config.get("description", "No description")
|
|
58
|
+
|
|
59
|
+
if port is not None:
|
|
60
|
+
lines.append("%s\t%d/tcp\t# %s" % (service, port, description))
|
|
61
|
+
|
|
62
|
+
for namespace, config in get_all_namespaces_for_service(service, full_name=False):
|
|
63
|
+
proxy_port = config.get("proxy_port", None)
|
|
64
|
+
if proxy_port is not None:
|
|
65
|
+
lines.append(
|
|
66
|
+
"%s\t%d/tcp\t# %s"
|
|
67
|
+
% (compose_job_id(service, namespace), proxy_port, description)
|
|
68
|
+
)
|
|
69
|
+
return lines
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def generate_configuration():
|
|
73
|
+
service_data = get_all_namespaces()
|
|
74
|
+
config = {}
|
|
75
|
+
for (name, data) in service_data:
|
|
76
|
+
proxy_port = data.get("proxy_port")
|
|
77
|
+
if proxy_port is None:
|
|
78
|
+
continue
|
|
79
|
+
config[name] = {"host": YOCALHOST, "port": int(proxy_port)}
|
|
80
|
+
return config
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def write_rfc1700_file(filename):
|
|
84
|
+
strings = [
|
|
85
|
+
"# This file is generated by generate_services_file",
|
|
86
|
+
"# DO NOT EDIT BY HAND",
|
|
87
|
+
]
|
|
88
|
+
for service in sorted(os.listdir(DEFAULT_SOA_DIR)):
|
|
89
|
+
strings.extend(get_service_lines_for_service(service))
|
|
90
|
+
with atomic_file_write(filename) as fp:
|
|
91
|
+
fp.write("\n".join(strings))
|
|
92
|
+
fp.write("\n")
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def main():
|
|
96
|
+
args = parse_args()
|
|
97
|
+
if args.output_format == "rfc1700":
|
|
98
|
+
write_rfc1700_file(filename=args.output_filename)
|
|
99
|
+
elif args.output_format in ("json", "yaml"):
|
|
100
|
+
writer = (
|
|
101
|
+
write_json_configuration_file
|
|
102
|
+
if args.output_format == "json"
|
|
103
|
+
else write_yaml_configuration_file
|
|
104
|
+
)
|
|
105
|
+
writer(
|
|
106
|
+
filename=args.output_filename,
|
|
107
|
+
configuration=generate_configuration(),
|
|
108
|
+
)
|
|
109
|
+
else:
|
|
110
|
+
raise (NotImplementedError)
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
if __name__ == "__main__":
|
|
114
|
+
main()
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
#!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
|
+
import argparse
|
|
16
|
+
|
|
17
|
+
from paasta_tools.generate_services_file import generate_configuration
|
|
18
|
+
from paasta_tools.utils import write_yaml_configuration_file
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def main(argv=None):
|
|
22
|
+
parser = argparse.ArgumentParser()
|
|
23
|
+
parser.add_argument("output_path")
|
|
24
|
+
args = parser.parse_args(argv)
|
|
25
|
+
|
|
26
|
+
write_yaml_configuration_file(args.output_path, generate_configuration())
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
if __name__ == "__main__":
|
|
30
|
+
main()
|