paasta-tools 1.4.6__tar.gz → 1.4.7__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.4.6/paasta_tools.egg-info → paasta-tools-1.4.7}/PKG-INFO +1 -1
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/__init__.py +1 -1
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/cli/cmds/logs.py +52 -1
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/cli/cmds/status.py +5 -1
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/kubernetes/application/controller_wrappers.py +20 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/kubernetes_tools.py +14 -14
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/setup_kubernetes_job.py +1 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/setup_tron_namespace.py +41 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/spark_tools.py +21 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/tron_tools.py +61 -20
- {paasta-tools-1.4.6 → paasta-tools-1.4.7/paasta_tools.egg-info}/PKG-INFO +1 -1
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools.egg-info/requires.txt +1 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/requirements-minimal.txt +1 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/MANIFEST.in +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/README.md +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/k8s_itests/__init__.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/k8s_itests/test_autoscaling.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/k8s_itests/utils.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/adhoc_tools.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/api/__init__.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/api/api.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/api/api_docs/swagger.json +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/api/client.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/api/settings.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/api/tweens/__init__.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/api/tweens/profiling.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/api/tweens/request_logger.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/api/views/__init__.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/api/views/autoscaler.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/api/views/exception.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/api/views/flink.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/api/views/instance.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/api/views/pause_autoscaler.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/api/views/resources.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/api/views/service.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/api/views/version.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/apply_external_resources.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/async_utils.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/autoscaling/__init__.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/autoscaling/autoscaling_service_lib.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/autoscaling/forecasting.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/autoscaling/max_all_k8s_services.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/autoscaling/pause_service_autoscaler.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/autoscaling/utils.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/bounce_lib.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/broadcast_log_to_services.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/cassandracluster_tools.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/check_autoscaler_max_instances.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/check_cassandracluster_services_replication.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/check_flink_services_health.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/check_kubernetes_api.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/check_kubernetes_services_replication.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/check_oom_events.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/check_services_replication_tools.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/check_spark_jobs.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/cleanup_kubernetes_cr.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/cleanup_kubernetes_crd.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/cleanup_kubernetes_jobs.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/cleanup_tron_namespaces.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/cli/__init__.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/cli/cli.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/cli/cmds/__init__.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/cli/cmds/autoscale.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/cli/cmds/check.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/cli/cmds/cook_image.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/cli/cmds/get_docker_image.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/cli/cmds/get_image_version.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/cli/cmds/get_latest_deployment.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/cli/cmds/info.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/cli/cmds/itest.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/cli/cmds/list.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/cli/cmds/list_clusters.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/cli/cmds/list_deploy_queue.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/cli/cmds/local_run.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/cli/cmds/mark_for_deployment.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/cli/cmds/mesh_status.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/cli/cmds/pause_service_autoscaler.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/cli/cmds/push_to_registry.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/cli/cmds/remote_run.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/cli/cmds/rollback.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/cli/cmds/secret.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/cli/cmds/security_check.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/cli/cmds/spark_run.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/cli/cmds/start_stop_restart.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/cli/cmds/validate.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/cli/cmds/wait_for_deployment.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/cli/fsm/__init__.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/cli/fsm/autosuggest.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/cli/fsm/template/README.md +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/cli/fsm/template/cookiecutter.json +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/cli/fsm/template/{{cookiecutter.service}}/kubernetes-PROD.yaml +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/cli/fsm/template/{{cookiecutter.service}}/monitoring.yaml +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/cli/fsm/template/{{cookiecutter.service}}/service.yaml +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/cli/fsm/template/{{cookiecutter.service}}/smartstack.yaml +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/cli/fsm_cmd.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/cli/paasta_tabcomplete.sh +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/cli/schemas/adhoc_schema.json +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/cli/schemas/autoscaling_schema.json +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/cli/schemas/autotuned_defaults/cassandracluster_schema.json +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/cli/schemas/autotuned_defaults/kubernetes_schema.json +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/cli/schemas/deploy_schema.json +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/cli/schemas/eks_schema.json +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/cli/schemas/kubernetes_schema.json +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/cli/schemas/rollback_schema.json +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/cli/schemas/service_schema.json +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/cli/schemas/smartstack_schema.json +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/cli/schemas/tron_schema.json +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/cli/utils.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/clusterman.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/config_utils.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/contrib/__init__.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/contrib/bounce_log_latency_parser.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/contrib/check_manual_oapi_changes.sh +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/contrib/check_orphans.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/contrib/create_dynamodb_table.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/contrib/create_paasta_playground.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/contrib/emit_allocated_cpu_metrics.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/contrib/get_running_task_allocation.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/contrib/habitat_fixer.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/contrib/ide_helper.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/contrib/is_pod_healthy_in_proxy.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/contrib/is_pod_healthy_in_smartstack.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/contrib/kill_bad_containers.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/contrib/mass-deploy-tag.sh +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/contrib/mock_patch_checker.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/contrib/paasta_update_soa_memcpu.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/contrib/render_template.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/contrib/rightsizer_soaconfigs_update.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/contrib/service_shard_remove.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/contrib/service_shard_update.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/contrib/shared_ip_check.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/contrib/timeouts_metrics_prom.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/delete_kubernetes_deployments.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/deployment_utils.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/docker_wrapper.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/docker_wrapper_imports.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/drain_lib.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/dump_locally_running_services.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/eks_tools.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/envoy_tools.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/firewall.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/firewall_logging.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/firewall_update.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/flink_tools.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/flinkeks_tools.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/frameworks/__init__.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/frameworks/adhoc_scheduler.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/frameworks/constraints.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/frameworks/native_scheduler.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/frameworks/native_service_config.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/frameworks/task_store.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/generate_all_deployments +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/generate_authenticating_services.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/generate_deployments_for_service.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/generate_services_file.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/generate_services_yaml.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/hacheck.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/instance/__init__.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/instance/hpa_metrics_parser.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/instance/kubernetes.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/iptables.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/kafkacluster_tools.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/kubernetes/__init__.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/kubernetes/application/__init__.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/kubernetes/application/tools.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/kubernetes/bin/__init__.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/kubernetes/bin/kubernetes_remove_evicted_pods.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/kubernetes/bin/paasta_cleanup_stale_nodes.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/kubernetes/bin/paasta_secrets_sync.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/list_kubernetes_service_instances.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/list_tron_namespaces.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/log_task_lifecycle_events.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/long_running_service_tools.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/mac_address.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/marathon_dashboard.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/mesos/__init__.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/mesos/cfg.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/mesos/cluster.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/mesos/exceptions.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/mesos/framework.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/mesos/log.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/mesos/master.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/mesos/mesos_file.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/mesos/parallel.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/mesos/slave.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/mesos/task.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/mesos/util.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/mesos/zookeeper.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/mesos_maintenance.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/mesos_tools.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/metrics/__init__.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/metrics/metastatus_lib.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/metrics/metrics_lib.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/monitoring/__init__.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/monitoring/check_k8s_api_performance.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/monitoring/kill_orphaned_docker_containers.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/monitoring_tools.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/monkrelaycluster_tools.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/nrtsearchservice_tools.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/nrtsearchserviceeks_tools.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/oom_logger.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paasta_deploy_tron_jobs +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paasta_execute_docker_command.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paasta_native_serviceinit.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paasta_remote_run.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paasta_service_config_loader.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paastaapi/__init__.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paastaapi/api/__init__.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paastaapi/api/autoscaler_api.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paastaapi/api/default_api.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paastaapi/api/resources_api.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paastaapi/api/service_api.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paastaapi/api_client.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paastaapi/apis/__init__.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paastaapi/configuration.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paastaapi/exceptions.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paastaapi/model/__init__.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paastaapi/model/adhoc_launch_history.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paastaapi/model/autoscaler_count_msg.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paastaapi/model/deploy_queue.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paastaapi/model/deploy_queue_service_instance.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paastaapi/model/envoy_backend.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paastaapi/model/envoy_location.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paastaapi/model/envoy_status.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paastaapi/model/flink_cluster_overview.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paastaapi/model/flink_config.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paastaapi/model/flink_job.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paastaapi/model/flink_job_details.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paastaapi/model/flink_jobs.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paastaapi/model/float_and_error.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paastaapi/model/hpa_metric.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paastaapi/model/inline_object.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paastaapi/model/inline_response200.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paastaapi/model/inline_response2001.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paastaapi/model/instance_bounce_status.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paastaapi/model/instance_mesh_status.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paastaapi/model/instance_status.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paastaapi/model/instance_status_adhoc.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paastaapi/model/instance_status_cassandracluster.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paastaapi/model/instance_status_flink.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paastaapi/model/instance_status_kafkacluster.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paastaapi/model/instance_status_kubernetes.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paastaapi/model/instance_status_kubernetes_autoscaling_status.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paastaapi/model/instance_status_kubernetes_v2.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paastaapi/model/instance_status_tron.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paastaapi/model/instance_status_vitesscluster.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paastaapi/model/instance_tasks.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paastaapi/model/integer_and_error.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paastaapi/model/kubernetes_container.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paastaapi/model/kubernetes_container_v2.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paastaapi/model/kubernetes_healthcheck.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paastaapi/model/kubernetes_pod.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paastaapi/model/kubernetes_pod_event.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paastaapi/model/kubernetes_pod_v2.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paastaapi/model/kubernetes_replica_set.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paastaapi/model/kubernetes_version.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paastaapi/model/resource.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paastaapi/model/resource_item.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paastaapi/model/resource_value.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paastaapi/model/smartstack_backend.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paastaapi/model/smartstack_location.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paastaapi/model/smartstack_status.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paastaapi/model/task_tail_lines.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paastaapi/model_utils.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paastaapi/models/__init__.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/paastaapi/rest.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/prune_completed_pods.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/puppet_service_tools.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/py.typed +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/remote_git.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/run-paasta-api-in-dev-mode.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/run-paasta-api-playground.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/secret_providers/__init__.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/secret_providers/vault.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/secret_tools.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/setup_istio_mesh.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/setup_kubernetes_cr.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/setup_kubernetes_crd.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/setup_kubernetes_internal_crd.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/setup_prometheus_adapter_config.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/slack.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/smartstack_tools.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/synapse_srv_namespaces_fact.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/tron/__init__.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/tron/client.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/tron/tron_command_context.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/tron/tron_timeutils.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/utils.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/vitesscluster_tools.py +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools.egg-info/SOURCES.txt +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools.egg-info/dependency_links.txt +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools.egg-info/entry_points.txt +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools.egg-info/top_level.txt +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/pyproject.toml +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/setup.cfg +0 -0
- {paasta-tools-1.4.6 → paasta-tools-1.4.7}/setup.py +0 -0
|
@@ -40,7 +40,9 @@ from typing import Tuple
|
|
|
40
40
|
from typing import Type
|
|
41
41
|
from typing import Union
|
|
42
42
|
|
|
43
|
+
import a_sync
|
|
43
44
|
import isodate
|
|
45
|
+
import nats
|
|
44
46
|
import pytz
|
|
45
47
|
from dateutil import tz
|
|
46
48
|
|
|
@@ -1166,19 +1168,26 @@ class ScribeLogReader(LogReader):
|
|
|
1166
1168
|
|
|
1167
1169
|
@register_log_reader("vector-logs")
|
|
1168
1170
|
class VectorLogsReader(LogReader):
|
|
1171
|
+
SUPPORTS_TAILING = True
|
|
1169
1172
|
SUPPORTS_TIME = True
|
|
1170
1173
|
|
|
1171
|
-
def __init__(
|
|
1174
|
+
def __init__(
|
|
1175
|
+
self, cluster_map: Mapping[str, Any], nats_endpoint_map: Mapping[str, Any]
|
|
1176
|
+
) -> None:
|
|
1172
1177
|
super().__init__()
|
|
1173
1178
|
|
|
1174
1179
|
if S3LogsReader is None:
|
|
1175
1180
|
raise Exception("yelp_clog package must be available to use S3LogsReader")
|
|
1176
1181
|
|
|
1177
1182
|
self.cluster_map = cluster_map
|
|
1183
|
+
self.nats_endpoint_map = nats_endpoint_map
|
|
1178
1184
|
|
|
1179
1185
|
def get_superregion_for_cluster(self, cluster: str) -> Optional[str]:
|
|
1180
1186
|
return self.cluster_map.get(cluster, None)
|
|
1181
1187
|
|
|
1188
|
+
def get_nats_endpoint_for_cluster(self, cluster: str) -> Optional[str]:
|
|
1189
|
+
return self.nats_endpoint_map.get(cluster, None)
|
|
1190
|
+
|
|
1182
1191
|
def print_logs_by_time(
|
|
1183
1192
|
self,
|
|
1184
1193
|
service,
|
|
@@ -1230,6 +1239,48 @@ class VectorLogsReader(LogReader):
|
|
|
1230
1239
|
for line in aggregated_logs:
|
|
1231
1240
|
print_log(line["raw_line"], levels, raw_mode, strip_headers)
|
|
1232
1241
|
|
|
1242
|
+
def tail_logs(
|
|
1243
|
+
self,
|
|
1244
|
+
service: str,
|
|
1245
|
+
levels: Sequence[str],
|
|
1246
|
+
components: Iterable[str],
|
|
1247
|
+
clusters: Sequence[str],
|
|
1248
|
+
instances: List[str],
|
|
1249
|
+
pods: Iterable[str] = None,
|
|
1250
|
+
raw_mode: bool = False,
|
|
1251
|
+
strip_headers: bool = False,
|
|
1252
|
+
) -> None:
|
|
1253
|
+
stream_name = get_log_name_for_service(service, prefix="app_output")
|
|
1254
|
+
endpoint = self.get_nats_endpoint_for_cluster(clusters[0])
|
|
1255
|
+
if not endpoint:
|
|
1256
|
+
raise NotImplementedError(
|
|
1257
|
+
"Tailing logs is not supported in this cluster yet, sorry"
|
|
1258
|
+
)
|
|
1259
|
+
|
|
1260
|
+
async def tail_logs_from_nats() -> None:
|
|
1261
|
+
nc = await nats.connect(f"nats://{endpoint}")
|
|
1262
|
+
sub = await nc.subscribe(stream_name)
|
|
1263
|
+
|
|
1264
|
+
while True:
|
|
1265
|
+
# Wait indefinitely for a new message (no timeout)
|
|
1266
|
+
msg = await sub.next_msg(timeout=None)
|
|
1267
|
+
decoded_data = msg.data.decode("utf-8")
|
|
1268
|
+
|
|
1269
|
+
if paasta_log_line_passes_filter(
|
|
1270
|
+
decoded_data,
|
|
1271
|
+
levels,
|
|
1272
|
+
service,
|
|
1273
|
+
components,
|
|
1274
|
+
clusters,
|
|
1275
|
+
instances,
|
|
1276
|
+
pods,
|
|
1277
|
+
):
|
|
1278
|
+
await a_sync.run(
|
|
1279
|
+
print_log, decoded_data, levels, raw_mode, strip_headers
|
|
1280
|
+
)
|
|
1281
|
+
|
|
1282
|
+
a_sync.block(tail_logs_from_nats)
|
|
1283
|
+
|
|
1233
1284
|
|
|
1234
1285
|
def scribe_env_to_locations(scribe_env) -> Mapping[str, Any]:
|
|
1235
1286
|
"""Converts a scribe environment to a dictionary of locations. The
|
|
@@ -134,7 +134,11 @@ InstanceStatusWriter = Callable[
|
|
|
134
134
|
int,
|
|
135
135
|
]
|
|
136
136
|
|
|
137
|
-
EKS_DEPLOYMENT_CONFIGS = [
|
|
137
|
+
EKS_DEPLOYMENT_CONFIGS = [
|
|
138
|
+
EksDeploymentConfig,
|
|
139
|
+
FlinkEksDeploymentConfig,
|
|
140
|
+
VitessDeploymentConfig,
|
|
141
|
+
]
|
|
138
142
|
FLINK_DEPLOYMENT_CONFIGS = [FlinkDeploymentConfig, FlinkEksDeploymentConfig]
|
|
139
143
|
|
|
140
144
|
|
{paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/kubernetes/application/controller_wrappers.py
RENAMED
|
@@ -15,6 +15,7 @@ from paasta_tools.eks_tools import load_eks_service_config_no_cache
|
|
|
15
15
|
from paasta_tools.kubernetes_tools import create_deployment
|
|
16
16
|
from paasta_tools.kubernetes_tools import create_pod_disruption_budget
|
|
17
17
|
from paasta_tools.kubernetes_tools import create_stateful_set
|
|
18
|
+
from paasta_tools.kubernetes_tools import ensure_service_account
|
|
18
19
|
from paasta_tools.kubernetes_tools import KubeClient
|
|
19
20
|
from paasta_tools.kubernetes_tools import KubeDeployment
|
|
20
21
|
from paasta_tools.kubernetes_tools import KubernetesDeploymentConfig
|
|
@@ -120,6 +121,25 @@ class Application(ABC):
|
|
|
120
121
|
"""
|
|
121
122
|
self.ensure_pod_disruption_budget(kube_client, self.soa_config.get_namespace())
|
|
122
123
|
|
|
124
|
+
def update_dependency_api_objects(self, kube_client: KubeClient) -> None:
|
|
125
|
+
"""
|
|
126
|
+
Update related Kubernetes API objects that should be updated before the main object,
|
|
127
|
+
such as service accounts.
|
|
128
|
+
:param kube_client:
|
|
129
|
+
"""
|
|
130
|
+
self.ensure_service_account(kube_client)
|
|
131
|
+
|
|
132
|
+
def ensure_service_account(self, kube_client: KubeClient) -> None:
|
|
133
|
+
"""
|
|
134
|
+
Ensure that the service account for this application exists
|
|
135
|
+
:param kube_client:
|
|
136
|
+
"""
|
|
137
|
+
ensure_service_account(
|
|
138
|
+
iam_role=self.soa_config.get_iam_role(),
|
|
139
|
+
namespace=self.soa_config.get_namespace(),
|
|
140
|
+
kube_client=kube_client,
|
|
141
|
+
)
|
|
142
|
+
|
|
123
143
|
def delete_pod_disruption_budget(self, kube_client: KubeClient) -> None:
|
|
124
144
|
try:
|
|
125
145
|
kube_client.policy.delete_namespaced_pod_disruption_budget(
|
|
@@ -2220,9 +2220,9 @@ class KubernetesDeploymentConfig(LongRunningServiceConfig):
|
|
|
2220
2220
|
annotations["iam.amazonaws.com/role"] = ""
|
|
2221
2221
|
iam_role = self.get_iam_role()
|
|
2222
2222
|
if iam_role:
|
|
2223
|
-
pod_spec_kwargs[
|
|
2224
|
-
|
|
2225
|
-
|
|
2223
|
+
pod_spec_kwargs["service_account_name"] = get_service_account_name(
|
|
2224
|
+
iam_role
|
|
2225
|
+
)
|
|
2226
2226
|
if fs_group is None:
|
|
2227
2227
|
# We need some reasoable default for group id of a process
|
|
2228
2228
|
# running inside the container. Seems like most of such
|
|
@@ -4050,12 +4050,9 @@ def get_all_limit_ranges(
|
|
|
4050
4050
|
_RE_NORMALIZE_IAM_ROLE = re.compile(r"[^0-9a-zA-Z]+")
|
|
4051
4051
|
|
|
4052
4052
|
|
|
4053
|
-
def
|
|
4053
|
+
def get_service_account_name(
|
|
4054
4054
|
iam_role: str,
|
|
4055
|
-
namespace: str,
|
|
4056
4055
|
k8s_role: Optional[str] = None,
|
|
4057
|
-
kubeconfig_file: Optional[str] = None,
|
|
4058
|
-
dry_run: bool = False,
|
|
4059
4056
|
) -> str:
|
|
4060
4057
|
# the service account is expected to always be prefixed with paasta- as using the actual namespace
|
|
4061
4058
|
# potentially wastes a lot of characters (e.g., paasta-nrtsearchservices) that could be used for
|
|
@@ -4081,12 +4078,17 @@ def create_or_find_service_account_name(
|
|
|
4081
4078
|
"Expected at least one of iam_role or k8s_role to be passed in!"
|
|
4082
4079
|
)
|
|
4083
4080
|
|
|
4084
|
-
|
|
4085
|
-
|
|
4086
|
-
|
|
4087
|
-
|
|
4081
|
+
return sa_name
|
|
4082
|
+
|
|
4083
|
+
|
|
4084
|
+
def ensure_service_account(
|
|
4085
|
+
iam_role: str,
|
|
4086
|
+
namespace: str,
|
|
4087
|
+
kube_client: KubeClient,
|
|
4088
|
+
k8s_role: Optional[str] = None,
|
|
4089
|
+
) -> None:
|
|
4090
|
+
sa_name = get_service_account_name(iam_role, k8s_role)
|
|
4088
4091
|
|
|
4089
|
-
kube_client = KubeClient(config_file=kubeconfig_file)
|
|
4090
4092
|
if not any(
|
|
4091
4093
|
sa.metadata and sa.metadata.name == sa_name
|
|
4092
4094
|
for sa in get_all_service_accounts(kube_client, namespace)
|
|
@@ -4135,8 +4137,6 @@ def create_or_find_service_account_name(
|
|
|
4135
4137
|
namespace=namespace, body=role_binding
|
|
4136
4138
|
)
|
|
4137
4139
|
|
|
4138
|
-
return sa_name
|
|
4139
|
-
|
|
4140
4140
|
|
|
4141
4141
|
def mode_to_int(mode: Optional[Union[str, int]]) -> Optional[int]:
|
|
4142
4142
|
if mode is not None:
|
|
@@ -26,8 +26,13 @@ import sys
|
|
|
26
26
|
|
|
27
27
|
import ruamel.yaml as yaml
|
|
28
28
|
|
|
29
|
+
from paasta_tools import spark_tools
|
|
29
30
|
from paasta_tools import tron_tools
|
|
31
|
+
from paasta_tools.kubernetes_tools import ensure_service_account
|
|
32
|
+
from paasta_tools.kubernetes_tools import KubeClient
|
|
33
|
+
from paasta_tools.tron_tools import KUBERNETES_NAMESPACE
|
|
30
34
|
from paasta_tools.tron_tools import MASTER_NAMESPACE
|
|
35
|
+
from paasta_tools.utils import load_system_paasta_config
|
|
31
36
|
|
|
32
37
|
log = logging.getLogger(__name__)
|
|
33
38
|
|
|
@@ -63,6 +68,32 @@ def parse_args():
|
|
|
63
68
|
return args
|
|
64
69
|
|
|
65
70
|
|
|
71
|
+
def ensure_service_accounts(
|
|
72
|
+
raw_config: str, kube_client: KubeClient, spark_kube_client: KubeClient
|
|
73
|
+
) -> None:
|
|
74
|
+
# this is kinda silly, but the tron create_config functions return strings
|
|
75
|
+
# we should refactor to pass the dicts around until the we're going to send the config to tron
|
|
76
|
+
# (where we can finally convert it to a string)
|
|
77
|
+
config = yaml.safe_load(raw_config)
|
|
78
|
+
for _, job in config.get("jobs", {}).items():
|
|
79
|
+
for _, action in job.get("actions", {}).items():
|
|
80
|
+
if action.get("service_account_name") is not None:
|
|
81
|
+
ensure_service_account(
|
|
82
|
+
action["service_account_name"],
|
|
83
|
+
namespace=KUBERNETES_NAMESPACE,
|
|
84
|
+
kube_client=kube_client,
|
|
85
|
+
)
|
|
86
|
+
# spark executors are special in that we want the SA to exist in two namespaces:
|
|
87
|
+
# the tron namespace - for the spark driver
|
|
88
|
+
# and the spark namespace - for the spark executor
|
|
89
|
+
if action.get("executor") == "spark":
|
|
90
|
+
ensure_service_account(
|
|
91
|
+
action["service_account_name"],
|
|
92
|
+
namespace=spark_tools.SPARK_EXECUTOR_NAMESPACE,
|
|
93
|
+
kube_client=spark_kube_client,
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
|
|
66
97
|
def main():
|
|
67
98
|
args = parse_args()
|
|
68
99
|
log_level = logging.DEBUG if args.verbose else logging.INFO
|
|
@@ -133,6 +164,16 @@ def main():
|
|
|
133
164
|
log.info(f"{new_config}")
|
|
134
165
|
updated.append(service)
|
|
135
166
|
else:
|
|
167
|
+
# NOTE: these are all lru_cache'd so it should be fine to call these for every service
|
|
168
|
+
system_paasta_config = load_system_paasta_config()
|
|
169
|
+
kube_client = KubeClient()
|
|
170
|
+
spark_kube_client = KubeClient(
|
|
171
|
+
config_file=system_paasta_config.get_spark_kubeconfig()
|
|
172
|
+
)
|
|
173
|
+
# PaaSTA will not necessarily have created the SAs we want to use
|
|
174
|
+
# ...so let's go ahead and create them!
|
|
175
|
+
ensure_service_accounts(new_config, kube_client, spark_kube_client)
|
|
176
|
+
|
|
136
177
|
if client.update_namespace(service, new_config):
|
|
137
178
|
updated.append(service)
|
|
138
179
|
log.debug(f"Updated {service}")
|
|
@@ -6,6 +6,7 @@ from typing import Any
|
|
|
6
6
|
from typing import cast
|
|
7
7
|
from typing import Dict
|
|
8
8
|
from typing import List
|
|
9
|
+
from typing import Literal
|
|
9
10
|
from typing import Mapping
|
|
10
11
|
from typing import Set
|
|
11
12
|
|
|
@@ -23,6 +24,7 @@ SPARK_DRIVER_POOL = "stable"
|
|
|
23
24
|
SPARK_JOB_USER = "TRON"
|
|
24
25
|
SPARK_PROMETHEUS_SHARD = "ml-compute"
|
|
25
26
|
SPARK_DNS_POD_TEMPLATE = "/nail/srv/configs/spark_dns_pod_template.yaml"
|
|
27
|
+
MEM_MULTIPLIER = {"k": 1024, "m": 1024**2, "g": 1024**3, "t": 1024**4}
|
|
26
28
|
|
|
27
29
|
log = logging.getLogger(__name__)
|
|
28
30
|
|
|
@@ -247,3 +249,22 @@ def get_spark_driver_monitoring_labels(
|
|
|
247
249
|
"spark.yelp.com/driver_ui_port": ui_port_str,
|
|
248
250
|
}
|
|
249
251
|
return labels
|
|
252
|
+
|
|
253
|
+
|
|
254
|
+
def get_spark_memory_in_unit(mem: str, unit: Literal["k", "m", "g", "t"]) -> float:
|
|
255
|
+
"""
|
|
256
|
+
Converts Spark memory to the desired unit.
|
|
257
|
+
mem is the same format as JVM memory strings: just number or number followed by 'k', 'm', 'g' or 't'.
|
|
258
|
+
unit can be 'k', 'm', 'g' or 't'.
|
|
259
|
+
Returns memory as a float converted to the desired unit.
|
|
260
|
+
"""
|
|
261
|
+
try:
|
|
262
|
+
memory_bytes = float(mem)
|
|
263
|
+
except ValueError:
|
|
264
|
+
try:
|
|
265
|
+
memory_bytes = float(mem[:-1]) * MEM_MULTIPLIER[mem[-1]]
|
|
266
|
+
except (ValueError, IndexError):
|
|
267
|
+
print(f"Unable to parse memory value {mem}. Defaulting to 2 GB.")
|
|
268
|
+
memory_bytes = 2147483648 # default to 2 GB
|
|
269
|
+
memory_unit = memory_bytes / MEM_MULTIPLIER[unit]
|
|
270
|
+
return memory_unit
|
|
@@ -62,7 +62,7 @@ from paasta_tools import spark_tools
|
|
|
62
62
|
|
|
63
63
|
from paasta_tools.kubernetes_tools import (
|
|
64
64
|
allowlist_denylist_to_requirements,
|
|
65
|
-
|
|
65
|
+
get_service_account_name,
|
|
66
66
|
limit_size_with_hash,
|
|
67
67
|
raw_selectors_to_requirements,
|
|
68
68
|
to_node_label,
|
|
@@ -280,9 +280,40 @@ class TronActionConfig(InstanceConfig):
|
|
|
280
280
|
soa_dir=soa_dir,
|
|
281
281
|
)
|
|
282
282
|
self.job, self.action = decompose_instance(instance)
|
|
283
|
+
|
|
283
284
|
# Indicate whether this config object is created for validation
|
|
284
285
|
self.for_validation = for_validation
|
|
285
286
|
|
|
287
|
+
self.action_spark_config = None
|
|
288
|
+
if self.get_executor() == "spark":
|
|
289
|
+
# build the complete Spark configuration
|
|
290
|
+
# TODO: add conditional check for Spark specific commands spark-submit, pyspark etc ?
|
|
291
|
+
self.action_spark_config = self.build_spark_config()
|
|
292
|
+
|
|
293
|
+
def get_cpus(self) -> float:
|
|
294
|
+
# set Spark driver pod CPU if it is specified by Spark arguments
|
|
295
|
+
if (
|
|
296
|
+
self.action_spark_config
|
|
297
|
+
and "spark.driver.cores" in self.action_spark_config
|
|
298
|
+
):
|
|
299
|
+
return float(self.action_spark_config["spark.driver.cores"])
|
|
300
|
+
# we fall back to this default if there's no spark.driver.cores config
|
|
301
|
+
return super().get_cpus()
|
|
302
|
+
|
|
303
|
+
def get_mem(self) -> float:
|
|
304
|
+
# set Spark driver pod memory if it is specified by Spark arguments
|
|
305
|
+
if (
|
|
306
|
+
self.action_spark_config
|
|
307
|
+
and "spark.driver.memory" in self.action_spark_config
|
|
308
|
+
):
|
|
309
|
+
return int(
|
|
310
|
+
spark_tools.get_spark_memory_in_unit(
|
|
311
|
+
self.action_spark_config["spark.driver.memory"], "m"
|
|
312
|
+
)
|
|
313
|
+
)
|
|
314
|
+
# we fall back to this default if there's no spark.driver.memory config
|
|
315
|
+
return super().get_mem()
|
|
316
|
+
|
|
286
317
|
def build_spark_config(self) -> Dict[str, str]:
|
|
287
318
|
system_paasta_config = load_system_paasta_config()
|
|
288
319
|
resolved_cluster = system_paasta_config.get_eks_cluster_aliases().get(
|
|
@@ -354,15 +385,11 @@ class TronActionConfig(InstanceConfig):
|
|
|
354
385
|
"spark.kubernetes.executor.label.yelp.com/owner", self.get_team()
|
|
355
386
|
)
|
|
356
387
|
|
|
357
|
-
# We need to make sure the Service Account used by the executors has been created.
|
|
358
388
|
# We are using the Service Account created using the provided or default IAM role.
|
|
359
389
|
spark_conf[
|
|
360
390
|
"spark.kubernetes.authenticate.executor.serviceAccountName"
|
|
361
|
-
] =
|
|
391
|
+
] = get_service_account_name(
|
|
362
392
|
iam_role=self.get_spark_executor_iam_role(),
|
|
363
|
-
namespace=spark_tools.SPARK_EXECUTOR_NAMESPACE,
|
|
364
|
-
kubeconfig_file=system_paasta_config.get_spark_kubeconfig(),
|
|
365
|
-
dry_run=self.for_validation,
|
|
366
393
|
)
|
|
367
394
|
|
|
368
395
|
return spark_conf
|
|
@@ -440,7 +467,6 @@ class TronActionConfig(InstanceConfig):
|
|
|
440
467
|
system_paasta_config: Optional["SystemPaastaConfig"] = None,
|
|
441
468
|
) -> Dict[str, str]:
|
|
442
469
|
env = super().get_env(system_paasta_config=system_paasta_config)
|
|
443
|
-
|
|
444
470
|
if self.get_executor() == "spark":
|
|
445
471
|
# Required by some sdks like boto3 client. Throws NoRegionError otherwise.
|
|
446
472
|
# AWS_REGION takes precedence if set.
|
|
@@ -605,6 +631,20 @@ class TronActionConfig(InstanceConfig):
|
|
|
605
631
|
error_msgs.append(
|
|
606
632
|
f"{self.get_job_name()}.{self.get_action_name()} must have a deploy_group set"
|
|
607
633
|
)
|
|
634
|
+
# We are not allowing users to specify `cpus` and `mem` configuration if the action is a Spark job
|
|
635
|
+
# with driver running on k8s (executor: spark), because we derive these values from `spark.driver.cores`
|
|
636
|
+
# and `spark.driver.memory` in order to avoid confusion.
|
|
637
|
+
if self.get_executor() == "spark":
|
|
638
|
+
if "cpus" in self.config_dict:
|
|
639
|
+
error_msgs.append(
|
|
640
|
+
f"{self.get_job_name()}.{self.get_action_name()} is a Spark job. `cpus` config is not allowed. "
|
|
641
|
+
f"Please specify the driver cores using `spark.driver.cores`."
|
|
642
|
+
)
|
|
643
|
+
if "mem" in self.config_dict:
|
|
644
|
+
error_msgs.append(
|
|
645
|
+
f"{self.get_job_name()}.{self.get_action_name()} is a Spark job. `mem` config is not allowed. "
|
|
646
|
+
f"Please specify the driver memory using `spark.driver.memory`."
|
|
647
|
+
)
|
|
608
648
|
return error_msgs
|
|
609
649
|
|
|
610
650
|
def get_pool(self) -> str:
|
|
@@ -952,20 +992,14 @@ def format_tron_action_dict(action_config: TronActionConfig):
|
|
|
952
992
|
|
|
953
993
|
result["labels"]["yelp.com/owner"] = "compute_infra_platform_experience"
|
|
954
994
|
|
|
955
|
-
# create_or_find_service_account_name requires k8s credentials, and we don't
|
|
956
|
-
# have those available for CI to use (nor do we check these for normal PaaSTA
|
|
957
|
-
# services, so we're not doing anything "new" by skipping this)
|
|
958
995
|
if (
|
|
959
996
|
action_config.get_iam_role_provider() == "aws"
|
|
960
997
|
and action_config.get_iam_role()
|
|
961
|
-
and not action_config.for_validation
|
|
962
998
|
):
|
|
963
999
|
# this service account will be used for normal Tron batches as well as for Spark drivers
|
|
964
|
-
result["service_account_name"] =
|
|
1000
|
+
result["service_account_name"] = get_service_account_name(
|
|
965
1001
|
iam_role=action_config.get_iam_role(),
|
|
966
|
-
namespace=EXECUTOR_TYPE_TO_NAMESPACE[executor],
|
|
967
1002
|
k8s_role=None,
|
|
968
|
-
dry_run=action_config.for_validation,
|
|
969
1003
|
)
|
|
970
1004
|
|
|
971
1005
|
# service account token volumes for service authentication
|
|
@@ -975,21 +1009,26 @@ def format_tron_action_dict(action_config: TronActionConfig):
|
|
|
975
1009
|
if executor == "spark":
|
|
976
1010
|
is_mrjob = action_config.config_dict.get("mrjob", False)
|
|
977
1011
|
system_paasta_config = load_system_paasta_config()
|
|
978
|
-
# inject
|
|
979
|
-
spark_config = action_config.build_spark_config()
|
|
1012
|
+
# inject additional Spark configs in case of Spark commands
|
|
980
1013
|
result["command"] = spark_tools.build_spark_command(
|
|
981
1014
|
result["command"],
|
|
982
|
-
|
|
1015
|
+
action_config.action_spark_config,
|
|
983
1016
|
is_mrjob,
|
|
984
1017
|
action_config.config_dict.get(
|
|
985
1018
|
"max_runtime", spark_tools.DEFAULT_SPARK_RUNTIME_TIMEOUT
|
|
986
1019
|
),
|
|
987
1020
|
)
|
|
1021
|
+
# point to the KUBECONFIG needed by Spark driver
|
|
988
1022
|
result["env"]["KUBECONFIG"] = system_paasta_config.get_spark_kubeconfig()
|
|
1023
|
+
|
|
989
1024
|
# spark, unlike normal batches, needs to expose several ports for things like the spark
|
|
990
1025
|
# ui and for executor->driver communication
|
|
991
1026
|
result["ports"] = list(
|
|
992
|
-
set(
|
|
1027
|
+
set(
|
|
1028
|
+
spark_tools.get_spark_ports_from_config(
|
|
1029
|
+
action_config.action_spark_config
|
|
1030
|
+
)
|
|
1031
|
+
)
|
|
993
1032
|
)
|
|
994
1033
|
# mount KUBECONFIG file for Spark drivers to communicate with EKS cluster
|
|
995
1034
|
extra_volumes.append(
|
|
@@ -1003,10 +1042,12 @@ def format_tron_action_dict(action_config: TronActionConfig):
|
|
|
1003
1042
|
)
|
|
1004
1043
|
# Add pod annotations and labels for Spark monitoring metrics
|
|
1005
1044
|
monitoring_annotations = (
|
|
1006
|
-
spark_tools.get_spark_driver_monitoring_annotations(
|
|
1045
|
+
spark_tools.get_spark_driver_monitoring_annotations(
|
|
1046
|
+
action_config.action_spark_config
|
|
1047
|
+
)
|
|
1007
1048
|
)
|
|
1008
1049
|
monitoring_labels = spark_tools.get_spark_driver_monitoring_labels(
|
|
1009
|
-
|
|
1050
|
+
action_config.action_spark_config
|
|
1010
1051
|
)
|
|
1011
1052
|
result["annotations"].update(monitoring_annotations)
|
|
1012
1053
|
result["labels"].update(monitoring_labels)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/autoscaling/autoscaling_service_lib.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/autoscaling/pause_service_autoscaler.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{paasta-tools-1.4.6 → paasta-tools-1.4.7}/paasta_tools/check_kubernetes_services_replication.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|