taskflow 5.8.0__tar.gz → 5.9.1__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 (352) hide show
  1. {taskflow-5.8.0 → taskflow-5.9.1}/.zuul.yaml +10 -0
  2. {taskflow-5.8.0 → taskflow-5.9.1}/ChangeLog +12 -0
  3. {taskflow-5.8.0 → taskflow-5.9.1}/PKG-INFO +2 -1
  4. {taskflow-5.8.0 → taskflow-5.9.1}/doc/source/user/jobs.rst +41 -0
  5. {taskflow-5.8.0 → taskflow-5.9.1}/playbooks/tests/functional/Debian.yaml +1 -0
  6. {taskflow-5.8.0 → taskflow-5.9.1}/playbooks/tests/functional/RedHat.yaml +1 -0
  7. taskflow-5.9.1/releasenotes/notes/etcd-jobboard-backend-8a9fea2238fb0f12.yaml +6 -0
  8. taskflow-5.9.1/releasenotes/notes/fix-revert-all-revert-a0310cd7beaa7409.yaml +6 -0
  9. taskflow-5.9.1/setup-etcd-env.sh +31 -0
  10. {taskflow-5.8.0 → taskflow-5.9.1}/setup.cfg +3 -0
  11. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/engines/action_engine/runtime.py +12 -0
  12. taskflow-5.9.1/taskflow/jobs/backends/impl_etcd.py +610 -0
  13. taskflow-5.9.1/taskflow/tests/unit/jobs/test_etcd_job.py +421 -0
  14. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/test_retries.py +52 -0
  15. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/utils.py +36 -0
  16. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow.egg-info/PKG-INFO +2 -1
  17. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow.egg-info/SOURCES.txt +5 -0
  18. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow.egg-info/entry_points.txt +1 -0
  19. taskflow-5.9.1/taskflow.egg-info/pbr.json +1 -0
  20. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow.egg-info/requires.txt +3 -0
  21. {taskflow-5.8.0 → taskflow-5.9.1}/test-requirements.txt +3 -0
  22. {taskflow-5.8.0 → taskflow-5.9.1}/tox.ini +2 -1
  23. taskflow-5.8.0/taskflow.egg-info/pbr.json +0 -1
  24. {taskflow-5.8.0 → taskflow-5.9.1}/.coveragerc +0 -0
  25. {taskflow-5.8.0 → taskflow-5.9.1}/.mailmap +0 -0
  26. {taskflow-5.8.0 → taskflow-5.9.1}/.pre-commit-config.yaml +0 -0
  27. {taskflow-5.8.0 → taskflow-5.9.1}/.stestr.conf +0 -0
  28. {taskflow-5.8.0 → taskflow-5.9.1}/AUTHORS +0 -0
  29. {taskflow-5.8.0 → taskflow-5.9.1}/CONTRIBUTING.rst +0 -0
  30. {taskflow-5.8.0 → taskflow-5.9.1}/LICENSE +0 -0
  31. {taskflow-5.8.0 → taskflow-5.9.1}/README.rst +0 -0
  32. {taskflow-5.8.0 → taskflow-5.9.1}/bindep.txt +0 -0
  33. {taskflow-5.8.0 → taskflow-5.9.1}/doc/diagrams/area_of_influence.graffle.tgz +0 -0
  34. {taskflow-5.8.0 → taskflow-5.9.1}/doc/diagrams/core.graffle.tgz +0 -0
  35. {taskflow-5.8.0 → taskflow-5.9.1}/doc/diagrams/jobboard.graffle.tgz +0 -0
  36. {taskflow-5.8.0 → taskflow-5.9.1}/doc/diagrams/tasks.graffle.tgz +0 -0
  37. {taskflow-5.8.0 → taskflow-5.9.1}/doc/diagrams/worker-engine.graffle.tgz +0 -0
  38. {taskflow-5.8.0 → taskflow-5.9.1}/doc/requirements.txt +0 -0
  39. {taskflow-5.8.0 → taskflow-5.9.1}/doc/source/conf.py +0 -0
  40. {taskflow-5.8.0 → taskflow-5.9.1}/doc/source/index.rst +0 -0
  41. {taskflow-5.8.0 → taskflow-5.9.1}/doc/source/templates/layout.html +0 -0
  42. {taskflow-5.8.0 → taskflow-5.9.1}/doc/source/user/arguments_and_results.rst +0 -0
  43. {taskflow-5.8.0 → taskflow-5.9.1}/doc/source/user/atoms.rst +0 -0
  44. {taskflow-5.8.0 → taskflow-5.9.1}/doc/source/user/conductors.rst +0 -0
  45. {taskflow-5.8.0 → taskflow-5.9.1}/doc/source/user/engines.rst +0 -0
  46. {taskflow-5.8.0 → taskflow-5.9.1}/doc/source/user/examples.rst +0 -0
  47. {taskflow-5.8.0 → taskflow-5.9.1}/doc/source/user/exceptions.rst +0 -0
  48. {taskflow-5.8.0 → taskflow-5.9.1}/doc/source/user/history.rst +0 -0
  49. {taskflow-5.8.0 → taskflow-5.9.1}/doc/source/user/img/area_of_influence.svg +0 -0
  50. {taskflow-5.8.0 → taskflow-5.9.1}/doc/source/user/img/conductor.png +0 -0
  51. {taskflow-5.8.0 → taskflow-5.9.1}/doc/source/user/img/conductor_cycle.png +0 -0
  52. {taskflow-5.8.0 → taskflow-5.9.1}/doc/source/user/img/distributed_flow_rpc.png +0 -0
  53. {taskflow-5.8.0 → taskflow-5.9.1}/doc/source/user/img/engine_states.svg +0 -0
  54. {taskflow-5.8.0 → taskflow-5.9.1}/doc/source/user/img/flow_states.svg +0 -0
  55. {taskflow-5.8.0 → taskflow-5.9.1}/doc/source/user/img/job_states.svg +0 -0
  56. {taskflow-5.8.0 → taskflow-5.9.1}/doc/source/user/img/jobboard.png +0 -0
  57. {taskflow-5.8.0 → taskflow-5.9.1}/doc/source/user/img/mandelbrot.png +0 -0
  58. {taskflow-5.8.0 → taskflow-5.9.1}/doc/source/user/img/retry_states.svg +0 -0
  59. {taskflow-5.8.0 → taskflow-5.9.1}/doc/source/user/img/task_states.svg +0 -0
  60. {taskflow-5.8.0 → taskflow-5.9.1}/doc/source/user/img/tasks.png +0 -0
  61. {taskflow-5.8.0 → taskflow-5.9.1}/doc/source/user/img/wbe_request_states.svg +0 -0
  62. {taskflow-5.8.0 → taskflow-5.9.1}/doc/source/user/img/worker-engine.svg +0 -0
  63. {taskflow-5.8.0 → taskflow-5.9.1}/doc/source/user/index.rst +0 -0
  64. {taskflow-5.8.0 → taskflow-5.9.1}/doc/source/user/inputs_and_outputs.rst +0 -0
  65. {taskflow-5.8.0 → taskflow-5.9.1}/doc/source/user/notifications.rst +0 -0
  66. {taskflow-5.8.0 → taskflow-5.9.1}/doc/source/user/patterns.rst +0 -0
  67. {taskflow-5.8.0 → taskflow-5.9.1}/doc/source/user/persistence.rst +0 -0
  68. {taskflow-5.8.0 → taskflow-5.9.1}/doc/source/user/resumption.rst +0 -0
  69. {taskflow-5.8.0 → taskflow-5.9.1}/doc/source/user/shelf.rst +0 -0
  70. {taskflow-5.8.0 → taskflow-5.9.1}/doc/source/user/states.rst +0 -0
  71. {taskflow-5.8.0 → taskflow-5.9.1}/doc/source/user/types.rst +0 -0
  72. {taskflow-5.8.0 → taskflow-5.9.1}/doc/source/user/utils.rst +0 -0
  73. {taskflow-5.8.0 → taskflow-5.9.1}/doc/source/user/workers.rst +0 -0
  74. {taskflow-5.8.0 → taskflow-5.9.1}/playbooks/tests/functional/pre.yml +0 -0
  75. {taskflow-5.8.0 → taskflow-5.9.1}/pylintrc +0 -0
  76. {taskflow-5.8.0 → taskflow-5.9.1}/releasenotes/notes/.placeholder +0 -0
  77. {taskflow-5.8.0 → taskflow-5.9.1}/releasenotes/notes/add-sentinel-redis-support-9fd16e2a5dd5c0c9.yaml +0 -0
  78. {taskflow-5.8.0 → taskflow-5.9.1}/releasenotes/notes/bug-2056656-871b67ddbc8cfc92.yaml +0 -0
  79. {taskflow-5.8.0 → taskflow-5.9.1}/releasenotes/notes/disable-process_executor-python-312-d1074c816bc8303e.yaml +0 -0
  80. {taskflow-5.8.0 → taskflow-5.9.1}/releasenotes/notes/drop-python-2-7-73d3113c69d724d6.yaml +0 -0
  81. {taskflow-5.8.0 → taskflow-5.9.1}/releasenotes/notes/fix-endless-loop-on-storage-error-dd4467f0bbc66abf.yaml +0 -0
  82. {taskflow-5.8.0 → taskflow-5.9.1}/releasenotes/notes/fix-endless-loop-on-storage-failures-b98b30f0c34d25e1.yaml +0 -0
  83. {taskflow-5.8.0 → taskflow-5.9.1}/releasenotes/notes/fix-storage-failure-handling-5c115d92daa0eb82.yaml +0 -0
  84. {taskflow-5.8.0 → taskflow-5.9.1}/releasenotes/notes/fix-zookeeper-option-parsing-f9d37fbc39af47f4.yaml +0 -0
  85. {taskflow-5.8.0 → taskflow-5.9.1}/releasenotes/notes/redis-username-df0eb33869db09a2.yaml +0 -0
  86. {taskflow-5.8.0 → taskflow-5.9.1}/releasenotes/notes/remove-strict-redis-f2a5a924b314de41.yaml +0 -0
  87. {taskflow-5.8.0 → taskflow-5.9.1}/releasenotes/notes/sentinel-fallbacks-6fe2ab0d68959cdf.yaml +0 -0
  88. {taskflow-5.8.0 → taskflow-5.9.1}/releasenotes/notes/sentinel-ssl-399c56ed7067d282.yaml +0 -0
  89. {taskflow-5.8.0 → taskflow-5.9.1}/releasenotes/notes/sentinel-use-redis-creds-63f58b12ad46a2b5.yaml +0 -0
  90. {taskflow-5.8.0 → taskflow-5.9.1}/releasenotes/notes/zookeeper-ssl-support-b9abf24a39096b62.yaml +0 -0
  91. {taskflow-5.8.0 → taskflow-5.9.1}/releasenotes/source/2023.1.rst +0 -0
  92. {taskflow-5.8.0 → taskflow-5.9.1}/releasenotes/source/2023.2.rst +0 -0
  93. {taskflow-5.8.0 → taskflow-5.9.1}/releasenotes/source/2024.1.rst +0 -0
  94. {taskflow-5.8.0 → taskflow-5.9.1}/releasenotes/source/_static/.placeholder +0 -0
  95. {taskflow-5.8.0 → taskflow-5.9.1}/releasenotes/source/_templates/.placeholder +0 -0
  96. {taskflow-5.8.0 → taskflow-5.9.1}/releasenotes/source/conf.py +0 -0
  97. {taskflow-5.8.0 → taskflow-5.9.1}/releasenotes/source/index.rst +0 -0
  98. {taskflow-5.8.0 → taskflow-5.9.1}/releasenotes/source/ocata.rst +0 -0
  99. {taskflow-5.8.0 → taskflow-5.9.1}/releasenotes/source/pike.rst +0 -0
  100. {taskflow-5.8.0 → taskflow-5.9.1}/releasenotes/source/queens.rst +0 -0
  101. {taskflow-5.8.0 → taskflow-5.9.1}/releasenotes/source/rocky.rst +0 -0
  102. {taskflow-5.8.0 → taskflow-5.9.1}/releasenotes/source/stein.rst +0 -0
  103. {taskflow-5.8.0 → taskflow-5.9.1}/releasenotes/source/train.rst +0 -0
  104. {taskflow-5.8.0 → taskflow-5.9.1}/releasenotes/source/unreleased.rst +0 -0
  105. {taskflow-5.8.0 → taskflow-5.9.1}/releasenotes/source/ussuri.rst +0 -0
  106. {taskflow-5.8.0 → taskflow-5.9.1}/releasenotes/source/victoria.rst +0 -0
  107. {taskflow-5.8.0 → taskflow-5.9.1}/requirements.txt +0 -0
  108. {taskflow-5.8.0 → taskflow-5.9.1}/run_tests.sh +0 -0
  109. {taskflow-5.8.0 → taskflow-5.9.1}/setup.py +0 -0
  110. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/__init__.py +0 -0
  111. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/atom.py +0 -0
  112. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/conductors/__init__.py +0 -0
  113. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/conductors/backends/__init__.py +0 -0
  114. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/conductors/backends/impl_blocking.py +0 -0
  115. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/conductors/backends/impl_executor.py +0 -0
  116. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/conductors/backends/impl_nonblocking.py +0 -0
  117. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/conductors/base.py +0 -0
  118. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/contrib/__init__.py +0 -0
  119. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/deciders.py +0 -0
  120. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/engines/__init__.py +0 -0
  121. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/engines/action_engine/__init__.py +0 -0
  122. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/engines/action_engine/actions/__init__.py +0 -0
  123. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/engines/action_engine/actions/base.py +0 -0
  124. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/engines/action_engine/actions/retry.py +0 -0
  125. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/engines/action_engine/actions/task.py +0 -0
  126. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/engines/action_engine/builder.py +0 -0
  127. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/engines/action_engine/compiler.py +0 -0
  128. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/engines/action_engine/completer.py +0 -0
  129. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/engines/action_engine/deciders.py +0 -0
  130. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/engines/action_engine/engine.py +0 -0
  131. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/engines/action_engine/executor.py +0 -0
  132. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/engines/action_engine/process_executor.py +0 -0
  133. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/engines/action_engine/scheduler.py +0 -0
  134. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/engines/action_engine/scopes.py +0 -0
  135. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/engines/action_engine/selector.py +0 -0
  136. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/engines/action_engine/traversal.py +0 -0
  137. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/engines/base.py +0 -0
  138. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/engines/helpers.py +0 -0
  139. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/engines/worker_based/__init__.py +0 -0
  140. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/engines/worker_based/dispatcher.py +0 -0
  141. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/engines/worker_based/endpoint.py +0 -0
  142. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/engines/worker_based/engine.py +0 -0
  143. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/engines/worker_based/executor.py +0 -0
  144. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/engines/worker_based/protocol.py +0 -0
  145. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/engines/worker_based/proxy.py +0 -0
  146. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/engines/worker_based/server.py +0 -0
  147. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/engines/worker_based/types.py +0 -0
  148. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/engines/worker_based/worker.py +0 -0
  149. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/examples/99_bottles.py +0 -0
  150. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/examples/alphabet_soup.py +0 -0
  151. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/examples/build_a_car.py +0 -0
  152. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/examples/buildsystem.py +0 -0
  153. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/examples/calculate_in_parallel.py +0 -0
  154. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/examples/calculate_linear.py +0 -0
  155. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/examples/create_parallel_volume.py +0 -0
  156. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/examples/delayed_return.py +0 -0
  157. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/examples/distance_calculator.py +0 -0
  158. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/examples/dump_memory_backend.py +0 -0
  159. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/examples/echo_listener.py +0 -0
  160. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/examples/example_utils.py +0 -0
  161. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/examples/fake_billing.py +0 -0
  162. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/examples/graph_flow.py +0 -0
  163. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/examples/hello_world.py +0 -0
  164. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/examples/jobboard_produce_consume_colors.py +0 -0
  165. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/examples/parallel_table_multiply.py +0 -0
  166. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/examples/persistence_example.py +0 -0
  167. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/examples/pseudo_scoping.out.txt +0 -0
  168. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/examples/pseudo_scoping.py +0 -0
  169. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/examples/resume_from_backend.out.txt +0 -0
  170. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/examples/resume_from_backend.py +0 -0
  171. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/examples/resume_many_flows/my_flows.py +0 -0
  172. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/examples/resume_many_flows/resume_all.py +0 -0
  173. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/examples/resume_many_flows/run_flow.py +0 -0
  174. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/examples/resume_many_flows.out.txt +0 -0
  175. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/examples/resume_many_flows.py +0 -0
  176. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/examples/resume_vm_boot.py +0 -0
  177. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/examples/resume_volume_create.py +0 -0
  178. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/examples/retry_flow.out.txt +0 -0
  179. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/examples/retry_flow.py +0 -0
  180. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/examples/reverting_linear.out.txt +0 -0
  181. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/examples/reverting_linear.py +0 -0
  182. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/examples/run_by_iter.out.txt +0 -0
  183. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/examples/run_by_iter.py +0 -0
  184. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/examples/run_by_iter_enumerate.out.txt +0 -0
  185. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/examples/run_by_iter_enumerate.py +0 -0
  186. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/examples/share_engine_thread.py +0 -0
  187. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/examples/simple_linear.out.txt +0 -0
  188. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/examples/simple_linear.py +0 -0
  189. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/examples/simple_linear_listening.out.txt +0 -0
  190. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/examples/simple_linear_listening.py +0 -0
  191. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/examples/simple_linear_pass.out.txt +0 -0
  192. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/examples/simple_linear_pass.py +0 -0
  193. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/examples/simple_map_reduce.py +0 -0
  194. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/examples/switch_graph_flow.py +0 -0
  195. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/examples/timing_listener.py +0 -0
  196. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/examples/tox_conductor.py +0 -0
  197. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/examples/wbe_event_sender.py +0 -0
  198. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/examples/wbe_mandelbrot.out.txt +0 -0
  199. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/examples/wbe_mandelbrot.py +0 -0
  200. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/examples/wbe_simple_linear.out.txt +0 -0
  201. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/examples/wbe_simple_linear.py +0 -0
  202. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/examples/wrapped_exception.py +0 -0
  203. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/exceptions.py +0 -0
  204. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/flow.py +0 -0
  205. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/formatters.py +0 -0
  206. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/jobs/__init__.py +0 -0
  207. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/jobs/backends/__init__.py +0 -0
  208. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/jobs/backends/impl_redis.py +0 -0
  209. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/jobs/backends/impl_zookeeper.py +0 -0
  210. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/jobs/base.py +0 -0
  211. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/listeners/__init__.py +0 -0
  212. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/listeners/base.py +0 -0
  213. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/listeners/capturing.py +0 -0
  214. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/listeners/claims.py +0 -0
  215. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/listeners/logging.py +0 -0
  216. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/listeners/printing.py +0 -0
  217. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/listeners/timing.py +0 -0
  218. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/logging.py +0 -0
  219. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/patterns/__init__.py +0 -0
  220. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/patterns/graph_flow.py +0 -0
  221. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/patterns/linear_flow.py +0 -0
  222. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/patterns/unordered_flow.py +0 -0
  223. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/persistence/__init__.py +0 -0
  224. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/persistence/backends/__init__.py +0 -0
  225. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/persistence/backends/impl_dir.py +0 -0
  226. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/persistence/backends/impl_memory.py +0 -0
  227. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/persistence/backends/impl_sqlalchemy.py +0 -0
  228. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/persistence/backends/impl_zookeeper.py +0 -0
  229. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/persistence/backends/sqlalchemy/__init__.py +0 -0
  230. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/persistence/backends/sqlalchemy/alembic/README +0 -0
  231. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/persistence/backends/sqlalchemy/alembic/alembic.ini +0 -0
  232. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/persistence/backends/sqlalchemy/alembic/env.py +0 -0
  233. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/persistence/backends/sqlalchemy/alembic/script.py.mako +0 -0
  234. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/persistence/backends/sqlalchemy/alembic/versions/0bc3e1a3c135_set_result_meduimtext_type.py +0 -0
  235. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/persistence/backends/sqlalchemy/alembic/versions/14b227d79a87_add_intention_column.py +0 -0
  236. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/persistence/backends/sqlalchemy/alembic/versions/1c783c0c2875_replace_exception_an.py +0 -0
  237. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/persistence/backends/sqlalchemy/alembic/versions/1cea328f0f65_initial_logbook_deta.py +0 -0
  238. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/persistence/backends/sqlalchemy/alembic/versions/2ad4984f2864_switch_postgres_to_json_native.py +0 -0
  239. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/persistence/backends/sqlalchemy/alembic/versions/3162c0f3f8e4_add_revert_results_and_revert_failure_.py +0 -0
  240. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/persistence/backends/sqlalchemy/alembic/versions/40fc8c914bd2_fix_atomdetails_failure_size.py +0 -0
  241. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/persistence/backends/sqlalchemy/alembic/versions/589dccdf2b6e_rename_taskdetails_to_atomdetails.py +0 -0
  242. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/persistence/backends/sqlalchemy/alembic/versions/6df9422fcb43_fix_flowdetails_meta_size.py +0 -0
  243. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/persistence/backends/sqlalchemy/alembic/versions/84d6e888850_add_task_detail_type.py +0 -0
  244. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/persistence/backends/sqlalchemy/alembic/versions/README +0 -0
  245. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/persistence/backends/sqlalchemy/migration.py +0 -0
  246. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/persistence/backends/sqlalchemy/tables.py +0 -0
  247. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/persistence/base.py +0 -0
  248. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/persistence/models.py +0 -0
  249. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/persistence/path_based.py +0 -0
  250. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/retry.py +0 -0
  251. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/states.py +0 -0
  252. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/storage.py +0 -0
  253. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/task.py +0 -0
  254. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/test.py +0 -0
  255. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/__init__.py +0 -0
  256. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/fixtures.py +0 -0
  257. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/test_examples.py +0 -0
  258. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/__init__.py +0 -0
  259. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/action_engine/__init__.py +0 -0
  260. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/action_engine/test_builder.py +0 -0
  261. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/action_engine/test_compile.py +0 -0
  262. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/action_engine/test_creation.py +0 -0
  263. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/action_engine/test_process_executor.py +0 -0
  264. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/action_engine/test_scoping.py +0 -0
  265. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/jobs/__init__.py +0 -0
  266. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/jobs/base.py +0 -0
  267. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/jobs/test_entrypoint.py +0 -0
  268. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/jobs/test_redis_job.py +0 -0
  269. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/jobs/test_zk_job.py +0 -0
  270. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/patterns/__init__.py +0 -0
  271. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/patterns/test_graph_flow.py +0 -0
  272. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/patterns/test_linear_flow.py +0 -0
  273. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/patterns/test_unordered_flow.py +0 -0
  274. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/persistence/__init__.py +0 -0
  275. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/persistence/base.py +0 -0
  276. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/persistence/test_dir_persistence.py +0 -0
  277. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/persistence/test_memory_persistence.py +0 -0
  278. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/persistence/test_sql_persistence.py +0 -0
  279. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/persistence/test_zk_persistence.py +0 -0
  280. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/test_arguments_passing.py +0 -0
  281. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/test_check_transition.py +0 -0
  282. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/test_conductors.py +0 -0
  283. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/test_deciders.py +0 -0
  284. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/test_engine_helpers.py +0 -0
  285. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/test_engines.py +0 -0
  286. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/test_exceptions.py +0 -0
  287. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/test_failure.py +0 -0
  288. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/test_flow_dependencies.py +0 -0
  289. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/test_formatters.py +0 -0
  290. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/test_functor_task.py +0 -0
  291. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/test_listeners.py +0 -0
  292. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/test_mapfunctor_task.py +0 -0
  293. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/test_notifier.py +0 -0
  294. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/test_progress.py +0 -0
  295. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/test_reducefunctor_task.py +0 -0
  296. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/test_states.py +0 -0
  297. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/test_storage.py +0 -0
  298. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/test_suspend.py +0 -0
  299. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/test_task.py +0 -0
  300. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/test_types.py +0 -0
  301. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/test_utils.py +0 -0
  302. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/test_utils_async_utils.py +0 -0
  303. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/test_utils_binary.py +0 -0
  304. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/test_utils_iter_utils.py +0 -0
  305. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/test_utils_kazoo_utils.py +0 -0
  306. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/test_utils_threading_utils.py +0 -0
  307. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/worker_based/__init__.py +0 -0
  308. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/worker_based/test_creation.py +0 -0
  309. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/worker_based/test_dispatcher.py +0 -0
  310. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/worker_based/test_endpoint.py +0 -0
  311. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/worker_based/test_executor.py +0 -0
  312. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/worker_based/test_message_pump.py +0 -0
  313. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/worker_based/test_pipeline.py +0 -0
  314. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/worker_based/test_protocol.py +0 -0
  315. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/worker_based/test_proxy.py +0 -0
  316. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/worker_based/test_server.py +0 -0
  317. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/worker_based/test_types.py +0 -0
  318. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/tests/unit/worker_based/test_worker.py +0 -0
  319. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/types/__init__.py +0 -0
  320. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/types/entity.py +0 -0
  321. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/types/failure.py +0 -0
  322. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/types/graph.py +0 -0
  323. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/types/latch.py +0 -0
  324. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/types/notifier.py +0 -0
  325. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/types/sets.py +0 -0
  326. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/types/timing.py +0 -0
  327. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/types/tree.py +0 -0
  328. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/utils/__init__.py +0 -0
  329. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/utils/async_utils.py +0 -0
  330. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/utils/banner.py +0 -0
  331. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/utils/eventlet_utils.py +0 -0
  332. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/utils/iter_utils.py +0 -0
  333. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/utils/kazoo_utils.py +0 -0
  334. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/utils/kombu_utils.py +0 -0
  335. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/utils/misc.py +0 -0
  336. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/utils/persistence_utils.py +0 -0
  337. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/utils/redis_utils.py +0 -0
  338. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/utils/schema_utils.py +0 -0
  339. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/utils/threading_utils.py +0 -0
  340. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow/version.py +0 -0
  341. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow.egg-info/dependency_links.txt +0 -0
  342. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow.egg-info/not-zip-safe +0 -0
  343. {taskflow-5.8.0 → taskflow-5.9.1}/taskflow.egg-info/top_level.txt +0 -0
  344. {taskflow-5.8.0 → taskflow-5.9.1}/tools/clear_zk.sh +0 -0
  345. {taskflow-5.8.0 → taskflow-5.9.1}/tools/env_builder.sh +0 -0
  346. {taskflow-5.8.0 → taskflow-5.9.1}/tools/pretty_tox.sh +0 -0
  347. {taskflow-5.8.0 → taskflow-5.9.1}/tools/schema_generator.py +0 -0
  348. {taskflow-5.8.0 → taskflow-5.9.1}/tools/speed_test.py +0 -0
  349. {taskflow-5.8.0 → taskflow-5.9.1}/tools/state_graph.py +0 -0
  350. {taskflow-5.8.0 → taskflow-5.9.1}/tools/subunit_trace.py +0 -0
  351. {taskflow-5.8.0 → taskflow-5.9.1}/tools/test-setup.sh +0 -0
  352. {taskflow-5.8.0 → taskflow-5.9.1}/tools/update_states.sh +0 -0
