paasta-tools 1.30.9__tar.gz → 1.35.4__tar.gz
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.
- {paasta_tools-1.30.9/paasta_tools.egg-info → paasta_tools-1.35.4}/PKG-INFO +2 -2
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/__init__.py +1 -1
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/api/api_docs/swagger.json +5 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/cmds/local_run.py +111 -23
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/cmds/mark_for_deployment.py +9 -1
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/cmds/remote_run.py +9 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/cmds/secret.py +2 -2
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/cmds/spark_run.py +2 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/cmds/status.py +29 -6
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/cmds/validate.py +222 -1
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/schemas/autoscaling_schema.json +3 -2
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/schemas/eks_schema.json +23 -1
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/schemas/smartstack_schema.json +12 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/instance/hpa_metrics_parser.py +3 -5
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/instance/kubernetes.py +58 -25
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/kubernetes/application/controller_wrappers.py +23 -2
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/kubernetes/remote_run.py +2 -2
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/kubernetes_tools.py +37 -66
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/long_running_service_tools.py +8 -1
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/kubernetes_version.py +3 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/setup_prometheus_adapter_config.py +82 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/tron_tools.py +3 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/utils.py +25 -8
- {paasta_tools-1.30.9 → paasta_tools-1.35.4/paasta_tools.egg-info}/PKG-INFO +2 -2
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools.egg-info/requires.txt +1 -1
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/requirements-minimal.txt +2 -1
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_kubernetes_tools.py +544 -26
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_setup_prometheus_adapter_config.py +65 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_tron_tools.py +1 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/LICENSE +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/MANIFEST.in +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/README.md +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/k8s_itests/__init__.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/k8s_itests/test_autoscaling.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/k8s_itests/utils.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/adhoc_tools.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/api/__init__.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/api/api.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/api/client.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/api/settings.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/api/tweens/__init__.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/api/tweens/auth.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/api/tweens/profiling.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/api/tweens/request_logger.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/api/views/__init__.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/api/views/autoscaler.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/api/views/exception.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/api/views/flink.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/api/views/instance.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/api/views/pause_autoscaler.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/api/views/remote_run.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/api/views/resources.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/api/views/service.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/api/views/version.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/apply_external_resources.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/async_utils.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/autoscaling/__init__.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/autoscaling/autoscaling_service_lib.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/autoscaling/forecasting.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/autoscaling/max_all_k8s_services.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/autoscaling/pause_service_autoscaler.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/autoscaling/utils.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/bounce_lib.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/broadcast_log_to_services.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cassandracluster_tools.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/check_autoscaler_max_instances.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/check_cassandracluster_services_replication.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/check_flink_services_health.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/check_kubernetes_api.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/check_kubernetes_services_replication.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/check_oom_events.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/check_services_replication_tools.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/check_spark_jobs.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cleanup_expired_autoscaling_overrides.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cleanup_kubernetes_cr.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cleanup_kubernetes_crd.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cleanup_kubernetes_jobs.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cleanup_tron_namespaces.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/__init__.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/authentication.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/cli.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/cmds/__init__.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/cmds/autoscale.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/cmds/check.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/cmds/cook_image.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/cmds/get_docker_image.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/cmds/get_image_version.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/cmds/get_latest_deployment.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/cmds/info.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/cmds/itest.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/cmds/list.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/cmds/list_clusters.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/cmds/list_deploy_queue.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/cmds/list_namespaces.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/cmds/logs.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/cmds/mesh_status.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/cmds/pause_service_autoscaler.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/cmds/push_to_registry.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/cmds/rollback.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/cmds/security_check.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/cmds/start_stop_restart.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/cmds/wait_for_deployment.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/fsm/__init__.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/fsm/autosuggest.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/fsm/template/README.md +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/fsm/template/cookiecutter.json +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/fsm/template/{{cookiecutter.service}}/kubernetes-PROD.yaml +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/fsm/template/{{cookiecutter.service}}/monitoring.yaml +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/fsm/template/{{cookiecutter.service}}/service.yaml +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/fsm/template/{{cookiecutter.service}}/smartstack.yaml +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/fsm_cmd.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/paasta_tabcomplete.sh +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/schemas/adhoc_schema.json +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/schemas/autotuned_defaults/cassandracluster_schema.json +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/schemas/autotuned_defaults/kubernetes_schema.json +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/schemas/deploy_schema.json +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/schemas/kubernetes_schema.json +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/schemas/rollback_schema.json +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/schemas/service_schema.json +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/schemas/tron_schema.json +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/cli/utils.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/clusterman.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/config_utils.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/contrib/__init__.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/contrib/bounce_log_latency_parser.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/contrib/check_manual_oapi_changes.sh +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/contrib/check_orphans.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/contrib/create_dynamodb_table.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/contrib/create_paasta_playground.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/contrib/emit_allocated_cpu_metrics.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/contrib/get_running_task_allocation.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/contrib/habitat_fixer.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/contrib/ide_helper.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/contrib/is_pod_healthy_in_proxy.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/contrib/is_pod_healthy_in_smartstack.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/contrib/kill_bad_containers.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/contrib/mass-deploy-tag.sh +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/contrib/mock_patch_checker.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/contrib/paasta_update_soa_memcpu.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/contrib/render_template.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/contrib/rightsizer_soaconfigs_update.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/contrib/service_shard_remove.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/contrib/service_shard_update.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/contrib/shared_ip_check.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/contrib/timeouts_metrics_prom.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/delete_kubernetes_deployments.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/deployment_utils.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/docker_wrapper.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/docker_wrapper_imports.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/drain_lib.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/dump_locally_running_services.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/eks_tools.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/envoy_tools.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/firewall.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/firewall_logging.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/firewall_update.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/flink_tools.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/flinkeks_tools.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/frameworks/__init__.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/frameworks/constraints.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/frameworks/native_service_config.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/generate_all_deployments +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/generate_authenticating_services.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/generate_deployments_for_service.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/generate_services_file.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/generate_services_yaml.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/hacheck.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/instance/__init__.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/iptables.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/kafkacluster_tools.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/kubernetes/__init__.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/kubernetes/application/__init__.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/kubernetes/application/tools.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/kubernetes/bin/__init__.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/kubernetes/bin/kubernetes_remove_evicted_pods.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/kubernetes/bin/paasta_cleanup_remote_run_resources.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/kubernetes/bin/paasta_cleanup_stale_nodes.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/kubernetes/bin/paasta_secrets_sync.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/list_kubernetes_service_instances.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/list_tron_namespaces.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/mac_address.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/marathon_dashboard.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/mesos/__init__.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/mesos/cfg.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/mesos/cluster.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/mesos/exceptions.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/mesos/framework.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/mesos/log.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/mesos/master.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/mesos/mesos_file.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/mesos/parallel.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/mesos/slave.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/mesos/task.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/mesos/util.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/mesos/zookeeper.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/mesos_tools.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/metrics/__init__.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/metrics/metastatus_lib.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/metrics/metrics_lib.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/monitoring/__init__.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/monitoring/check_k8s_api_performance.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/monitoring_tools.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/monkrelaycluster_tools.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/nrtsearchservice_tools.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/nrtsearchserviceeks_tools.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/oom_logger.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paasta_deploy_tron_jobs +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paasta_execute_docker_command.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paasta_service_config_loader.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/__init__.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/api/__init__.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/api/autoscaler_api.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/api/default_api.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/api/remote_run_api.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/api/resources_api.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/api/service_api.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/api_client.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/apis/__init__.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/configuration.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/exceptions.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/__init__.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/adhoc_launch_history.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/autoscaler_count_msg.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/autoscaling_override.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/deploy_queue.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/deploy_queue_service_instance.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/envoy_backend.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/envoy_location.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/envoy_status.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/flink_cluster_overview.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/flink_config.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/flink_job.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/flink_job_details.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/flink_jobs.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/float_and_error.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/hpa_metric.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/inline_object.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/inline_response200.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/inline_response2001.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/inline_response202.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/inline_response403.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/instance_bounce_status.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/instance_mesh_status.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/instance_status.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/instance_status_adhoc.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/instance_status_cassandracluster.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/instance_status_flink.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/instance_status_kafkacluster.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/instance_status_kubernetes.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/instance_status_kubernetes_autoscaling_status.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/instance_status_kubernetes_v2.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/instance_status_tron.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/instance_tasks.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/integer_and_error.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/kubernetes_container.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/kubernetes_container_v2.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/kubernetes_healthcheck.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/kubernetes_pod.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/kubernetes_pod_event.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/kubernetes_pod_v2.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/kubernetes_replica_set.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/remote_run_outcome.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/remote_run_start.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/remote_run_stop.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/remote_run_token.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/resource.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/resource_item.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/resource_value.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/smartstack_backend.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/smartstack_location.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/smartstack_status.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model/task_tail_lines.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/model_utils.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/models/__init__.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/paastaapi/rest.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/prune_completed_pods.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/puppet_service_tools.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/py.typed +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/remote_git.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/run-paasta-api-in-dev-mode.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/run-paasta-api-playground.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/secret_providers/__init__.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/secret_providers/vault.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/secret_tools.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/setup_istio_mesh.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/setup_kubernetes_cr.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/setup_kubernetes_crd.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/setup_kubernetes_internal_crd.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/setup_kubernetes_job.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/setup_tron_namespace.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/slack.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/smartstack_tools.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/spark_tools.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/synapse_srv_namespaces_fact.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/tron/__init__.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/tron/client.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/tron/tron_command_context.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/tron/tron_timeutils.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools/yaml_tools.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools.egg-info/SOURCES.txt +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools.egg-info/dependency_links.txt +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools.egg-info/entry_points.txt +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/paasta_tools.egg-info/top_level.txt +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/pyproject.toml +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/setup.cfg +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/setup.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_adhoc_tools.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_apply_external_resources.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_async_utils.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_bounce_lib.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_check_flink_services_health.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_check_kubernetes_services_replication.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_check_oom_events.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_check_service_replication_tools.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_check_spark_jobs.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_cleanup_kubernetes_jobs.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_config_utils.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_delete_kubernetes_deployments.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_deployment_utils.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_docker_wrapper.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_drain_lib.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_eks_tools.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_envoy_tools.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_firewall.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_firewall_logging.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_firewall_update.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_flink_tools.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_flinkeks_tools.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_generate_authenticating_services.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_generate_deployments_for_service.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_generate_services_file.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_generate_services_yaml.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_hacheck.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_iptables.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_list_kubernetes_service_instances.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_long_running_service_tools.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_mac_address.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_mesos_tools.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_monitoring_tools.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_nrtsearchserviceseks_tools.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_oom_logger.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_paasta_execute_docker_command.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_paasta_service_config_loader.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_puppet_service_tools.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_remote_git.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_secret_tools.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_setup_istio_mesh.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_setup_kubernetes_cr.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_setup_kubernetes_job.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_slack.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_smartstack_tools.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_spark_tools.py +0 -0
- {paasta_tools-1.30.9 → paasta_tools-1.35.4}/tests/test_utils.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: paasta-tools
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.35.4
|
|
4
4
|
Summary: Tools for Yelps SOA infrastructure
|
|
5
5
|
Author: Compute Infrastructure @ Yelp
|
|
6
6
|
Author-email: compute-infra@yelp.com
|
|
@@ -34,7 +34,7 @@ Requires-Dist: ipaddress>=1.0.22
|
|
|
34
34
|
Requires-Dist: isodate>=0.7.2
|
|
35
35
|
Requires-Dist: jsonschema[format]
|
|
36
36
|
Requires-Dist: kazoo>=2.0.0
|
|
37
|
-
Requires-Dist: kubernetes<
|
|
37
|
+
Requires-Dist: kubernetes<35.0.0,>=29.0.0
|
|
38
38
|
Requires-Dist: ldap3
|
|
39
39
|
Requires-Dist: manhole
|
|
40
40
|
Requires-Dist: mypy-extensions>=0.3.0
|
|
@@ -1788,6 +1788,11 @@
|
|
|
1788
1788
|
"KubernetesVersion": {
|
|
1789
1789
|
"type": "object",
|
|
1790
1790
|
"properties": {
|
|
1791
|
+
"container_port": {
|
|
1792
|
+
"description": "Port the container is expecting to receive traffic on",
|
|
1793
|
+
"type": "integer",
|
|
1794
|
+
"format": "int32"
|
|
1795
|
+
},
|
|
1791
1796
|
"type": {
|
|
1792
1797
|
"description": "Type of version (ReplicaSet or ControllerRevision)",
|
|
1793
1798
|
"type": "string"
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
13
|
# See the License for the specific language governing permissions and
|
|
14
14
|
# limitations under the License.
|
|
15
|
+
import base64
|
|
15
16
|
import datetime
|
|
16
17
|
import json
|
|
17
18
|
import os
|
|
@@ -31,7 +32,9 @@ from urllib.parse import urlparse
|
|
|
31
32
|
import boto3
|
|
32
33
|
import requests
|
|
33
34
|
from docker import errors
|
|
35
|
+
from docker.api.client import APIClient
|
|
34
36
|
from mypy_extensions import TypedDict
|
|
37
|
+
from service_configuration_lib import read_service_configuration
|
|
35
38
|
|
|
36
39
|
from paasta_tools.adhoc_tools import get_default_interactive_config
|
|
37
40
|
from paasta_tools.cli.authentication import get_service_auth_token
|
|
@@ -612,26 +615,83 @@ class LostContainerException(Exception):
|
|
|
612
615
|
pass
|
|
613
616
|
|
|
614
617
|
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
618
|
+
class DockerAuthConfig(TypedDict):
|
|
619
|
+
username: str
|
|
620
|
+
password: str
|
|
621
|
+
|
|
622
|
+
|
|
623
|
+
def get_readonly_docker_registry_auth_config(
|
|
624
|
+
docker_url: str,
|
|
625
|
+
) -> DockerAuthConfig | None:
|
|
626
|
+
system_paasta_config = load_system_paasta_config()
|
|
627
|
+
config_path = system_paasta_config.get_readonly_docker_registry_auth_file()
|
|
628
|
+
|
|
629
|
+
try:
|
|
630
|
+
with open(config_path) as f:
|
|
631
|
+
docker_config = json.load(f)
|
|
632
|
+
except Exception:
|
|
633
|
+
print(
|
|
634
|
+
PaastaColors.yellow(
|
|
635
|
+
"Warning: unable to load read-only docker registry credentials."
|
|
636
|
+
),
|
|
637
|
+
file=sys.stderr,
|
|
638
|
+
)
|
|
639
|
+
# the best we can do is try to pull with whatever auth the user has configured locally
|
|
640
|
+
# i.e., root-owned docker config in /root/.docker/config.json
|
|
641
|
+
return None
|
|
642
|
+
registry = docker_url.split("/")[0]
|
|
643
|
+
|
|
644
|
+
# find matching auth config - our usual ro config will have at least two entries
|
|
645
|
+
# at the time this comment was written
|
|
646
|
+
auths = docker_config
|
|
647
|
+
for auth_url, auth_data in auths.items():
|
|
648
|
+
if registry in auth_url:
|
|
649
|
+
# Decode the base64 auth string if present
|
|
650
|
+
if "auth" in auth_data:
|
|
651
|
+
auth_string = base64.b64decode(auth_data["auth"]).decode("utf-8")
|
|
652
|
+
username, password = auth_string.split(":", 1)
|
|
653
|
+
return {"username": username, "password": password}
|
|
654
|
+
|
|
655
|
+
# we'll hit this for registries like docker-dev or extra-private internal registries
|
|
656
|
+
return None
|
|
657
|
+
|
|
658
|
+
|
|
659
|
+
def docker_pull_image(docker_client: APIClient, docker_url: str) -> None:
|
|
660
|
+
"""Pull an image using the docker-py library with read-only registry credentials"""
|
|
620
661
|
print(
|
|
621
|
-
"Please wait while the image (
|
|
622
|
-
% docker_url,
|
|
662
|
+
f"Please wait while the image ({docker_url}) is pulled (times out after 30m)...",
|
|
623
663
|
file=sys.stderr,
|
|
624
664
|
)
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
665
|
+
|
|
666
|
+
auth_config = get_readonly_docker_registry_auth_config(docker_url)
|
|
667
|
+
if not auth_config:
|
|
668
|
+
print(
|
|
669
|
+
PaastaColors.yellow(
|
|
670
|
+
"Warning: No read-only docker registry credentials found, attempting to pull without them."
|
|
671
|
+
),
|
|
672
|
+
file=sys.stderr,
|
|
673
|
+
)
|
|
674
|
+
|
|
675
|
+
try:
|
|
676
|
+
with Timeout(
|
|
677
|
+
seconds=1800,
|
|
678
|
+
error_message=f"Timed out pulling docker image from {docker_url}",
|
|
679
|
+
):
|
|
680
|
+
# this is slightly funky since pull() returns the output line-by-line, but as a dict
|
|
681
|
+
# ...that we then need to format back to the usual `docker pull` output
|
|
682
|
+
# :p
|
|
683
|
+
for line in docker_client.pull(
|
|
684
|
+
docker_url, auth_config=auth_config, stream=True, decode=True
|
|
685
|
+
):
|
|
686
|
+
# not all lines have an 'id' key :(
|
|
687
|
+
id_prefix = f"{line['id']}: " if "id" in line else ""
|
|
688
|
+
print(f"{id_prefix}{line['status']}", file=sys.stderr)
|
|
689
|
+
except Exception as e:
|
|
690
|
+
print(
|
|
691
|
+
f"\nPull failed. Error: {e}",
|
|
692
|
+
file=sys.stderr,
|
|
693
|
+
)
|
|
694
|
+
sys.exit(1)
|
|
635
695
|
|
|
636
696
|
|
|
637
697
|
def get_container_id(docker_client, container_name):
|
|
@@ -1226,7 +1286,7 @@ def configure_and_run_docker_container(
|
|
|
1226
1286
|
return 1
|
|
1227
1287
|
|
|
1228
1288
|
if pull_image:
|
|
1229
|
-
docker_pull_image(docker_url)
|
|
1289
|
+
docker_pull_image(docker_client, docker_url)
|
|
1230
1290
|
|
|
1231
1291
|
for volume in instance_config.get_volumes(
|
|
1232
1292
|
system_paasta_config.get_volumes(),
|
|
@@ -1302,10 +1362,40 @@ def docker_config_available():
|
|
|
1302
1362
|
)
|
|
1303
1363
|
|
|
1304
1364
|
|
|
1365
|
+
def should_reexec_as_root(
|
|
1366
|
+
service: str, skip_secrets: bool, action: str, soa_dir: str = DEFAULT_SOA_DIR
|
|
1367
|
+
) -> bool:
|
|
1368
|
+
# local-run can't pull secrets from Vault in prod without a root-owned token
|
|
1369
|
+
need_vault_token = not skip_secrets and action == "pull"
|
|
1370
|
+
|
|
1371
|
+
# there are some special teams with their own private docker registries and no ro creds
|
|
1372
|
+
# however, we don't know what registry is to be used without loading the service config
|
|
1373
|
+
service_info = read_service_configuration(service, soa_dir)
|
|
1374
|
+
# technically folks can set the standard registry as a value here, but atm no one is doing that :p
|
|
1375
|
+
registry_override = service_info.get("docker_registry")
|
|
1376
|
+
# note: we could also have a list of registries that have ro creds, but this seems fine for now
|
|
1377
|
+
uses_private_registry = (
|
|
1378
|
+
registry_override
|
|
1379
|
+
and registry_override
|
|
1380
|
+
in load_system_paasta_config().get_private_docker_registries()
|
|
1381
|
+
)
|
|
1382
|
+
need_docker_config = uses_private_registry and action == "pull"
|
|
1383
|
+
|
|
1384
|
+
return (need_vault_token or need_docker_config) and os.geteuid() != 0
|
|
1385
|
+
|
|
1386
|
+
|
|
1305
1387
|
def paasta_local_run(args):
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1388
|
+
service = figure_out_service_name(args, soa_dir=args.yelpsoa_config_root)
|
|
1389
|
+
if should_reexec_as_root(
|
|
1390
|
+
service, args.skip_secrets, args.action, args.yelpsoa_config_root
|
|
1391
|
+
):
|
|
1392
|
+
# XXX: we should re-architect this to not need sudo, but for now,
|
|
1393
|
+
# re-exec ourselves with sudo to get access to the paasta vault token
|
|
1394
|
+
# NOTE: once we do that, we can also remove the venv check above :)
|
|
1395
|
+
print(
|
|
1396
|
+
"Re-executing paasta local-run --pull with sudo for Vault/Docker registry access..."
|
|
1397
|
+
)
|
|
1398
|
+
os.execvp("sudo", ["sudo", "-H", "/usr/bin/paasta"] + sys.argv[1:])
|
|
1309
1399
|
if args.action == "build" and not makefile_responds_to("cook-image"):
|
|
1310
1400
|
print(
|
|
1311
1401
|
"A local Makefile with a 'cook-image' target is required for --build",
|
|
@@ -1332,8 +1422,6 @@ def paasta_local_run(args):
|
|
|
1332
1422
|
|
|
1333
1423
|
local_run_config = system_paasta_config.get_local_run_config()
|
|
1334
1424
|
|
|
1335
|
-
service = figure_out_service_name(args, soa_dir=args.yelpsoa_config_root)
|
|
1336
|
-
|
|
1337
1425
|
if args.cluster:
|
|
1338
1426
|
cluster = args.cluster
|
|
1339
1427
|
else:
|
|
@@ -1264,7 +1264,15 @@ class MarkForDeploymentProcess(RollbackSlackDeploymentProcess):
|
|
|
1264
1264
|
self.ping_authors()
|
|
1265
1265
|
|
|
1266
1266
|
def send_manual_rollback_instructions(self) -> None:
|
|
1267
|
-
|
|
1267
|
+
# NOTE: new deploy groups are not exactly a particularly frequent occurrence, but
|
|
1268
|
+
# we want to prevent sending messages that look like
|
|
1269
|
+
# `If you need to roll back manually, run: paasta rollback --service $S --deploy-group $G --commit None`
|
|
1270
|
+
# since that's not actually valid/actionable.
|
|
1271
|
+
# thus the seemingly out-of-nowhere old_git_sha check: new deploy groups won't have value set there.
|
|
1272
|
+
if (
|
|
1273
|
+
self.deployment_version != self.old_deployment_version
|
|
1274
|
+
and self.old_git_sha is not None
|
|
1275
|
+
):
|
|
1268
1276
|
extra_rollback_args = ""
|
|
1269
1277
|
if self.old_deployment_version.image_version:
|
|
1270
1278
|
extra_rollback_args = (
|
|
@@ -295,11 +295,19 @@ def paasta_remote_run_stop(
|
|
|
295
295
|
|
|
296
296
|
|
|
297
297
|
def add_common_args_to_parser(parser: argparse.ArgumentParser):
|
|
298
|
+
def _validate_service_name(name: str) -> str:
|
|
299
|
+
if name not in _list_services_and_toolboxes():
|
|
300
|
+
raise ValueError(f"{name} is not a known service name")
|
|
301
|
+
return name
|
|
302
|
+
|
|
298
303
|
service_arg = parser.add_argument(
|
|
299
304
|
"-s",
|
|
300
305
|
"--service",
|
|
301
306
|
help="The name of the service you wish to inspect. Required.",
|
|
302
307
|
required=True,
|
|
308
|
+
# not using `choices` for validation to avoid the help text
|
|
309
|
+
# for the command being incredibly large
|
|
310
|
+
type=_validate_service_name,
|
|
303
311
|
)
|
|
304
312
|
service_arg.completer = lazy_choices_completer(_list_services_and_toolboxes) # type: ignore
|
|
305
313
|
instance_or_toolbox = parser.add_mutually_exclusive_group()
|
|
@@ -323,6 +331,7 @@ def add_common_args_to_parser(parser: argparse.ArgumentParser):
|
|
|
323
331
|
"--cluster",
|
|
324
332
|
help="The name of the cluster you wish to run your task on. Required.",
|
|
325
333
|
required=True,
|
|
334
|
+
choices=list_clusters(),
|
|
326
335
|
)
|
|
327
336
|
cluster_arg.completer = lazy_choices_completer(list_clusters) # type: ignore
|
|
328
337
|
|
|
@@ -212,7 +212,7 @@ def _add_vault_auth_args(parser: argparse.ArgumentParser):
|
|
|
212
212
|
dest="vault_auth_method",
|
|
213
213
|
required=False,
|
|
214
214
|
default="token",
|
|
215
|
-
choices=["token", "
|
|
215
|
+
choices=["token", "okta"],
|
|
216
216
|
)
|
|
217
217
|
parser.add_argument(
|
|
218
218
|
"--vault-token-file",
|
|
@@ -456,7 +456,7 @@ def paasta_secret(args):
|
|
|
456
456
|
"vault_token_file": args.vault_token_file,
|
|
457
457
|
# best solution so far is to change the below string to "token",
|
|
458
458
|
# so that token file is picked up from argparse
|
|
459
|
-
"vault_auth_method": "
|
|
459
|
+
"vault_auth_method": "okta", # must use Okta to get 2FA push
|
|
460
460
|
},
|
|
461
461
|
)
|
|
462
462
|
secret_provider.write_secret(
|
|
@@ -897,6 +897,8 @@ def configure_and_run_docker_container(
|
|
|
897
897
|
)
|
|
898
898
|
) # type:ignore
|
|
899
899
|
environment.update(extra_driver_envs)
|
|
900
|
+
if "jupyter-lab" == args.cmd:
|
|
901
|
+
environment["SPARK_DRIVER_TYPE"] = "jupyter"
|
|
900
902
|
|
|
901
903
|
if args.use_service_auth_token:
|
|
902
904
|
environment["YELP_SVC_AUTHZ_TOKEN"] = get_service_auth_token()
|
|
@@ -917,11 +917,13 @@ def _print_flink_status_from_job_manager(
|
|
|
917
917
|
else f"{pod_evicted_count}"
|
|
918
918
|
)
|
|
919
919
|
|
|
920
|
+
pods_total_count = pod_running_count + pod_evicted_count + pod_other_count
|
|
920
921
|
output.append(
|
|
921
922
|
" Pods:"
|
|
922
923
|
f" {pod_running_count} running,"
|
|
923
924
|
f" {evicted} evicted,"
|
|
924
|
-
f" {pod_other_count} other"
|
|
925
|
+
f" {pod_other_count} other,"
|
|
926
|
+
f" {pods_total_count} total"
|
|
925
927
|
)
|
|
926
928
|
|
|
927
929
|
if not should_job_info_be_shown(status["state"]):
|
|
@@ -944,12 +946,19 @@ def _print_flink_status_from_job_manager(
|
|
|
944
946
|
output.append(str(e))
|
|
945
947
|
return 1
|
|
946
948
|
|
|
949
|
+
jobs_total_count = (
|
|
950
|
+
overview.jobs_running
|
|
951
|
+
+ overview.jobs_finished
|
|
952
|
+
+ overview.jobs_failed
|
|
953
|
+
+ overview.jobs_cancelled
|
|
954
|
+
)
|
|
947
955
|
output.append(
|
|
948
956
|
" Jobs:"
|
|
949
957
|
f" {overview.jobs_running} running,"
|
|
950
958
|
f" {overview.jobs_finished} finished,"
|
|
951
959
|
f" {overview.jobs_failed} failed,"
|
|
952
|
-
f" {overview.jobs_cancelled} cancelled"
|
|
960
|
+
f" {overview.jobs_cancelled} cancelled,"
|
|
961
|
+
f" {jobs_total_count} total"
|
|
953
962
|
)
|
|
954
963
|
output.append(
|
|
955
964
|
" "
|
|
@@ -1313,7 +1322,9 @@ def get_version_table_entry(
|
|
|
1313
1322
|
for state in ReplicaState
|
|
1314
1323
|
if state in replica_state_counts
|
|
1315
1324
|
]
|
|
1316
|
-
entry.append(
|
|
1325
|
+
entry.append(
|
|
1326
|
+
f" Replica States: {' / '.join(replica_state_display)} / {replica_state_counts.total()} total"
|
|
1327
|
+
)
|
|
1317
1328
|
if not verbose:
|
|
1318
1329
|
unhealthy_replicas = [
|
|
1319
1330
|
(state, pod) for state, pod in replica_states if state.is_unhealthy()
|
|
@@ -1321,13 +1332,23 @@ def get_version_table_entry(
|
|
|
1321
1332
|
if unhealthy_replicas:
|
|
1322
1333
|
entry.append(" Unhealthy Replicas:")
|
|
1323
1334
|
replica_table = create_replica_table(
|
|
1324
|
-
unhealthy_replicas,
|
|
1335
|
+
unhealthy_replicas,
|
|
1336
|
+
service,
|
|
1337
|
+
instance,
|
|
1338
|
+
cluster,
|
|
1339
|
+
version.container_port,
|
|
1340
|
+
verbose,
|
|
1325
1341
|
)
|
|
1326
1342
|
for line in replica_table:
|
|
1327
1343
|
entry.append(f" {line}")
|
|
1328
1344
|
else:
|
|
1329
1345
|
replica_table = create_replica_table(
|
|
1330
|
-
replica_states,
|
|
1346
|
+
replica_states,
|
|
1347
|
+
service,
|
|
1348
|
+
instance,
|
|
1349
|
+
cluster,
|
|
1350
|
+
version.container_port,
|
|
1351
|
+
verbose,
|
|
1331
1352
|
)
|
|
1332
1353
|
for line in replica_table:
|
|
1333
1354
|
entry.append(f" {line}")
|
|
@@ -1467,6 +1488,7 @@ def create_replica_table(
|
|
|
1467
1488
|
service: str,
|
|
1468
1489
|
instance: str,
|
|
1469
1490
|
cluster: str,
|
|
1491
|
+
container_port: int,
|
|
1470
1492
|
verbose: int = 0,
|
|
1471
1493
|
) -> List[str]:
|
|
1472
1494
|
header = ["ID", "IP/Port", "Host deployed to", "Started at what localtime", "State"]
|
|
@@ -1474,9 +1496,10 @@ def create_replica_table(
|
|
|
1474
1496
|
for state, pod in pods:
|
|
1475
1497
|
start_datetime = datetime.fromtimestamp(pod.create_timestamp)
|
|
1476
1498
|
humanized_start_time = humanize.naturaltime(start_datetime)
|
|
1499
|
+
|
|
1477
1500
|
row = [
|
|
1478
1501
|
pod.name,
|
|
1479
|
-
f"{pod.ip}:
|
|
1502
|
+
f"{pod.ip}:{container_port}" if pod.ip else "None",
|
|
1480
1503
|
pod.host or "None",
|
|
1481
1504
|
humanized_start_time,
|
|
1482
1505
|
state.formatted_message,
|
|
@@ -22,6 +22,7 @@ from datetime import datetime
|
|
|
22
22
|
from functools import lru_cache
|
|
23
23
|
from functools import partial
|
|
24
24
|
from glob import glob
|
|
25
|
+
from pathlib import Path
|
|
25
26
|
from typing import Any
|
|
26
27
|
from typing import Callable
|
|
27
28
|
from typing import cast
|
|
@@ -34,6 +35,9 @@ from typing import Union
|
|
|
34
35
|
|
|
35
36
|
import pytz
|
|
36
37
|
from croniter import croniter
|
|
38
|
+
from environment_tools.type_utils import available_location_types
|
|
39
|
+
from environment_tools.type_utils import compare_types
|
|
40
|
+
from environment_tools.type_utils import convert_location_type
|
|
37
41
|
from jsonschema import Draft4Validator
|
|
38
42
|
from jsonschema import exceptions
|
|
39
43
|
from jsonschema import FormatChecker
|
|
@@ -64,6 +68,7 @@ from paasta_tools.long_running_service_tools import METRICS_PROVIDER_PISCINA
|
|
|
64
68
|
from paasta_tools.long_running_service_tools import METRICS_PROVIDER_PROMQL
|
|
65
69
|
from paasta_tools.long_running_service_tools import METRICS_PROVIDER_UWSGI
|
|
66
70
|
from paasta_tools.long_running_service_tools import METRICS_PROVIDER_UWSGI_V2
|
|
71
|
+
from paasta_tools.long_running_service_tools import METRICS_PROVIDER_WORKER_LOAD
|
|
67
72
|
from paasta_tools.secret_tools import get_secret_name_from_ref
|
|
68
73
|
from paasta_tools.secret_tools import is_secret_ref
|
|
69
74
|
from paasta_tools.secret_tools import is_shared_secret
|
|
@@ -120,6 +125,7 @@ SCHEMA_TYPES = {
|
|
|
120
125
|
"rollback", # automatic rollbacks during deployments
|
|
121
126
|
"tron", # batch workloads
|
|
122
127
|
"eks", # eks workloads
|
|
128
|
+
"smartstack", # mesh configs
|
|
123
129
|
"autotuned_defaults/kubernetes",
|
|
124
130
|
"autotuned_defaults/cassandracluster",
|
|
125
131
|
}
|
|
@@ -163,9 +169,33 @@ INVALID_AUTOSCALING_FIELDS = {
|
|
|
163
169
|
"desired_active_requests_per_replica",
|
|
164
170
|
"prometheus-adapter-config",
|
|
165
171
|
},
|
|
172
|
+
METRICS_PROVIDER_WORKER_LOAD: {
|
|
173
|
+
"desired_active_requests_per_replica",
|
|
174
|
+
"prometheus-adapter-config",
|
|
175
|
+
},
|
|
166
176
|
METRICS_PROVIDER_PROMQL: {"desired_active_requests_per_replica"},
|
|
167
177
|
}
|
|
168
178
|
|
|
179
|
+
# Listener names in Envoy cannot exceed 128 characters and use the
|
|
180
|
+
# following format:
|
|
181
|
+
# service_name.namespace.listener
|
|
182
|
+
# This naming scheme leaves 128 - 10 = 118 characters
|
|
183
|
+
# for the Smartstack service name and namespace.
|
|
184
|
+
# See COREBACK-6303 for more context.
|
|
185
|
+
MAX_ENVOY_NAME_LEN = 118
|
|
186
|
+
|
|
187
|
+
# Socket names cannot exceed 108 characters, and the longest socket
|
|
188
|
+
# name generated by HAProxy uses the following format:
|
|
189
|
+
# /var/run/synapse/sockets/service_name.namespace.LONGPID.sock.tmp
|
|
190
|
+
# This naming scheme leaves 108 - 43 = 65 characters combined for the
|
|
191
|
+
# Smartstack service name and namespace. We leave a generous buffer
|
|
192
|
+
# to arrive at a maximum name length of 55, in case e.g. the .sock
|
|
193
|
+
# suffix is renamed to a longer name for certain sockets.
|
|
194
|
+
# See SMTSTK-204 for more context.
|
|
195
|
+
# NOTE: the above is mostly still true - but the path we use is now /var/run/envoy/sockets/...
|
|
196
|
+
# so we may want to adjust this a tad in the future ;)
|
|
197
|
+
MAX_SMARTSTACK_NAME_LEN = 55
|
|
198
|
+
|
|
169
199
|
|
|
170
200
|
class ConditionConfig(TypedDict, total=False):
|
|
171
201
|
"""
|
|
@@ -978,6 +1008,191 @@ def validate_cpu_burst(service_path: str) -> bool:
|
|
|
978
1008
|
return returncode
|
|
979
1009
|
|
|
980
1010
|
|
|
1011
|
+
def _check_smartstack_name_length_envoy(service: str, namespace: str) -> None:
|
|
1012
|
+
"""Ensures that Smartstack service name and namespace does not
|
|
1013
|
+
exceed the limit on the length of Envoy's listener names
|
|
1014
|
+
"""
|
|
1015
|
+
if len(service) + len(namespace) > MAX_ENVOY_NAME_LEN:
|
|
1016
|
+
raise ValueError(
|
|
1017
|
+
"Service name and namespace exceeds max listener name length in Envoy. Note that the full listener name "
|
|
1018
|
+
'is "{}.{}.listener". Please rename so that the combined length of the service name and namespace does '
|
|
1019
|
+
"not exceed {} characters".format(service, namespace, MAX_ENVOY_NAME_LEN),
|
|
1020
|
+
)
|
|
1021
|
+
|
|
1022
|
+
|
|
1023
|
+
def _check_smartstack_name_length(service: str, namespace: str) -> None:
|
|
1024
|
+
"""Ensure that Smartstack name does not
|
|
1025
|
+
exceed limits on HAProxy socket name
|
|
1026
|
+
"""
|
|
1027
|
+
if len(service + namespace) > MAX_SMARTSTACK_NAME_LEN:
|
|
1028
|
+
socket_name = "/var/run/synapse/sockets/{}.{}.sock.LONGPID.tmp".format(
|
|
1029
|
+
service,
|
|
1030
|
+
namespace,
|
|
1031
|
+
)
|
|
1032
|
+
raise ValueError(
|
|
1033
|
+
"Name exceeds max socket name length. Note that the full socket name under the HAProxy naming scheme "
|
|
1034
|
+
'is "{}". Please rename so that the combined length of the service name and namespace does not '
|
|
1035
|
+
"exceed {} characters".format(socket_name, MAX_SMARTSTACK_NAME_LEN),
|
|
1036
|
+
)
|
|
1037
|
+
|
|
1038
|
+
|
|
1039
|
+
@lru_cache()
|
|
1040
|
+
def _get_etc_services() -> list[str]:
|
|
1041
|
+
with open("/etc/services") as f:
|
|
1042
|
+
return f.read().splitlines()
|
|
1043
|
+
|
|
1044
|
+
|
|
1045
|
+
@lru_cache()
|
|
1046
|
+
def _get_etc_services_entry(port_lookup: int) -> str | None:
|
|
1047
|
+
entries = _get_etc_services()
|
|
1048
|
+
for entry in entries:
|
|
1049
|
+
try:
|
|
1050
|
+
service = entry.split()[0]
|
|
1051
|
+
port = entry.split()[1]
|
|
1052
|
+
if port.startswith("%s/" % str(port_lookup)):
|
|
1053
|
+
return service
|
|
1054
|
+
except IndexError:
|
|
1055
|
+
continue
|
|
1056
|
+
return None
|
|
1057
|
+
|
|
1058
|
+
|
|
1059
|
+
def _check_proxy_port_in_use(service: str, namespace: str, port: int) -> bool:
|
|
1060
|
+
if port is None:
|
|
1061
|
+
return False
|
|
1062
|
+
|
|
1063
|
+
# TODO(luisp): this should probably check the distributed /nail/etc/services
|
|
1064
|
+
# smartstack.yamls OR we should more automatically manage /etc/services
|
|
1065
|
+
etc_services_entry = _get_etc_services_entry(port)
|
|
1066
|
+
if etc_services_entry is None:
|
|
1067
|
+
return False
|
|
1068
|
+
elif f"{service}.{namespace}" == etc_services_entry:
|
|
1069
|
+
return False
|
|
1070
|
+
else:
|
|
1071
|
+
raise ValueError(
|
|
1072
|
+
(
|
|
1073
|
+
"port {} is already in use by {} according to /etc/services, it cannot be used by "
|
|
1074
|
+
"{}.{}. Please either pick a different port or update /etc/services via puppet"
|
|
1075
|
+
).format(port, etc_services_entry, service, namespace),
|
|
1076
|
+
)
|
|
1077
|
+
|
|
1078
|
+
|
|
1079
|
+
def _check_advertise_discover(
|
|
1080
|
+
smartstack_data: dict[str, Any]
|
|
1081
|
+
) -> None: # XXX: we should use a TypedDict here
|
|
1082
|
+
"""Need to ensure a few properties about smartstack files
|
|
1083
|
+
1) discover is a member of advertise
|
|
1084
|
+
2) discovery and advertise contain valid locations
|
|
1085
|
+
3) extra_advertise contains valid locations
|
|
1086
|
+
4) rhs of extra_advertise are >= discover type
|
|
1087
|
+
"""
|
|
1088
|
+
|
|
1089
|
+
def assert_valid_type(location_type: str) -> None:
|
|
1090
|
+
if location_type not in available_location_types():
|
|
1091
|
+
raise ValueError(
|
|
1092
|
+
'Location type "{}" not a valid Yelp location type'.format(
|
|
1093
|
+
location_type,
|
|
1094
|
+
),
|
|
1095
|
+
)
|
|
1096
|
+
|
|
1097
|
+
def assert_valid_location(location_string: str) -> None:
|
|
1098
|
+
try:
|
|
1099
|
+
typ, loc = location_string.split(":")
|
|
1100
|
+
assert len(convert_location_type(loc, typ, typ)) == 1
|
|
1101
|
+
except Exception:
|
|
1102
|
+
raise ValueError(
|
|
1103
|
+
'Location string "{}" not a valid Yelp location'.format(
|
|
1104
|
+
location_string,
|
|
1105
|
+
),
|
|
1106
|
+
)
|
|
1107
|
+
|
|
1108
|
+
advertise = smartstack_data.get("advertise", ["region"])
|
|
1109
|
+
discover = smartstack_data.get("discover", "region")
|
|
1110
|
+
if discover not in advertise:
|
|
1111
|
+
raise ValueError(
|
|
1112
|
+
'discover key "{}" not a member of advertise "{}"'.format(
|
|
1113
|
+
discover,
|
|
1114
|
+
advertise,
|
|
1115
|
+
),
|
|
1116
|
+
)
|
|
1117
|
+
for location_type in [discover] + advertise:
|
|
1118
|
+
assert_valid_type(location_type)
|
|
1119
|
+
|
|
1120
|
+
extra_advertisements = smartstack_data.get("extra_advertise", {})
|
|
1121
|
+
for source, destinations in extra_advertisements.items():
|
|
1122
|
+
assert_valid_location(source)
|
|
1123
|
+
for destination in destinations:
|
|
1124
|
+
assert_valid_location(destination)
|
|
1125
|
+
dest_type = destination.split(":")[0]
|
|
1126
|
+
if compare_types(dest_type, discover) > 0:
|
|
1127
|
+
raise ValueError(
|
|
1128
|
+
'Right hand side "{}" less general than discover type "{}". Your advertisement would potentially '
|
|
1129
|
+
"result in more hosts seeing your service than intended. Please change the type of your RHS to be "
|
|
1130
|
+
">= the discover type".format(destination, discover),
|
|
1131
|
+
)
|
|
1132
|
+
|
|
1133
|
+
|
|
1134
|
+
def _check_smartstack_valid_proxy(proxied_through: str, soa_dir: str) -> None:
|
|
1135
|
+
"""Checks whether its parameter is a valid Smartstack namespace. Can be used for proxied_through or clb_proxy."""
|
|
1136
|
+
proxy_service, proxy_namespace = proxied_through.split(".")
|
|
1137
|
+
proxy_smartstack_filename = Path(soa_dir) / proxy_service / "smartstack.yaml"
|
|
1138
|
+
try:
|
|
1139
|
+
yaml_data = get_config_file_dict(proxy_smartstack_filename)
|
|
1140
|
+
if proxy_namespace not in yaml_data:
|
|
1141
|
+
raise ValueError(
|
|
1142
|
+
f"{proxied_through} is not a valid Smartstack namespace to proxy through: "
|
|
1143
|
+
f"{proxy_namespace} not found in {proxy_smartstack_filename}.",
|
|
1144
|
+
)
|
|
1145
|
+
except FileNotFoundError:
|
|
1146
|
+
raise ValueError(
|
|
1147
|
+
f"{proxied_through} is not a valid Smartstack namespace to proxy through: "
|
|
1148
|
+
f"{proxy_smartstack_filename} does not exist.",
|
|
1149
|
+
)
|
|
1150
|
+
|
|
1151
|
+
|
|
1152
|
+
def _check_smartstack_proxied_through(
|
|
1153
|
+
smartstack_data: dict[str, Any],
|
|
1154
|
+
soa_dir: str,
|
|
1155
|
+
) -> None: # XXX: we should use a TypedDict here
|
|
1156
|
+
"""Checks the proxied_through field of a Smartstack namespace refers to another valid Smartstack namespace"""
|
|
1157
|
+
if "proxied_through" not in smartstack_data:
|
|
1158
|
+
return
|
|
1159
|
+
|
|
1160
|
+
proxied_through = smartstack_data["proxied_through"]
|
|
1161
|
+
_check_smartstack_valid_proxy(proxied_through, soa_dir)
|
|
1162
|
+
|
|
1163
|
+
|
|
1164
|
+
def validate_smartstack(service_path: str) -> bool:
|
|
1165
|
+
if not os.path.exists(os.path.join(service_path, "smartstack.yaml")):
|
|
1166
|
+
# not every service is mesh-registered, exit early if this is the case
|
|
1167
|
+
return True
|
|
1168
|
+
|
|
1169
|
+
config = get_config_file_dict(os.path.join(service_path, "smartstack.yaml"))
|
|
1170
|
+
if not config:
|
|
1171
|
+
print(
|
|
1172
|
+
failure(
|
|
1173
|
+
"smartstack.yaml is empty - if this service is not mesh-registered, please remove this file.",
|
|
1174
|
+
"http://paasta.readthedocs.io/en/latest/yelpsoa_configs.html",
|
|
1175
|
+
)
|
|
1176
|
+
)
|
|
1177
|
+
return False
|
|
1178
|
+
|
|
1179
|
+
soa_dir, service = path_to_soa_dir_service(service_path)
|
|
1180
|
+
for namespace, namespace_config in config.items():
|
|
1181
|
+
# XXX(luisp): these should all really either return bools or be enforced in the schema
|
|
1182
|
+
# ...i'm mostly leaving these as-is since i'm trying to remove some internal code that
|
|
1183
|
+
# duplicates a bunch of paasta validate checks (i.e., py-gitolite)
|
|
1184
|
+
_check_smartstack_name_length_envoy(service, namespace)
|
|
1185
|
+
if namespace_config["proxy_port"]:
|
|
1186
|
+
_check_smartstack_name_length(service, namespace)
|
|
1187
|
+
proxy_port = namespace_config["proxy_port"]
|
|
1188
|
+
_check_proxy_port_in_use(service, namespace, proxy_port)
|
|
1189
|
+
_check_advertise_discover(namespace_config)
|
|
1190
|
+
_check_smartstack_proxied_through(namespace_config, soa_dir)
|
|
1191
|
+
|
|
1192
|
+
print(success("All SmartStack configs are valid"))
|
|
1193
|
+
return True
|
|
1194
|
+
|
|
1195
|
+
|
|
981
1196
|
def paasta_validate_soa_configs(
|
|
982
1197
|
service: str, service_path: str, verbose: bool = False
|
|
983
1198
|
) -> bool:
|
|
@@ -1000,6 +1215,7 @@ def paasta_validate_soa_configs(
|
|
|
1000
1215
|
validate_secrets,
|
|
1001
1216
|
validate_min_max_instances,
|
|
1002
1217
|
validate_cpu_burst,
|
|
1218
|
+
validate_smartstack,
|
|
1003
1219
|
]
|
|
1004
1220
|
|
|
1005
1221
|
# NOTE: we're explicitly passing a list comprehension to all()
|
|
@@ -1013,8 +1229,13 @@ def paasta_validate(args):
|
|
|
1013
1229
|
|
|
1014
1230
|
:param args: argparse.Namespace obj created from sys.args by cli
|
|
1015
1231
|
"""
|
|
1016
|
-
service_path = get_service_path(args.service, args.yelpsoa_config_root)
|
|
1017
1232
|
service = args.service or guess_service_name()
|
|
1233
|
+
service_path = get_service_path(service, args.yelpsoa_config_root)
|
|
1234
|
+
|
|
1235
|
+
# not much we can do if we have no path to inspect ;)
|
|
1236
|
+
if not service_path:
|
|
1237
|
+
return 1
|
|
1238
|
+
|
|
1018
1239
|
if not paasta_validate_soa_configs(service, service_path, args.verbose):
|
|
1019
1240
|
print("Invalid configs found. Please try again.")
|
|
1020
1241
|
return 1
|