apache-airflow-providers-edge3 1.2.0__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.
Files changed (160) hide show
  1. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/PKG-INFO +7 -7
  2. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/README.rst +3 -3
  3. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/docs/architecture.rst +0 -1
  4. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/docs/changelog.rst +41 -0
  5. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/docs/deployment.rst +5 -6
  6. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/docs/edge_executor.rst +1 -1
  7. apache_airflow_providers_edge3-1.3.0rc1/docs/img/worker_hosts.png +0 -0
  8. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/docs/index.rst +1 -1
  9. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/docs/install_on_windows.rst +2 -0
  10. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/docs/ui_plugin.rst +7 -10
  11. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/provider.yaml +2 -1
  12. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/pyproject.toml +4 -4
  13. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/__init__.py +1 -1
  14. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/cli/edge_command.py +43 -0
  15. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/cli/worker.py +40 -40
  16. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/models/edge_worker.py +13 -8
  17. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/openapi/v2-edge-generated.yaml +249 -0
  18. apache_airflow_providers_edge3-1.3.0rc1/src/airflow/providers/edge3/plugins/www/dist/main.umd.cjs +158 -0
  19. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/openapi-gen/queries/common.ts +7 -0
  20. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/openapi-gen/queries/queries.ts +44 -1
  21. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/openapi-gen/requests/schemas.gen.ts +14 -0
  22. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/openapi-gen/requests/services.gen.ts +158 -1
  23. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/openapi-gen/requests/types.gen.ts +155 -0
  24. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/package.json +14 -10
  25. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/pnpm-lock.yaml +601 -457
  26. apache_airflow_providers_edge3-1.3.0rc1/src/airflow/providers/edge3/plugins/www/src/components/AddQueueButton.tsx +138 -0
  27. apache_airflow_providers_edge3-1.3.0rc1/src/airflow/providers/edge3/plugins/www/src/components/MaintenanceEditCommentButton.tsx +106 -0
  28. apache_airflow_providers_edge3-1.3.0rc1/src/airflow/providers/edge3/plugins/www/src/components/MaintenanceEnterButton.tsx +102 -0
  29. apache_airflow_providers_edge3-1.3.0rc1/src/airflow/providers/edge3/plugins/www/src/components/MaintenanceExitButton.tsx +92 -0
  30. apache_airflow_providers_edge3-1.3.0rc1/src/airflow/providers/edge3/plugins/www/src/components/RemoveQueueButton.tsx +151 -0
  31. apache_airflow_providers_edge3-1.3.0rc1/src/airflow/providers/edge3/plugins/www/src/components/WorkerDeleteButton.tsx +104 -0
  32. apache_airflow_providers_edge3-1.3.0rc1/src/airflow/providers/edge3/plugins/www/src/components/WorkerOperations.tsx +85 -0
  33. apache_airflow_providers_edge3-1.3.0rc1/src/airflow/providers/edge3/plugins/www/src/components/WorkerShutdownButton.tsx +104 -0
  34. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/src/components/WorkerStateBadge.tsx +33 -0
  35. apache_airflow_providers_edge3-1.3.0rc1/src/airflow/providers/edge3/plugins/www/src/components/ui/ScrollToAnchor.tsx +49 -0
  36. apache_airflow_providers_edge3-1.3.0rc1/src/airflow/providers/edge3/plugins/www/src/components/ui/createToaster.ts +24 -0
  37. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/src/components/ui/index.ts +2 -0
  38. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/src/context/colorMode/ColorModeProvider.tsx +1 -2
  39. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/src/context/colorMode/useColorMode.tsx +2 -5
  40. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/src/pages/JobsPage.tsx +52 -15
  41. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/src/pages/WorkerPage.tsx +52 -22
  42. apache_airflow_providers_edge3-1.3.0rc1/src/airflow/providers/edge3/plugins/www/src/theme.ts +424 -0
  43. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/vite.config.ts +2 -0
  44. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/worker_api/datamodels_ui.py +12 -0
  45. apache_airflow_providers_edge3-1.3.0rc1/src/airflow/providers/edge3/worker_api/routes/ui.py +292 -0
  46. apache_airflow_providers_edge3-1.3.0rc1/www-hash.txt +1 -0
  47. apache_airflow_providers_edge3-1.2.0/docs/img/worker_hosts.png +0 -0
  48. apache_airflow_providers_edge3-1.2.0/docs/img/worker_maintenance.png +0 -0
  49. apache_airflow_providers_edge3-1.2.0/src/airflow/providers/edge3/plugins/www/dist/main.umd.cjs +0 -124
  50. apache_airflow_providers_edge3-1.2.0/src/airflow/providers/edge3/plugins/www/src/theme.ts +0 -176
  51. apache_airflow_providers_edge3-1.2.0/src/airflow/providers/edge3/worker_api/routes/ui.py +0 -102
  52. apache_airflow_providers_edge3-1.2.0/www-hash.txt +0 -1
  53. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/docs/cli-ref.rst +0 -0
  54. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/docs/commits.rst +0 -0
  55. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/docs/conf.py +0 -0
  56. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/docs/configurations-ref.rst +0 -0
  57. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/docs/img/distributed_architecture.svg +0 -0
  58. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/docs/img/edge_package.svg +0 -0
  59. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/docs/installing-providers-from-sources.rst +0 -0
  60. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/docs/security.rst +0 -0
  61. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/docs/why_edge.rst +0 -0
  62. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/__init__.py +0 -0
  63. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/__init__.py +0 -0
  64. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/LICENSE +0 -0
  65. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/cli/__init__.py +0 -0
  66. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/cli/api_client.py +0 -0
  67. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/cli/dataclasses.py +0 -0
  68. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/cli/signalling.py +0 -0
  69. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/example_dags/__init__.py +0 -0
  70. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/example_dags/integration_test.py +0 -0
  71. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/example_dags/win_notepad.py +0 -0
  72. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/example_dags/win_test.py +0 -0
  73. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/executors/__init__.py +0 -0
  74. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/executors/edge_executor.py +0 -0
  75. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/get_provider_info.py +0 -0
  76. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/models/__init__.py +0 -0
  77. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/models/edge_job.py +0 -0
  78. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/models/edge_logs.py +0 -0
  79. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/openapi/__init__.py +0 -0
  80. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/openapi/edge_worker_api_v1.yaml +0 -0
  81. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/__init__.py +0 -0
  82. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/edge_executor_plugin.py +0 -0
  83. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/templates/edge_worker_hosts.html +0 -0
  84. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/templates/edge_worker_jobs.html +0 -0
  85. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/.gitignore +0 -0
  86. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/.prettierignore +0 -0
  87. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/.prettierrc +0 -0
  88. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/README.md +0 -0
  89. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/dist/main.d.ts +0 -0
  90. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/eslint.config.js +0 -0
  91. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/index.html +0 -0
  92. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/openapi-gen/queries/ensureQueryData.ts +0 -0
  93. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/openapi-gen/queries/index.ts +0 -0
  94. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/openapi-gen/queries/infiniteQueries.ts +0 -0
  95. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/openapi-gen/queries/prefetch.ts +0 -0
  96. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/openapi-gen/queries/suspense.ts +0 -0
  97. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/openapi-gen/requests/core/ApiError.ts +0 -0
  98. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/openapi-gen/requests/core/ApiRequestOptions.ts +0 -0
  99. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/openapi-gen/requests/core/ApiResult.ts +0 -0
  100. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/openapi-gen/requests/core/CancelablePromise.ts +0 -0
  101. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/openapi-gen/requests/core/OpenAPI.ts +0 -0
  102. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/openapi-gen/requests/core/request.ts +0 -0
  103. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/openapi-gen/requests/index.ts +0 -0
  104. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/src/components/ErrorAlert.tsx +0 -0
  105. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/src/components/StateBadge.tsx +0 -0
  106. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/src/components/StateIcon.tsx +0 -0
  107. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/src/components/WorkerStateIcon.tsx +0 -0
  108. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/src/components/ui/Alert.tsx +0 -0
  109. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/src/components/ui/CloseButton.tsx +0 -0
  110. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/src/context/colorMode/index.ts +0 -0
  111. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/src/dev.tsx +0 -0
  112. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/src/layouts/EdgeLayout.tsx +0 -0
  113. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/src/layouts/NavTabs.tsx +0 -0
  114. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/src/main.tsx +0 -0
  115. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/src/res/README.md +0 -0
  116. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/src/res/cloud-computer-dark.svg +0 -0
  117. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/src/res/cloud-computer.svg +0 -0
  118. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/src/utils/config.ts +0 -0
  119. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/src/utils/index.ts +0 -0
  120. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/src/utils/tokenHandler.ts +0 -0
  121. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/src/utils/useContainerWidth.ts +0 -0
  122. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/src/vite-env.d.ts +0 -0
  123. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/testsSetup.ts +0 -0
  124. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/tsconfig.app.json +0 -0
  125. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/tsconfig.json +0 -0
  126. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/tsconfig.lib.json +0 -0
  127. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/plugins/www/tsconfig.node.json +0 -0
  128. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/version_compat.py +0 -0
  129. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/worker_api/__init__.py +0 -0
  130. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/worker_api/app.py +0 -0
  131. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/worker_api/auth.py +0 -0
  132. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/worker_api/datamodels.py +0 -0
  133. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/worker_api/routes/__init__.py +0 -0
  134. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/worker_api/routes/_v2_compat.py +0 -0
  135. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/worker_api/routes/_v2_routes.py +0 -0
  136. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/worker_api/routes/health.py +0 -0
  137. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/worker_api/routes/jobs.py +0 -0
  138. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/worker_api/routes/logs.py +0 -0
  139. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/src/airflow/providers/edge3/worker_api/routes/worker.py +0 -0
  140. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/tests/conftest.py +0 -0
  141. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/tests/unit/__init__.py +0 -0
  142. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/tests/unit/edge3/__init__.py +0 -0
  143. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/tests/unit/edge3/cli/__init__.py +0 -0
  144. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/tests/unit/edge3/cli/test_api_client.py +0 -0
  145. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/tests/unit/edge3/cli/test_dataclasses.py +0 -0
  146. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/tests/unit/edge3/cli/test_edge_command.py +0 -0
  147. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/tests/unit/edge3/cli/test_signalling.py +0 -0
  148. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/tests/unit/edge3/cli/test_worker.py +0 -0
  149. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/tests/unit/edge3/executors/__init__.py +0 -0
  150. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/tests/unit/edge3/executors/test_edge_executor.py +0 -0
  151. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/tests/unit/edge3/models/__init__.py +0 -0
  152. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/tests/unit/edge3/plugins/__init__.py +0 -0
  153. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/tests/unit/edge3/plugins/test_edge_executor_plugin.py +0 -0
  154. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/tests/unit/edge3/worker_api/__init__.py +0 -0
  155. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/tests/unit/edge3/worker_api/routes/__init__.py +0 -0
  156. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/tests/unit/edge3/worker_api/routes/test_health.py +0 -0
  157. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/tests/unit/edge3/worker_api/routes/test_jobs.py +0 -0
  158. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/tests/unit/edge3/worker_api/routes/test_logs.py +0 -0
  159. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/tests/unit/edge3/worker_api/routes/test_ui.py +0 -0
  160. {apache_airflow_providers_edge3-1.2.0 → apache_airflow_providers_edge3-1.3.0rc1}/tests/unit/edge3/worker_api/routes/test_worker.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: apache-airflow-providers-edge3