@@ -13,6 +13,14 @@
13
13
  tox_environment:
14
14
  PIFPAF_DAEMON: redis
15
15
 
16
+ - job:
17
+ name: taskflow-functional-etcd
18
+ parent: taskflow-functional
19
+ vars:
20
+ tox_environment:
21
+ PIFPAF_DAEMON: etcd
22
+ SETUP_ENV_SCRIPT: ./setup-etcd-env.sh
23
+
16
24
  - project:
17
25
  templates:
18
26
  - check-requirements
@@ -25,6 +33,8 @@
25
33
  check:
26
34
  jobs:
27
35
  - taskflow-functional-redis
36
+ - taskflow-functional-etcd
28
37
  gate:
29
38
  jobs:
30
39
  - taskflow-functional-redis
40
+ - taskflow-functional-etcd
@@ -1,10 +1,22 @@
1
1
  CHANGES
2
2
  =======
3
3
 
4
+ 5.9.1
5
+ -----
6
+
7
+
8
+ 5.9.0
9
+ -----
10
+
11
+ * Follow-up of "Add Etcd backend for jobboard"
12
+ * Add functional test with etcd
13
+ * Add Etcd backend for jobboard
14
+
4
15
  5.8.0
5
16
  -----
6
17
 
7
18
  * Python3.12: disable process\_executor, which depends on asyncore
