prefect-client 3.6.27.dev3__tar.gz → 3.6.27.dev5__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.
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/PKG-INFO +1 -1
- prefect_client-3.6.27.dev5/src/prefect/_build_info.py +5 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_experimental/bundles/__init__.py +18 -7
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_experimental/bundles/execute.py +4 -1
- prefect_client-3.6.27.dev5/src/prefect/_internal/control_listener.py +223 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/deployments/runner.py +28 -12
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/engine.py +66 -13
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/flow_engine.py +252 -38
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/runner/AGENTS.md +24 -1
- prefect_client-3.6.27.dev5/src/prefect/runner/_cancel_finalizer.py +111 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/runner/_cancellation_manager.py +98 -9
- prefect_client-3.6.27.dev5/src/prefect/runner/_control_channel.py +388 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/runner/_flow_run_executor.py +12 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/runner/_process_manager.py +87 -1
- prefect_client-3.6.27.dev5/src/prefect/runner/_starter_bundle.py +75 -0
- prefect_client-3.6.27.dev5/src/prefect/runner/_starter_direct.py +72 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/runner/_starter_engine.py +48 -12
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/runner/_state_proposer.py +7 -3
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/runner/runner.py +239 -33
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/utilities/AGENTS.md +2 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/utilities/callables.py +2 -1
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/utilities/engine.py +166 -12
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/utilities/processutils.py +17 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/utilities/templating.py +5 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/workers/process.py +3 -2
- prefect_client-3.6.27.dev3/src/prefect/_build_info.py +0 -5
- prefect_client-3.6.27.dev3/src/prefect/runner/_starter_bundle.py +0 -52
- prefect_client-3.6.27.dev3/src/prefect/runner/_starter_direct.py +0 -50
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/.gitignore +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/LICENSE +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/README.md +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/pyproject.toml +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/.prefectignore +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/AGENTS.md +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/__init__.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/__main__.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_experimental/__init__.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_experimental/_launchers.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_experimental/bundles/_file_collector.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_experimental/bundles/_ignore_filter.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_experimental/bundles/_path_resolver.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_experimental/bundles/_zip_builder.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_experimental/bundles/_zip_extractor.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_experimental/plugins/__init__.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_experimental/plugins/apply.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_experimental/plugins/diagnostics.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_experimental/plugins/manager.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_experimental/plugins/spec.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_experimental/sla/__init__.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_experimental/sla/client.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_experimental/sla/objects.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_internal/__init__.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_internal/_logging.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_internal/analytics/__init__.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_internal/analytics/ci_detection.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_internal/analytics/client.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_internal/analytics/device_id.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_internal/analytics/emit.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_internal/analytics/enabled.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_internal/analytics/events.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_internal/analytics/milestones.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_internal/analytics/notice.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_internal/analytics/service.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_internal/compatibility/__init__.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_internal/compatibility/async_dispatch.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_internal/compatibility/backports.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_internal/compatibility/blocks.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_internal/compatibility/deprecated.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_internal/compatibility/migration.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_internal/compatibility/starlette.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_internal/concurrency/__init__.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_internal/concurrency/api.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_internal/concurrency/calls.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_internal/concurrency/cancellation.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_internal/concurrency/event_loop.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_internal/concurrency/inspection.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_internal/concurrency/primitives.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_internal/concurrency/services.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_internal/concurrency/threads.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_internal/concurrency/waiters.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_internal/installation.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_internal/integrations.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_internal/lazy.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_internal/observability.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_internal/pydantic/__init__.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_internal/pydantic/schemas.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_internal/pydantic/v1_schema.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_internal/pydantic/v2_schema.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_internal/pydantic/validated_func.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_internal/pytz.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_internal/retries.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_internal/schemas/__init__.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_internal/schemas/bases.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_internal/schemas/fields.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_internal/schemas/serializers.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_internal/schemas/validators.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_internal/send_entrypoint_logs.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_internal/testing.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_internal/urls.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_internal/uuid7.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_internal/websockets.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_observers.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_result_records.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_sdk/__init__.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_sdk/fetcher.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_sdk/generator.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_sdk/models.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_sdk/naming.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_sdk/renderer.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_sdk/schema_converter.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_sdk/templates/__init__.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_sdk/templates/sdk.py.jinja +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_sdk/types.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_sdk/unions.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_states.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_vendor/croniter/__init__.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_vendor/croniter/croniter.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_versioning.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/_waiters.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/agent.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/analytics/__init__.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/artifacts.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/assets/__init__.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/assets/core.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/assets/materialize.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/automations.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/blocks/AGENTS.md +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/blocks/__init__.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/blocks/abstract.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/blocks/core.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/blocks/fields.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/blocks/notifications.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/blocks/redis.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/blocks/system.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/blocks/webhook.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/cache_policies.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/client/AGENTS.md +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/client/__init__.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/client/_version_checking.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/client/attribution.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/client/base.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/client/cloud.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/client/collections.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/client/constants.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/client/orchestration/__init__.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/client/orchestration/_artifacts/__init__.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/client/orchestration/_artifacts/client.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/client/orchestration/_automations/__init__.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/client/orchestration/_automations/client.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/client/orchestration/_blocks_documents/__init__.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/client/orchestration/_blocks_documents/client.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/client/orchestration/_blocks_schemas/__init__.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/client/orchestration/_blocks_schemas/client.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/client/orchestration/_blocks_types/__init__.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/client/orchestration/_blocks_types/client.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/client/orchestration/_concurrency_limits/__init__.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/client/orchestration/_concurrency_limits/client.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/client/orchestration/_deployments/__init__.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/client/orchestration/_deployments/client.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/client/orchestration/_events/__init__.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/client/orchestration/_events/client.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/client/orchestration/_flow_runs/__init__.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/client/orchestration/_flow_runs/client.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/client/orchestration/_flows/__init__.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/client/orchestration/_flows/client.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/client/orchestration/_logs/__init__.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/client/orchestration/_logs/client.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/client/orchestration/_variables/__init__.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/client/orchestration/_variables/client.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/client/orchestration/_work_pools/__init__.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/client/orchestration/_work_pools/client.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/client/orchestration/base.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/client/orchestration/routes.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/client/schemas/__init__.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/client/schemas/actions.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/client/schemas/events.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/client/schemas/filters.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/client/schemas/objects.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/client/schemas/responses.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/client/schemas/schedules.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/client/schemas/sorting.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/client/subscriptions.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/client/types/__init__.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/client/types/flexible_schedule_list.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/client/utilities.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/concurrency/AGENTS.md +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/concurrency/__init__.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/concurrency/_asyncio.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/concurrency/_events.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/concurrency/_leases.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/concurrency/_sync.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/concurrency/asyncio.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/concurrency/context.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/concurrency/services.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/concurrency/sync.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/concurrency/v1/__init__.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/concurrency/v1/_asyncio.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/concurrency/v1/_events.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/concurrency/v1/asyncio.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/concurrency/v1/context.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/concurrency/v1/services.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/concurrency/v1/sync.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/context.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/deployments/AGENTS.md +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/deployments/__init__.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/deployments/base.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/deployments/deployments.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/deployments/flow_runs.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/deployments/schedules.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/deployments/steps/__init__.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/deployments/steps/core.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/deployments/steps/pull.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/deployments/steps/utility.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/docker/__init__.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/docker/_buildx.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/docker/docker_image.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/events/AGENTS.md +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/events/__init__.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/events/actions.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/events/clients.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/events/filters.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/events/related.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/events/schemas/__init__.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/events/schemas/automations.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/events/schemas/deployment_triggers.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/events/schemas/events.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/events/schemas/labelling.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/events/subscribers.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/events/utilities.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/events/worker.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/exceptions.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/filesystems.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/flow_runs.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/flows.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/futures.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/infrastructure/__init__.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/infrastructure/base.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/infrastructure/provisioners/__init__.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/infrastructure/provisioners/cloud_run.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/infrastructure/provisioners/coiled.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/infrastructure/provisioners/container_instance.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/infrastructure/provisioners/ecs.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/infrastructure/provisioners/modal.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/input/__init__.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/input/actions.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/input/run_input.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/locking/__init__.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/locking/filesystem.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/locking/memory.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/locking/protocol.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/logging/AGENTS.md +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/logging/__init__.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/logging/clients.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/logging/configuration.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/logging/filters.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/logging/formatters.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/logging/handlers.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/logging/highlighters.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/logging/loggers.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/logging/logging.yml +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/main.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/plugins.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/py.typed +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/results.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/runner/__init__.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/runner/_deployment_registry.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/runner/_event_emitter.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/runner/_flow_resolver.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/runner/_hook_runner.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/runner/_limit_manager.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/runner/_scheduled_run_poller.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/runner/server.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/runner/storage.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/runtime/__init__.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/runtime/deployment.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/runtime/flow_run.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/runtime/task_run.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/schedules.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/serializers.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/server/api/__init__.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/server/api/admin.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/server/api/artifacts.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/server/api/automations.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/server/api/background_workers.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/server/api/block_capabilities.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/server/api/block_documents.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/server/api/block_schemas.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/server/api/block_types.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/server/api/clients.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/server/api/collections.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/server/api/collections_data/views/aggregate-worker-metadata.json +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/server/api/concurrency_limits.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/server/api/concurrency_limits_v2.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/server/api/csrf_token.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/server/api/dependencies.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/server/api/deployments.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/server/api/events.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/server/api/flow_run_states.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/server/api/flow_runs.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/server/api/flows.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/server/api/logs.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/server/api/middleware.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/server/api/root.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/server/api/run_history.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/server/api/saved_searches.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/server/api/server.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/server/api/static/prefect-logo-mark-gradient.png +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/server/api/task_run_states.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/server/api/task_runs.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/server/api/task_workers.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/server/api/templates.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/server/api/ui/__init__.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/server/api/ui/flow_runs.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/server/api/ui/flows.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/server/api/ui/schemas.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/server/api/ui/task_runs.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/server/api/validation.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/server/api/variables.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/server/api/work_queues.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/server/api/workers.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/settings/AGENTS.md +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/settings/__init__.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/settings/base.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/settings/constants.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/settings/context.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/settings/legacy.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/settings/models/__init__.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/settings/models/_defaults.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/settings/models/api.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/settings/models/cli.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/settings/models/client.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/settings/models/cloud.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/settings/models/deployments.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/settings/models/events.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/settings/models/experiments.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/settings/models/flows.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/settings/models/internal.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/settings/models/logging.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/settings/models/results.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/settings/models/root.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/settings/models/runner.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/settings/models/server/__init__.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/settings/models/server/api.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/settings/models/server/concurrency.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/settings/models/server/database.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/settings/models/server/deployments.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/settings/models/server/docket.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/settings/models/server/ephemeral.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/settings/models/server/events.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/settings/models/server/flow_run_graph.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/settings/models/server/logs.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/settings/models/server/root.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/settings/models/server/services.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/settings/models/server/tasks.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/settings/models/server/ui.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/settings/models/tasks.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/settings/models/telemetry.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/settings/models/testing.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/settings/models/worker.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/settings/profiles.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/settings/profiles.toml +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/settings/sources.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/states.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/task_engine.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/task_runners.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/task_runs.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/task_worker.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/tasks.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/telemetry/__init__.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/telemetry/_metrics.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/telemetry/run_telemetry.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/transactions.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/types/__init__.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/types/_concurrency.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/types/_datetime.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/types/_schema.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/types/entrypoint.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/types/names.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/utilities/__init__.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/utilities/_ast.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/utilities/_deprecated.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/utilities/_engine.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/utilities/_git.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/utilities/_infrastructure_exit_codes.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/utilities/annotations.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/utilities/asyncutils.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/utilities/collections.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/utilities/compat.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/utilities/context.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/utilities/dispatch.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/utilities/dockerutils.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/utilities/filesystem.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/utilities/generics.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/utilities/hashing.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/utilities/importtools.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/utilities/math.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/utilities/names.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/utilities/pydantic.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/utilities/render_swagger.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/utilities/schema_tools/__init__.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/utilities/schema_tools/hydration.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/utilities/schema_tools/validation.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/utilities/services.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/utilities/slugify.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/utilities/text.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/utilities/timeout.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/utilities/urls.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/utilities/visualization.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/variables.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/workers/AGENTS.md +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/workers/__init__.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/workers/base.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/workers/block.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/workers/cloud.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/workers/server.py +0 -0
- {prefect_client-3.6.27.dev3 → prefect_client-3.6.27.dev5}/src/prefect/workers/utilities.py +0 -0
|
@@ -24,6 +24,7 @@ from typing_extensions import Literal, NotRequired, TypeAlias
|
|
|
24
24
|
import anyio
|
|
25
25
|
import cloudpickle # pyright: ignore[reportMissingTypeStubs]
|
|
26
26
|
|
|
27
|
+
from prefect._internal.control_listener import configure_from_env
|
|
27
28
|
from prefect.client.schemas.objects import FlowRun
|
|
28
29
|
from prefect.context import SettingsContext, get_settings_context, serialize_context
|
|
29
30
|
from prefect.engine import handle_engine_signals
|
|
@@ -32,6 +33,7 @@ from prefect.flows import Flow
|
|
|
32
33
|
from prefect.logging import get_logger
|
|
33
34
|
from prefect.settings.context import get_current_settings
|
|
34
35
|
from prefect.settings.models.root import Settings
|
|
36
|
+
from prefect.utilities.processutils import sanitize_subprocess_env
|
|
35
37
|
from prefect.utilities.slugify import slugify
|
|
36
38
|
|
|
37
39
|
from prefect._experimental._launchers import validate_bundle_step_launcher
|
|
@@ -509,7 +511,7 @@ def extract_flow_from_bundle(bundle: SerializedBundle) -> Flow[Any, Any]:
|
|
|
509
511
|
def _extract_and_run_flow(
|
|
510
512
|
bundle: SerializedBundle,
|
|
511
513
|
cwd: Path | str | None = None,
|
|
512
|
-
env: dict[str,
|
|
514
|
+
env: dict[str, str | None] | None = None,
|
|
513
515
|
) -> None:
|
|
514
516
|
"""
|
|
515
517
|
Extracts a flow from a bundle and runs it.
|
|
@@ -522,14 +524,20 @@ def _extract_and_run_flow(
|
|
|
522
524
|
env: The environment to use when running the flow.
|
|
523
525
|
"""
|
|
524
526
|
|
|
525
|
-
os.environ.update(env
|
|
527
|
+
os.environ.update(sanitize_subprocess_env(env))
|
|
526
528
|
# TODO: make this a thing we can pass directly to the engine
|
|
527
529
|
os.environ["PREFECT__ENABLE_CANCELLATION_AND_CRASHED_HOOKS"] = "false"
|
|
528
530
|
settings_context = get_settings_context()
|
|
531
|
+
flow_run = FlowRun.model_validate(bundle["flow_run"])
|
|
532
|
+
|
|
533
|
+
# Consume the runner control-channel bootstrap env before deserializing
|
|
534
|
+
# bundled function/context objects, but do not connect yet. The actual
|
|
535
|
+
# listener socket is only opened while `capture_sigterm()` is active
|
|
536
|
+
# inside the flow engine.
|
|
537
|
+
configure_from_env()
|
|
529
538
|
|
|
530
539
|
flow = _deserialize_bundle_object(bundle["function"])
|
|
531
540
|
context = _deserialize_bundle_object(bundle["context"])
|
|
532
|
-
flow_run = FlowRun.model_validate(bundle["flow_run"])
|
|
533
541
|
|
|
534
542
|
if cwd:
|
|
535
543
|
os.chdir(cwd)
|
|
@@ -552,7 +560,7 @@ def _extract_and_run_flow(
|
|
|
552
560
|
|
|
553
561
|
def execute_bundle_in_subprocess(
|
|
554
562
|
bundle: SerializedBundle,
|
|
555
|
-
env: dict[str,
|
|
563
|
+
env: dict[str, str | None] | None = None,
|
|
556
564
|
cwd: Path | str | None = None,
|
|
557
565
|
) -> multiprocessing.context.SpawnProcess:
|
|
558
566
|
"""
|
|
@@ -576,13 +584,16 @@ def execute_bundle_in_subprocess(
|
|
|
576
584
|
env=os.environ,
|
|
577
585
|
)
|
|
578
586
|
|
|
587
|
+
subprocess_env = sanitize_subprocess_env(
|
|
588
|
+
get_current_settings().to_environment_variables(exclude_unset=True)
|
|
589
|
+
| os.environ
|
|
590
|
+
| env
|
|
591
|
+
)
|
|
579
592
|
process = ctx.Process(
|
|
580
593
|
target=_extract_and_run_flow,
|
|
581
594
|
kwargs={
|
|
582
595
|
"bundle": bundle,
|
|
583
|
-
"env":
|
|
584
|
-
| os.environ
|
|
585
|
-
| env,
|
|
596
|
+
"env": subprocess_env,
|
|
586
597
|
"cwd": cwd,
|
|
587
598
|
},
|
|
588
599
|
)
|
|
@@ -34,7 +34,10 @@ async def execute_bundle(bundle: dict) -> None:
|
|
|
34
34
|
flow_run = FlowRun.model_validate(bundle["flow_run"])
|
|
35
35
|
executor = ctx.create_executor(
|
|
36
36
|
flow_run,
|
|
37
|
-
BundleExecutionStarter(
|
|
37
|
+
BundleExecutionStarter(
|
|
38
|
+
bundle=bundle,
|
|
39
|
+
control_channel=ctx.control_channel,
|
|
40
|
+
),
|
|
38
41
|
resolve_flow=resolve_flow,
|
|
39
42
|
)
|
|
40
43
|
await executor.submit()
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Child-process runner-control intent listener.
|
|
3
|
+
|
|
4
|
+
This module is intentionally small. It only supports steady-state graceful
|
|
5
|
+
control delivery after Prefect has already installed its SIGTERM bridge via
|
|
6
|
+
`capture_sigterm()`.
|
|
7
|
+
|
|
8
|
+
Protocol:
|
|
9
|
+
|
|
10
|
+
1. The runner injects `PREFECT__CONTROL_PORT` and `PREFECT__CONTROL_TOKEN`
|
|
11
|
+
into the child environment.
|
|
12
|
+
2. Process entrypoints call `configure_from_env()` early to consume those
|
|
13
|
+
one-shot env vars without connecting yet.
|
|
14
|
+
3. The outermost `capture_sigterm()` calls `start()`, which connects back to
|
|
15
|
+
the runner and spawns a daemon thread blocked on the socket.
|
|
16
|
+
4. The runner writes a single-byte intent (`b"c"` today).
|
|
17
|
+
5. If Prefect still owns the live SIGTERM bridge, the child writes `b"a"`,
|
|
18
|
+
commits the intent for engine dispatch, and on Windows triggers
|
|
19
|
+
`_thread.interrupt_main(SIGTERM)`.
|
|
20
|
+
6. The runner then sends its normal external termination signal. On POSIX,
|
|
21
|
+
that real `SIGTERM` is the only trigger that interrupts blocking code.
|
|
22
|
+
|
|
23
|
+
If the child is not connected yet, or can no longer safely acknowledge the
|
|
24
|
+
intent, the runner sees no ack and falls back to its existing crash-style
|
|
25
|
+
termination path. There is deliberately no startup-time graceful cancellation
|
|
26
|
+
contract in this implementation.
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
from __future__ import annotations
|
|
30
|
+
|
|
31
|
+
import _thread
|
|
32
|
+
import os
|
|
33
|
+
import signal
|
|
34
|
+
import socket
|
|
35
|
+
import threading
|
|
36
|
+
from typing import Literal
|
|
37
|
+
|
|
38
|
+
from prefect.utilities.engine import commit_control_intent_and_ack
|
|
39
|
+
|
|
40
|
+
Intent = Literal["cancel"]
|
|
41
|
+
|
|
42
|
+
_INTENT_FOR_BYTE: dict[bytes, Intent] = {
|
|
43
|
+
b"c": "cancel",
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
_intent: Intent | None = None
|
|
47
|
+
_intent_lock = threading.Lock()
|
|
48
|
+
|
|
49
|
+
_configured = False
|
|
50
|
+
_configured_port: int | None = None
|
|
51
|
+
_configured_token: str | None = None
|
|
52
|
+
|
|
53
|
+
_started = False
|
|
54
|
+
_started_lock = threading.Lock()
|
|
55
|
+
_socket: socket.socket | None = None
|
|
56
|
+
_reader_thread: threading.Thread | None = None
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def get_intent() -> Intent | None:
|
|
60
|
+
"""Return the committed control intent, if any."""
|
|
61
|
+
with _intent_lock:
|
|
62
|
+
return _intent
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def _set_intent(value: Intent) -> None:
|
|
66
|
+
global _intent
|
|
67
|
+
with _intent_lock:
|
|
68
|
+
_intent = value
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def _clear_intent() -> None:
|
|
72
|
+
global _intent
|
|
73
|
+
with _intent_lock:
|
|
74
|
+
_intent = None
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def clear_intent() -> None:
|
|
78
|
+
"""Clear the committed control intent after the current session consumes it."""
|
|
79
|
+
_clear_intent()
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def configure_from_env() -> None:
|
|
83
|
+
"""Consume one-shot control-channel env vars without connecting yet."""
|
|
84
|
+
global _configured, _configured_port, _configured_token
|
|
85
|
+
|
|
86
|
+
with _started_lock:
|
|
87
|
+
if _configured:
|
|
88
|
+
return
|
|
89
|
+
|
|
90
|
+
_configured = True
|
|
91
|
+
port_str = os.environ.pop("PREFECT__CONTROL_PORT", None)
|
|
92
|
+
token = os.environ.pop("PREFECT__CONTROL_TOKEN", None)
|
|
93
|
+
if not port_str or not token:
|
|
94
|
+
return
|
|
95
|
+
|
|
96
|
+
try:
|
|
97
|
+
_configured_port = int(port_str)
|
|
98
|
+
except ValueError:
|
|
99
|
+
_configured_port = None
|
|
100
|
+
_configured_token = None
|
|
101
|
+
return
|
|
102
|
+
|
|
103
|
+
_configured_token = token
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def _acknowledge_intent(sock: socket.socket, intent: Intent) -> bool:
|
|
107
|
+
"""Commit intent and acknowledge it to the runner."""
|
|
108
|
+
if not commit_control_intent_and_ack(
|
|
109
|
+
commit_intent=lambda: _set_intent(intent),
|
|
110
|
+
clear_intent=_clear_intent,
|
|
111
|
+
send_ack=lambda: sock.sendall(b"a"),
|
|
112
|
+
trigger_cancel=(
|
|
113
|
+
(lambda: _thread.interrupt_main(signal.SIGTERM))
|
|
114
|
+
if os.name == "nt"
|
|
115
|
+
else None
|
|
116
|
+
),
|
|
117
|
+
):
|
|
118
|
+
return False
|
|
119
|
+
|
|
120
|
+
return True
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def _reader_loop(sock: socket.socket) -> None:
|
|
124
|
+
"""Block on the runner's control channel and act on a single intent byte."""
|
|
125
|
+
try:
|
|
126
|
+
while True:
|
|
127
|
+
try:
|
|
128
|
+
data = sock.recv(1)
|
|
129
|
+
except OSError:
|
|
130
|
+
return
|
|
131
|
+
if not data:
|
|
132
|
+
return
|
|
133
|
+
|
|
134
|
+
intent = _INTENT_FOR_BYTE.get(data)
|
|
135
|
+
if intent is None:
|
|
136
|
+
return
|
|
137
|
+
|
|
138
|
+
_acknowledge_intent(sock, intent)
|
|
139
|
+
return
|
|
140
|
+
finally:
|
|
141
|
+
try:
|
|
142
|
+
sock.close()
|
|
143
|
+
except OSError:
|
|
144
|
+
pass
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
def start() -> None:
|
|
148
|
+
"""Connect to the runner's control channel if bootstrap config is present."""
|
|
149
|
+
global _started, _socket, _reader_thread
|
|
150
|
+
|
|
151
|
+
configure_from_env()
|
|
152
|
+
|
|
153
|
+
with _started_lock:
|
|
154
|
+
if _started:
|
|
155
|
+
return
|
|
156
|
+
if _configured_port is None or _configured_token is None:
|
|
157
|
+
return
|
|
158
|
+
|
|
159
|
+
# A new listener session must not inherit a committed intent from an
|
|
160
|
+
# earlier flow run in the same interpreter.
|
|
161
|
+
_clear_intent()
|
|
162
|
+
|
|
163
|
+
try:
|
|
164
|
+
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
165
|
+
sock.connect(("127.0.0.1", _configured_port))
|
|
166
|
+
sock.sendall(_configured_token.encode("ascii") + b"\n")
|
|
167
|
+
except OSError:
|
|
168
|
+
try:
|
|
169
|
+
sock.close()
|
|
170
|
+
except (OSError, UnboundLocalError):
|
|
171
|
+
pass
|
|
172
|
+
return
|
|
173
|
+
|
|
174
|
+
thread = threading.Thread(
|
|
175
|
+
target=_reader_loop,
|
|
176
|
+
args=(sock,),
|
|
177
|
+
name="prefect-control-listener",
|
|
178
|
+
daemon=True,
|
|
179
|
+
)
|
|
180
|
+
_socket = sock
|
|
181
|
+
_reader_thread = thread
|
|
182
|
+
_started = True
|
|
183
|
+
thread.start()
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
def stop() -> None:
|
|
187
|
+
"""Close the active control connection, if any."""
|
|
188
|
+
global _configured, _configured_port, _configured_token
|
|
189
|
+
global _started, _socket, _reader_thread
|
|
190
|
+
|
|
191
|
+
with _started_lock:
|
|
192
|
+
sock = _socket
|
|
193
|
+
_socket = None
|
|
194
|
+
_reader_thread = None
|
|
195
|
+
_started = False
|
|
196
|
+
_configured = False
|
|
197
|
+
_configured_port = None
|
|
198
|
+
_configured_token = None
|
|
199
|
+
|
|
200
|
+
if sock is not None:
|
|
201
|
+
try:
|
|
202
|
+
sock.shutdown(socket.SHUT_RDWR)
|
|
203
|
+
except OSError:
|
|
204
|
+
pass
|
|
205
|
+
try:
|
|
206
|
+
sock.close()
|
|
207
|
+
except OSError:
|
|
208
|
+
pass
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
def reset_for_testing() -> None:
|
|
212
|
+
"""Reset module state. Tests only."""
|
|
213
|
+
global _intent, _configured, _configured_port, _configured_token
|
|
214
|
+
|
|
215
|
+
with _intent_lock:
|
|
216
|
+
_intent = None
|
|
217
|
+
|
|
218
|
+
stop()
|
|
219
|
+
|
|
220
|
+
with _started_lock:
|
|
221
|
+
_configured = False
|
|
222
|
+
_configured_port = None
|
|
223
|
+
_configured_token = None
|
|
@@ -963,7 +963,7 @@ class RunnerDeployment(BaseModel):
|
|
|
963
963
|
concurrency_limit
|
|
964
964
|
)
|
|
965
965
|
|
|
966
|
-
|
|
966
|
+
kwargs: dict[str, Any] = dict(
|
|
967
967
|
name=name,
|
|
968
968
|
flow_name=flow.name,
|
|
969
969
|
schedules=constructed_schedules,
|
|
@@ -977,10 +977,14 @@ class RunnerDeployment(BaseModel):
|
|
|
977
977
|
version=version,
|
|
978
978
|
version_type=version_type,
|
|
979
979
|
enforce_parameter_schema=enforce_parameter_schema,
|
|
980
|
-
work_pool_name=work_pool_name,
|
|
981
|
-
work_queue_name=work_queue_name,
|
|
982
980
|
job_variables=job_variables,
|
|
983
981
|
)
|
|
982
|
+
if work_pool_name is not None:
|
|
983
|
+
kwargs["work_pool_name"] = work_pool_name
|
|
984
|
+
if work_queue_name is not None:
|
|
985
|
+
kwargs["work_queue_name"] = work_queue_name
|
|
986
|
+
|
|
987
|
+
deployment = cls(**kwargs)
|
|
984
988
|
deployment._sla = _sla
|
|
985
989
|
|
|
986
990
|
if not deployment.entrypoint:
|
|
@@ -1110,7 +1114,7 @@ class RunnerDeployment(BaseModel):
|
|
|
1110
1114
|
concurrency_limit
|
|
1111
1115
|
)
|
|
1112
1116
|
|
|
1113
|
-
|
|
1117
|
+
kwargs: dict[str, Any] = dict(
|
|
1114
1118
|
name=name,
|
|
1115
1119
|
flow_name=flow_name or flow.name,
|
|
1116
1120
|
schedules=constructed_schedules,
|
|
@@ -1124,10 +1128,14 @@ class RunnerDeployment(BaseModel):
|
|
|
1124
1128
|
version=version,
|
|
1125
1129
|
entrypoint=entrypoint,
|
|
1126
1130
|
enforce_parameter_schema=enforce_parameter_schema,
|
|
1127
|
-
work_pool_name=work_pool_name,
|
|
1128
|
-
work_queue_name=work_queue_name,
|
|
1129
1131
|
job_variables=job_variables,
|
|
1130
1132
|
)
|
|
1133
|
+
if work_pool_name is not None:
|
|
1134
|
+
kwargs["work_pool_name"] = work_pool_name
|
|
1135
|
+
if work_queue_name is not None:
|
|
1136
|
+
kwargs["work_queue_name"] = work_queue_name
|
|
1137
|
+
|
|
1138
|
+
deployment = cls(**kwargs)
|
|
1131
1139
|
deployment._sla = _sla
|
|
1132
1140
|
deployment._path = str(Path.cwd())
|
|
1133
1141
|
|
|
@@ -1237,7 +1245,7 @@ class RunnerDeployment(BaseModel):
|
|
|
1237
1245
|
if ":" not in entrypoint:
|
|
1238
1246
|
sys.path.remove(str(storage.destination))
|
|
1239
1247
|
|
|
1240
|
-
|
|
1248
|
+
kwargs: dict[str, Any] = dict(
|
|
1241
1249
|
name=name,
|
|
1242
1250
|
flow_name=flow_name or flow.name,
|
|
1243
1251
|
schedules=constructed_schedules,
|
|
@@ -1253,10 +1261,14 @@ class RunnerDeployment(BaseModel):
|
|
|
1253
1261
|
entrypoint=entrypoint,
|
|
1254
1262
|
enforce_parameter_schema=enforce_parameter_schema,
|
|
1255
1263
|
storage=storage,
|
|
1256
|
-
work_pool_name=work_pool_name,
|
|
1257
|
-
work_queue_name=work_queue_name,
|
|
1258
1264
|
job_variables=job_variables,
|
|
1259
1265
|
)
|
|
1266
|
+
if work_pool_name is not None:
|
|
1267
|
+
kwargs["work_pool_name"] = work_pool_name
|
|
1268
|
+
if work_queue_name is not None:
|
|
1269
|
+
kwargs["work_queue_name"] = work_queue_name
|
|
1270
|
+
|
|
1271
|
+
deployment = cls(**kwargs)
|
|
1260
1272
|
deployment._sla = _sla
|
|
1261
1273
|
deployment._entrypoint_type = (
|
|
1262
1274
|
EntrypointType.FILE_PATH
|
|
@@ -1372,7 +1384,7 @@ class RunnerDeployment(BaseModel):
|
|
|
1372
1384
|
if ":" not in entrypoint:
|
|
1373
1385
|
sys.path.remove(str(storage.destination))
|
|
1374
1386
|
|
|
1375
|
-
|
|
1387
|
+
kwargs: dict[str, Any] = dict(
|
|
1376
1388
|
name=name,
|
|
1377
1389
|
flow_name=flow_name or flow.name,
|
|
1378
1390
|
schedules=constructed_schedules,
|
|
@@ -1388,10 +1400,14 @@ class RunnerDeployment(BaseModel):
|
|
|
1388
1400
|
entrypoint=entrypoint,
|
|
1389
1401
|
enforce_parameter_schema=enforce_parameter_schema,
|
|
1390
1402
|
storage=storage,
|
|
1391
|
-
work_pool_name=work_pool_name,
|
|
1392
|
-
work_queue_name=work_queue_name,
|
|
1393
1403
|
job_variables=job_variables,
|
|
1394
1404
|
)
|
|
1405
|
+
if work_pool_name is not None:
|
|
1406
|
+
kwargs["work_pool_name"] = work_pool_name
|
|
1407
|
+
if work_queue_name is not None:
|
|
1408
|
+
kwargs["work_queue_name"] = work_queue_name
|
|
1409
|
+
|
|
1410
|
+
deployment = cls(**kwargs)
|
|
1395
1411
|
deployment._sla = _sla
|
|
1396
1412
|
deployment._entrypoint_type = (
|
|
1397
1413
|
EntrypointType.FILE_PATH
|
|
@@ -1,22 +1,26 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
+
import asyncio
|
|
4
|
+
import inspect
|
|
3
5
|
import os
|
|
4
6
|
import sys
|
|
5
7
|
from contextlib import contextmanager
|
|
8
|
+
from types import GeneratorType
|
|
6
9
|
from typing import TYPE_CHECKING, Any, Callable
|
|
7
10
|
from uuid import UUID
|
|
8
11
|
|
|
9
12
|
from prefect._internal.compatibility.migration import getattr_migration
|
|
13
|
+
from prefect._internal.control_listener import (
|
|
14
|
+
clear_intent,
|
|
15
|
+
configure_from_env,
|
|
16
|
+
get_intent,
|
|
17
|
+
)
|
|
10
18
|
from prefect.exceptions import (
|
|
11
19
|
Abort,
|
|
12
20
|
Pause,
|
|
21
|
+
TerminationSignal,
|
|
13
22
|
)
|
|
14
|
-
from prefect.logging.loggers import
|
|
15
|
-
get_logger,
|
|
16
|
-
)
|
|
17
|
-
from prefect.utilities.asyncutils import (
|
|
18
|
-
run_coro_as_sync,
|
|
19
|
-
)
|
|
23
|
+
from prefect.logging.loggers import get_logger
|
|
20
24
|
|
|
21
25
|
if TYPE_CHECKING:
|
|
22
26
|
import logging
|
|
@@ -28,6 +32,32 @@ if TYPE_CHECKING:
|
|
|
28
32
|
engine_logger: "logging.Logger" = get_logger("engine")
|
|
29
33
|
|
|
30
34
|
|
|
35
|
+
def _drive_run_flow_result(flow: Any, run_result: object) -> None:
|
|
36
|
+
"""Execute deferred work for generator flows returned by `run_flow()`."""
|
|
37
|
+
if getattr(flow, "isasync", False) and getattr(flow, "isgenerator", False):
|
|
38
|
+
if not inspect.isasyncgen(run_result):
|
|
39
|
+
return
|
|
40
|
+
|
|
41
|
+
async def _consume_asyncgen() -> None:
|
|
42
|
+
async for _ in run_result:
|
|
43
|
+
pass
|
|
44
|
+
|
|
45
|
+
asyncio.run(_consume_asyncgen())
|
|
46
|
+
return
|
|
47
|
+
|
|
48
|
+
if not getattr(flow, "isasync", False) and getattr(flow, "isgenerator", False):
|
|
49
|
+
if not isinstance(run_result, GeneratorType):
|
|
50
|
+
return
|
|
51
|
+
for _ in run_result:
|
|
52
|
+
pass
|
|
53
|
+
return
|
|
54
|
+
|
|
55
|
+
if getattr(flow, "isasync", False) and not getattr(flow, "isgenerator", False):
|
|
56
|
+
if not asyncio.iscoroutine(run_result):
|
|
57
|
+
return
|
|
58
|
+
asyncio.run(run_result)
|
|
59
|
+
|
|
60
|
+
|
|
31
61
|
@contextmanager
|
|
32
62
|
def handle_engine_signals(flow_run_id: UUID | None = None):
|
|
33
63
|
"""
|
|
@@ -69,6 +99,21 @@ def handle_engine_signals(flow_run_id: UUID | None = None):
|
|
|
69
99
|
msg = "Execution is paused."
|
|
70
100
|
engine_logger.info(msg)
|
|
71
101
|
exit(0)
|
|
102
|
+
except TerminationSignal:
|
|
103
|
+
# A TerminationSignal can mean either:
|
|
104
|
+
# - an expected runner-driven control action (today: cancel intent),
|
|
105
|
+
# - or a raw external termination with no runner intent attached.
|
|
106
|
+
#
|
|
107
|
+
# Only the first case should translate to a clean process exit.
|
|
108
|
+
if get_intent() == "cancel":
|
|
109
|
+
if flow_run_id:
|
|
110
|
+
msg = f"Execution of flow run '{flow_run_id}' was cancelled."
|
|
111
|
+
else:
|
|
112
|
+
msg = "Execution was cancelled."
|
|
113
|
+
engine_logger.info(msg)
|
|
114
|
+
clear_intent()
|
|
115
|
+
exit(0)
|
|
116
|
+
raise
|
|
72
117
|
except Exception:
|
|
73
118
|
if flow_run_id:
|
|
74
119
|
msg = f"Execution of flow run '{flow_run_id}' exited with unexpected exception"
|
|
@@ -97,6 +142,13 @@ if __name__ == "__main__":
|
|
|
97
142
|
)
|
|
98
143
|
exit(1)
|
|
99
144
|
|
|
145
|
+
# Consume the runner control-channel bootstrap env before loading any
|
|
146
|
+
# flow code, but do not connect yet. The actual socket connection is
|
|
147
|
+
# established only while `capture_sigterm()` is active inside the flow
|
|
148
|
+
# engine; cancels that land before then fall back to the existing
|
|
149
|
+
# crash-style termination path.
|
|
150
|
+
configure_from_env()
|
|
151
|
+
|
|
100
152
|
with handle_engine_signals(flow_run_id):
|
|
101
153
|
from prefect.flow_engine import (
|
|
102
154
|
flow_run_logger,
|
|
@@ -118,14 +170,15 @@ if __name__ == "__main__":
|
|
|
118
170
|
)
|
|
119
171
|
raise
|
|
120
172
|
|
|
121
|
-
#
|
|
173
|
+
# Run async flows on a main-thread event loop in this subprocess so
|
|
174
|
+
# `capture_sigterm()` can install Prefect's SIGTERM bridge. Using the
|
|
175
|
+
# shared run-sync loop here moves execution off the main thread, which
|
|
176
|
+
# prevents graceful cancellation from ever becoming ready.
|
|
122
177
|
with RunMetrics(flow_run, flow):
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
else:
|
|
128
|
-
run_flow(flow, flow_run=flow_run, error_logger=run_logger)
|
|
178
|
+
_run_result: object = run_flow(
|
|
179
|
+
flow, flow_run=flow_run, error_logger=run_logger
|
|
180
|
+
)
|
|
181
|
+
_drive_run_flow_result(flow, _run_result)
|
|
129
182
|
|
|
130
183
|
|
|
131
184
|
__getattr__: Callable[[str], Any] = getattr_migration(__name__)
|