paasta-tools 1.22.0__tar.gz → 1.36.11__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.
Potentially problematic release.
This version of paasta-tools might be problematic. Click here for more details.
- {paasta_tools-1.22.0/paasta_tools.egg-info → paasta_tools-1.36.11}/PKG-INFO +16 -10
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/__init__.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/api/api_docs/swagger.json +46 -6
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/api/tweens/auth.py +2 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/api/views/autoscaler.py +60 -23
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/api/views/instance.py +9 -2
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/api/views/remote_run.py +2 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/async_utils.py +4 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/bounce_lib.py +8 -5
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/check_services_replication_tools.py +10 -4
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/check_spark_jobs.py +1 -1
- paasta_tools-1.36.11/paasta_tools/cleanup_expired_autoscaling_overrides.py +155 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/cli/cli.py +4 -4
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/cli/cmds/autoscale.py +40 -17
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/cli/cmds/check.py +2 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/cli/cmds/cook_image.py +2 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/cli/cmds/get_docker_image.py +2 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/cli/cmds/get_image_version.py +2 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/cli/cmds/get_latest_deployment.py +2 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/cli/cmds/info.py +10 -3
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/cli/cmds/itest.py +2 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/cli/cmds/list_namespaces.py +2 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/cli/cmds/local_run.py +122 -27
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/cli/cmds/logs.py +31 -7
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/cli/cmds/mark_for_deployment.py +14 -4
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/cli/cmds/mesh_status.py +3 -2
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/cli/cmds/push_to_registry.py +2 -0
- paasta_tools-1.36.11/paasta_tools/cli/cmds/remote_run.py +453 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/cli/cmds/rollback.py +6 -2
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/cli/cmds/secret.py +4 -2
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/cli/cmds/security_check.py +2 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/cli/cmds/spark_run.py +34 -32
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/cli/cmds/status.py +172 -31
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/cli/cmds/validate.py +325 -40
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/cli/cmds/wait_for_deployment.py +2 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/cli/schemas/adhoc_schema.json +3 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/cli/schemas/autoscaling_schema.json +3 -2
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/cli/schemas/eks_schema.json +24 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/cli/schemas/kubernetes_schema.json +1 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/cli/schemas/smartstack_schema.json +21 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/cli/schemas/tron_schema.json +5 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/cli/utils.py +34 -20
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/contrib/bounce_log_latency_parser.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/contrib/check_orphans.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/contrib/get_running_task_allocation.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/contrib/ide_helper.py +27 -27
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/contrib/mock_patch_checker.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/contrib/paasta_update_soa_memcpu.py +78 -19
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/contrib/render_template.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/contrib/shared_ip_check.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/flink_tools.py +18 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/generate_deployments_for_service.py +2 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/instance/hpa_metrics_parser.py +3 -5
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/instance/kubernetes.py +70 -36
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/kubernetes/application/controller_wrappers.py +27 -3
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/kubernetes/remote_run.py +54 -25
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/kubernetes_tools.py +133 -77
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/long_running_service_tools.py +15 -5
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/mesos/master.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/metrics/metastatus_lib.py +1 -25
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/metrics/metrics_lib.py +12 -3
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/__init__.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/api/autoscaler_api.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/api/default_api.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/api/remote_run_api.py +2 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/api/resources_api.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/api/service_api.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/api_client.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/configuration.py +2 -2
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/exceptions.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/model/adhoc_launch_history.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/model/autoscaler_count_msg.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/model/autoscaling_override.py +8 -7
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/model/deploy_queue.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/model/deploy_queue_service_instance.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/model/envoy_backend.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/model/envoy_location.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/model/envoy_status.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/model/flink_cluster_overview.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/model/flink_config.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/model/flink_job.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/model/flink_job_details.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/model/flink_jobs.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/model/float_and_error.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/model/hpa_metric.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/model/inline_object.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/model/inline_response200.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/model/inline_response2001.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/model/inline_response202.py +6 -3
- paasta_tools-1.36.11/paasta_tools/paastaapi/model/inline_response403.py +170 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/model/instance_bounce_status.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/model/instance_mesh_status.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/model/instance_status.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/model/instance_status_adhoc.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/model/instance_status_cassandracluster.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/model/instance_status_flink.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/model/instance_status_kafkacluster.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/model/instance_status_kubernetes.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/model/instance_status_kubernetes_autoscaling_status.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/model/instance_status_kubernetes_v2.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/model/instance_status_tron.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/model/instance_tasks.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/model/integer_and_error.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/model/kubernetes_container.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/model/kubernetes_container_v2.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/model/kubernetes_healthcheck.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/model/kubernetes_pod.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/model/kubernetes_pod_event.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/model/kubernetes_pod_v2.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/model/kubernetes_replica_set.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/model/kubernetes_version.py +4 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/model/remote_run_outcome.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/model/remote_run_start.py +4 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/model/remote_run_stop.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/model/remote_run_token.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/model/resource.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/model/resource_item.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/model/resource_value.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/model/smartstack_backend.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/model/smartstack_location.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/model/smartstack_status.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/model/task_tail_lines.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/model_utils.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/models/__init__.py +1 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/rest.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/remote_git.py +2 -2
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/run-paasta-api-in-dev-mode.py +2 -2
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/run-paasta-api-playground.py +2 -2
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/setup_kubernetes_cr.py +14 -7
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/setup_kubernetes_job.py +54 -6
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/setup_prometheus_adapter_config.py +82 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/setup_tron_namespace.py +2 -2
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/tron_tools.py +23 -3
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/utils.py +74 -11
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/yaml_tools.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11/paasta_tools.egg-info}/PKG-INFO +16 -10
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools.egg-info/SOURCES.txt +2 -8
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools.egg-info/entry_points.txt +1 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools.egg-info/requires.txt +6 -7
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/requirements-minimal.txt +7 -9
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/setup.py +2 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/tests/test_adhoc_tools.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/tests/test_apply_external_resources.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/tests/test_async_utils.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/tests/test_bounce_lib.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/tests/test_check_flink_services_health.py +2 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/tests/test_check_kubernetes_services_replication.py +2 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/tests/test_check_oom_events.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/tests/test_check_service_replication_tools.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/tests/test_check_spark_jobs.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/tests/test_cleanup_kubernetes_jobs.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/tests/test_config_utils.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/tests/test_delete_kubernetes_deployments.py +2 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/tests/test_deployment_utils.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/tests/test_docker_wrapper.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/tests/test_drain_lib.py +9 -16
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/tests/test_eks_tools.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/tests/test_envoy_tools.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/tests/test_firewall.py +2 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/tests/test_firewall_logging.py +2 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/tests/test_firewall_update.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/tests/test_flink_tools.py +76 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/tests/test_flinkeks_tools.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/tests/test_generate_deployments_for_service.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/tests/test_generate_services_file.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/tests/test_generate_services_yaml.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/tests/test_hacheck.py +8 -8
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/tests/test_iptables.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/tests/test_kubernetes_tools.py +630 -38
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/tests/test_list_kubernetes_service_instances.py +2 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/tests/test_long_running_service_tools.py +2 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/tests/test_mac_address.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/tests/test_monitoring_tools.py +2 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/tests/test_nrtsearchserviceseks_tools.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/tests/test_oom_logger.py +9 -5
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/tests/test_paasta_execute_docker_command.py +2 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/tests/test_paasta_service_config_loader.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/tests/test_puppet_service_tools.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/tests/test_remote_git.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/tests/test_secret_tools.py +1 -2
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/tests/test_setup_istio_mesh.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/tests/test_setup_kubernetes_cr.py +2 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/tests/test_setup_kubernetes_job.py +109 -3
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/tests/test_setup_prometheus_adapter_config.py +67 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/tests/test_slack.py +2 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/tests/test_smartstack_tools.py +1 -1
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/tests/test_tron_tools.py +53 -3
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/tests/test_utils.py +46 -1
- paasta_tools-1.22.0/paasta_tools/cli/cmds/remote_run.py +0 -252
- paasta_tools-1.22.0/paasta_tools/clusterman.py +0 -21
- paasta_tools-1.22.0/paasta_tools/frameworks/adhoc_scheduler.py +0 -71
- paasta_tools-1.22.0/paasta_tools/frameworks/native_scheduler.py +0 -652
- paasta_tools-1.22.0/paasta_tools/frameworks/task_store.py +0 -245
- paasta_tools-1.22.0/paasta_tools/mesos_maintenance.py +0 -848
- paasta_tools-1.22.0/paasta_tools/paasta_native_serviceinit.py +0 -21
- paasta_tools-1.22.0/tests/test_mesos_tools.py +0 -945
- paasta_tools-1.22.0/tests/test_task_processing.py +0 -21
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/LICENSE +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/MANIFEST.in +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/README.md +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/k8s_itests/__init__.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/k8s_itests/test_autoscaling.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/k8s_itests/utils.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/adhoc_tools.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/api/__init__.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/api/api.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/api/client.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/api/settings.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/api/tweens/__init__.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/api/tweens/profiling.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/api/tweens/request_logger.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/api/views/__init__.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/api/views/exception.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/api/views/flink.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/api/views/pause_autoscaler.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/api/views/resources.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/api/views/service.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/api/views/version.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/apply_external_resources.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/autoscaling/__init__.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/autoscaling/autoscaling_service_lib.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/autoscaling/forecasting.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/autoscaling/max_all_k8s_services.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/autoscaling/pause_service_autoscaler.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/autoscaling/utils.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/broadcast_log_to_services.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/cassandracluster_tools.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/check_autoscaler_max_instances.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/check_cassandracluster_services_replication.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/check_flink_services_health.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/check_kubernetes_api.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/check_kubernetes_services_replication.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/check_oom_events.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/cleanup_kubernetes_cr.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/cleanup_kubernetes_crd.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/cleanup_kubernetes_jobs.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/cleanup_tron_namespaces.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/cli/__init__.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/cli/authentication.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/cli/cmds/__init__.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/cli/cmds/list.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/cli/cmds/list_clusters.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/cli/cmds/list_deploy_queue.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/cli/cmds/pause_service_autoscaler.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/cli/cmds/start_stop_restart.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/cli/fsm/__init__.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/cli/fsm/autosuggest.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/cli/fsm/template/README.md +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/cli/fsm/template/cookiecutter.json +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/cli/fsm/template/{{cookiecutter.service}}/kubernetes-PROD.yaml +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/cli/fsm/template/{{cookiecutter.service}}/monitoring.yaml +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/cli/fsm/template/{{cookiecutter.service}}/service.yaml +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/cli/fsm/template/{{cookiecutter.service}}/smartstack.yaml +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/cli/fsm_cmd.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/cli/paasta_tabcomplete.sh +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/cli/schemas/autotuned_defaults/cassandracluster_schema.json +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/cli/schemas/autotuned_defaults/kubernetes_schema.json +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/cli/schemas/deploy_schema.json +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/cli/schemas/rollback_schema.json +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/cli/schemas/service_schema.json +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/config_utils.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/contrib/__init__.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/contrib/check_manual_oapi_changes.sh +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/contrib/create_dynamodb_table.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/contrib/create_paasta_playground.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/contrib/emit_allocated_cpu_metrics.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/contrib/habitat_fixer.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/contrib/is_pod_healthy_in_proxy.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/contrib/is_pod_healthy_in_smartstack.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/contrib/kill_bad_containers.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/contrib/mass-deploy-tag.sh +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/contrib/rightsizer_soaconfigs_update.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/contrib/service_shard_remove.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/contrib/service_shard_update.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/contrib/timeouts_metrics_prom.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/delete_kubernetes_deployments.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/deployment_utils.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/docker_wrapper.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/docker_wrapper_imports.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/drain_lib.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/dump_locally_running_services.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/eks_tools.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/envoy_tools.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/firewall.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/firewall_logging.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/firewall_update.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/flinkeks_tools.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/frameworks/__init__.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/frameworks/constraints.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/frameworks/native_service_config.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/generate_all_deployments +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/generate_authenticating_services.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/generate_services_file.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/generate_services_yaml.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/hacheck.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/instance/__init__.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/iptables.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/kafkacluster_tools.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/kubernetes/__init__.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/kubernetes/application/__init__.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/kubernetes/application/tools.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/kubernetes/bin/__init__.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/kubernetes/bin/kubernetes_remove_evicted_pods.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/kubernetes/bin/paasta_cleanup_remote_run_resources.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/kubernetes/bin/paasta_cleanup_stale_nodes.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/kubernetes/bin/paasta_secrets_sync.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/list_kubernetes_service_instances.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/list_tron_namespaces.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/mac_address.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/marathon_dashboard.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/mesos/__init__.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/mesos/cfg.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/mesos/cluster.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/mesos/exceptions.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/mesos/framework.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/mesos/log.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/mesos/mesos_file.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/mesos/parallel.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/mesos/slave.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/mesos/task.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/mesos/util.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/mesos/zookeeper.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/mesos_tools.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/metrics/__init__.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/monitoring/__init__.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/monitoring/check_k8s_api_performance.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/monitoring_tools.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/monkrelaycluster_tools.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/nrtsearchservice_tools.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/nrtsearchserviceeks_tools.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/oom_logger.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paasta_deploy_tron_jobs +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paasta_execute_docker_command.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paasta_service_config_loader.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/api/__init__.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/apis/__init__.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/paastaapi/model/__init__.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/prune_completed_pods.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/puppet_service_tools.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/py.typed +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/secret_providers/__init__.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/secret_providers/vault.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/secret_tools.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/setup_istio_mesh.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/setup_kubernetes_crd.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/setup_kubernetes_internal_crd.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/slack.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/smartstack_tools.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/spark_tools.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/synapse_srv_namespaces_fact.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/tron/__init__.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/tron/client.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/tron/tron_command_context.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/tron/tron_timeutils.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools.egg-info/dependency_links.txt +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools.egg-info/top_level.txt +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/pyproject.toml +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/setup.cfg +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/tests/test_generate_authenticating_services.py +0 -0
- {paasta_tools-1.22.0 → paasta_tools-1.36.11}/tests/test_spark_tools.py +0 -0
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: paasta-tools
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.36.11
|
|
4
4
|
Summary: Tools for Yelps SOA infrastructure
|
|
5
5
|
Author: Compute Infrastructure @ Yelp
|
|
6
6
|
Author-email: compute-infra@yelp.com
|
|
7
7
|
Provides: paasta_tools
|
|
8
|
-
Requires-Python: >=3.
|
|
8
|
+
Requires-Python: >=3.9.0
|
|
9
9
|
License-File: LICENSE
|
|
10
10
|
Requires-Dist: a-sync>=0.5.0
|
|
11
11
|
Requires-Dist: aiohttp>=3.5.4
|
|
@@ -22,6 +22,7 @@ Requires-Dist: cookiecutter>=1.4.0
|
|
|
22
22
|
Requires-Dist: croniter
|
|
23
23
|
Requires-Dist: docker
|
|
24
24
|
Requires-Dist: dulwich>=0.17.3
|
|
25
|
+
Requires-Dist: environment-tools
|
|
25
26
|
Requires-Dist: ephemeral-port-reserve>=1.0.1
|
|
26
27
|
Requires-Dist: graphviz
|
|
27
28
|
Requires-Dist: grpcio
|
|
@@ -33,7 +34,7 @@ Requires-Dist: ipaddress>=1.0.22
|
|
|
33
34
|
Requires-Dist: isodate>=0.7.2
|
|
34
35
|
Requires-Dist: jsonschema[format]
|
|
35
36
|
Requires-Dist: kazoo>=2.0.0
|
|
36
|
-
Requires-Dist: kubernetes<
|
|
37
|
+
Requires-Dist: kubernetes<35.0.0,>=29.0.0
|
|
37
38
|
Requires-Dist: ldap3
|
|
38
39
|
Requires-Dist: manhole
|
|
39
40
|
Requires-Dist: mypy-extensions>=0.3.0
|
|
@@ -41,11 +42,11 @@ Requires-Dist: nats-py
|
|
|
41
42
|
Requires-Dist: nulltype
|
|
42
43
|
Requires-Dist: objgraph
|
|
43
44
|
Requires-Dist: ply
|
|
44
|
-
Requires-Dist: progressbar2>=3.
|
|
45
|
+
Requires-Dist: progressbar2>=4.3.2
|
|
45
46
|
Requires-Dist: prometheus-client
|
|
46
47
|
Requires-Dist: pymesos>=0.2.0
|
|
47
|
-
Requires-Dist: pyramid>=1.8
|
|
48
48
|
Requires-Dist: pyramid-swagger>=2.3.0
|
|
49
|
+
Requires-Dist: pyramid>=2.0.2
|
|
49
50
|
Requires-Dist: pysensu-yelp>=0.3.4
|
|
50
51
|
Requires-Dist: PyStaticConfiguration
|
|
51
52
|
Requires-Dist: python-crontab>=2.1.1
|
|
@@ -53,21 +54,26 @@ Requires-Dist: python-dateutil>=2.4.0
|
|
|
53
54
|
Requires-Dist: python-iptables
|
|
54
55
|
Requires-Dist: pytimeparse>=1.1.0
|
|
55
56
|
Requires-Dist: pytz>=2014.10
|
|
56
|
-
Requires-Dist: requests
|
|
57
|
+
Requires-Dist: requests>=2.18.4
|
|
57
58
|
Requires-Dist: requests-cache>=0.4.10
|
|
58
59
|
Requires-Dist: retry
|
|
59
60
|
Requires-Dist: ruamel.yaml
|
|
60
61
|
Requires-Dist: sensu-plugin
|
|
61
|
-
Requires-Dist: service-configuration-lib>=3.3.
|
|
62
|
+
Requires-Dist: service-configuration-lib>=3.3.8
|
|
62
63
|
Requires-Dist: signalfx
|
|
63
64
|
Requires-Dist: slackclient>=1.2.1
|
|
64
65
|
Requires-Dist: sticht>=1.1.0
|
|
65
66
|
Requires-Dist: syslogmp
|
|
66
|
-
Requires-Dist: task-processing
|
|
67
|
-
Requires-Dist: thriftpy2
|
|
68
67
|
Requires-Dist: transitions
|
|
69
68
|
Requires-Dist: typing-extensions
|
|
70
69
|
Requires-Dist: tzlocal
|
|
71
70
|
Requires-Dist: urllib3
|
|
72
71
|
Requires-Dist: utaw>=0.2.0
|
|
73
72
|
Requires-Dist: wsgicors
|
|
73
|
+
Dynamic: author
|
|
74
|
+
Dynamic: author-email
|
|
75
|
+
Dynamic: license-file
|
|
76
|
+
Dynamic: provides
|
|
77
|
+
Dynamic: requires-dist
|
|
78
|
+
Dynamic: requires-python
|
|
79
|
+
Dynamic: summary
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"swagger": "2.0",
|
|
3
3
|
"info": {
|
|
4
4
|
"title": "Paasta API",
|
|
5
|
-
"version": "1.
|
|
5
|
+
"version": "1.3.0"
|
|
6
6
|
},
|
|
7
7
|
"basePath": "/v1",
|
|
8
8
|
"schemes": [
|
|
@@ -322,8 +322,14 @@
|
|
|
322
322
|
},
|
|
323
323
|
"min_instances": {
|
|
324
324
|
"type": "integer",
|
|
325
|
+
"x-nullable": true,
|
|
325
326
|
"description": "Minimum number of instances to run"
|
|
326
327
|
},
|
|
328
|
+
"max_instances": {
|
|
329
|
+
"type": "integer",
|
|
330
|
+
"x-nullable": true,
|
|
331
|
+
"description": "Maximum number of instances to run"
|
|
332
|
+
},
|
|
327
333
|
"expire_after": {
|
|
328
334
|
"type": "number",
|
|
329
335
|
"format": "float",
|
|
@@ -930,7 +936,15 @@
|
|
|
930
936
|
}
|
|
931
937
|
},
|
|
932
938
|
"403": {
|
|
933
|
-
"description": "Unauthorized to remote-run this service"
|
|
939
|
+
"description": "Unauthorized to remote-run this service",
|
|
940
|
+
"schema": {
|
|
941
|
+
"type": "object",
|
|
942
|
+
"properties": {
|
|
943
|
+
"reason": {
|
|
944
|
+
"type": "string"
|
|
945
|
+
}
|
|
946
|
+
}
|
|
947
|
+
}
|
|
934
948
|
},
|
|
935
949
|
"404": {
|
|
936
950
|
"description": "Deployment key not found"
|
|
@@ -981,7 +995,15 @@
|
|
|
981
995
|
}
|
|
982
996
|
},
|
|
983
997
|
"403": {
|
|
984
|
-
"description": "Unauthorized to remote-run this service"
|
|
998
|
+
"description": "Unauthorized to remote-run this service",
|
|
999
|
+
"schema": {
|
|
1000
|
+
"type": "object",
|
|
1001
|
+
"properties": {
|
|
1002
|
+
"reason": {
|
|
1003
|
+
"type": "string"
|
|
1004
|
+
}
|
|
1005
|
+
}
|
|
1006
|
+
}
|
|
985
1007
|
},
|
|
986
1008
|
"404": {
|
|
987
1009
|
"description": "Service instance not found"
|
|
@@ -1037,6 +1059,9 @@
|
|
|
1037
1059
|
"404": {
|
|
1038
1060
|
"description": "Service instance not found"
|
|
1039
1061
|
},
|
|
1062
|
+
"409": {
|
|
1063
|
+
"description": "A pod was found but is currently being terminated"
|
|
1064
|
+
},
|
|
1040
1065
|
"500": {
|
|
1041
1066
|
"description": "Failure"
|
|
1042
1067
|
}
|
|
@@ -1705,17 +1730,24 @@
|
|
|
1705
1730
|
"properties": {
|
|
1706
1731
|
"min_instances": {
|
|
1707
1732
|
"type": "integer",
|
|
1708
|
-
"
|
|
1709
|
-
"
|
|
1733
|
+
"x-nullable": true,
|
|
1734
|
+
"description": "Minimum number of instances to run"
|
|
1735
|
+
},
|
|
1736
|
+
"max_instances": {
|
|
1737
|
+
"type": "integer",
|
|
1738
|
+
"x-nullable": true,
|
|
1739
|
+
"description": "Maximum number of instances to run"
|
|
1710
1740
|
},
|
|
1711
1741
|
"expire_after": {
|
|
1712
1742
|
"type": "number",
|
|
1713
1743
|
"format": "float",
|
|
1714
|
-
"description": "Unix timestamp when this override is no longer valid"
|
|
1744
|
+
"description": "Unix timestamp when this override is no longer valid",
|
|
1745
|
+
"minimum": 1
|
|
1715
1746
|
}
|
|
1716
1747
|
},
|
|
1717
1748
|
"required": [
|
|
1718
1749
|
"min_instances",
|
|
1750
|
+
"max_instances",
|
|
1719
1751
|
"expire_after"
|
|
1720
1752
|
]
|
|
1721
1753
|
},
|
|
@@ -1756,6 +1788,11 @@
|
|
|
1756
1788
|
"KubernetesVersion": {
|
|
1757
1789
|
"type": "object",
|
|
1758
1790
|
"properties": {
|
|
1791
|
+
"container_port": {
|
|
1792
|
+
"description": "Port the container is expecting to receive traffic on",
|
|
1793
|
+
"type": "integer",
|
|
1794
|
+
"format": "int32"
|
|
1795
|
+
},
|
|
1759
1796
|
"type": {
|
|
1760
1797
|
"description": "Type of version (ReplicaSet or ControllerRevision)",
|
|
1761
1798
|
"type": "string"
|
|
@@ -2292,6 +2329,9 @@
|
|
|
2292
2329
|
},
|
|
2293
2330
|
"toolbox": {
|
|
2294
2331
|
"type": "boolean"
|
|
2332
|
+
},
|
|
2333
|
+
"command": {
|
|
2334
|
+
"type": "string"
|
|
2295
2335
|
}
|
|
2296
2336
|
},
|
|
2297
2337
|
"required": [
|
|
@@ -136,7 +136,7 @@ def set_autoscaling_override(request):
|
|
|
136
136
|
Required parameters:
|
|
137
137
|
- service: The service name
|
|
138
138
|
- instance: The instance name
|
|
139
|
-
- min_instances: The minimum number of instances to enforce
|
|
139
|
+
- min_instances AND/OR max_instances: The minimum and/or maximum number of instances to enforce
|
|
140
140
|
- expires_after: unix timestamp after which the override is no longer valid
|
|
141
141
|
"""
|
|
142
142
|
service = request.swagger_data.get("service")
|
|
@@ -156,24 +156,29 @@ def set_autoscaling_override(request):
|
|
|
156
156
|
|
|
157
157
|
json_body = request.swagger_data.get("json_body", {})
|
|
158
158
|
min_instances_override = json_body.get("min_instances")
|
|
159
|
-
|
|
159
|
+
max_instances_override = json_body.get("max_instances")
|
|
160
|
+
expire_after = json_body["expire_after"]
|
|
160
161
|
|
|
161
|
-
|
|
162
|
-
|
|
162
|
+
# ideally we'd enforce this in our api spec - but since we're using both swagger and oapi, that's not quite so simple
|
|
163
|
+
if not min_instances_override and not max_instances_override:
|
|
164
|
+
raise ApiFailure(
|
|
165
|
+
"At least one of min_instances or max_instances must be provided", 400
|
|
166
|
+
)
|
|
163
167
|
|
|
164
|
-
|
|
165
|
-
|
|
168
|
+
# we can't currently enforce this in the API spec since the generator seems to have issues generating a validator
|
|
169
|
+
# for a nullable integer field with a minimum value as we get errors like:
|
|
170
|
+
# `TypeError: '<' not supported between instances of 'NoneType' and 'int'`
|
|
171
|
+
# that said, unless someone is manually crafting requests, this should never happen
|
|
172
|
+
# since the CLI includes a check for this as well
|
|
173
|
+
if min_instances_override is not None and min_instances_override < 1:
|
|
174
|
+
raise ApiFailure("min_instances must be a positive integer", 400)
|
|
175
|
+
if max_instances_override is not None and max_instances_override < 1:
|
|
176
|
+
raise ApiFailure("max_instances must be a positive integer", 400)
|
|
166
177
|
|
|
167
|
-
|
|
168
|
-
if
|
|
178
|
+
# otherwise, we could have folks accidentally enable autoscaling (using cpu) for a non-autoscaled
|
|
179
|
+
if instance_config.is_autoscaling_enabled() is None:
|
|
169
180
|
raise ApiFailure(f"Autoscaling is not enabled for {service}.{instance}", 400)
|
|
170
181
|
|
|
171
|
-
if max_instances < min_instances_override:
|
|
172
|
-
raise ApiFailure(
|
|
173
|
-
f"min_instances ({min_instances_override}) cannot be greater than max_instances ({max_instances})",
|
|
174
|
-
400,
|
|
175
|
-
)
|
|
176
|
-
|
|
177
182
|
configmap, created = get_or_create_autoscaling_overrides_configmap()
|
|
178
183
|
if created:
|
|
179
184
|
log.info("Created new autoscaling overrides ConfigMap")
|
|
@@ -182,23 +187,54 @@ def set_autoscaling_override(request):
|
|
|
182
187
|
if not configmap.data:
|
|
183
188
|
configmap.data = {}
|
|
184
189
|
|
|
185
|
-
override_data = {
|
|
186
|
-
"min_instances": min_instances_override,
|
|
187
|
-
"created_at": datetime.now(timezone.utc).isoformat(),
|
|
188
|
-
# NOTE: we may want to also allow setting a max_instances override in the future, but if we do that
|
|
189
|
-
# we'd probably want to force folks to either set one or both and share the same expiration time
|
|
190
|
-
"expire_after": expire_after,
|
|
191
|
-
}
|
|
192
|
-
|
|
193
190
|
service_instance = f"{service}.{instance}"
|
|
194
191
|
existing_overrides = (
|
|
195
192
|
json.loads(configmap.data[service_instance])
|
|
196
193
|
if service_instance in configmap.data
|
|
197
194
|
else {}
|
|
198
195
|
)
|
|
199
|
-
|
|
196
|
+
|
|
197
|
+
# this is slightly funky as there's a hierarchy of what value to pick:
|
|
198
|
+
# 1. the override value provided in the request - as this should override any existing value
|
|
199
|
+
# 2. the existing override value in the configmap - this is used if we previously only set an override for min or
|
|
200
|
+
# max instances and now want to set a value for the other
|
|
201
|
+
# 3. the value from the instance config - this is used as a final fallback since this means no override is present
|
|
202
|
+
min_instances = (
|
|
203
|
+
min_instances_override
|
|
204
|
+
or existing_overrides.get("min_instances")
|
|
205
|
+
or instance_config.get_min_instances()
|
|
206
|
+
)
|
|
207
|
+
max_instances = (
|
|
208
|
+
max_instances_override
|
|
209
|
+
or existing_overrides.get("max_instances")
|
|
210
|
+
or instance_config.get_max_instances()
|
|
211
|
+
)
|
|
212
|
+
|
|
213
|
+
# NOTE: the max_instances check is unnecessary here, but type-checkers can't see that the is_autoscaling_enabled()
|
|
214
|
+
# check above ensures that max_instances is not None
|
|
215
|
+
if max_instances is None or max_instances < min_instances:
|
|
216
|
+
raise ApiFailure(
|
|
217
|
+
f"min_instances ({min_instances_override}) cannot be greater than max_instances ({max_instances})",
|
|
218
|
+
400,
|
|
219
|
+
)
|
|
220
|
+
|
|
221
|
+
override_data = {
|
|
222
|
+
"min_instances": min_instances_override,
|
|
223
|
+
"max_instances": max_instances_override,
|
|
224
|
+
"created_at": datetime.now(timezone.utc).isoformat(),
|
|
225
|
+
"expire_after": expire_after,
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
# NOTE: we need to strip out null values from the incoming overrides since otherwise we'd remove existing overrides
|
|
229
|
+
# (since if only --set-min or --set-max is provided, the other will be sent as None)
|
|
230
|
+
merged_overrides = {
|
|
231
|
+
**existing_overrides,
|
|
232
|
+
**{k: v for k, v in override_data.items() if v is not None},
|
|
233
|
+
}
|
|
200
234
|
serialized_overrides = json.dumps(merged_overrides)
|
|
201
235
|
|
|
236
|
+
# note: we can only append with patching - if we ever want to remove overrides outside of the cleanup cronjob,
|
|
237
|
+
# we would need to change this to use replace_namespaced_configmap
|
|
202
238
|
patch_namespaced_configmap(
|
|
203
239
|
name=AUTOSCALING_OVERRIDES_CONFIGMAP_NAME,
|
|
204
240
|
namespace=AUTOSCALING_OVERRIDES_CONFIGMAP_NAMESPACE,
|
|
@@ -213,6 +249,7 @@ def set_autoscaling_override(request):
|
|
|
213
249
|
"instance": instance,
|
|
214
250
|
"cluster": cluster,
|
|
215
251
|
"min_instances": min_instances_override,
|
|
252
|
+
"max_instances": max_instances_override,
|
|
216
253
|
"expire_after": expire_after,
|
|
217
254
|
"status": "SUCCESS",
|
|
218
255
|
}
|
|
@@ -26,6 +26,7 @@ from typing import Mapping
|
|
|
26
26
|
from typing import Optional
|
|
27
27
|
|
|
28
28
|
import a_sync
|
|
29
|
+
from pyramid.request import Request
|
|
29
30
|
from pyramid.response import Response
|
|
30
31
|
from pyramid.view import view_config
|
|
31
32
|
|
|
@@ -139,7 +140,10 @@ def no_configuration_for_service_message(cluster, service, instance):
|
|
|
139
140
|
@view_config(
|
|
140
141
|
route_name="service.instance.status", request_method="GET", renderer="json"
|
|
141
142
|
)
|
|
142
|
-
def instance_status(
|
|
143
|
+
def instance_status(
|
|
144
|
+
request: Request,
|
|
145
|
+
) -> dict[str, Any]: # godspeed to anyone typing the retval here
|
|
146
|
+
# NOTE: swagger_data is populated by pyramid_swagger
|
|
143
147
|
service = request.swagger_data.get("service")
|
|
144
148
|
instance = request.swagger_data.get("instance")
|
|
145
149
|
verbose = request.swagger_data.get("verbose") or 0
|
|
@@ -353,7 +357,10 @@ def get_deployment_version(
|
|
|
353
357
|
request_method="GET",
|
|
354
358
|
renderer="json",
|
|
355
359
|
)
|
|
356
|
-
def instance_mesh_status(
|
|
360
|
+
def instance_mesh_status(
|
|
361
|
+
request: Request,
|
|
362
|
+
) -> dict[str, Any]: # godspeed to anyone typing the retval here
|
|
363
|
+
# NOTE: swagger_data is populated by pyramid_swagger
|
|
357
364
|
service = request.swagger_data.get("service")
|
|
358
365
|
instance = request.swagger_data.get("instance")
|
|
359
366
|
include_envoy = request.swagger_data.get("include_envoy")
|
|
@@ -35,6 +35,7 @@ def view_remote_run_start(request):
|
|
|
35
35
|
interactive = request.swagger_data["json_body"].get("interactive", True)
|
|
36
36
|
recreate = request.swagger_data["json_body"].get("recreate", False)
|
|
37
37
|
is_toolbox = request.swagger_data["json_body"].get("toolbox", False)
|
|
38
|
+
command = request.swagger_data["json_body"].get("command", None)
|
|
38
39
|
max_duration = min(
|
|
39
40
|
request.swagger_data["json_body"].get("max_duration", DEFAULT_MAX_DURATION),
|
|
40
41
|
get_max_job_duration_limit(),
|
|
@@ -49,6 +50,7 @@ def view_remote_run_start(request):
|
|
|
49
50
|
recreate=recreate,
|
|
50
51
|
max_duration=max_duration,
|
|
51
52
|
is_toolbox=is_toolbox,
|
|
53
|
+
command=command,
|
|
52
54
|
)
|
|
53
55
|
except Exception:
|
|
54
56
|
error_message = traceback.format_exc()
|
|
@@ -3,9 +3,11 @@ import functools
|
|
|
3
3
|
import time
|
|
4
4
|
import weakref
|
|
5
5
|
from collections import defaultdict
|
|
6
|
+
from typing import Any
|
|
6
7
|
from typing import AsyncIterable
|
|
7
8
|
from typing import Awaitable
|
|
8
9
|
from typing import Callable
|
|
10
|
+
from typing import Coroutine
|
|
9
11
|
from typing import Dict
|
|
10
12
|
from typing import List
|
|
11
13
|
from typing import Optional
|
|
@@ -97,7 +99,8 @@ async def aiter_to_list(
|
|
|
97
99
|
def async_timeout(
|
|
98
100
|
seconds: int = 10,
|
|
99
101
|
) -> Callable[
|
|
100
|
-
[Callable[...,
|
|
102
|
+
[Callable[..., Coroutine[Any, Any, T]]],
|
|
103
|
+
Callable[..., Coroutine[Any, Any, T]], # wrapped # inner
|
|
101
104
|
]:
|
|
102
105
|
def outer(wrapped):
|
|
103
106
|
@functools.wraps(wrapped)
|
|
@@ -42,11 +42,14 @@ BounceMethodResult = TypedDict(
|
|
|
42
42
|
|
|
43
43
|
BounceMethod = Callable[
|
|
44
44
|
[
|
|
45
|
-
Arg(
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
45
|
+
Arg(
|
|
46
|
+
BounceMethodConfigDict,
|
|
47
|
+
"new_config", # noqa: F821 # flake8 false-positive, these are not var references
|
|
48
|
+
),
|
|
49
|
+
Arg(bool, "new_app_running"), # noqa: F821 # flake8 false-positive
|
|
50
|
+
Arg(Collection, "happy_new_tasks"), # noqa: F821 # flake8 false-positive
|
|
51
|
+
Arg(Sequence, "old_non_draining_tasks"), # noqa: F821 # flake8 false-positive
|
|
52
|
+
DefaultArg(float, "margin_factor"), # noqa: F821 # flake8 false-positive
|
|
50
53
|
],
|
|
51
54
|
BounceMethodResult,
|
|
52
55
|
]
|
{paasta_tools-1.22.0 → paasta_tools-1.36.11}/paasta_tools/check_services_replication_tools.py
RENAMED
|
@@ -56,10 +56,16 @@ log = logging.getLogger(__name__)
|
|
|
56
56
|
|
|
57
57
|
CheckServiceReplication = Callable[
|
|
58
58
|
[
|
|
59
|
-
Arg(
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
59
|
+
Arg(
|
|
60
|
+
InstanceConfig_T,
|
|
61
|
+
"instance_config", # noqa: F821 # flake8 false-positive, these are not var references
|
|
62
|
+
),
|
|
63
|
+
Arg(
|
|
64
|
+
Dict[str, Dict[str, List[V1Pod]]],
|
|
65
|
+
"pods_by_service_instance", # noqa: F821 # flake8 false-positive
|
|
66
|
+
),
|
|
67
|
+
Arg(Any, "replication_checker"), # noqa: F821 # flake8 false-positive
|
|
68
|
+
NamedArg(bool, "dry_run"), # noqa: F821 # flake8 false-positive
|
|
63
69
|
],
|
|
64
70
|
Optional[bool],
|
|
65
71
|
]
|
|
@@ -124,7 +124,7 @@ def format_framework(info):
|
|
|
124
124
|
def format_message_for_service(service, frameworks):
|
|
125
125
|
output = f"Found the following long-running Spark frameworks associated with service {service}.\n"
|
|
126
126
|
output += (
|
|
127
|
-
|
|
127
|
+
"Please check why they are still running and terminate if appropriate.\n\n"
|
|
128
128
|
)
|
|
129
129
|
output += "\n".join(format_framework(f) for f in frameworks)
|
|
130
130
|
return output
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import argparse
|
|
2
|
+
import json
|
|
3
|
+
import logging
|
|
4
|
+
import sys
|
|
5
|
+
import time
|
|
6
|
+
from datetime import datetime
|
|
7
|
+
from datetime import timezone
|
|
8
|
+
|
|
9
|
+
from kubernetes.client.rest import ApiException
|
|
10
|
+
|
|
11
|
+
from paasta_tools.kubernetes_tools import AUTOSCALING_OVERRIDES_CONFIGMAP_NAME
|
|
12
|
+
from paasta_tools.kubernetes_tools import AUTOSCALING_OVERRIDES_CONFIGMAP_NAMESPACE
|
|
13
|
+
from paasta_tools.kubernetes_tools import get_namespaced_configmap
|
|
14
|
+
from paasta_tools.kubernetes_tools import KubeClient
|
|
15
|
+
from paasta_tools.kubernetes_tools import replace_namespaced_configmap
|
|
16
|
+
|
|
17
|
+
log = logging.getLogger(__name__)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def parse_args():
|
|
21
|
+
parser = argparse.ArgumentParser(
|
|
22
|
+
description=f"Clean up expired entries from the {AUTOSCALING_OVERRIDES_CONFIGMAP_NAME} configmap"
|
|
23
|
+
)
|
|
24
|
+
parser.add_argument(
|
|
25
|
+
"--dry-run",
|
|
26
|
+
dest="dry_run",
|
|
27
|
+
action="store_true",
|
|
28
|
+
help="Print entries to be removed instead of removing them",
|
|
29
|
+
)
|
|
30
|
+
parser.add_argument(
|
|
31
|
+
"-v", "--verbose", dest="verbose", action="store_true", default=False
|
|
32
|
+
)
|
|
33
|
+
args = parser.parse_args()
|
|
34
|
+
return args
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def setup_logging(verbose):
|
|
38
|
+
level = logging.DEBUG if verbose else logging.INFO
|
|
39
|
+
logging.basicConfig(level=level)
|
|
40
|
+
# silence kubernetes client metadata logs since debug ones are pretty noisy
|
|
41
|
+
logging.getLogger("kubernetes.client.rest").setLevel(logging.ERROR)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def main():
|
|
45
|
+
args = parse_args()
|
|
46
|
+
setup_logging(args.verbose)
|
|
47
|
+
|
|
48
|
+
kube_client = KubeClient()
|
|
49
|
+
|
|
50
|
+
try:
|
|
51
|
+
configmap = get_namespaced_configmap(
|
|
52
|
+
name=AUTOSCALING_OVERRIDES_CONFIGMAP_NAME,
|
|
53
|
+
namespace=AUTOSCALING_OVERRIDES_CONFIGMAP_NAMESPACE,
|
|
54
|
+
kube_client=kube_client,
|
|
55
|
+
)
|
|
56
|
+
except ApiException as e:
|
|
57
|
+
if e.status == 404:
|
|
58
|
+
log.debug(
|
|
59
|
+
f"ConfigMap {AUTOSCALING_OVERRIDES_CONFIGMAP_NAME} not found, nothing to clean up"
|
|
60
|
+
)
|
|
61
|
+
sys.exit(0)
|
|
62
|
+
else:
|
|
63
|
+
log.error(f"Error retrieving ConfigMap: {e}")
|
|
64
|
+
sys.exit(1)
|
|
65
|
+
|
|
66
|
+
if configmap is None:
|
|
67
|
+
log.debug(
|
|
68
|
+
f"ConfigMap {AUTOSCALING_OVERRIDES_CONFIGMAP_NAME} not found, nothing to clean up"
|
|
69
|
+
)
|
|
70
|
+
sys.exit(0)
|
|
71
|
+
|
|
72
|
+
if not configmap.data:
|
|
73
|
+
log.debug("ConfigMap has no data, nothing to clean up")
|
|
74
|
+
sys.exit(0)
|
|
75
|
+
|
|
76
|
+
current_timestamp = (
|
|
77
|
+
time.time()
|
|
78
|
+
) # we'll fix the comparison time to the start of the script execution
|
|
79
|
+
expired_entries = [] # used just for logging
|
|
80
|
+
unexpired_data = {} # used to replace the existing configmap data
|
|
81
|
+
|
|
82
|
+
log.debug(f"Current timestamp: {current_timestamp}")
|
|
83
|
+
for service_instance, override_json in configmap.data.items():
|
|
84
|
+
log.debug(f"Processing entry for {service_instance}")
|
|
85
|
+
|
|
86
|
+
try:
|
|
87
|
+
override_data = json.loads(override_json)
|
|
88
|
+
except json.JSONDecodeError:
|
|
89
|
+
log.exception(
|
|
90
|
+
f"Failed to parse JSON for {service_instance}, removing entry"
|
|
91
|
+
)
|
|
92
|
+
expired_entries.append(service_instance)
|
|
93
|
+
continue
|
|
94
|
+
|
|
95
|
+
if "expire_after" not in override_data:
|
|
96
|
+
log.warning(
|
|
97
|
+
f"Entry for {service_instance} missing expire_after field, removing entry"
|
|
98
|
+
)
|
|
99
|
+
expired_entries.append(service_instance)
|
|
100
|
+
continue
|
|
101
|
+
|
|
102
|
+
try:
|
|
103
|
+
expire_after = float(override_data["expire_after"])
|
|
104
|
+
except (ValueError, TypeError):
|
|
105
|
+
log.exception(
|
|
106
|
+
f"Failed to parse expire_after for {service_instance}, removing entry"
|
|
107
|
+
)
|
|
108
|
+
expired_entries.append(service_instance)
|
|
109
|
+
continue
|
|
110
|
+
|
|
111
|
+
if current_timestamp > expire_after:
|
|
112
|
+
expire_datetime = datetime.fromtimestamp(expire_after, tz=timezone.utc)
|
|
113
|
+
log.debug(
|
|
114
|
+
f"Entry for {service_instance} expired at {expire_after} ({expire_datetime})"
|
|
115
|
+
)
|
|
116
|
+
expired_entries.append(service_instance)
|
|
117
|
+
else:
|
|
118
|
+
expire_datetime = datetime.fromtimestamp(expire_after, tz=timezone.utc)
|
|
119
|
+
log.debug(
|
|
120
|
+
f"Entry for {service_instance} expires at {expire_after} ({expire_datetime}), keeping"
|
|
121
|
+
)
|
|
122
|
+
unexpired_data[service_instance] = override_json
|
|
123
|
+
|
|
124
|
+
if not expired_entries:
|
|
125
|
+
log.info("No expired entries found")
|
|
126
|
+
sys.exit(0)
|
|
127
|
+
|
|
128
|
+
if args.dry_run:
|
|
129
|
+
log.info(
|
|
130
|
+
"Would have removed the following expired entries:\n "
|
|
131
|
+
+ "\n ".join(expired_entries)
|
|
132
|
+
)
|
|
133
|
+
sys.exit(0)
|
|
134
|
+
|
|
135
|
+
try:
|
|
136
|
+
configmap.data = (
|
|
137
|
+
unexpired_data # naughtily re-use the existing configmap object
|
|
138
|
+
)
|
|
139
|
+
replace_namespaced_configmap( # NOTE: this is not a patch since you cannot currently remove entries in a patch
|
|
140
|
+
name=AUTOSCALING_OVERRIDES_CONFIGMAP_NAME,
|
|
141
|
+
namespace=AUTOSCALING_OVERRIDES_CONFIGMAP_NAMESPACE,
|
|
142
|
+
body=configmap,
|
|
143
|
+
kube_client=kube_client,
|
|
144
|
+
)
|
|
145
|
+
log.info(
|
|
146
|
+
f"Successfully removed {len(expired_entries)} expired entries:\n "
|
|
147
|
+
+ "\n ".join(expired_entries)
|
|
148
|
+
)
|
|
149
|
+
except ApiException as e:
|
|
150
|
+
log.error(f"Failed to update ConfigMap: {e}")
|
|
151
|
+
sys.exit(1)
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
if __name__ == "__main__":
|
|
155
|
+
main()
|
|
@@ -68,7 +68,7 @@ class PrintsHelpOnErrorArgumentParser(argparse.ArgumentParser):
|
|
|
68
68
|
def list_external_commands():
|
|
69
69
|
p = subprocess.check_output(["/bin/bash", "-p", "-c", "compgen -A command paasta-"])
|
|
70
70
|
lines = p.decode("utf-8").strip().split("\n")
|
|
71
|
-
return {
|
|
71
|
+
return {line.replace("paasta-", "", 1) for line in lines}
|
|
72
72
|
|
|
73
73
|
|
|
74
74
|
def calling_external_command():
|
|
@@ -132,10 +132,10 @@ PAASTA_SUBCOMMANDS = {
|
|
|
132
132
|
}
|
|
133
133
|
|
|
134
134
|
|
|
135
|
-
def get_argparser(commands=None):
|
|
135
|
+
def get_argparser(commands: list[str] | None = None) -> argparse.ArgumentParser:
|
|
136
136
|
"""Create and return argument parser for a set of subcommands.
|
|
137
137
|
|
|
138
|
-
:param commands:
|
|
138
|
+
:param commands: list[str] | None: If `commands` argument is `None`,
|
|
139
139
|
add full parsers for all subcommands, if `commands` is empty list -
|
|
140
140
|
add thin parsers for all subcommands, otherwise - add full parsers for
|
|
141
141
|
subcommands in the argument.
|
|
@@ -170,7 +170,7 @@ def get_argparser(commands=None):
|
|
|
170
170
|
|
|
171
171
|
# Adding a separate help subparser allows us to respond to "help" without --help
|
|
172
172
|
help_parser = subparsers.add_parser(
|
|
173
|
-
"help", help=
|
|
173
|
+
"help", help="run `paasta <subcommand> -h` for help"
|
|
174
174
|
)
|
|
175
175
|
help_parser.set_defaults(command=None)
|
|
176
176
|
|