19
+ * Fix REVERT\_ALL with Retries in unordered Flows
8
20
  * Remove SQLAlchemy tips jobs
9
21
  * Remove old excludes
10
22
  * Remove assertRaisesRegex
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: taskflow
3
- Version: 5.8.0
3
+ Version: 5.9.1
4
4
  Summary: Taskflow structured state management library.
5
5
  Home-page: https://docs.openstack.org/taskflow/latest/
6
6
  Author: OpenStack
@@ -101,6 +101,7 @@ Classifier: Topic :: Software Development :: Libraries
101
101
  Classifier: Topic :: System :: Distributed Computing
102
102
  Requires-Python: >=3.8
103
103
  Provides-Extra: database
104
+ Provides-Extra: etcd
104
105
  Provides-Extra: eventlet
105
106
  Provides-Extra: redis
106
107
  Provides-Extra: test
@@ -288,6 +288,40 @@ optionally expire after a given amount of time).
288
288
  See :py:class:`~taskflow.jobs.backends.impl_redis.RedisJobBoard`
289
289
  for implementation details.
290
290
 
291
+ Etcd
292
+ ----
293
+
294
+ **Board type**: ``'etcd'``
295
+
296
+ Uses `etcd`_ to provide the jobboard capabilities by using Etcd key values data
297
+ structures and individual job ownership key (that can optionally expire after a
298
+ given amount of time).
299
+
300
+ Additional *kwarg* parameters:
301
+
302
+ * ``persistence``: a class that provides a :doc:`persistence <persistence>`
303
+ backend interface; it will be used for loading jobs logbooks for usage at
304
+ runtime or for usage before a job is claimed for introspection.
305
+
306
+ Additional *configuration* parameters:
307
+
308
+ * ``path``: the Etcd path to store job information (*defaults* to
309
+ ``jobboard``)
310
+ * ``host``: the Etcd host to connect to (*defaults* to ``localhost``)
311
+ * ``port``: the port of the Etcd server (*defaults* to ``2379``)
312
+ * ``api_path``: the path of the Etcd API endpoint
313
+ * ``protocol``: the protocol used to communicate with the server (*defaults* to
314
+ ``http``, choices are ``http`` or ``https``)
315
+ * ``ca_cert``, ``cert_key`` and ``cert_cert``: the certificate information
316
+ passed to Etcd3gw for ``https`` communications
317
+ * ``timeout``: the timeout used when performing operations with Etcd
318
+ * ``ttl``: the default time-to-live when claiming a job (*defaults* to
319
+ ``None``)
320
+
321
+ .. note::
322
+ See :py:class:`~taskflow.jobs.backends.impl_etcd.EtcdJobBoard`
323
+ for implementation details.
324
+
291
325
  Considerations