3
- Version: 1.2.0
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>
@@ -20,12 +20,12 @@ Classifier: Programming Language :: Python :: 3.11
20
20
  Classifier: Programming Language :: Python :: 3.12
21
21
  Classifier: Programming Language :: Python :: 3.13
22
22
  Classifier: Topic :: System :: Monitoring
23
- Requires-Dist: apache-airflow>=2.10.0
23
+ 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.apache.org/docs/apache-airflow-providers-edge3/1.2.0/changelog.html
28
- Project-URL: Documentation, https://airflow.apache.org/docs/apache-airflow-providers-edge3/1.2.0
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.2.0``
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.2.0/>`_.
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.2.0/changelog.html>`_.
107
+ `changelog <https://airflow.apache.org/docs/apache-airflow-providers-edge3/1.3.0/changelog.html>`_.
108
108
 
@@ -23,7 +23,7 @@
23
23
 
24
24
  Package ``apache-airflow-providers-edge3``
25
25
 
26
- Release: ``1.2.0``
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.2.0/>`_.
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.2.0/changelog.html>`_.
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 Hosts" page.
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
- As of time of writing the web UI to see edge jobs and manage workers is not ported to Airflow 3.0.
140
- Until this is available you can use the CLI commands as described in :ref:`deployment:maintenance-mgmt-cli`.
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 Hosts" page.
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 ~50 workers until now. Note that executed tasks require more webserver API capacity.
112
+ operation with ~80 workers until now. Note that executed tasks require more webserver API capacity.
@@ -90,7 +90,7 @@ Additional REST API endpoints are provided to distribute tasks and manage the ed
90
90
  are provided by the API server.
