apache-airflow-providers-edge3 1.2.0rc1__tar.gz → 1.3.0rc1__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.
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/PKG-INFO +6 -6
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/README.rst +3 -3
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/docs/architecture.rst +0 -1
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/docs/changelog.rst +41 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/docs/deployment.rst +5 -6
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/docs/edge_executor.rst +1 -1
- apache_airflow_providers_edge3-1.3.0rc1/docs/img/worker_hosts.png +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/docs/index.rst +1 -1
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/docs/install_on_windows.rst +2 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/docs/ui_plugin.rst +7 -10
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/provider.yaml +2 -1
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/pyproject.toml +3 -3
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/__init__.py +1 -1
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/cli/edge_command.py +43 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/cli/worker.py +40 -40
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/models/edge_worker.py +13 -8
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/openapi/v2-edge-generated.yaml +249 -0
- apache_airflow_providers_edge3-1.3.0rc1/src/airflow/providers/edge3/plugins/www/dist/main.umd.cjs +158 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/openapi-gen/queries/common.ts +7 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/openapi-gen/queries/queries.ts +44 -1
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/openapi-gen/requests/schemas.gen.ts +14 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/openapi-gen/requests/services.gen.ts +158 -1
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/openapi-gen/requests/types.gen.ts +155 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/package.json +14 -10
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/pnpm-lock.yaml +601 -457
- apache_airflow_providers_edge3-1.3.0rc1/src/airflow/providers/edge3/plugins/www/src/components/AddQueueButton.tsx +138 -0
- apache_airflow_providers_edge3-1.3.0rc1/src/airflow/providers/edge3/plugins/www/src/components/MaintenanceEditCommentButton.tsx +106 -0
- apache_airflow_providers_edge3-1.3.0rc1/src/airflow/providers/edge3/plugins/www/src/components/MaintenanceEnterButton.tsx +102 -0
- apache_airflow_providers_edge3-1.3.0rc1/src/airflow/providers/edge3/plugins/www/src/components/MaintenanceExitButton.tsx +92 -0
- apache_airflow_providers_edge3-1.3.0rc1/src/airflow/providers/edge3/plugins/www/src/components/RemoveQueueButton.tsx +151 -0
- apache_airflow_providers_edge3-1.3.0rc1/src/airflow/providers/edge3/plugins/www/src/components/WorkerDeleteButton.tsx +104 -0
- apache_airflow_providers_edge3-1.3.0rc1/src/airflow/providers/edge3/plugins/www/src/components/WorkerOperations.tsx +85 -0
- apache_airflow_providers_edge3-1.3.0rc1/src/airflow/providers/edge3/plugins/www/src/components/WorkerShutdownButton.tsx +104 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/src/components/WorkerStateBadge.tsx +33 -0
- apache_airflow_providers_edge3-1.3.0rc1/src/airflow/providers/edge3/plugins/www/src/components/ui/ScrollToAnchor.tsx +49 -0
- apache_airflow_providers_edge3-1.3.0rc1/src/airflow/providers/edge3/plugins/www/src/components/ui/createToaster.ts +24 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/src/components/ui/index.ts +2 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/src/context/colorMode/ColorModeProvider.tsx +1 -2
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/src/context/colorMode/useColorMode.tsx +2 -5
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/src/pages/JobsPage.tsx +52 -15
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/src/pages/WorkerPage.tsx +52 -22
- apache_airflow_providers_edge3-1.3.0rc1/src/airflow/providers/edge3/plugins/www/src/theme.ts +424 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/vite.config.ts +2 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/worker_api/datamodels_ui.py +12 -0
- apache_airflow_providers_edge3-1.3.0rc1/src/airflow/providers/edge3/worker_api/routes/ui.py +292 -0
- apache_airflow_providers_edge3-1.3.0rc1/www-hash.txt +1 -0
- apache_airflow_providers_edge3-1.2.0rc1/docs/img/worker_hosts.png +0 -0
- apache_airflow_providers_edge3-1.2.0rc1/docs/img/worker_maintenance.png +0 -0
- apache_airflow_providers_edge3-1.2.0rc1/src/airflow/providers/edge3/plugins/www/dist/main.umd.cjs +0 -124
- apache_airflow_providers_edge3-1.2.0rc1/src/airflow/providers/edge3/plugins/www/src/theme.ts +0 -176
- apache_airflow_providers_edge3-1.2.0rc1/src/airflow/providers/edge3/worker_api/routes/ui.py +0 -102
- apache_airflow_providers_edge3-1.2.0rc1/www-hash.txt +0 -1
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/docs/cli-ref.rst +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/docs/commits.rst +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/docs/conf.py +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/docs/configurations-ref.rst +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/docs/img/distributed_architecture.svg +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/docs/img/edge_package.svg +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/docs/installing-providers-from-sources.rst +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/docs/security.rst +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/docs/why_edge.rst +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/__init__.py +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/__init__.py +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/LICENSE +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/cli/__init__.py +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/cli/api_client.py +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/cli/dataclasses.py +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/cli/signalling.py +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/example_dags/__init__.py +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/example_dags/integration_test.py +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/example_dags/win_notepad.py +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/example_dags/win_test.py +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/executors/__init__.py +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/executors/edge_executor.py +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/get_provider_info.py +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/models/__init__.py +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/models/edge_job.py +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/models/edge_logs.py +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/openapi/__init__.py +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/openapi/edge_worker_api_v1.yaml +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/__init__.py +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/edge_executor_plugin.py +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/templates/edge_worker_hosts.html +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/templates/edge_worker_jobs.html +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/.gitignore +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/.prettierignore +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/.prettierrc +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/README.md +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/dist/main.d.ts +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/eslint.config.js +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/index.html +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/openapi-gen/queries/ensureQueryData.ts +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/openapi-gen/queries/index.ts +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/openapi-gen/queries/infiniteQueries.ts +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/openapi-gen/queries/prefetch.ts +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/openapi-gen/queries/suspense.ts +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/openapi-gen/requests/core/ApiError.ts +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/openapi-gen/requests/core/ApiRequestOptions.ts +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/openapi-gen/requests/core/ApiResult.ts +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/openapi-gen/requests/core/CancelablePromise.ts +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/openapi-gen/requests/core/OpenAPI.ts +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/openapi-gen/requests/core/request.ts +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/openapi-gen/requests/index.ts +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/src/components/ErrorAlert.tsx +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/src/components/StateBadge.tsx +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/src/components/StateIcon.tsx +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/src/components/WorkerStateIcon.tsx +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/src/components/ui/Alert.tsx +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/src/components/ui/CloseButton.tsx +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/src/context/colorMode/index.ts +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/src/dev.tsx +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/src/layouts/EdgeLayout.tsx +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/src/layouts/NavTabs.tsx +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/src/main.tsx +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/src/res/README.md +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/src/res/cloud-computer-dark.svg +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/src/res/cloud-computer.svg +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/src/utils/config.ts +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/src/utils/index.ts +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/src/utils/tokenHandler.ts +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/src/utils/useContainerWidth.ts +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/src/vite-env.d.ts +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/testsSetup.ts +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/tsconfig.app.json +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/tsconfig.json +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/tsconfig.lib.json +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/tsconfig.node.json +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/version_compat.py +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/worker_api/__init__.py +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/worker_api/app.py +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/worker_api/auth.py +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/worker_api/datamodels.py +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/worker_api/routes/__init__.py +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/worker_api/routes/_v2_compat.py +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/worker_api/routes/_v2_routes.py +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/worker_api/routes/health.py +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/worker_api/routes/jobs.py +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/worker_api/routes/logs.py +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/worker_api/routes/worker.py +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/tests/conftest.py +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/tests/unit/__init__.py +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/tests/unit/edge3/__init__.py +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/tests/unit/edge3/cli/__init__.py +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/tests/unit/edge3/cli/test_api_client.py +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/tests/unit/edge3/cli/test_dataclasses.py +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/tests/unit/edge3/cli/test_edge_command.py +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/tests/unit/edge3/cli/test_signalling.py +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/tests/unit/edge3/cli/test_worker.py +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/tests/unit/edge3/executors/__init__.py +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/tests/unit/edge3/executors/test_edge_executor.py +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/tests/unit/edge3/models/__init__.py +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/tests/unit/edge3/plugins/__init__.py +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/tests/unit/edge3/plugins/test_edge_executor_plugin.py +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/tests/unit/edge3/worker_api/__init__.py +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/tests/unit/edge3/worker_api/routes/__init__.py +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/tests/unit/edge3/worker_api/routes/test_health.py +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/tests/unit/edge3/worker_api/routes/test_jobs.py +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/tests/unit/edge3/worker_api/routes/test_logs.py +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/tests/unit/edge3/worker_api/routes/test_ui.py +0 -0
- {apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/tests/unit/edge3/worker_api/routes/test_worker.py +0 -0
{apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: apache-airflow-providers-edge3
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.3.0rc1
|
|
4
4
|
Summary: Provider package apache-airflow-providers-edge3 for Apache Airflow
|
|
5
5
|
Keywords: airflow-provider,edge3,airflow,integration
|
|
6
6
|
Author-email: Apache Software Foundation <dev@airflow.apache.org>
|
|
@@ -24,8 +24,8 @@ Requires-Dist: apache-airflow>=2.10.0rc1
|
|
|
24
24
|
Requires-Dist: pydantic>=2.11.0
|
|
25
25
|
Requires-Dist: retryhttp>=1.2.0,!=1.3.0
|
|
26
26
|
Project-URL: Bug Tracker, https://github.com/apache/airflow/issues
|
|
27
|
-
Project-URL: Changelog, https://airflow.staged.apache.org/docs/apache-airflow-providers-edge3/1.
|
|
28
|
-
Project-URL: Documentation, https://airflow.staged.apache.org/docs/apache-airflow-providers-edge3/1.
|
|
27
|
+
Project-URL: Changelog, https://airflow.staged.apache.org/docs/apache-airflow-providers-edge3/1.3.0/changelog.html
|
|
28
|
+
Project-URL: Documentation, https://airflow.staged.apache.org/docs/apache-airflow-providers-edge3/1.3.0
|
|
29
29
|
Project-URL: Mastodon, https://fosstodon.org/@airflow
|
|
30
30
|
Project-URL: Slack Chat, https://s.apache.org/airflow-slack
|
|
31
31
|
Project-URL: Source Code, https://github.com/apache/airflow
|
|
@@ -56,7 +56,7 @@ Project-URL: YouTube, https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/
|
|
|
56
56
|
|
|
57
57
|
Package ``apache-airflow-providers-edge3``
|
|
58
58
|
|
|
59
|
-
Release: ``1.
|
|
59
|
+
Release: ``1.3.0``
|
|
60
60
|
|
|
61
61
|
|
|
62
62
|
Handle edge workers on remote sites via HTTP(s) connection and orchestrates work over distributed sites.
|
|
@@ -81,7 +81,7 @@ This is a provider package for ``edge3`` provider. All classes for this provider
|
|
|
81
81
|
are in ``airflow.providers.edge3`` python package.
|
|
82
82
|
|
|
83
83
|
You can find package information and changelog for the provider
|
|
84
|
-
in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-edge3/1.
|
|
84
|
+
in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-edge3/1.3.0/>`_.
|
|
85
85
|
|
|
86
86
|
Installation
|
|
87
87
|
------------
|
|
@@ -104,5 +104,5 @@ PIP package Version required
|
|
|
104
104
|
================== ===================
|
|
105
105
|
|
|
106
106
|
The changelog for the provider package can be found in the
|
|
107
|
-
`changelog <https://airflow.apache.org/docs/apache-airflow-providers-edge3/1.
|
|
107
|
+
`changelog <https://airflow.apache.org/docs/apache-airflow-providers-edge3/1.3.0/changelog.html>`_.
|
|
108
108
|
|
{apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/README.rst
RENAMED
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
|
|
24
24
|
Package ``apache-airflow-providers-edge3``
|
|
25
25
|
|
|
26
|
-
Release: ``1.
|
|
26
|
+
Release: ``1.3.0``
|
|
27
27
|
|
|
28
28
|
|
|
29
29
|
Handle edge workers on remote sites via HTTP(s) connection and orchestrates work over distributed sites.
|
|
@@ -48,7 +48,7 @@ This is a provider package for ``edge3`` provider. All classes for this provider
|
|
|
48
48
|
are in ``airflow.providers.edge3`` python package.
|
|
49
49
|
|
|
50
50
|
You can find package information and changelog for the provider
|
|
51
|
-
in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-edge3/1.
|
|
51
|
+
in the `documentation <https://airflow.apache.org/docs/apache-airflow-providers-edge3/1.3.0/>`_.
|
|
52
52
|
|
|
53
53
|
Installation
|
|
54
54
|
------------
|
|
@@ -71,4 +71,4 @@ PIP package Version required
|
|
|
71
71
|
================== ===================
|
|
72
72
|
|
|
73
73
|
The changelog for the provider package can be found in the
|
|
74
|
-
`changelog <https://airflow.apache.org/docs/apache-airflow-providers-edge3/1.
|
|
74
|
+
`changelog <https://airflow.apache.org/docs/apache-airflow-providers-edge3/1.3.0/changelog.html>`_.
|
|
@@ -154,7 +154,6 @@ The following features are known missing and will be implemented in increments:
|
|
|
154
154
|
- API token per worker: Today there is a global API token available only
|
|
155
155
|
- Edge Worker Plugin
|
|
156
156
|
|
|
157
|
-
- Make plugin working on Airflow 3.0, depending on AIP-68
|
|
158
157
|
- Overview about queues / jobs per queue
|
|
159
158
|
- Allow starting Edge Worker REST API separate to api-server
|
|
160
159
|
- Add some hints how to setup an additional worker
|
|
@@ -27,6 +27,47 @@
|
|
|
27
27
|
Changelog
|
|
28
28
|
---------
|
|
29
29
|
|
|
30
|
+
1.3.0
|
|
31
|
+
.....
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
Release Date: ``|PypiReleaseDate|``
|
|
35
|
+
|
|
36
|
+
Features
|
|
37
|
+
~~~~~~~~
|
|
38
|
+
|
|
39
|
+
* ``Add Color Scheme to all Operations Buttons in Edge React UI (#55637)``
|
|
40
|
+
* ``Add shutdown-all-workers command to Edge CLI (#55626)``
|
|
41
|
+
* ``add yellow hover background to enter maintenance icon (#55631)``
|
|
42
|
+
* ``Add queue management UI buttons for Edge workers (#55625)``
|
|
43
|
+
* ``Add Worker Maintenance Comment Change to React UI (#55547)``
|
|
44
|
+
* ``feat: Add delete button for offline edge workers (#55529)``
|
|
45
|
+
* ``feat: Add shutdown button for edge workers with confirmation dialog (#55513)``
|
|
46
|
+
* ``Add confirmation dialog for exit maintenance action in Edge Worker Page (#55400)``
|
|
47
|
+
* ``Add Links to Edge React UI (#55356)``
|
|
48
|
+
* ``Feature/edge maintenance plugin beautification (#55348)``
|
|
49
|
+
* ``Add worker maintenance mode functionality to Edge3 provider UI (#55301)``
|
|
50
|
+
|
|
51
|
+
Bug Fixes
|
|
52
|
+
~~~~~~~~~
|
|
53
|
+
|
|
54
|
+
* ``Fix EdgeWorker multiprocessing pickle error on Windows (#55284)``
|
|
55
|
+
|
|
56
|
+
Misc
|
|
57
|
+
~~~~
|
|
58
|
+
|
|
59
|
+
* ``Pick/vite vitest full (#55623)``
|
|
60
|
+
* ``Bump React and React-DOM (#55598)``
|
|
61
|
+
* ``Bump axios from 1.11.0 to 1.12.0 in /providers/edge3/src/airflow/providers/edge3/plugins/www (#55550)``
|
|
62
|
+
* ``Some small UI polishing for Edge React UI (#55545)``
|
|
63
|
+
* ``Adjust Edge color scheme after merge of PR 53981 (#55485)``
|
|
64
|
+
* ``Bump vite from 5.4.19 to 5.4.20 in /providers/edge3/src/airflow/providers/edge3/plugins/www (#55449)``
|
|
65
|
+
|
|
66
|
+
Doc-only
|
|
67
|
+
~~~~~~~~
|
|
68
|
+
|
|
69
|
+
* ``Update docs for new Airflow 3.1 UI Plugins (#55654)``
|
|
70
|
+
|
|
30
71
|
1.2.0
|
|
31
72
|
.....
|
|
32
73
|
|
|
@@ -130,14 +130,14 @@ Also please note if the worker detects that the Airflow or Edge provider package
|
|
|
130
130
|
is not the same as the one running on the API server, it will stop accepting new tasks and shut down gracefully.
|
|
131
131
|
This is to prevent running tasks with different versions of the code.
|
|
132
132
|
|
|
133
|
-
Worker status can be checked via the web UI in the "Admin" - "Edge Worker
|
|
133
|
+
Worker status can be checked via the web UI in the "Admin" - "Edge Worker" page. Maintenance can be set on a per worker basis.
|
|
134
134
|
|
|
135
135
|
.. image:: img/worker_hosts.png
|
|
136
136
|
|
|
137
137
|
.. note::
|
|
138
138
|
|
|
139
|
-
|
|
140
|
-
|
|
139
|
+
Airflow 3.0 does not support UI plugins. The UI plugin is only available in Airflow 2.10 and in 3.1 and newer.
|
|
140
|
+
Alternatively you can use the CLI commands as described in :ref:`deployment:maintenance-mgmt-cli`.
|
|
141
141
|
|
|
142
142
|
|
|
143
143
|
Worker maintenance can also be triggered via the CLI command on the machine that runs the worker.
|
|
@@ -160,9 +160,7 @@ use the command
|
|
|
160
160
|
This will show the status of the local worker instance as JSON and the tasks running on it.
|
|
161
161
|
|
|
162
162
|
The status and maintenance comments will also be shown in the web UI
|
|
163
|
-
in the "Admin" - "Edge Worker
|
|
164
|
-
|
|
165
|
-
.. image:: img/worker_maintenance.png
|
|
163
|
+
in the "Admin" - "Edge Worker" page.
|
|
166
164
|
|
|
167
165
|
The local worker instance can be started to fetch new tasks via the command
|
|
168
166
|
|
|
@@ -189,6 +187,7 @@ instance. The commands are:
|
|
|
189
187
|
- ``airflow edge remote-edge-worker-update-maintenance-comment``: Updates the maintenance comment for a remote edge worker
|
|
190
188
|
- ``airflow edge remote-edge-worker-exit-maintenance``: Request a remote edge worker to exit maintenance mode
|
|
191
189
|
- ``airflow edge shutdown-remote-edge-worker``: Shuts down a remote edge worker gracefully
|
|
190
|
+
- ``airflow edge shutdown-all-workers``: Request graceful shutdown of all registered edge workers
|
|
192
191
|
- ``airflow edge remove-remote-edge-worker``: Remove a worker instance from the cluster
|
|
193
192
|
- ``airflow edge add-worker-queues``: Add queues to an edge worker
|
|
194
193
|
- ``airflow edge remove-worker-queues``: Remove queues from an edge worker
|
|
@@ -109,4 +109,4 @@ Current Limitations Edge Executor
|
|
|
109
109
|
the logs will be scattered across the webserver instances.
|
|
110
110
|
- Performance: No extensive performance assessment and scaling tests have been made. The edge executor package is
|
|
111
111
|
optimized for stability. This will be incrementally improved in future releases. Setups have reported stable
|
|
112
|
-
operation with ~
|
|
112
|
+
operation with ~80 workers until now. Note that executed tasks require more webserver API capacity.
|
|
Binary file
|
|
@@ -25,6 +25,8 @@ Install Edge Worker on Windows
|
|
|
25
25
|
Windows-based setup is intended solely for testing at your own risk. It is technically limited
|
|
26
26
|
due to Python OS restrictions and if currently of Proof-of-Concept quality.
|
|
27
27
|
|
|
28
|
+
It is known that due to changes in Task SDK running in Windows is not possible.
|
|
29
|
+
|
|
28
30
|
|
|
29
31
|
The setup was tested on Windows 10 with Python 3.12.8, 64-bit. Backend for tests was Airflow 2.10.5.
|
|
30
32
|
To setup a instance of Edge Worker on Windows, you need to follow the steps below:
|
|
@@ -22,8 +22,7 @@ The Edge provider uses a Plugin to
|
|
|
22
22
|
|
|
23
23
|
- Extend the REST API endpoints for connecting workers to the Airflow cluster
|
|
24
24
|
- Provide a web UI for managing the workers and monitoring their status and tasks
|
|
25
|
-
(Note: The UI is
|
|
26
|
-
Airflow 3.0 depends on completion of AIP-68)
|
|
25
|
+
(Note: Airflow 3.0 does not have support for UI plugins. The UI plugin is only available in Airflow 2.10 and in 3.1 and newer.)
|
|
27
26
|
|
|
28
27
|
REST API endpoints
|
|
29
28
|
------------------
|
|
@@ -38,29 +37,27 @@ The Edge provider adds the following REST API endpoints to the Airflow API:
|
|
|
38
37
|
To see full documentation of the API endpoints open the Airflow web UI and navigate to
|
|
39
38
|
the sub-path ``/edge_worker/docs`` (Airflow 3.0) or ``/edge_worker/v1/ui`` (Airflow 2.10).
|
|
40
39
|
|
|
41
|
-
Web UI Plugin
|
|
42
|
-
|
|
40
|
+
Web UI Plugin
|
|
41
|
+
-------------
|
|
43
42
|
|
|
44
43
|
.. note::
|
|
45
44
|
|
|
46
|
-
|
|
47
|
-
|
|
45
|
+
Airflow 3.0 does not support UI plugins. The UI plugin is only available in Airflow 2.10 and in 3.1 and newer.
|
|
46
|
+
Alternatively you can use the CLI commands as described in :ref:`deployment:maintenance-mgmt-cli`.
|
|
48
47
|
|
|
49
48
|
The Edge provider adds a web UI plugin to the Airflow web UI. The plugin is
|
|
50
49
|
made to be able to see job queue and Edge Worker status.
|
|
51
50
|
|
|
52
51
|
Pending and processes tasks can be checked in "Admin" - "Edge Worker Jobs" page.
|
|
53
52
|
|
|
54
|
-
Worker status can be checked via the web UI in the "Admin" - "Edge Worker
|
|
53
|
+
Worker status can be checked via the web UI in the "Admin" - "Edge Worker" page.
|
|
55
54
|
|
|
56
55
|
.. image:: img/worker_hosts.png
|
|
57
56
|
|
|
58
57
|
Via the UI you can also set the status of the worker to "Maintenance" or "Active".
|
|
59
58
|
|
|
60
59
|
The status and maintenance comments will also be shown in the web UI
|
|
61
|
-
in the "Admin" - "Edge Worker
|
|
62
|
-
|
|
63
|
-
.. image:: img/worker_maintenance.png
|
|
60
|
+
in the "Admin" - "Edge Worker" page.
|
|
64
61
|
|
|
65
62
|
Note that maintenance mode can also be adjusted via CLI.
|
|
66
63
|
See :ref:`deployment:maintenance` for more details.
|
{apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/provider.yaml
RENAMED
|
@@ -33,13 +33,14 @@ description: |
|
|
|
33
33
|
are provided by the API server.
|
|
34
34
|
|
|
35
35
|
state: ready
|
|
36
|
-
source-date-epoch:
|
|
36
|
+
source-date-epoch: 1757950232
|
|
37
37
|
|
|
38
38
|
# Note that those versions are maintained by release manager - do not update them manually
|
|
39
39
|
# with the exception of case where other provider in sources has >= new provider version.
|
|
40
40
|
# In such case adding >= NEW_VERSION and bumping to NEW_VERSION in a provider have
|
|
41
41
|
# to be done in the same PR
|
|
42
42
|
versions:
|
|
43
|
+
- 1.3.0
|
|
43
44
|
- 1.2.0
|
|
44
45
|
- 1.1.3
|
|
45
46
|
- 1.1.2
|
{apache_airflow_providers_edge3-1.2.0rc1 → apache_airflow_providers_edge3-1.3.0rc1}/pyproject.toml
RENAMED
|
@@ -25,7 +25,7 @@ build-backend = "flit_core.buildapi"
|
|
|
25
25
|
|
|
26
26
|
[project]
|
|
27
27
|
name = "apache-airflow-providers-edge3"
|
|
28
|
-
version = "1.
|
|
28
|
+
version = "1.3.0rc1"
|
|
29
29
|
description = "Provider package apache-airflow-providers-edge3 for Apache Airflow"
|
|
30
30
|
readme = "README.rst"
|
|
31
31
|
authors = [
|
|
@@ -96,8 +96,8 @@ apache-airflow-providers-common-sql = {workspace = true}
|
|
|
96
96
|
apache-airflow-providers-standard = {workspace = true}
|
|
97
97
|
|
|
98
98
|
[project.urls]
|
|
99
|
-
"Documentation" = "https://airflow.staged.apache.org/docs/apache-airflow-providers-edge3/1.
|
|
100
|
-
"Changelog" = "https://airflow.staged.apache.org/docs/apache-airflow-providers-edge3/1.
|
|
99
|
+
"Documentation" = "https://airflow.staged.apache.org/docs/apache-airflow-providers-edge3/1.3.0"
|
|
100
|
+
"Changelog" = "https://airflow.staged.apache.org/docs/apache-airflow-providers-edge3/1.3.0/changelog.html"
|
|
101
101
|
"Bug Tracker" = "https://github.com/apache/airflow/issues"
|
|
102
102
|
"Source Code" = "https://github.com/apache/airflow"
|
|
103
103
|
"Slack Chat" = "https://s.apache.org/airflow-slack"
|
|
@@ -29,7 +29,7 @@ from airflow import __version__ as airflow_version
|
|
|
29
29
|
|
|
30
30
|
__all__ = ["__version__"]
|
|
31
31
|
|
|
32
|
-
__version__ = "1.
|
|
32
|
+
__version__ = "1.3.0"
|
|
33
33
|
|
|
34
34
|
if packaging.version.parse(packaging.version.parse(airflow_version).base_version) < packaging.version.parse(
|
|
35
35
|
"2.10.0"
|
|
@@ -351,6 +351,37 @@ def remote_worker_request_shutdown(args) -> None:
|
|
|
351
351
|
logger.info("Requested shutdown of Edge Worker host %s by %s.", args.edge_hostname, getuser())
|
|
352
352
|
|
|
353
353
|
|
|
354
|
+
@cli_utils.action_cli(check_db=False)
|
|
355
|
+
@providers_configuration_loaded
|
|
356
|
+
def shutdown_all_workers(args) -> None:
|
|
357
|
+
"""Request graceful shutdown of all edge workers."""
|
|
358
|
+
_check_valid_db_connection()
|
|
359
|
+
if not (
|
|
360
|
+
args.yes
|
|
361
|
+
or input("This will shutdown all active edge workers, this cannot be undone! Proceed? (y/n)").upper()
|
|
362
|
+
== "Y"
|
|
363
|
+
):
|
|
364
|
+
raise SystemExit("Cancelled")
|
|
365
|
+
|
|
366
|
+
from airflow.providers.edge3.models.edge_worker import get_registered_edge_hosts, request_shutdown
|
|
367
|
+
|
|
368
|
+
all_hosts = list(get_registered_edge_hosts())
|
|
369
|
+
if not all_hosts:
|
|
370
|
+
logger.info("No edge workers found to shutdown.")
|
|
371
|
+
return
|
|
372
|
+
|
|
373
|
+
shutdown_count = 0
|
|
374
|
+
for host in all_hosts:
|
|
375
|
+
try:
|
|
376
|
+
request_shutdown(host.worker_name)
|
|
377
|
+
logger.info("Requested shutdown of Edge Worker host %s", host.worker_name)
|
|
378
|
+
shutdown_count += 1
|
|
379
|
+
except Exception as e:
|
|
380
|
+
logger.error("Failed to shutdown Edge Worker host %s: %s", host.worker_name, e)
|
|
381
|
+
|
|
382
|
+
logger.info("Requested shutdown of %d edge workers by %s.", shutdown_count, getuser())
|
|
383
|
+
|
|
384
|
+
|
|
354
385
|
@cli_utils.action_cli(check_db=False)
|
|
355
386
|
@providers_configuration_loaded
|
|
356
387
|
def add_worker_queues(args) -> None:
|
|
@@ -468,6 +499,12 @@ ARG_UMASK = Arg(
|
|
|
468
499
|
ARG_STDERR = Arg(("--stderr",), help="Redirect stderr to this file if run in daemon mode")
|
|
469
500
|
ARG_STDOUT = Arg(("--stdout",), help="Redirect stdout to this file if run in daemon mode")
|
|
470
501
|
ARG_LOG_FILE = Arg(("-l", "--log-file"), help="Location of the log file if run in daemon mode")
|
|
502
|
+
ARG_YES = Arg(
|
|
503
|
+
("-y", "--yes"),
|
|
504
|
+
help="Skip confirmation prompt and proceed with shutdown",
|
|
505
|
+
action="store_true",
|
|
506
|
+
default=False,
|
|
507
|
+
)
|
|
471
508
|
|
|
472
509
|
EDGE_COMMANDS: list[ActionCommand] = [
|
|
473
510
|
ActionCommand(
|
|
@@ -581,4 +618,10 @@ EDGE_COMMANDS: list[ActionCommand] = [
|
|
|
581
618
|
ARG_QUEUES_MANAGE,
|
|
582
619
|
),
|
|
583
620
|
),
|
|
621
|
+
ActionCommand(
|
|
622
|
+
name="shutdown-all-workers",
|
|
623
|
+
help=shutdown_all_workers.__doc__,
|
|
624
|
+
func=shutdown_all_workers,
|
|
625
|
+
args=(ARG_YES,),
|
|
626
|
+
),
|
|
584
627
|
]
|
|
@@ -175,48 +175,46 @@ class EdgeWorker:
|
|
|
175
175
|
return EdgeWorkerState.MAINTENANCE_MODE
|
|
176
176
|
return EdgeWorkerState.IDLE
|
|
177
177
|
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
178
|
+
@staticmethod
|
|
179
|
+
def _run_job_via_supervisor(workload) -> int:
|
|
180
|
+
from airflow.sdk.execution_time.supervisor import supervise
|
|
181
181
|
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
) -> int:
|
|
185
|
-
from airflow.sdk.execution_time.supervisor import supervise
|
|
182
|
+
# Ignore ctrl-c in this process -- we don't want to kill _this_ one. we let tasks run to completion
|
|
183
|
+
signal.signal(signal.SIGINT, signal.SIG_IGN)
|
|
186
184
|
|
|
187
|
-
|
|
188
|
-
|
|
185
|
+
logger.info("Worker starting up pid=%d", os.getpid())
|
|
186
|
+
setproctitle(f"airflow edge worker: {workload.ti.key}")
|
|
189
187
|
|
|
190
|
-
|
|
191
|
-
|
|
188
|
+
try:
|
|
189
|
+
api_url = conf.get("edge", "api_url")
|
|
190
|
+
execution_api_server_url = conf.get("core", "execution_api_server_url", fallback="")
|
|
191
|
+
if not execution_api_server_url:
|
|
192
|
+
parsed = urlparse(api_url)
|
|
193
|
+
execution_api_server_url = f"{parsed.scheme}://{parsed.netloc}/execution/"
|
|
194
|
+
|
|
195
|
+
supervise(
|
|
196
|
+
# This is the "wrong" ti type, but it duck types the same. TODO: Create a protocol for this.
|
|
197
|
+
# Same like in airflow/executors/local_executor.py:_execute_work()
|
|
198
|
+
ti=workload.ti, # type: ignore[arg-type]
|
|
199
|
+
dag_rel_path=workload.dag_rel_path,
|
|
200
|
+
bundle_info=workload.bundle_info,
|
|
201
|
+
token=workload.token,
|
|
202
|
+
server=execution_api_server_url,
|
|
203
|
+
log_path=workload.log_path,
|
|
204
|
+
)
|
|
205
|
+
return 0
|
|
206
|
+
except Exception as e:
|
|
207
|
+
logger.exception("Task execution failed: %s", e)
|
|
208
|
+
return 1
|
|
192
209
|
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
parsed = urlparse(api_url)
|
|
198
|
-
execution_api_server_url = f"{parsed.scheme}://{parsed.netloc}/execution/"
|
|
199
|
-
|
|
200
|
-
logger.info("Worker starting up server=execution_api_server_url=%s", execution_api_server_url)
|
|
201
|
-
|
|
202
|
-
supervise(
|
|
203
|
-
# This is the "wrong" ti type, but it duck types the same. TODO: Create a protocol for this.
|
|
204
|
-
# Same like in airflow/executors/local_executor.py:_execute_work()
|
|
205
|
-
ti=workload.ti, # type: ignore[arg-type]
|
|
206
|
-
dag_rel_path=workload.dag_rel_path,
|
|
207
|
-
bundle_info=workload.bundle_info,
|
|
208
|
-
token=workload.token,
|
|
209
|
-
server=execution_api_server_url,
|
|
210
|
-
log_path=workload.log_path,
|
|
211
|
-
)
|
|
212
|
-
return 0
|
|
213
|
-
except Exception as e:
|
|
214
|
-
logger.exception("Task execution failed: %s", e)
|
|
215
|
-
return 1
|
|
210
|
+
@staticmethod
|
|
211
|
+
def _launch_job_af3(edge_job: EdgeJobFetched) -> tuple[Process, Path]:
|
|
212
|
+
if TYPE_CHECKING:
|
|
213
|
+
from airflow.executors.workloads import ExecuteTask
|
|
216
214
|
|
|
217
215
|
workload: ExecuteTask = edge_job.command
|
|
218
216
|
process = Process(
|
|
219
|
-
target=_run_job_via_supervisor,
|
|
217
|
+
target=EdgeWorker._run_job_via_supervisor,
|
|
220
218
|
kwargs={"workload": workload},
|
|
221
219
|
)
|
|
222
220
|
process.start()
|
|
@@ -226,7 +224,8 @@ class EdgeWorker:
|
|
|
226
224
|
logfile = Path(base_log_folder, workload.log_path)
|
|
227
225
|
return process, logfile
|
|
228
226
|
|
|
229
|
-
|
|
227
|
+
@staticmethod
|
|
228
|
+
def _launch_job_af2_10(edge_job: EdgeJobFetched) -> tuple[Popen, Path]:
|
|
230
229
|
"""Compatibility for Airflow 2.10 Launch."""
|
|
231
230
|
env = os.environ.copy()
|
|
232
231
|
env["AIRFLOW__CORE__DATABASE_ACCESS_ISOLATION"] = "True"
|
|
@@ -237,14 +236,15 @@ class EdgeWorker:
|
|
|
237
236
|
logfile = logs_logfile_path(edge_job.key)
|
|
238
237
|
return process, logfile
|
|
239
238
|
|
|
240
|
-
|
|
239
|
+
@staticmethod
|
|
240
|
+
def _launch_job(edge_job: EdgeJobFetched):
|
|
241
241
|
"""Get the received job executed."""
|
|
242
242
|
process: Popen | Process
|
|
243
243
|
if AIRFLOW_V_3_0_PLUS:
|
|
244
|
-
process, logfile =
|
|
244
|
+
process, logfile = EdgeWorker._launch_job_af3(edge_job)
|
|
245
245
|
else:
|
|
246
246
|
# Airflow 2.10
|
|
247
|
-
process, logfile =
|
|
247
|
+
process, logfile = EdgeWorker._launch_job_af2_10(edge_job)
|
|
248
248
|
EdgeWorker.jobs.append(Job(edge_job, process, logfile, 0))
|
|
249
249
|
|
|
250
250
|
def start(self):
|
|
@@ -316,7 +316,7 @@ class EdgeWorker:
|
|
|
316
316
|
edge_job = jobs_fetch(self.hostname, self.queues, self.free_concurrency)
|
|
317
317
|
if edge_job:
|
|
318
318
|
logger.info("Received job: %s", edge_job)
|
|
319
|
-
|
|
319
|
+
EdgeWorker._launch_job(edge_job)
|
|
320
320
|
jobs_set_state(edge_job.key, TaskInstanceState.RUNNING)
|
|
321
321
|
return True
|
|
322
322
|
|
|
@@ -56,21 +56,21 @@ class EdgeWorkerState(str, Enum):
|
|
|
56
56
|
IDLE = "idle"
|
|
57
57
|
"""Edge Worker is active and waiting for a task."""
|
|
58
58
|
SHUTDOWN_REQUEST = "shutdown request"
|
|
59
|
-
"""Request to shutdown Edge Worker."""
|
|
59
|
+
"""Request to shutdown Edge Worker is issued. It will be picked-up on the next heartbeat, tasks will drain and then worker will terminate."""
|
|
60
60
|
TERMINATING = "terminating"
|
|
61
|
-
"""Edge Worker is completing work and stopping."""
|
|
61
|
+
"""Edge Worker is completing work (draining running tasks) and stopping."""
|
|
62
62
|
OFFLINE = "offline"
|
|
63
63
|
"""Edge Worker was shut down."""
|
|
64
64
|
UNKNOWN = "unknown"
|
|
65
|
-
"""No heartbeat signal from worker for some time, Edge Worker probably down."""
|
|
65
|
+
"""No heartbeat signal from worker for some time, Edge Worker probably down or got disconnected."""
|
|
66
66
|
MAINTENANCE_REQUEST = "maintenance request"
|
|
67
|
-
"""Worker was requested to enter maintenance mode. Once worker receives this it will pause fetching
|
|
67
|
+
"""Worker was requested to enter maintenance mode. Once worker receives this message it will pause fetching tasks and drain tasks."""
|
|
68
68
|
MAINTENANCE_PENDING = "maintenance pending"
|
|
69
|
-
"""Edge
|
|
69
|
+
"""Edge Worker received the request for maintenance, waiting for tasks to finish. Once tasks are finished will move to 'maintenance mode'."""
|
|
70
70
|
MAINTENANCE_MODE = "maintenance mode"
|
|
71
|
-
"""Edge
|
|
71
|
+
"""Edge Worker is in maintenance mode. It is online but pauses fetching tasks."""
|
|
72
72
|
MAINTENANCE_EXIT = "maintenance exit"
|
|
73
|
-
"""Request
|
|
73
|
+
"""Request Worker is requested to exit maintenance mode. Once the worker receives this state it will un-pause and fetch new tasks."""
|
|
74
74
|
OFFLINE_MAINTENANCE = "offline maintenance"
|
|
75
75
|
"""Worker was shut down in maintenance mode. It will be in maintenance mode when restarted."""
|
|
76
76
|
|
|
@@ -264,7 +264,12 @@ def change_maintenance_comment(
|
|
|
264
264
|
"""Write maintenance comment in the db."""
|
|
265
265
|
query = select(EdgeWorkerModel).where(EdgeWorkerModel.worker_name == worker_name)
|
|
266
266
|
worker: EdgeWorkerModel = session.scalar(query)
|
|
267
|
-
if worker.state in (
|
|
267
|
+
if worker.state in (
|
|
268
|
+
EdgeWorkerState.MAINTENANCE_MODE,
|
|
269
|
+
EdgeWorkerState.MAINTENANCE_PENDING,
|
|
270
|
+
EdgeWorkerState.MAINTENANCE_REQUEST,
|
|
271
|
+
EdgeWorkerState.OFFLINE_MAINTENANCE,
|
|
272
|
+
):
|
|
268
273
|
worker.maintenance_comment = maintenance_comment
|
|
269
274
|
else:
|
|
270
275
|
error_message = f"Cannot change maintenance comment as {worker_name} is not in maintenance!"
|