292
326
  ==============
293
327
 
@@ -356,6 +390,11 @@ Redis
356
390
 
357
391
  .. automodule:: taskflow.jobs.backends.impl_redis
358
392
 
393
+ Etcd
394
+ ----
395
+
396
+ .. automodule:: taskflow.jobs.backends.impl_etcd
397
+
359
398
  Hierarchy
360
399
  =========
361
400
 
@@ -363,6 +402,7 @@ Hierarchy
363
402
  taskflow.jobs.base
364
403
  taskflow.jobs.backends.impl_redis
365
404
  taskflow.jobs.backends.impl_zookeeper
405
+ taskflow.jobs.backends.impl_etcd
366
406
  :parts: 1
367
407
 
368
408
  .. _paradigm shift: https://wiki.openstack.org/wiki/TaskFlow/Paradigm_shifts#Workflow_ownership_transfer
@@ -370,3 +410,4 @@ Hierarchy
370
410
  .. _kazoo: https://kazoo.readthedocs.io/en/latest/
371
411
  .. _stevedore: https://docs.openstack.org/stevedore/latest
372
412
  .. _redis: https://redis.io/
413
+ .. _etcd: https://etcd.io/
@@ -3,3 +3,4 @@ backend_services_map:
3
3
  redis:
4
4
  - redis-server
