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,174 @@
|
|
|
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 List
|
|
16
|
+
from typing import Tuple
|
|
17
|
+
|
|
18
|
+
from paasta_tools.api.client import get_paasta_oapi_client
|
|
19
|
+
from paasta_tools.cli.cmds.status import get_envoy_status_human
|
|
20
|
+
from paasta_tools.cli.cmds.status import get_smartstack_status_human
|
|
21
|
+
from paasta_tools.cli.utils import figure_out_service_name
|
|
22
|
+
from paasta_tools.cli.utils import get_instance_configs_for_service
|
|
23
|
+
from paasta_tools.cli.utils import get_paasta_oapi_api_clustername
|
|
24
|
+
from paasta_tools.cli.utils import lazy_choices_completer
|
|
25
|
+
from paasta_tools.cli.utils import verify_instances
|
|
26
|
+
from paasta_tools.eks_tools import EksDeploymentConfig
|
|
27
|
+
from paasta_tools.utils import DEFAULT_SOA_DIR
|
|
28
|
+
from paasta_tools.utils import list_clusters
|
|
29
|
+
from paasta_tools.utils import list_services
|
|
30
|
+
from paasta_tools.utils import load_system_paasta_config
|
|
31
|
+
from paasta_tools.utils import PaastaColors
|
|
32
|
+
from paasta_tools.utils import SystemPaastaConfig
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def add_subparser(subparsers) -> None:
|
|
36
|
+
mesh_status_parser = subparsers.add_parser(
|
|
37
|
+
"mesh-status",
|
|
38
|
+
help="Display the mesh status of a PaaSTA service.",
|
|
39
|
+
description=(
|
|
40
|
+
"'paasta mesh-status' queries the PaaSTA API in order to report "
|
|
41
|
+
"on the health of a PaaSTA service in the mesh."
|
|
42
|
+
),
|
|
43
|
+
)
|
|
44
|
+
mesh_status_parser.add_argument(
|
|
45
|
+
"-s",
|
|
46
|
+
"--service",
|
|
47
|
+
type=str,
|
|
48
|
+
help="The name of the service you wish to inspect",
|
|
49
|
+
required=True,
|
|
50
|
+
).completer = lazy_choices_completer(list_services)
|
|
51
|
+
mesh_status_parser.add_argument(
|
|
52
|
+
"-i",
|
|
53
|
+
"--instance",
|
|
54
|
+
type=str,
|
|
55
|
+
help="The name of the instance of the service you wish to inspect",
|
|
56
|
+
required=True,
|
|
57
|
+
) # No completer because we need to know service first and we can't until some other stuff has happened
|
|
58
|
+
mesh_status_parser.add_argument(
|
|
59
|
+
"-c",
|
|
60
|
+
"--cluster",
|
|
61
|
+
type=str,
|
|
62
|
+
help="The name of the cluster in which the instance runs",
|
|
63
|
+
required=True,
|
|
64
|
+
).completer = lazy_choices_completer(list_clusters)
|
|
65
|
+
mesh_status_parser.add_argument(
|
|
66
|
+
"-d",
|
|
67
|
+
"--soa-dir",
|
|
68
|
+
dest="soa_dir",
|
|
69
|
+
metavar="SOA_DIR",
|
|
70
|
+
default=DEFAULT_SOA_DIR,
|
|
71
|
+
help="define a different soa config directory",
|
|
72
|
+
)
|
|
73
|
+
mesh_status_parser.set_defaults(command=paasta_mesh_status)
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def paasta_mesh_status_on_api_endpoint(
|
|
77
|
+
cluster: str,
|
|
78
|
+
service: str,
|
|
79
|
+
instance: str,
|
|
80
|
+
system_paasta_config: SystemPaastaConfig,
|
|
81
|
+
soa_dir: str = DEFAULT_SOA_DIR,
|
|
82
|
+
) -> Tuple[int, List[str]]:
|
|
83
|
+
instance_config = next(
|
|
84
|
+
get_instance_configs_for_service(
|
|
85
|
+
service=service,
|
|
86
|
+
soa_dir=soa_dir,
|
|
87
|
+
clusters=[cluster],
|
|
88
|
+
instances=[instance],
|
|
89
|
+
),
|
|
90
|
+
None,
|
|
91
|
+
)
|
|
92
|
+
if not instance_config:
|
|
93
|
+
print(
|
|
94
|
+
"ERROR: Could not find config files for this service instance in soaconfigs. Maybe you mispelled an argument?"
|
|
95
|
+
)
|
|
96
|
+
exit(1)
|
|
97
|
+
|
|
98
|
+
client = get_paasta_oapi_client(
|
|
99
|
+
cluster=get_paasta_oapi_api_clustername(
|
|
100
|
+
cluster,
|
|
101
|
+
is_eks=(instance_config.__class__ == EksDeploymentConfig),
|
|
102
|
+
),
|
|
103
|
+
system_paasta_config=system_paasta_config,
|
|
104
|
+
)
|
|
105
|
+
if not client:
|
|
106
|
+
print("ERROR: Cannot get a paasta-api client")
|
|
107
|
+
exit(1)
|
|
108
|
+
|
|
109
|
+
try:
|
|
110
|
+
mesh_status = client.service.mesh_instance(
|
|
111
|
+
service=service,
|
|
112
|
+
instance=instance,
|
|
113
|
+
)
|
|
114
|
+
except client.api_error as exc:
|
|
115
|
+
# 405 (method not allowed) is returned for instances that are not configured
|
|
116
|
+
# for the mesh, or for which getting mesh status is not supported
|
|
117
|
+
return (
|
|
118
|
+
exc.status,
|
|
119
|
+
[PaastaColors.red(exc.body if exc.status == 405 else exc.reason)],
|
|
120
|
+
)
|
|
121
|
+
except (client.connection_error, client.timeout_error) as exc:
|
|
122
|
+
return (
|
|
123
|
+
1,
|
|
124
|
+
[PaastaColors.red(f"Could not connect to API: {exc.__class__.__name__}")],
|
|
125
|
+
)
|
|
126
|
+
except Exception as e:
|
|
127
|
+
output = [PaastaColors.red(f"Exception when talking to the API:")]
|
|
128
|
+
output.extend(str(e).split("\n"))
|
|
129
|
+
return 1, output
|
|
130
|
+
|
|
131
|
+
output = []
|
|
132
|
+
if mesh_status.smartstack is not None:
|
|
133
|
+
smartstack_status_human = get_smartstack_status_human(
|
|
134
|
+
mesh_status.smartstack.registration,
|
|
135
|
+
mesh_status.smartstack.expected_backends_per_location,
|
|
136
|
+
mesh_status.smartstack.locations,
|
|
137
|
+
)
|
|
138
|
+
output.extend(smartstack_status_human)
|
|
139
|
+
if mesh_status.envoy is not None:
|
|
140
|
+
envoy_status_human = get_envoy_status_human(
|
|
141
|
+
mesh_status.envoy.registration,
|
|
142
|
+
mesh_status.envoy.expected_backends_per_location,
|
|
143
|
+
mesh_status.envoy.locations,
|
|
144
|
+
)
|
|
145
|
+
output.extend(envoy_status_human)
|
|
146
|
+
|
|
147
|
+
return 0, output
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
def paasta_mesh_status(args) -> int:
|
|
151
|
+
system_paasta_config = load_system_paasta_config()
|
|
152
|
+
|
|
153
|
+
# validate args, funcs have their own error output
|
|
154
|
+
service = figure_out_service_name(args, args.soa_dir)
|
|
155
|
+
if verify_instances(args.instance, service, [args.cluster], args.soa_dir):
|
|
156
|
+
return 1
|
|
157
|
+
|
|
158
|
+
return_code, mesh_output = paasta_mesh_status_on_api_endpoint(
|
|
159
|
+
cluster=args.cluster,
|
|
160
|
+
service=service,
|
|
161
|
+
instance=args.instance,
|
|
162
|
+
system_paasta_config=system_paasta_config,
|
|
163
|
+
soa_dir=args.soa_dir,
|
|
164
|
+
)
|
|
165
|
+
|
|
166
|
+
output = [
|
|
167
|
+
f"service: {service}",
|
|
168
|
+
f"cluster: {args.cluster}",
|
|
169
|
+
f"instance: {PaastaColors.cyan(args.instance)}",
|
|
170
|
+
]
|
|
171
|
+
output.extend([" " + line for line in mesh_output])
|
|
172
|
+
print("\n".join(output))
|
|
173
|
+
|
|
174
|
+
return return_code
|
|
@@ -0,0 +1,107 @@
|
|
|
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 paasta_tools.autoscaling.pause_service_autoscaler import (
|
|
16
|
+
delete_service_autoscale_pause_time,
|
|
17
|
+
)
|
|
18
|
+
from paasta_tools.autoscaling.pause_service_autoscaler import (
|
|
19
|
+
get_service_autoscale_pause_time,
|
|
20
|
+
)
|
|
21
|
+
from paasta_tools.autoscaling.pause_service_autoscaler import (
|
|
22
|
+
update_service_autoscale_pause_time,
|
|
23
|
+
)
|
|
24
|
+
from paasta_tools.utils import _log_audit
|
|
25
|
+
|
|
26
|
+
MAX_PAUSE_DURATION = 320
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def add_subparser(subparsers):
|
|
30
|
+
status_parser = subparsers.add_parser(
|
|
31
|
+
"pause_service_autoscaler",
|
|
32
|
+
help="Pause the service autoscaler for an entire cluster",
|
|
33
|
+
description=(
|
|
34
|
+
"'paasta pause_service_autoscaler is used to pause the paasta service autoscaler "
|
|
35
|
+
"for an entire paasta cluster. "
|
|
36
|
+
),
|
|
37
|
+
)
|
|
38
|
+
status_parser.add_argument(
|
|
39
|
+
"-c",
|
|
40
|
+
"--cluster",
|
|
41
|
+
dest="cluster",
|
|
42
|
+
help="which cluster to pause autoscaling in. ie. pnw-prod",
|
|
43
|
+
)
|
|
44
|
+
status_parser.add_argument(
|
|
45
|
+
"-d",
|
|
46
|
+
"--pause-duration",
|
|
47
|
+
default=120,
|
|
48
|
+
dest="duration",
|
|
49
|
+
type=int,
|
|
50
|
+
help="How long to pause the autoscaler for, defaults to %(default)s minutes",
|
|
51
|
+
)
|
|
52
|
+
status_parser.add_argument(
|
|
53
|
+
"-f",
|
|
54
|
+
"--force",
|
|
55
|
+
help="Force pause for longer than max duration",
|
|
56
|
+
action="store_true",
|
|
57
|
+
dest="force",
|
|
58
|
+
default=False,
|
|
59
|
+
)
|
|
60
|
+
status_parser.add_argument(
|
|
61
|
+
"-i",
|
|
62
|
+
"--info",
|
|
63
|
+
help="Print when the autoscaler is paused until",
|
|
64
|
+
action="store_true",
|
|
65
|
+
dest="info",
|
|
66
|
+
default=False,
|
|
67
|
+
)
|
|
68
|
+
status_parser.add_argument(
|
|
69
|
+
"-r",
|
|
70
|
+
"--resume",
|
|
71
|
+
help="Resume autoscaling (unpause) in a cluster",
|
|
72
|
+
action="store_true",
|
|
73
|
+
dest="resume",
|
|
74
|
+
default=False,
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
status_parser.set_defaults(command=paasta_pause_service_autoscaler)
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def paasta_pause_service_autoscaler(args):
|
|
81
|
+
"""With a given cluster and duration, pauses the paasta service autoscaler
|
|
82
|
+
in that cluster for duration minutes"""
|
|
83
|
+
if args.duration > MAX_PAUSE_DURATION:
|
|
84
|
+
if not args.force:
|
|
85
|
+
print(
|
|
86
|
+
"Specified duration: {d} longer than max: {m}".format(
|
|
87
|
+
d=args.duration, m=MAX_PAUSE_DURATION
|
|
88
|
+
)
|
|
89
|
+
)
|
|
90
|
+
print("If you are really sure, run again with --force")
|
|
91
|
+
return 3
|
|
92
|
+
|
|
93
|
+
if args.info:
|
|
94
|
+
return_code = get_service_autoscale_pause_time(args.cluster)
|
|
95
|
+
elif args.resume:
|
|
96
|
+
return_code = delete_service_autoscale_pause_time(args.cluster)
|
|
97
|
+
_log_audit(action="resume-service-autoscaler", cluster=args.cluster)
|
|
98
|
+
else:
|
|
99
|
+
minutes = args.duration
|
|
100
|
+
return_code = update_service_autoscale_pause_time(args.cluster, minutes)
|
|
101
|
+
_log_audit(
|
|
102
|
+
action="pause-service-autoscaler",
|
|
103
|
+
action_details={"duration": minutes},
|
|
104
|
+
cluster=args.cluster,
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
return return_code
|
|
@@ -0,0 +1,275 @@
|
|
|
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
|
+
"""Contains methods used by the paasta client to upload a docker
|
|
16
|
+
image to a registry.
|
|
17
|
+
"""
|
|
18
|
+
import argparse
|
|
19
|
+
import base64
|
|
20
|
+
import binascii
|
|
21
|
+
import json
|
|
22
|
+
import os
|
|
23
|
+
from typing import Optional
|
|
24
|
+
from typing import Tuple
|
|
25
|
+
|
|
26
|
+
import requests
|
|
27
|
+
from requests.exceptions import RequestException
|
|
28
|
+
from requests.exceptions import SSLError
|
|
29
|
+
|
|
30
|
+
from paasta_tools.cli.utils import get_jenkins_build_output_url
|
|
31
|
+
from paasta_tools.cli.utils import validate_full_git_sha
|
|
32
|
+
from paasta_tools.cli.utils import validate_service_name
|
|
33
|
+
from paasta_tools.generate_deployments_for_service import build_docker_image_name
|
|
34
|
+
from paasta_tools.utils import _log
|
|
35
|
+
from paasta_tools.utils import _log_audit
|
|
36
|
+
from paasta_tools.utils import _run
|
|
37
|
+
from paasta_tools.utils import build_docker_tag
|
|
38
|
+
from paasta_tools.utils import build_image_identifier
|
|
39
|
+
from paasta_tools.utils import DEFAULT_SOA_DIR
|
|
40
|
+
from paasta_tools.utils import get_service_docker_registry
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def add_subparser(subparsers: argparse._SubParsersAction) -> None:
|
|
44
|
+
list_parser = subparsers.add_parser(
|
|
45
|
+
"push-to-registry",
|
|
46
|
+
help="Uploads a docker image to a registry",
|
|
47
|
+
description=(
|
|
48
|
+
"'paasta push-to-registry' is a tool to upload a local docker image "
|
|
49
|
+
"to the configured PaaSTA docker registry with a predictable and "
|
|
50
|
+
"well-constructed image name. The image name must be predictable because "
|
|
51
|
+
"the other PaaSTA components are expecting a particular format for the docker "
|
|
52
|
+
"image name."
|
|
53
|
+
),
|
|
54
|
+
epilog=(
|
|
55
|
+
"Note: Uploading to a docker registry often requires access to the local "
|
|
56
|
+
"docker socket as well as credentials to the remote registry"
|
|
57
|
+
),
|
|
58
|
+
)
|
|
59
|
+
list_parser.add_argument(
|
|
60
|
+
"-s",
|
|
61
|
+
"--service",
|
|
62
|
+
help='Name of service for which you wish to upload a docker image. Leading "services-", '
|
|
63
|
+
"as included in a Jenkins job name, will be stripped.",
|
|
64
|
+
required=True,
|
|
65
|
+
)
|
|
66
|
+
list_parser.add_argument(
|
|
67
|
+
"-c",
|
|
68
|
+
"--commit",
|
|
69
|
+
help="Git sha after which to name the remote image",
|
|
70
|
+
required=True,
|
|
71
|
+
type=validate_full_git_sha,
|
|
72
|
+
)
|
|
73
|
+
list_parser.add_argument(
|
|
74
|
+
"--image-version",
|
|
75
|
+
type=str,
|
|
76
|
+
required=False,
|
|
77
|
+
default=None,
|
|
78
|
+
help=(
|
|
79
|
+
"Extra version metadata to use when naming the remote image."
|
|
80
|
+
" When set, both versioned and non-versioned Docker tags are"
|
|
81
|
+
" pushed to the registry. The image with a versioned tag is"
|
|
82
|
+
" expected to have been build locally."
|
|
83
|
+
),
|
|
84
|
+
)
|
|
85
|
+
list_parser.add_argument(
|
|
86
|
+
"-d",
|
|
87
|
+
"--soa-dir",
|
|
88
|
+
dest="soa_dir",
|
|
89
|
+
metavar="SOA_DIR",
|
|
90
|
+
default=DEFAULT_SOA_DIR,
|
|
91
|
+
help="define a different soa config directory",
|
|
92
|
+
)
|
|
93
|
+
list_parser.add_argument(
|
|
94
|
+
"-f",
|
|
95
|
+
"--force",
|
|
96
|
+
help=(
|
|
97
|
+
"Do not check if the image is already in the PaaSTA docker registry. "
|
|
98
|
+
"Push it anyway."
|
|
99
|
+
),
|
|
100
|
+
action="store_true",
|
|
101
|
+
)
|
|
102
|
+
list_parser.set_defaults(command=paasta_push_to_registry)
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
def build_command(
|
|
106
|
+
upstream_job_name: str,
|
|
107
|
+
upstream_git_commit: str,
|
|
108
|
+
image_version: Optional[str] = None,
|
|
109
|
+
) -> str:
|
|
110
|
+
# This is kinda dumb since we just cleaned the 'services-' off of the
|
|
111
|
+
# service so we could validate it, but the Docker image will have the full
|
|
112
|
+
# name with 'services-' so add it back.
|
|
113
|
+
tag = build_docker_tag(upstream_job_name, upstream_git_commit, image_version)
|
|
114
|
+
cmd = f"docker push {tag}"
|
|
115
|
+
return cmd
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def paasta_push_to_registry_impl(
|
|
119
|
+
args: argparse.Namespace, service: str, image_version: Optional[str]
|
|
120
|
+
) -> int:
|
|
121
|
+
"""Upload a docker image to a registry"""
|
|
122
|
+
image_identifier = build_image_identifier(args.commit, None, image_version)
|
|
123
|
+
|
|
124
|
+
if not args.force:
|
|
125
|
+
try:
|
|
126
|
+
if is_docker_image_already_in_registry(
|
|
127
|
+
service, args.soa_dir, args.commit, image_version
|
|
128
|
+
):
|
|
129
|
+
print(
|
|
130
|
+
"The docker image is already in the PaaSTA docker registry. "
|
|
131
|
+
"I'm NOT overriding the existing image. "
|
|
132
|
+
"Add --force to override the image in the registry if you are sure what you are doing."
|
|
133
|
+
)
|
|
134
|
+
return 0
|
|
135
|
+
except RequestException as e:
|
|
136
|
+
registry_uri = get_service_docker_registry(service, args.soa_dir)
|
|
137
|
+
print(
|
|
138
|
+
"Can not connect to the PaaSTA docker registry '%s' to verify if this image exists.\n"
|
|
139
|
+
"%s" % (registry_uri, str(e))
|
|
140
|
+
)
|
|
141
|
+
return 1
|
|
142
|
+
|
|
143
|
+
cmd = build_command(service, args.commit, image_version)
|
|
144
|
+
loglines = []
|
|
145
|
+
returncode, output = _run(
|
|
146
|
+
cmd,
|
|
147
|
+
timeout=3600,
|
|
148
|
+
log=True,
|
|
149
|
+
component="build",
|
|
150
|
+
service=service,
|
|
151
|
+
loglevel="debug",
|
|
152
|
+
)
|
|
153
|
+
if returncode != 0:
|
|
154
|
+
loglines.append("ERROR: Failed to promote image for %s." % image_identifier)
|
|
155
|
+
output = get_jenkins_build_output_url()
|
|
156
|
+
if output:
|
|
157
|
+
loglines.append("See output: %s" % output)
|
|
158
|
+
else:
|
|
159
|
+
loglines.append(
|
|
160
|
+
"Successfully pushed image for %s to registry" % image_identifier
|
|
161
|
+
)
|
|
162
|
+
_log_audit(
|
|
163
|
+
action="push-to-registry",
|
|
164
|
+
action_details={"commit": args.commit},
|
|
165
|
+
service=service,
|
|
166
|
+
)
|
|
167
|
+
for logline in loglines:
|
|
168
|
+
_log(service=service, line=logline, component="build", level="event")
|
|
169
|
+
return returncode
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
def paasta_push_to_registry(args: argparse.Namespace) -> int:
|
|
173
|
+
"""Upload a docker images to a registry"""
|
|
174
|
+
service = args.service
|
|
175
|
+
if service and service.startswith("services-"):
|
|
176
|
+
service = service.split("services-", 1)[1]
|
|
177
|
+
validate_service_name(service, args.soa_dir)
|
|
178
|
+
|
|
179
|
+
returncode = 0
|
|
180
|
+
image_versions = [None]
|
|
181
|
+
if args.image_version:
|
|
182
|
+
# re-tag with legacy convention as well
|
|
183
|
+
returncode = retag_versioned_image(service, args.commit, args.image_version)
|
|
184
|
+
if returncode != 0:
|
|
185
|
+
_log(
|
|
186
|
+
service=service,
|
|
187
|
+
line=f"ERROR: failed re-tagging image. See output at {get_jenkins_build_output_url()}",
|
|
188
|
+
component="build",
|
|
189
|
+
level="event",
|
|
190
|
+
)
|
|
191
|
+
return returncode
|
|
192
|
+
image_versions.append(args.image_version)
|
|
193
|
+
|
|
194
|
+
for image_version in image_versions:
|
|
195
|
+
returncode = paasta_push_to_registry_impl(args, service, image_version)
|
|
196
|
+
if returncode != 0:
|
|
197
|
+
break
|
|
198
|
+
|
|
199
|
+
return returncode
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
def retag_versioned_image(service: str, commit: str, image_version: str) -> int:
|
|
203
|
+
"""Create new local tag without additional version information
|
|
204
|
+
|
|
205
|
+
:param str service: service name
|
|
206
|
+
:param str commit: commit sha
|
|
207
|
+
:param str image_version: additional image version metadata
|
|
208
|
+
:return: docker command return code
|
|
209
|
+
"""
|
|
210
|
+
unversioned_tag = build_docker_tag(service, commit, None)
|
|
211
|
+
image_version_tag = build_docker_tag(service, commit, image_version)
|
|
212
|
+
returncode, _ = _run(
|
|
213
|
+
["docker", "tag", image_version_tag, unversioned_tag],
|
|
214
|
+
timeout=30,
|
|
215
|
+
log=True,
|
|
216
|
+
component="build",
|
|
217
|
+
service=service,
|
|
218
|
+
loglevel="debug",
|
|
219
|
+
)
|
|
220
|
+
return returncode
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
def read_docker_registry_creds(
|
|
224
|
+
registry_uri: str,
|
|
225
|
+
) -> Tuple[Optional[str], Optional[str]]:
|
|
226
|
+
dockercfg_path = os.path.expanduser("~/.dockercfg")
|
|
227
|
+
try:
|
|
228
|
+
with open(dockercfg_path) as f:
|
|
229
|
+
dockercfg = json.load(f)
|
|
230
|
+
auth = base64.b64decode(dockercfg[registry_uri]["auth"]).decode("utf-8")
|
|
231
|
+
first_colon = auth.find(":")
|
|
232
|
+
if first_colon != -1:
|
|
233
|
+
return (auth[:first_colon], auth[first_colon + 1 : -2])
|
|
234
|
+
except IOError: # Can't open ~/.dockercfg
|
|
235
|
+
pass
|
|
236
|
+
except json.JSONDecodeError: # JSON decoder error
|
|
237
|
+
pass
|
|
238
|
+
except binascii.Error: # base64 decode error
|
|
239
|
+
pass
|
|
240
|
+
return (None, None)
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
def is_docker_image_already_in_registry(service: str, soa_dir: str, sha: str, image_version: Optional[str] = None) -> bool: # type: ignore
|
|
244
|
+
"""Verifies that docker image exists in the paasta registry.
|
|
245
|
+
|
|
246
|
+
:param service: name of the service
|
|
247
|
+
:param sha: git sha
|
|
248
|
+
:returns: True, False or raises requests.exceptions.RequestException
|
|
249
|
+
"""
|
|
250
|
+
registry_uri = get_service_docker_registry(service, soa_dir)
|
|
251
|
+
repository, tag = build_docker_image_name(service, sha, image_version).split(":", 1)
|
|
252
|
+
|
|
253
|
+
creds = read_docker_registry_creds(registry_uri)
|
|
254
|
+
uri = f"{registry_uri}/v2/{repository}/manifests/{tag}"
|
|
255
|
+
|
|
256
|
+
with requests.Session() as s:
|
|
257
|
+
try:
|
|
258
|
+
url = "https://" + uri
|
|
259
|
+
r = (
|
|
260
|
+
s.head(url, timeout=30)
|
|
261
|
+
if creds[0] is None
|
|
262
|
+
else s.head(url, auth=creds, timeout=30)
|
|
263
|
+
)
|
|
264
|
+
except SSLError:
|
|
265
|
+
# If no auth creds, fallback to trying http
|
|
266
|
+
if creds[0] is not None:
|
|
267
|
+
raise
|
|
268
|
+
url = "http://" + uri
|
|
269
|
+
r = s.head(url, timeout=30)
|
|
270
|
+
|
|
271
|
+
if r.status_code == 200:
|
|
272
|
+
return True
|
|
273
|
+
elif r.status_code == 404:
|
|
274
|
+
return False # No Such Repository Error
|
|
275
|
+
r.raise_for_status()
|