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,334 @@
|
|
|
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 check whether Yelp service
|
|
16
|
+
passes all the markers required to be considered paasta ready."""
|
|
17
|
+
import os
|
|
18
|
+
import re
|
|
19
|
+
|
|
20
|
+
from paasta_tools.cli.cmds.validate import paasta_validate_soa_configs
|
|
21
|
+
from paasta_tools.cli.utils import figure_out_service_name
|
|
22
|
+
from paasta_tools.cli.utils import get_file_contents
|
|
23
|
+
from paasta_tools.cli.utils import get_instance_config
|
|
24
|
+
from paasta_tools.cli.utils import is_file_in_dir
|
|
25
|
+
from paasta_tools.cli.utils import lazy_choices_completer
|
|
26
|
+
from paasta_tools.cli.utils import NoSuchService
|
|
27
|
+
from paasta_tools.cli.utils import PaastaCheckMessages
|
|
28
|
+
from paasta_tools.cli.utils import success
|
|
29
|
+
from paasta_tools.cli.utils import validate_service_name
|
|
30
|
+
from paasta_tools.cli.utils import x_mark
|
|
31
|
+
from paasta_tools.long_running_service_tools import get_all_namespaces_for_service
|
|
32
|
+
from paasta_tools.monitoring_tools import get_team
|
|
33
|
+
from paasta_tools.utils import _run
|
|
34
|
+
from paasta_tools.utils import DEFAULT_SOA_DIR
|
|
35
|
+
from paasta_tools.utils import get_git_url
|
|
36
|
+
from paasta_tools.utils import get_pipeline_config
|
|
37
|
+
from paasta_tools.utils import get_pipeline_deploy_groups
|
|
38
|
+
from paasta_tools.utils import get_service_instance_list
|
|
39
|
+
from paasta_tools.utils import INSTANCE_TYPES
|
|
40
|
+
from paasta_tools.utils import list_clusters
|
|
41
|
+
from paasta_tools.utils import list_services
|
|
42
|
+
from paasta_tools.utils import PaastaColors
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def add_subparser(subparsers):
|
|
46
|
+
help_text = (
|
|
47
|
+
"Determine whether service in pwd is 'paasta ready', checking for common "
|
|
48
|
+
"mistakes in the soa-configs directory and the local service directory. This "
|
|
49
|
+
"command is designed to be run from the 'root' of a service directory."
|
|
50
|
+
)
|
|
51
|
+
check_parser = subparsers.add_parser("check", description=help_text, help=help_text)
|
|
52
|
+
check_parser.add_argument(
|
|
53
|
+
"-s",
|
|
54
|
+
"--service",
|
|
55
|
+
help="The name of the service you wish to inspect. Defaults to autodetect.",
|
|
56
|
+
).completer = lazy_choices_completer(list_services)
|
|
57
|
+
check_parser.add_argument(
|
|
58
|
+
"-y",
|
|
59
|
+
"--yelpsoa-config-root",
|
|
60
|
+
dest="yelpsoa_config_root",
|
|
61
|
+
help="A directory from which yelpsoa-configs should be read from",
|
|
62
|
+
default=DEFAULT_SOA_DIR,
|
|
63
|
+
)
|
|
64
|
+
check_parser.set_defaults(command=paasta_check)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def deploy_check(service_path):
|
|
68
|
+
"""Check whether deploy.yaml exists in service directory. Prints success or
|
|
69
|
+
error message.
|
|
70
|
+
|
|
71
|
+
:param service_path: path to a directory containing deploy.yaml"""
|
|
72
|
+
if is_file_in_dir("deploy.yaml", service_path):
|
|
73
|
+
print(PaastaCheckMessages.DEPLOY_YAML_FOUND)
|
|
74
|
+
else:
|
|
75
|
+
print(PaastaCheckMessages.DEPLOY_YAML_MISSING)
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def deploy_has_security_check(service, soa_dir):
|
|
79
|
+
pipeline = get_pipeline_config(service=service, soa_dir=soa_dir)
|
|
80
|
+
steps = [step["step"] for step in pipeline if not step.get("parallel")]
|
|
81
|
+
steps += [
|
|
82
|
+
substep["step"]
|
|
83
|
+
for step in pipeline
|
|
84
|
+
if step.get("parallel")
|
|
85
|
+
for substep in step.get("parallel")
|
|
86
|
+
]
|
|
87
|
+
if "security-check" in steps:
|
|
88
|
+
print(PaastaCheckMessages.DEPLOY_SECURITY_FOUND)
|
|
89
|
+
return True
|
|
90
|
+
else:
|
|
91
|
+
print(PaastaCheckMessages.DEPLOY_SECURITY_MISSING)
|
|
92
|
+
return False
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def docker_check():
|
|
96
|
+
"""Check whether Dockerfile exists in service directory, and is valid.
|
|
97
|
+
Prints suitable message depending on outcome"""
|
|
98
|
+
docker_file_path = is_file_in_dir("Dockerfile", os.getcwd())
|
|
99
|
+
if docker_file_path:
|
|
100
|
+
print(PaastaCheckMessages.DOCKERFILE_FOUND)
|
|
101
|
+
else:
|
|
102
|
+
print(PaastaCheckMessages.DOCKERFILE_MISSING)
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
def makefile_responds_to(target):
|
|
106
|
+
"""Runs `make --question <target>` to detect if a makefile responds to the
|
|
107
|
+
specified target."""
|
|
108
|
+
# According to http://www.gnu.org/software/make/manual/make.html#index-exit-status-of-make,
|
|
109
|
+
# 0 means OK, 1 means the target is not up to date, and 2 means error
|
|
110
|
+
returncode, _ = _run(["make", "--question", target], timeout=5)
|
|
111
|
+
return returncode != 2
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
def makefile_has_a_tab(makefile_path):
|
|
115
|
+
contents = get_file_contents(makefile_path)
|
|
116
|
+
return "\t" in contents
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
def makefile_has_docker_tag(makefile_path):
|
|
120
|
+
contents = get_file_contents(makefile_path)
|
|
121
|
+
return re.search(r"DOCKER_TAG\s*\?=", contents, re.MULTILINE) is not None
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
def makefile_check():
|
|
125
|
+
"""Detects if you have a makefile and runs some sanity tests against
|
|
126
|
+
it to ensure it is paasta-ready"""
|
|
127
|
+
makefile_path = is_file_in_dir("Makefile", os.getcwd())
|
|
128
|
+
if makefile_path:
|
|
129
|
+
print(PaastaCheckMessages.MAKEFILE_FOUND)
|
|
130
|
+
|
|
131
|
+
if makefile_has_a_tab(makefile_path):
|
|
132
|
+
print(PaastaCheckMessages.MAKEFILE_HAS_A_TAB)
|
|
133
|
+
else:
|
|
134
|
+
print(PaastaCheckMessages.MAKEFILE_HAS_NO_TABS)
|
|
135
|
+
|
|
136
|
+
if makefile_has_docker_tag(makefile_path):
|
|
137
|
+
print(PaastaCheckMessages.MAKEFILE_HAS_DOCKER_TAG)
|
|
138
|
+
else:
|
|
139
|
+
print(PaastaCheckMessages.MAKEFILE_HAS_NO_DOCKER_TAG)
|
|
140
|
+
|
|
141
|
+
if makefile_responds_to("cook-image"):
|
|
142
|
+
print(PaastaCheckMessages.MAKEFILE_RESPONDS_BUILD_IMAGE)
|
|
143
|
+
else:
|
|
144
|
+
print(PaastaCheckMessages.MAKEFILE_RESPONDS_BUILD_IMAGE_FAIL)
|
|
145
|
+
|
|
146
|
+
if makefile_responds_to("itest"):
|
|
147
|
+
print(PaastaCheckMessages.MAKEFILE_RESPONDS_ITEST)
|
|
148
|
+
else:
|
|
149
|
+
print(PaastaCheckMessages.MAKEFILE_RESPONDS_ITEST_FAIL)
|
|
150
|
+
|
|
151
|
+
if makefile_responds_to("test"):
|
|
152
|
+
print(PaastaCheckMessages.MAKEFILE_RESPONDS_TEST)
|
|
153
|
+
else:
|
|
154
|
+
print(PaastaCheckMessages.MAKEFILE_RESPONDS_TEST_FAIL)
|
|
155
|
+
else:
|
|
156
|
+
print(PaastaCheckMessages.MAKEFILE_MISSING)
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
def git_repo_check(service, soa_dir):
|
|
160
|
+
git_url = get_git_url(service, soa_dir)
|
|
161
|
+
cmd = "git ls-remote %s" % git_url
|
|
162
|
+
returncode, _ = _run(cmd, timeout=5)
|
|
163
|
+
if returncode == 0:
|
|
164
|
+
print(PaastaCheckMessages.GIT_REPO_FOUND)
|
|
165
|
+
else:
|
|
166
|
+
print(PaastaCheckMessages.git_repo_missing(git_url))
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
def get_deploy_groups_used_by_framework(instance_type, service, soa_dir):
|
|
170
|
+
"""This is a kind of funny function that gets all the instances for specified
|
|
171
|
+
service and framework, and massages it into a form that matches up with what
|
|
172
|
+
deploy.yaml's steps look like. This is only so we can compare it 1-1
|
|
173
|
+
with what deploy.yaml has for linting.
|
|
174
|
+
|
|
175
|
+
:param instance_type: one of the entries in utils.INSTANCE_TYPES
|
|
176
|
+
:param service: the service name
|
|
177
|
+
:param soa_dir: The SOA configuration directory to read from
|
|
178
|
+
|
|
179
|
+
:returns: a list of deploy group names used by the service.
|
|
180
|
+
"""
|
|
181
|
+
|
|
182
|
+
deploy_groups = []
|
|
183
|
+
for cluster in list_clusters(service, soa_dir):
|
|
184
|
+
for _, instance in get_service_instance_list(
|
|
185
|
+
service=service,
|
|
186
|
+
cluster=cluster,
|
|
187
|
+
instance_type=instance_type,
|
|
188
|
+
soa_dir=soa_dir,
|
|
189
|
+
):
|
|
190
|
+
try:
|
|
191
|
+
config = get_instance_config(
|
|
192
|
+
service=service,
|
|
193
|
+
instance=instance,
|
|
194
|
+
cluster=cluster,
|
|
195
|
+
soa_dir=soa_dir,
|
|
196
|
+
load_deployments=False,
|
|
197
|
+
instance_type=instance_type,
|
|
198
|
+
)
|
|
199
|
+
deploy_groups.append(config.get_deploy_group())
|
|
200
|
+
except NotImplementedError:
|
|
201
|
+
pass
|
|
202
|
+
return set(filter(None, deploy_groups))
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
def deployments_check(service, soa_dir):
|
|
206
|
+
"""Checks for consistency between deploy.yaml and the kubernetes/etc yamls"""
|
|
207
|
+
the_return = True
|
|
208
|
+
pipeline_deploy_groups = get_pipeline_deploy_groups(
|
|
209
|
+
service=service, soa_dir=soa_dir
|
|
210
|
+
)
|
|
211
|
+
|
|
212
|
+
framework_deploy_groups = {}
|
|
213
|
+
in_deploy_not_frameworks = set(pipeline_deploy_groups)
|
|
214
|
+
for it in INSTANCE_TYPES:
|
|
215
|
+
framework_deploy_groups[it] = get_deploy_groups_used_by_framework(
|
|
216
|
+
it, service, soa_dir
|
|
217
|
+
)
|
|
218
|
+
in_framework_not_deploy = set(framework_deploy_groups[it]) - set(
|
|
219
|
+
pipeline_deploy_groups
|
|
220
|
+
)
|
|
221
|
+
in_deploy_not_frameworks -= set(framework_deploy_groups[it])
|
|
222
|
+
if len(in_framework_not_deploy) > 0:
|
|
223
|
+
print(
|
|
224
|
+
"{} There are some instance(s) you have asked to run in {} that".format(
|
|
225
|
+
x_mark(), it
|
|
226
|
+
)
|
|
227
|
+
)
|
|
228
|
+
print(" do not have a corresponding entry in deploy.yaml:")
|
|
229
|
+
print(" %s" % PaastaColors.bold(", ".join(in_framework_not_deploy)))
|
|
230
|
+
print(" You should probably configure these to use a 'deploy_group' or")
|
|
231
|
+
print(
|
|
232
|
+
" add entries to deploy.yaml for them so they are deployed to those clusters."
|
|
233
|
+
)
|
|
234
|
+
the_return = False
|
|
235
|
+
|
|
236
|
+
if len(in_deploy_not_frameworks) > 0:
|
|
237
|
+
print(
|
|
238
|
+
"%s There are some instance(s) in deploy.yaml that are not referenced"
|
|
239
|
+
% x_mark()
|
|
240
|
+
)
|
|
241
|
+
print(" by any instance:")
|
|
242
|
+
print(" %s" % PaastaColors.bold((", ".join(in_deploy_not_frameworks))))
|
|
243
|
+
print(
|
|
244
|
+
" You should probably delete these deploy.yaml entries if they are unused."
|
|
245
|
+
)
|
|
246
|
+
the_return = False
|
|
247
|
+
|
|
248
|
+
if the_return is True:
|
|
249
|
+
print(success("All entries in deploy.yaml correspond to a paasta instance"))
|
|
250
|
+
for it in INSTANCE_TYPES:
|
|
251
|
+
if len(framework_deploy_groups[it]) > 0:
|
|
252
|
+
print(
|
|
253
|
+
success(
|
|
254
|
+
"All %s instances have a corresponding deploy.yaml entry" % it
|
|
255
|
+
)
|
|
256
|
+
)
|
|
257
|
+
return the_return
|
|
258
|
+
|
|
259
|
+
|
|
260
|
+
def sensu_check(service, service_path, soa_dir):
|
|
261
|
+
"""Check whether monitoring.yaml exists in service directory,
|
|
262
|
+
and that the team name is declared.
|
|
263
|
+
|
|
264
|
+
:param service: name of service currently being examined
|
|
265
|
+
:param service_path: path to location of monitoring.yaml file"""
|
|
266
|
+
if is_file_in_dir("monitoring.yaml", service_path):
|
|
267
|
+
print(PaastaCheckMessages.SENSU_MONITORING_FOUND)
|
|
268
|
+
team = get_team(service=service, overrides={}, soa_dir=soa_dir)
|
|
269
|
+
if team is None:
|
|
270
|
+
print(PaastaCheckMessages.SENSU_TEAM_MISSING)
|
|
271
|
+
else:
|
|
272
|
+
print(PaastaCheckMessages.sensu_team_found(team))
|
|
273
|
+
else:
|
|
274
|
+
print(PaastaCheckMessages.SENSU_MONITORING_MISSING)
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
def service_dir_check(service, soa_dir):
|
|
278
|
+
"""Check whether directory service exists in /nail/etc/services
|
|
279
|
+
:param service: string of service name we wish to inspect
|
|
280
|
+
"""
|
|
281
|
+
try:
|
|
282
|
+
validate_service_name(service, soa_dir)
|
|
283
|
+
print(PaastaCheckMessages.service_dir_found(service, soa_dir))
|
|
284
|
+
except NoSuchService:
|
|
285
|
+
print(PaastaCheckMessages.service_dir_missing(service, soa_dir))
|
|
286
|
+
|
|
287
|
+
|
|
288
|
+
def smartstack_check(service, service_path, soa_dir):
|
|
289
|
+
"""Check whether smartstack.yaml exists in service directory, and the proxy
|
|
290
|
+
ports are declared. Print appropriate message depending on outcome.
|
|
291
|
+
|
|
292
|
+
:param service: name of service currently being examined
|
|
293
|
+
:param service_path: path to location of smartstack.yaml file"""
|
|
294
|
+
if is_file_in_dir("smartstack.yaml", service_path):
|
|
295
|
+
print(PaastaCheckMessages.SMARTSTACK_YAML_FOUND)
|
|
296
|
+
instances = get_all_namespaces_for_service(service=service, soa_dir=soa_dir)
|
|
297
|
+
if len(instances) > 0:
|
|
298
|
+
for namespace, config in get_all_namespaces_for_service(
|
|
299
|
+
service=service, soa_dir=soa_dir, full_name=False
|
|
300
|
+
):
|
|
301
|
+
if "proxy_port" in config:
|
|
302
|
+
print(
|
|
303
|
+
PaastaCheckMessages.smartstack_port_found(
|
|
304
|
+
namespace, config.get("proxy_port")
|
|
305
|
+
)
|
|
306
|
+
)
|
|
307
|
+
else:
|
|
308
|
+
print(PaastaCheckMessages.SMARTSTACK_PORT_MISSING)
|
|
309
|
+
else:
|
|
310
|
+
print(PaastaCheckMessages.SMARTSTACK_PORT_MISSING)
|
|
311
|
+
|
|
312
|
+
|
|
313
|
+
def paasta_check(args):
|
|
314
|
+
"""Analyze the service in the PWD to determine if it is paasta ready
|
|
315
|
+
:param args: argparse.Namespace obj created from sys.args by cli"""
|
|
316
|
+
soa_dir = args.yelpsoa_config_root
|
|
317
|
+
service = figure_out_service_name(args, soa_dir)
|
|
318
|
+
service_path = os.path.join(soa_dir, service)
|
|
319
|
+
|
|
320
|
+
service_dir_check(service, soa_dir)
|
|
321
|
+
deploy_check(service_path)
|
|
322
|
+
deploy_has_security_check(service, soa_dir)
|
|
323
|
+
git_repo_check(service, soa_dir)
|
|
324
|
+
docker_check()
|
|
325
|
+
makefile_check()
|
|
326
|
+
deployments_check(service, soa_dir)
|
|
327
|
+
sensu_check(service, service_path, soa_dir)
|
|
328
|
+
smartstack_check(service, service_path, soa_dir)
|
|
329
|
+
paasta_validate_soa_configs(service, service_path)
|
|
330
|
+
|
|
331
|
+
|
|
332
|
+
def read_dockerfile_lines(path):
|
|
333
|
+
with open(path, "r") as dockerfile:
|
|
334
|
+
return dockerfile.readlines()
|
|
@@ -0,0 +1,147 @@
|
|
|
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 build a docker image."""
|
|
16
|
+
import argparse
|
|
17
|
+
import os
|
|
18
|
+
import sys
|
|
19
|
+
from typing import Optional
|
|
20
|
+
|
|
21
|
+
from paasta_tools.cli.cmds.check import makefile_responds_to
|
|
22
|
+
from paasta_tools.cli.utils import validate_service_name
|
|
23
|
+
from paasta_tools.utils import _log
|
|
24
|
+
from paasta_tools.utils import _log_audit
|
|
25
|
+
from paasta_tools.utils import _run
|
|
26
|
+
from paasta_tools.utils import build_docker_tag
|
|
27
|
+
from paasta_tools.utils import DEFAULT_SOA_DIR
|
|
28
|
+
from paasta_tools.utils import get_username
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def add_subparser(subparsers: argparse._SubParsersAction) -> None:
|
|
32
|
+
list_parser = subparsers.add_parser(
|
|
33
|
+
"cook-image",
|
|
34
|
+
description="Calls 'make cook-image' as part of the PaaSTA contract",
|
|
35
|
+
help=(
|
|
36
|
+
"'paasta cook-image' calls 'make cook-image' as part of the PaaSTA contract.\n\n"
|
|
37
|
+
"The PaaSTA contract specifies that a service MUST respond to 'cook-image' and produce "
|
|
38
|
+
"a docker image as a result. This command is often run as part of the normal build pipeline "
|
|
39
|
+
"('paasta itest'), or via a 'paasta local-run --build'."
|
|
40
|
+
),
|
|
41
|
+
epilog="This command assumes that the Makefile is in the current working directory.",
|
|
42
|
+
)
|
|
43
|
+
list_parser.add_argument(
|
|
44
|
+
"-s",
|
|
45
|
+
"--service",
|
|
46
|
+
help=(
|
|
47
|
+
"Build docker image for this service. Leading "
|
|
48
|
+
'"services-", as included in a Jenkins job name, '
|
|
49
|
+
"will be stripped."
|
|
50
|
+
),
|
|
51
|
+
required=True,
|
|
52
|
+
)
|
|
53
|
+
list_parser.add_argument(
|
|
54
|
+
"-y",
|
|
55
|
+
"--yelpsoa-config-root",
|
|
56
|
+
dest="yelpsoa_config_root",
|
|
57
|
+
help="A directory from which yelpsoa-configs should be read from",
|
|
58
|
+
default=DEFAULT_SOA_DIR,
|
|
59
|
+
)
|
|
60
|
+
list_parser.add_argument(
|
|
61
|
+
"-c",
|
|
62
|
+
"--commit",
|
|
63
|
+
help="Git sha used to construct tag for built image",
|
|
64
|
+
)
|
|
65
|
+
list_parser.add_argument(
|
|
66
|
+
"--image-version",
|
|
67
|
+
type=str,
|
|
68
|
+
required=False,
|
|
69
|
+
default=None,
|
|
70
|
+
help="Extra version metadata used to construct tag for built image",
|
|
71
|
+
)
|
|
72
|
+
list_parser.set_defaults(command=paasta_cook_image)
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def paasta_cook_image(
|
|
76
|
+
args: Optional[argparse.Namespace],
|
|
77
|
+
service: Optional[str] = None,
|
|
78
|
+
soa_dir: Optional[str] = None,
|
|
79
|
+
) -> int:
|
|
80
|
+
"""Build a docker image"""
|
|
81
|
+
if not service:
|
|
82
|
+
if args is None:
|
|
83
|
+
print(
|
|
84
|
+
"ERROR: No arguments or service passed to cook-image - unable to determine what service to cook an image for",
|
|
85
|
+
file=sys.stderr,
|
|
86
|
+
)
|
|
87
|
+
return 1
|
|
88
|
+
service = args.service
|
|
89
|
+
if service and service.startswith("services-"):
|
|
90
|
+
service = service.split("services-", 1)[1]
|
|
91
|
+
if not soa_dir:
|
|
92
|
+
if args is None:
|
|
93
|
+
print(
|
|
94
|
+
"ERROR: No arguments or soadir passed to cook-image - unable to determine where to look for soa-configs",
|
|
95
|
+
file=sys.stderr,
|
|
96
|
+
)
|
|
97
|
+
return 1
|
|
98
|
+
soa_dir = args.yelpsoa_config_root
|
|
99
|
+
|
|
100
|
+
validate_service_name(service, soa_dir)
|
|
101
|
+
|
|
102
|
+
run_env = os.environ.copy()
|
|
103
|
+
if args is not None and args.commit is not None:
|
|
104
|
+
# if we're given a commit, we're likely being called by Jenkins or someone
|
|
105
|
+
# trying to push the cooked image to our registry - as such, we should tag
|
|
106
|
+
# the cooked image as `paasta itest` would.
|
|
107
|
+
tag = build_docker_tag(service, args.commit, args.image_version)
|
|
108
|
+
else:
|
|
109
|
+
default_tag = "paasta-cook-image-{}-{}".format(service, get_username())
|
|
110
|
+
tag = run_env.get("DOCKER_TAG", default_tag)
|
|
111
|
+
run_env["DOCKER_TAG"] = tag
|
|
112
|
+
|
|
113
|
+
if not makefile_responds_to("cook-image"):
|
|
114
|
+
print(
|
|
115
|
+
"ERROR: local-run now requires a cook-image target to be present in the Makefile. See "
|
|
116
|
+
"http://paasta.readthedocs.io/en/latest/about/contract.html.",
|
|
117
|
+
file=sys.stderr,
|
|
118
|
+
)
|
|
119
|
+
return 1
|
|
120
|
+
|
|
121
|
+
try:
|
|
122
|
+
cmd = "make cook-image"
|
|
123
|
+
returncode, output = _run(
|
|
124
|
+
cmd,
|
|
125
|
+
env=run_env,
|
|
126
|
+
log=True,
|
|
127
|
+
component="build",
|
|
128
|
+
service=service,
|
|
129
|
+
loglevel="debug",
|
|
130
|
+
)
|
|
131
|
+
if returncode != 0:
|
|
132
|
+
_log(
|
|
133
|
+
service=service,
|
|
134
|
+
line="ERROR: make cook-image failed for %s." % service,
|
|
135
|
+
component="build",
|
|
136
|
+
level="event",
|
|
137
|
+
)
|
|
138
|
+
else:
|
|
139
|
+
action_details = {"tag": tag}
|
|
140
|
+
_log_audit(
|
|
141
|
+
action="cook-image", action_details=action_details, service=service
|
|
142
|
+
)
|
|
143
|
+
return returncode
|
|
144
|
+
|
|
145
|
+
except KeyboardInterrupt:
|
|
146
|
+
print("\nProcess interrupted by the user. Cancelling.", file=sys.stderr)
|
|
147
|
+
return 2
|
|
@@ -0,0 +1,76 @@
|
|
|
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
|
+
import sys
|
|
16
|
+
|
|
17
|
+
from paasta_tools.cli.utils import lazy_choices_completer
|
|
18
|
+
from paasta_tools.cli.utils import list_deploy_groups
|
|
19
|
+
from paasta_tools.cli.utils import PaastaColors
|
|
20
|
+
from paasta_tools.cli.utils import validate_service_name
|
|
21
|
+
from paasta_tools.deployment_utils import load_v2_deployments_json
|
|
22
|
+
from paasta_tools.utils import DEFAULT_SOA_DIR
|
|
23
|
+
from paasta_tools.utils import get_service_docker_registry
|
|
24
|
+
from paasta_tools.utils import list_services
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def add_subparser(subparsers):
|
|
28
|
+
list_parser = subparsers.add_parser(
|
|
29
|
+
"get-docker-image",
|
|
30
|
+
help="Gets the docker image URL for the deployment of a service",
|
|
31
|
+
)
|
|
32
|
+
list_parser.add_argument(
|
|
33
|
+
"-s",
|
|
34
|
+
"--service",
|
|
35
|
+
help="Name of the service which you want to get the docker image for.",
|
|
36
|
+
required=True,
|
|
37
|
+
).completer = lazy_choices_completer(list_services)
|
|
38
|
+
list_parser.add_argument(
|
|
39
|
+
"-i",
|
|
40
|
+
"-l",
|
|
41
|
+
"--deploy-group",
|
|
42
|
+
help='Name of the deploy group, like "prod".',
|
|
43
|
+
required=True,
|
|
44
|
+
).completer = lazy_choices_completer(list_deploy_groups)
|
|
45
|
+
list_parser.add_argument(
|
|
46
|
+
"-d",
|
|
47
|
+
"--soa-dir",
|
|
48
|
+
help="A directory from which soa-configs should be read from",
|
|
49
|
+
default=DEFAULT_SOA_DIR,
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
list_parser.set_defaults(command=paasta_get_docker_image)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def paasta_get_docker_image(args):
|
|
56
|
+
service = args.service
|
|
57
|
+
deploy_group = args.deploy_group
|
|
58
|
+
soa_dir = args.soa_dir
|
|
59
|
+
validate_service_name(service, soa_dir)
|
|
60
|
+
|
|
61
|
+
deployments = load_v2_deployments_json(service=service, soa_dir=soa_dir)
|
|
62
|
+
docker_image = deployments.get_docker_image_for_deploy_group(deploy_group)
|
|
63
|
+
|
|
64
|
+
if not docker_image:
|
|
65
|
+
print(
|
|
66
|
+
PaastaColors.red(
|
|
67
|
+
f"There is no {service} docker_image for {deploy_group}. Has it been deployed yet?"
|
|
68
|
+
),
|
|
69
|
+
file=sys.stderr,
|
|
70
|
+
)
|
|
71
|
+
return 1
|
|
72
|
+
else:
|
|
73
|
+
registry_uri = get_service_docker_registry(service=service, soa_dir=soa_dir)
|
|
74
|
+
docker_url = f"{registry_uri}/{docker_image}"
|
|
75
|
+
print(docker_url)
|
|
76
|
+
return 0
|