5
5
  - redis-sentinel
6
+ etcd: []
@@ -3,3 +3,4 @@ backend_services_map:
3
3
  redis:
4
4
  - redis
5
5
  - redis-sentinel
6
+ etcd: []
@@ -0,0 +1,6 @@
1
+ ---
2
+ features:
3
+ - |
4
+ Added an Etcd-based backend for jobboard. This backend is similar to the
5
+ Redis backend, it requires that the consumer extends the expiry of the job
6
+ that is being running.
@@ -0,0 +1,6 @@
1
+ ---
2
+ fixes:
3
+ - |
4
+ Fixed a bug when using retries with unordered flows, a REVERT_ALL triggered
5
+ by one of the subflow was overriden by an other subflow running in parallel,
6
+ leading to an incomplete revert of the flow.
@@ -0,0 +1,31 @@
1
+ #!/bin/bash
2
+ set -eux
3
+ if [ -z "$(which etcd)" ]; then
4
+ ETCD_VERSION=3.3.27
5
+ case `uname -s` in
6
+ Darwin)
7
+ OS=darwin
8
+ SUFFIX=zip
9
+ ;;
10
+ Linux)
11
+ OS=linux
12
+ SUFFIX=tar.gz
13
+ ;;
14
+ *)
15
+ echo "Unsupported OS"
16
+ exit 1
17
+ esac
18
+ case `uname -m` in
19
+ x86_64)
20
+ MACHINE=amd64
21
+ ;;
22
+ *)
23
+ echo "Unsupported machine"
24
+ exit 1
25
+ esac
26
+ TARBALL_NAME=etcd-v${ETCD_VERSION}-$OS-$MACHINE
27
+ test ! -d "$TARBALL_NAME" && curl -L https://github.com/coreos/etcd/releases/download/v${ETCD_VERSION}/${TARBALL_NAME}.${SUFFIX} | tar xz
28
+ export PATH=$PATH:$TARBALL_NAME
29
+ fi
30
+
31
+ $*
@@ -34,6 +34,7 @@ packages =
34
34
  taskflow.jobboards =
