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
paasta_tools/cli/cli.py
ADDED
|
@@ -0,0 +1,260 @@
|
|
|
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
|
+
# PYTHON_ARGCOMPLETE_OK
|
|
16
|
+
"""A command line tool for viewing information from the PaaSTA stack."""
|
|
17
|
+
import argparse
|
|
18
|
+
import logging
|
|
19
|
+
import os
|
|
20
|
+
import pkgutil
|
|
21
|
+
import subprocess
|
|
22
|
+
import sys
|
|
23
|
+
import warnings
|
|
24
|
+
from typing import Any
|
|
25
|
+
from typing import List
|
|
26
|
+
from typing import Tuple
|
|
27
|
+
|
|
28
|
+
import argcomplete
|
|
29
|
+
|
|
30
|
+
import paasta_tools
|
|
31
|
+
from paasta_tools.cli import cmds
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def load_method(module_name, method_name):
|
|
35
|
+
"""Return a function given a module and method name.
|
|
36
|
+
|
|
37
|
+
:param module_name: a string
|
|
38
|
+
:param method_name: a string
|
|
39
|
+
:return: a function
|
|
40
|
+
"""
|
|
41
|
+
module = __import__(module_name, fromlist=[method_name])
|
|
42
|
+
method = getattr(module, method_name)
|
|
43
|
+
return method
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def modules_in_pkg(pkg):
|
|
47
|
+
"""Return the list of modules in a python package (a module with a
|
|
48
|
+
__init__.py file.)
|
|
49
|
+
|
|
50
|
+
:return: a list of strings such as `['list', 'check']` that correspond to
|
|
51
|
+
the module names in the package.
|
|
52
|
+
"""
|
|
53
|
+
for _, module_name, _ in pkgutil.walk_packages(pkg.__path__):
|
|
54
|
+
yield module_name
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
class PrintsHelpOnErrorArgumentParser(argparse.ArgumentParser):
|
|
58
|
+
"""Overriding the error method allows us to print the whole help page,
|
|
59
|
+
otherwise the python arg parser prints a not-so-useful usage message that
|
|
60
|
+
is way too terse"""
|
|
61
|
+
|
|
62
|
+
def error(self, message):
|
|
63
|
+
print(f"Argument parse error: {message}\n")
|
|
64
|
+
self.print_help()
|
|
65
|
+
sys.exit(1)
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def list_external_commands():
|
|
69
|
+
p = subprocess.check_output(["/bin/bash", "-p", "-c", "compgen -A command paasta-"])
|
|
70
|
+
lines = p.decode("utf-8").strip().split("\n")
|
|
71
|
+
return {l.replace("paasta-", "", 1) for l in lines}
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def calling_external_command():
|
|
75
|
+
if len(sys.argv) > 1:
|
|
76
|
+
return sys.argv[1] in list_external_commands()
|
|
77
|
+
else:
|
|
78
|
+
return False
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def exec_subcommand(argv):
|
|
82
|
+
command = sys.argv[1]
|
|
83
|
+
os.execlp(f"paasta-{command}", *argv[1:])
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def add_subparser(command, subparsers):
|
|
87
|
+
"""Given a command name, paasta_cmd, execute the add_subparser method
|
|
88
|
+
implemented in paasta_cmd.py.
|
|
89
|
+
|
|
90
|
+
Each paasta client command must implement a method called add_subparser.
|
|
91
|
+
This allows the client to dynamically add subparsers to its subparser, which
|
|
92
|
+
provides the benefits of argcomplete/argparse but gets it done in a modular
|
|
93
|
+
fashion.
|
|
94
|
+
|
|
95
|
+
:param command: a simple string - e.g. 'list'
|
|
96
|
+
:param subparsers: an ArgumentParser object"""
|
|
97
|
+
module_name = "paasta_tools.cli.cmds.%s" % command
|
|
98
|
+
add_subparser_fn = load_method(module_name, "add_subparser")
|
|
99
|
+
add_subparser_fn(subparsers)
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
PAASTA_SUBCOMMANDS = {
|
|
103
|
+
"autoscale": "autoscale",
|
|
104
|
+
"check": "check",
|
|
105
|
+
"cook-image": "cook_image",
|
|
106
|
+
"get-docker-image": "get_docker_image",
|
|
107
|
+
"get-image-version": "get_image_version",
|
|
108
|
+
"get-latest-deployment": "get_latest_deployment",
|
|
109
|
+
"info": "info",
|
|
110
|
+
"itest": "itest",
|
|
111
|
+
"list-clusters": "list_clusters",
|
|
112
|
+
"list-deploy-queue": "list_deploy_queue",
|
|
113
|
+
"list-namespaces": "list_namespaces",
|
|
114
|
+
"list": "list",
|
|
115
|
+
"local-run": "local_run",
|
|
116
|
+
"logs": "logs",
|
|
117
|
+
"mark-for-deployment": "mark_for_deployment",
|
|
118
|
+
"mesh-status": "mesh_status",
|
|
119
|
+
"pause_service_autoscaler": "pause_service_autoscaler",
|
|
120
|
+
"push-to-registry": "push_to_registry",
|
|
121
|
+
"remote-run": "remote_run",
|
|
122
|
+
"rollback": "rollback",
|
|
123
|
+
"secret": "secret",
|
|
124
|
+
"security-check": "security_check",
|
|
125
|
+
"spark-run": "spark_run",
|
|
126
|
+
"start": "start_stop_restart",
|
|
127
|
+
"stop": "start_stop_restart",
|
|
128
|
+
"restart": "start_stop_restart",
|
|
129
|
+
"status": "status",
|
|
130
|
+
"validate": "validate",
|
|
131
|
+
"wait-for-deployment": "wait_for_deployment",
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
def get_argparser(commands=None):
|
|
136
|
+
"""Create and return argument parser for a set of subcommands.
|
|
137
|
+
|
|
138
|
+
:param commands: Union[None, List[str]] If `commands` argument is `None`,
|
|
139
|
+
add full parsers for all subcommands, if `commands` is empty list -
|
|
140
|
+
add thin parsers for all subcommands, otherwise - add full parsers for
|
|
141
|
+
subcommands in the argument.
|
|
142
|
+
"""
|
|
143
|
+
|
|
144
|
+
parser = PrintsHelpOnErrorArgumentParser(
|
|
145
|
+
description=(
|
|
146
|
+
"The PaaSTA command line tool. The 'paasta' command is the entry point "
|
|
147
|
+
"to multiple subcommands, see below.\n\n"
|
|
148
|
+
"You can see more help for individual commands by appending them with '--help', "
|
|
149
|
+
"for example, 'paasta status --help' or see the man page with 'man paasta status'."
|
|
150
|
+
),
|
|
151
|
+
epilog=(
|
|
152
|
+
"The 'paasta' command line tool is designed to be used by humans, and therefore has "
|
|
153
|
+
"command line completion for almost all options and uses pretty formatting when "
|
|
154
|
+
"possible."
|
|
155
|
+
),
|
|
156
|
+
# Suppressing usage prevents it from being printed twice upon print_help
|
|
157
|
+
usage=argparse.SUPPRESS,
|
|
158
|
+
)
|
|
159
|
+
|
|
160
|
+
# http://stackoverflow.com/a/8521644/812183
|
|
161
|
+
parser.add_argument(
|
|
162
|
+
"-V",
|
|
163
|
+
"--version",
|
|
164
|
+
action="version",
|
|
165
|
+
version=f"paasta-tools {paasta_tools.__version__}",
|
|
166
|
+
)
|
|
167
|
+
|
|
168
|
+
subparsers = parser.add_subparsers(dest="command", metavar="")
|
|
169
|
+
subparsers.required = True
|
|
170
|
+
|
|
171
|
+
# Adding a separate help subparser allows us to respond to "help" without --help
|
|
172
|
+
help_parser = subparsers.add_parser(
|
|
173
|
+
"help", help=f"run `paasta <subcommand> -h` for help"
|
|
174
|
+
)
|
|
175
|
+
help_parser.set_defaults(command=None)
|
|
176
|
+
|
|
177
|
+
# Build a list of subcommands to add them in alphabetical order later
|
|
178
|
+
command_choices: List[Tuple[str, Any]] = []
|
|
179
|
+
if commands is None:
|
|
180
|
+
for command in sorted(modules_in_pkg(cmds)):
|
|
181
|
+
command_choices.append(
|
|
182
|
+
(command, (add_subparser, [command, subparsers], {}))
|
|
183
|
+
)
|
|
184
|
+
elif commands:
|
|
185
|
+
for command in commands:
|
|
186
|
+
if command not in PAASTA_SUBCOMMANDS:
|
|
187
|
+
# could be external subcommand
|
|
188
|
+
continue
|
|
189
|
+
command_choices.append(
|
|
190
|
+
(
|
|
191
|
+
command,
|
|
192
|
+
(add_subparser, [PAASTA_SUBCOMMANDS[command], subparsers], {}),
|
|
193
|
+
)
|
|
194
|
+
)
|
|
195
|
+
else:
|
|
196
|
+
for command in PAASTA_SUBCOMMANDS.keys():
|
|
197
|
+
command_choices.append(
|
|
198
|
+
(
|
|
199
|
+
command,
|
|
200
|
+
(subparsers.add_parser, [command], dict(help="", add_help=False)),
|
|
201
|
+
)
|
|
202
|
+
)
|
|
203
|
+
|
|
204
|
+
for command in list_external_commands():
|
|
205
|
+
command_choices.append(
|
|
206
|
+
(command, (subparsers.add_parser, [command], dict(help="")))
|
|
207
|
+
)
|
|
208
|
+
|
|
209
|
+
for (_, (fn, args, kwds)) in sorted(command_choices, key=lambda e: e[0]):
|
|
210
|
+
fn(*args, **kwds)
|
|
211
|
+
|
|
212
|
+
return parser
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
def parse_args(argv):
|
|
216
|
+
"""Initialize autocompletion and configure the argument parser.
|
|
217
|
+
|
|
218
|
+
:return: an argparse.Namespace object mapping parameter names to the inputs
|
|
219
|
+
from sys.argv
|
|
220
|
+
"""
|
|
221
|
+
parser = get_argparser(commands=[])
|
|
222
|
+
argcomplete.autocomplete(parser)
|
|
223
|
+
|
|
224
|
+
args, _ = parser.parse_known_args(argv)
|
|
225
|
+
if args.command:
|
|
226
|
+
parser = get_argparser(commands=[args.command])
|
|
227
|
+
|
|
228
|
+
argcomplete.autocomplete(parser)
|
|
229
|
+
return parser.parse_args(argv), parser
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
def main(argv=None):
|
|
233
|
+
"""Perform a paasta call. Read args from sys.argv and pass parsed args onto
|
|
234
|
+
appropriate command in paasta_cli/cmds directory.
|
|
235
|
+
|
|
236
|
+
Ensure we kill any child pids before we quit
|
|
237
|
+
"""
|
|
238
|
+
logging.basicConfig()
|
|
239
|
+
warnings.filterwarnings("ignore", category=DeprecationWarning)
|
|
240
|
+
|
|
241
|
+
# if we are an external command, we need to exec out early.
|
|
242
|
+
# The reason we exec out early is so we don't bother trying to parse
|
|
243
|
+
# "foreign" arguments, which would cause a stack trace.
|
|
244
|
+
if calling_external_command():
|
|
245
|
+
exec_subcommand(sys.argv)
|
|
246
|
+
|
|
247
|
+
try:
|
|
248
|
+
args, parser = parse_args(argv)
|
|
249
|
+
if args.command is None:
|
|
250
|
+
parser.print_help()
|
|
251
|
+
return_code = 0
|
|
252
|
+
else:
|
|
253
|
+
return_code = args.command(args)
|
|
254
|
+
except KeyboardInterrupt:
|
|
255
|
+
return_code = 130
|
|
256
|
+
sys.exit(return_code)
|
|
257
|
+
|
|
258
|
+
|
|
259
|
+
if __name__ == "__main__":
|
|
260
|
+
main()
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Copyright 2015-2016 Yelp Inc.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
@@ -0,0 +1,143 @@
|
|
|
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 logging
|
|
16
|
+
|
|
17
|
+
import paasta_tools.paastaapi.models as paastamodels
|
|
18
|
+
from paasta_tools.api import client
|
|
19
|
+
from paasta_tools.cli.utils import figure_out_service_name
|
|
20
|
+
from paasta_tools.cli.utils import get_instance_configs_for_service
|
|
21
|
+
from paasta_tools.cli.utils import get_paasta_oapi_api_clustername
|
|
22
|
+
from paasta_tools.cli.utils import lazy_choices_completer
|
|
23
|
+
from paasta_tools.cli.utils import list_instances
|
|
24
|
+
from paasta_tools.eks_tools import EksDeploymentConfig
|
|
25
|
+
from paasta_tools.utils import _log_audit
|
|
26
|
+
from paasta_tools.utils import DEFAULT_SOA_DIR
|
|
27
|
+
from paasta_tools.utils import list_clusters
|
|
28
|
+
from paasta_tools.utils import list_services
|
|
29
|
+
from paasta_tools.utils import PaastaColors
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
log = logging.getLogger(__name__)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def add_subparser(subparsers):
|
|
36
|
+
autoscale_parser = subparsers.add_parser(
|
|
37
|
+
"autoscale",
|
|
38
|
+
help="Manually scale a service up and down manually, bypassing the normal autoscaler",
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
autoscale_parser.add_argument(
|
|
42
|
+
"-s",
|
|
43
|
+
"--service",
|
|
44
|
+
help="Service that you want to autoscale. Like 'example_service'.",
|
|
45
|
+
).completer = lazy_choices_completer(list_services)
|
|
46
|
+
autoscale_parser.add_argument(
|
|
47
|
+
"-i",
|
|
48
|
+
"--instance",
|
|
49
|
+
help="Instance of the service that you want to autoscale. Like 'main' or 'canary'.",
|
|
50
|
+
required=True,
|
|
51
|
+
).completer = lazy_choices_completer(list_instances)
|
|
52
|
+
autoscale_parser.add_argument(
|
|
53
|
+
"-c",
|
|
54
|
+
"--cluster",
|
|
55
|
+
help="The PaaSTA cluster that has the service instance you want to autoscale. Like 'pnw-prod'.",
|
|
56
|
+
required=True,
|
|
57
|
+
).completer = lazy_choices_completer(list_clusters)
|
|
58
|
+
autoscale_parser.add_argument(
|
|
59
|
+
"--set", help="Set the number to scale to. Must be an Int.", type=int
|
|
60
|
+
)
|
|
61
|
+
autoscale_parser.add_argument(
|
|
62
|
+
"-d",
|
|
63
|
+
"--soa-dir",
|
|
64
|
+
dest="soa_dir",
|
|
65
|
+
metavar="SOA_DIR",
|
|
66
|
+
default=DEFAULT_SOA_DIR,
|
|
67
|
+
help="define a different soa config directory",
|
|
68
|
+
)
|
|
69
|
+
autoscale_parser.set_defaults(command=paasta_autoscale)
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def paasta_autoscale(args):
|
|
73
|
+
log.setLevel(logging.DEBUG)
|
|
74
|
+
service = figure_out_service_name(args)
|
|
75
|
+
instance_config = next(
|
|
76
|
+
get_instance_configs_for_service(
|
|
77
|
+
service=service,
|
|
78
|
+
soa_dir=args.soa_dir,
|
|
79
|
+
clusters=[args.cluster],
|
|
80
|
+
instances=[args.instance],
|
|
81
|
+
),
|
|
82
|
+
None,
|
|
83
|
+
)
|
|
84
|
+
if not instance_config:
|
|
85
|
+
print(
|
|
86
|
+
"Could not find config files for this service instance in soaconfigs. Maybe you mispelled an argument?"
|
|
87
|
+
)
|
|
88
|
+
return 1
|
|
89
|
+
|
|
90
|
+
api = client.get_paasta_oapi_client(
|
|
91
|
+
cluster=get_paasta_oapi_api_clustername(
|
|
92
|
+
cluster=args.cluster,
|
|
93
|
+
is_eks=(instance_config.__class__ == EksDeploymentConfig),
|
|
94
|
+
),
|
|
95
|
+
http_res=True,
|
|
96
|
+
)
|
|
97
|
+
if not api:
|
|
98
|
+
print("Could not connect to paasta api. Maybe you misspelled the cluster?")
|
|
99
|
+
return 1
|
|
100
|
+
|
|
101
|
+
try:
|
|
102
|
+
if args.set is None:
|
|
103
|
+
log.debug("Getting the current autoscaler count...")
|
|
104
|
+
res, status, _ = api.autoscaler.get_autoscaler_count(
|
|
105
|
+
service=service, instance=args.instance, _return_http_data_only=False
|
|
106
|
+
)
|
|
107
|
+
else:
|
|
108
|
+
log.debug(f"Setting desired instances to {args.set}.")
|
|
109
|
+
msg = paastamodels.AutoscalerCountMsg(desired_instances=int(args.set))
|
|
110
|
+
res, status, _ = api.autoscaler.update_autoscaler_count(
|
|
111
|
+
service=service,
|
|
112
|
+
instance=args.instance,
|
|
113
|
+
autoscaler_count_msg=msg,
|
|
114
|
+
_return_http_data_only=False,
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
_log_audit(
|
|
118
|
+
action="manual-scale",
|
|
119
|
+
action_details=str(msg),
|
|
120
|
+
service=service,
|
|
121
|
+
instance=args.instance,
|
|
122
|
+
cluster=args.cluster,
|
|
123
|
+
)
|
|
124
|
+
except api.api_error as exc:
|
|
125
|
+
status = exc.status
|
|
126
|
+
|
|
127
|
+
if not 200 <= status <= 299:
|
|
128
|
+
print(
|
|
129
|
+
PaastaColors.red(
|
|
130
|
+
f"ERROR: '{args.instance}' is not configured to autoscale, "
|
|
131
|
+
f"so paasta autoscale could not scale it up on demand. "
|
|
132
|
+
f"If you want to be able to boost this service, please configure autoscaling for the service "
|
|
133
|
+
f"in its config file by setting min and max instances. Example: \n"
|
|
134
|
+
f"{args.instance}:\n"
|
|
135
|
+
f" min_instances: 5\n"
|
|
136
|
+
f" max_instances: 50"
|
|
137
|
+
)
|
|
138
|
+
)
|
|
139
|
+
return 0
|
|
140
|
+
|
|
141
|
+
log.debug(f"Res: {res} Http: {status}")
|
|
142
|
+
print(res.desired_instances)
|
|
143
|
+
return 0
|