91
91
 
92
92
 
93
- Release: 1.2.0
93
+ Release: 1.3.0
94
94
 
95
95
  Provider package
96
96
  ----------------
@@ -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 currently only available in Airflow 2.10+, implementation for
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 (Airflow 2.10 only)
42
- ---------------------------------
40
+ Web UI Plugin
41
+ -------------
43
42
 
44
43
  .. note::
45
44
 
46
- As of time of writing the web UI to see edge jobs and manage workers is not ported to Airflow 3.0.
47
- Until this is available you can use the CLI commands as described in :ref:`deployment:maintenance-mgmt-cli`.
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 Hosts" page.
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 Hosts" page.
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.
@@ -33,13 +33,14 @@ description: |
33
33
  are provided by the API server.
34
34
 
35
35
  state: ready
36
- source-date-epoch: 1756876811
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
@@ -25,7 +25,7 @@ build-backend = "flit_core.buildapi"
25
25
 
26
26
  [project]
27
27
  name = "apache-airflow-providers-edge3"
28
- version = "1.2.0"
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 = [
@@ -57,7 +57,7 @@ requires-python = ">=3.10"
57
57
  # Make sure to run ``prek update-providers-dependencies --all-files``
58
58
  # After you modify the dependencies, and rebuild your Breeze CI image with ``breeze ci-image build``
59
59
  dependencies = [
60
- "apache-airflow>=2.10.0",
60
+ "apache-airflow>=2.10.0rc1",
61
61
  "pydantic>=2.11.0",
62
62
  "retryhttp>=1.2.0,!=1.3.0",
63
63
  ]
@@ -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.apache.org/docs/apache-airflow-providers-edge3/1.2.0"
100
- "Changelog" = "https://airflow.apache.org/docs/apache-airflow-providers-edge3/1.2.0/changelog.html"
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.2.0"
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
- def _launch_job_af3(self, edge_job: EdgeJobFetched) -> tuple[Process, Path]:
179
- if TYPE_CHECKING:
180
- from airflow.executors.workloads import ExecuteTask
178
+ @staticmethod
179
+ def _run_job_via_supervisor(workload) -> int:
180
+ from airflow.sdk.execution_time.supervisor import supervise
181
181
 
182
- def _run_job_via_supervisor(
183
- workload: ExecuteTask,
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
- # Ignore ctrl-c in this process -- we don't want to kill _this_ one. we let tasks run to completion
188
- signal.signal(signal.SIGINT, signal.SIG_IGN)
185
+ logger.info("Worker starting up pid=%d", os.getpid())
186
+ setproctitle(f"airflow edge worker: {workload.ti.key}")
189
187
 
190
- logger.info("Worker starting up pid=%d", os.getpid())
191
- setproctitle(f"airflow edge worker: {workload.ti.key}")
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
- try:
194
- api_url = conf.get("edge", "api_url")
195
- execution_api_server_url = conf.get("core", "execution_api_server_url", fallback="")
196
- if not execution_api_server_url:
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
- def _launch_job_af2_10(self, edge_job: EdgeJobFetched) -> tuple[Popen, Path]:
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
- def _launch_job(self, edge_job: EdgeJobFetched):
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 = self._launch_job_af3(edge_job)
244
+ process, logfile = EdgeWorker._launch_job_af3(edge_job)
245
245
  else:
246
246
  # Airflow 2.10
247
- process, logfile = self._launch_job_af2_10(edge_job)
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
- self._launch_job(edge_job)
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 jobs."""
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 worker received the request for maintenance, waiting for jobs to finish. Once jobs are finished will move to 'maintenance mode'."""
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 worker is in maintenance mode. It is online but pauses fetching jobs."""
71
+ """Edge Worker is in maintenance mode. It is online but pauses fetching tasks."""
72
72
  MAINTENANCE_EXIT = "maintenance exit"
73
- """Request worker to exit maintenance mode. Once the worker receives this state it will un-pause and fetch new jobs."""
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 (EdgeWorkerState.MAINTENANCE_MODE, EdgeWorkerState.OFFLINE_MAINTENANCE):
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!"