35
35
  zookeeper = taskflow.jobs.backends.impl_zookeeper:ZookeeperJobBoard
36
36
  redis = taskflow.jobs.backends.impl_redis:RedisJobBoard
37
+ etcd = taskflow.jobs.backends.impl_etcd:EtcdJobBoard
37
38
  taskflow.conductors =
38
39
  blocking = taskflow.conductors.backends.impl_blocking:BlockingConductor
39
40
  nonblocking = taskflow.conductors.backends.impl_nonblocking:NonBlockingConductor
@@ -58,6 +59,8 @@ zookeeper =
58
59
  zake>=0.1.6 # Apache-2.0
59
60
  redis =
60
61
  redis>=4.0.0 # MIT
62
+ etcd =
63
+ etcd3gw>=2.0.0 # Apache-2.0
61
64
  workers =
62
65
  kombu>=4.3.0 # BSD
63
66
  eventlet =
@@ -291,6 +291,18 @@ class Runtime(object):
291
291
  """Resets all the provided atoms to the given state and intention."""
292
292
  tweaked = []
293
293
  for atom in atoms:
294
+ cur_intention = self.storage.get_atom_intention(atom.name)
295
+ # Don't trigger a RETRY if the atom needs to be REVERTED.
296
+ # This is a workaround for a bug when REVERT_ALL is applied to
297
+ # unordered flows
298
+ # (https://bugs.launchpad.net/taskflow/+bug/2043808)
299
+ # A subflow may trigger a REVERT_ALL, all the atoms of all the
300
+ # related subflows are marked as REVERT but a task of a related
301
+ # flow may still be running in another thread. If this task
302
+ # triggers a RETRY, it overrides the previously set REVERT status,
303
+ # breaking the revert path of the flow.
304
+ if cur_intention == st.REVERT and intention == st.RETRY:
305
+ continue
294
306
  if state or intention:
295
307
  tweaked.append((atom, state, intention))
296
308
  if state: