taskflow 5.4.0__tar.gz → 5.6.0__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 (343) hide show
  1. {taskflow-5.4.0 → taskflow-5.6.0}/.coveragerc +1 -1
  2. {taskflow-5.4.0 → taskflow-5.6.0}/.pre-commit-config.yaml +1 -1
  3. {taskflow-5.4.0 → taskflow-5.6.0}/.zuul.yaml +3 -1
  4. {taskflow-5.4.0 → taskflow-5.6.0}/AUTHORS +1 -0
  5. {taskflow-5.4.0 → taskflow-5.6.0}/ChangeLog +27 -0
  6. {taskflow-5.4.0 → taskflow-5.6.0}/PKG-INFO +2 -1
  7. taskflow-5.6.0/bindep.txt +17 -0
  8. taskflow-5.6.0/releasenotes/notes/bug-2056656-871b67ddbc8cfc92.yaml +7 -0
  9. taskflow-5.6.0/releasenotes/notes/fix-endless-loop-on-storage-failures-b98b30f0c34d25e1.yaml +5 -0
  10. taskflow-5.6.0/releasenotes/notes/fix-storage-failure-handling-5c115d92daa0eb82.yaml +6 -0
  11. taskflow-5.6.0/releasenotes/notes/redis-username-df0eb33869db09a2.yaml +5 -0
  12. taskflow-5.6.0/releasenotes/notes/sentinel-fallbacks-6fe2ab0d68959cdf.yaml +5 -0
  13. taskflow-5.6.0/releasenotes/notes/sentinel-ssl-399c56ed7067d282.yaml +5 -0
  14. taskflow-5.6.0/releasenotes/notes/sentinel-use-redis-creds-63f58b12ad46a2b5.yaml +11 -0
  15. taskflow-5.6.0/releasenotes/source/2023.2.rst +6 -0
  16. {taskflow-5.4.0 → taskflow-5.6.0}/releasenotes/source/index.rst +1 -0
  17. {taskflow-5.4.0 → taskflow-5.6.0}/requirements.txt +0 -4
  18. {taskflow-5.4.0 → taskflow-5.6.0}/setup.cfg +2 -1
  19. {taskflow-5.4.0 → taskflow-5.6.0}/setup.py +0 -9
  20. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/conductors/backends/impl_executor.py +11 -2
  21. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/jobs/backends/impl_redis.py +19 -8
  22. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/jobs/backends/impl_zookeeper.py +1 -1
  23. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/jobs/base.py +10 -0
  24. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/storage.py +4 -2
  25. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/jobs/test_redis_job.py +61 -1
  26. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/jobs/test_zk_job.py +2 -2
  27. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/patterns/test_graph_flow.py +3 -3
  28. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/patterns/test_linear_flow.py +3 -3
  29. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/patterns/test_unordered_flow.py +1 -1
  30. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow.egg-info/PKG-INFO +2 -1
  31. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow.egg-info/SOURCES.txt +8 -0
  32. taskflow-5.6.0/taskflow.egg-info/pbr.json +1 -0
  33. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow.egg-info/requires.txt +1 -1
  34. {taskflow-5.4.0 → taskflow-5.6.0}/test-requirements.txt +2 -2
  35. {taskflow-5.4.0 → taskflow-5.6.0}/tools/schema_generator.py +1 -1
  36. {taskflow-5.4.0 → taskflow-5.6.0}/tools/state_graph.py +1 -1
  37. {taskflow-5.4.0 → taskflow-5.6.0}/tools/subunit_trace.py +1 -1
  38. {taskflow-5.4.0 → taskflow-5.6.0}/tox.ini +1 -1
  39. taskflow-5.4.0/bindep.txt +0 -12
  40. taskflow-5.4.0/taskflow.egg-info/pbr.json +0 -1
  41. {taskflow-5.4.0 → taskflow-5.6.0}/.mailmap +0 -0
  42. {taskflow-5.4.0 → taskflow-5.6.0}/.stestr.conf +0 -0
  43. {taskflow-5.4.0 → taskflow-5.6.0}/CONTRIBUTING.rst +0 -0
  44. {taskflow-5.4.0 → taskflow-5.6.0}/LICENSE +0 -0
  45. {taskflow-5.4.0 → taskflow-5.6.0}/README.rst +0 -0
  46. {taskflow-5.4.0 → taskflow-5.6.0}/doc/diagrams/area_of_influence.graffle.tgz +0 -0
  47. {taskflow-5.4.0 → taskflow-5.6.0}/doc/diagrams/core.graffle.tgz +0 -0
  48. {taskflow-5.4.0 → taskflow-5.6.0}/doc/diagrams/jobboard.graffle.tgz +0 -0
  49. {taskflow-5.4.0 → taskflow-5.6.0}/doc/diagrams/tasks.graffle.tgz +0 -0
  50. {taskflow-5.4.0 → taskflow-5.6.0}/doc/diagrams/worker-engine.graffle.tgz +0 -0
  51. {taskflow-5.4.0 → taskflow-5.6.0}/doc/requirements.txt +0 -0
  52. {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/conf.py +0 -0
  53. {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/index.rst +0 -0
  54. {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/templates/layout.html +0 -0
  55. {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/arguments_and_results.rst +0 -0
  56. {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/atoms.rst +0 -0
  57. {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/conductors.rst +0 -0
  58. {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/engines.rst +0 -0
  59. {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/examples.rst +0 -0
  60. {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/exceptions.rst +0 -0
  61. {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/history.rst +0 -0
  62. {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/img/area_of_influence.svg +0 -0
  63. {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/img/conductor.png +0 -0
  64. {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/img/conductor_cycle.png +0 -0
  65. {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/img/distributed_flow_rpc.png +0 -0
  66. {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/img/engine_states.svg +0 -0
  67. {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/img/flow_states.svg +0 -0
  68. {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/img/job_states.svg +0 -0
  69. {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/img/jobboard.png +0 -0
  70. {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/img/mandelbrot.png +0 -0
  71. {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/img/retry_states.svg +0 -0
  72. {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/img/task_states.svg +0 -0
  73. {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/img/tasks.png +0 -0
  74. {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/img/wbe_request_states.svg +0 -0
  75. {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/img/worker-engine.svg +0 -0
  76. {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/index.rst +0 -0
  77. {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/inputs_and_outputs.rst +0 -0
  78. {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/jobs.rst +0 -0
  79. {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/notifications.rst +0 -0
  80. {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/patterns.rst +0 -0
  81. {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/persistence.rst +0 -0
  82. {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/resumption.rst +0 -0
  83. {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/shelf.rst +0 -0
  84. {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/states.rst +0 -0
  85. {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/types.rst +0 -0
  86. {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/utils.rst +0 -0
  87. {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/workers.rst +0 -0
  88. {taskflow-5.4.0 → taskflow-5.6.0}/pylintrc +0 -0
  89. {taskflow-5.4.0 → taskflow-5.6.0}/releasenotes/notes/.placeholder +0 -0
  90. {taskflow-5.4.0 → taskflow-5.6.0}/releasenotes/notes/add-sentinel-redis-support-9fd16e2a5dd5c0c9.yaml +0 -0
  91. {taskflow-5.4.0 → taskflow-5.6.0}/releasenotes/notes/drop-python-2-7-73d3113c69d724d6.yaml +0 -0
  92. {taskflow-5.4.0 → taskflow-5.6.0}/releasenotes/notes/fix-endless-loop-on-storage-error-dd4467f0bbc66abf.yaml +0 -0
  93. {taskflow-5.4.0 → taskflow-5.6.0}/releasenotes/notes/fix-zookeeper-option-parsing-f9d37fbc39af47f4.yaml +0 -0
  94. {taskflow-5.4.0 → taskflow-5.6.0}/releasenotes/notes/remove-strict-redis-f2a5a924b314de41.yaml +0 -0
  95. {taskflow-5.4.0 → taskflow-5.6.0}/releasenotes/notes/zookeeper-ssl-support-b9abf24a39096b62.yaml +0 -0
  96. {taskflow-5.4.0 → taskflow-5.6.0}/releasenotes/source/2023.1.rst +0 -0
  97. {taskflow-5.4.0 → taskflow-5.6.0}/releasenotes/source/_static/.placeholder +0 -0
  98. {taskflow-5.4.0 → taskflow-5.6.0}/releasenotes/source/_templates/.placeholder +0 -0
  99. {taskflow-5.4.0 → taskflow-5.6.0}/releasenotes/source/conf.py +0 -0
  100. {taskflow-5.4.0 → taskflow-5.6.0}/releasenotes/source/ocata.rst +0 -0
  101. {taskflow-5.4.0 → taskflow-5.6.0}/releasenotes/source/pike.rst +0 -0
  102. {taskflow-5.4.0 → taskflow-5.6.0}/releasenotes/source/queens.rst +0 -0
  103. {taskflow-5.4.0 → taskflow-5.6.0}/releasenotes/source/rocky.rst +0 -0
  104. {taskflow-5.4.0 → taskflow-5.6.0}/releasenotes/source/stein.rst +0 -0
  105. {taskflow-5.4.0 → taskflow-5.6.0}/releasenotes/source/train.rst +0 -0
  106. {taskflow-5.4.0 → taskflow-5.6.0}/releasenotes/source/unreleased.rst +0 -0
  107. {taskflow-5.4.0 → taskflow-5.6.0}/releasenotes/source/ussuri.rst +0 -0
  108. {taskflow-5.4.0 → taskflow-5.6.0}/releasenotes/source/victoria.rst +0 -0
  109. {taskflow-5.4.0 → taskflow-5.6.0}/run_tests.sh +0 -0
  110. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/__init__.py +0 -0
  111. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/atom.py +0 -0
  112. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/conductors/__init__.py +0 -0
  113. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/conductors/backends/__init__.py +0 -0
  114. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/conductors/backends/impl_blocking.py +0 -0
  115. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/conductors/backends/impl_nonblocking.py +0 -0
  116. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/conductors/base.py +0 -0
  117. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/contrib/__init__.py +0 -0
  118. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/deciders.py +0 -0
  119. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/engines/__init__.py +0 -0
  120. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/engines/action_engine/__init__.py +0 -0
  121. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/engines/action_engine/actions/__init__.py +0 -0
  122. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/engines/action_engine/actions/base.py +0 -0
  123. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/engines/action_engine/actions/retry.py +0 -0
  124. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/engines/action_engine/actions/task.py +0 -0
  125. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/engines/action_engine/builder.py +0 -0
  126. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/engines/action_engine/compiler.py +0 -0
  127. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/engines/action_engine/completer.py +0 -0
  128. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/engines/action_engine/deciders.py +0 -0
  129. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/engines/action_engine/engine.py +0 -0
  130. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/engines/action_engine/executor.py +0 -0
  131. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/engines/action_engine/process_executor.py +0 -0
  132. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/engines/action_engine/runtime.py +0 -0
  133. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/engines/action_engine/scheduler.py +0 -0
  134. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/engines/action_engine/scopes.py +0 -0
  135. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/engines/action_engine/selector.py +0 -0
  136. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/engines/action_engine/traversal.py +0 -0
  137. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/engines/base.py +0 -0
  138. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/engines/helpers.py +0 -0
  139. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/engines/worker_based/__init__.py +0 -0
  140. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/engines/worker_based/dispatcher.py +0 -0
  141. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/engines/worker_based/endpoint.py +0 -0
  142. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/engines/worker_based/engine.py +0 -0
  143. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/engines/worker_based/executor.py +0 -0
  144. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/engines/worker_based/protocol.py +0 -0
  145. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/engines/worker_based/proxy.py +0 -0
  146. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/engines/worker_based/server.py +0 -0
  147. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/engines/worker_based/types.py +0 -0
  148. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/engines/worker_based/worker.py +0 -0
  149. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/99_bottles.py +0 -0
  150. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/alphabet_soup.py +0 -0
  151. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/build_a_car.py +0 -0
  152. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/buildsystem.py +0 -0
  153. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/calculate_in_parallel.py +0 -0
  154. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/calculate_linear.py +0 -0
  155. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/create_parallel_volume.py +0 -0
  156. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/delayed_return.py +0 -0
  157. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/distance_calculator.py +0 -0
  158. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/dump_memory_backend.py +0 -0
  159. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/echo_listener.py +0 -0
  160. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/example_utils.py +0 -0
  161. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/fake_billing.py +0 -0
  162. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/graph_flow.py +0 -0
  163. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/hello_world.py +0 -0
  164. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/jobboard_produce_consume_colors.py +0 -0
  165. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/parallel_table_multiply.py +0 -0
  166. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/persistence_example.py +0 -0
  167. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/pseudo_scoping.out.txt +0 -0
  168. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/pseudo_scoping.py +0 -0
  169. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/resume_from_backend.out.txt +0 -0
  170. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/resume_from_backend.py +0 -0
  171. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/resume_many_flows/my_flows.py +0 -0
  172. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/resume_many_flows/resume_all.py +0 -0
  173. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/resume_many_flows/run_flow.py +0 -0
  174. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/resume_many_flows.out.txt +0 -0
  175. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/resume_many_flows.py +0 -0
  176. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/resume_vm_boot.py +0 -0
  177. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/resume_volume_create.py +0 -0
  178. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/retry_flow.out.txt +0 -0
  179. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/retry_flow.py +0 -0
  180. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/reverting_linear.out.txt +0 -0
  181. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/reverting_linear.py +0 -0
  182. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/run_by_iter.out.txt +0 -0
  183. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/run_by_iter.py +0 -0
  184. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/run_by_iter_enumerate.out.txt +0 -0
  185. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/run_by_iter_enumerate.py +0 -0
  186. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/share_engine_thread.py +0 -0
  187. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/simple_linear.out.txt +0 -0
  188. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/simple_linear.py +0 -0
  189. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/simple_linear_listening.out.txt +0 -0
  190. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/simple_linear_listening.py +0 -0
  191. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/simple_linear_pass.out.txt +0 -0
  192. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/simple_linear_pass.py +0 -0
  193. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/simple_map_reduce.py +0 -0
  194. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/switch_graph_flow.py +0 -0
  195. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/timing_listener.py +0 -0
  196. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/tox_conductor.py +0 -0
  197. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/wbe_event_sender.py +0 -0
  198. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/wbe_mandelbrot.out.txt +0 -0
  199. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/wbe_mandelbrot.py +0 -0
  200. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/wbe_simple_linear.out.txt +0 -0
  201. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/wbe_simple_linear.py +0 -0
  202. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/wrapped_exception.py +0 -0
  203. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/exceptions.py +0 -0
  204. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/flow.py +0 -0
  205. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/formatters.py +0 -0
  206. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/jobs/__init__.py +0 -0
  207. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/jobs/backends/__init__.py +0 -0
  208. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/listeners/__init__.py +0 -0
  209. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/listeners/base.py +0 -0
  210. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/listeners/capturing.py +0 -0
  211. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/listeners/claims.py +0 -0
  212. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/listeners/logging.py +0 -0
  213. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/listeners/printing.py +0 -0
  214. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/listeners/timing.py +0 -0
  215. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/logging.py +0 -0
  216. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/patterns/__init__.py +0 -0
  217. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/patterns/graph_flow.py +0 -0
  218. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/patterns/linear_flow.py +0 -0
  219. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/patterns/unordered_flow.py +0 -0
  220. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/persistence/__init__.py +0 -0
  221. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/persistence/backends/__init__.py +0 -0
  222. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/persistence/backends/impl_dir.py +0 -0
  223. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/persistence/backends/impl_memory.py +0 -0
  224. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/persistence/backends/impl_sqlalchemy.py +0 -0
  225. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/persistence/backends/impl_zookeeper.py +0 -0
  226. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/persistence/backends/sqlalchemy/__init__.py +0 -0
  227. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/persistence/backends/sqlalchemy/alembic/README +0 -0
  228. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/persistence/backends/sqlalchemy/alembic/alembic.ini +0 -0
  229. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/persistence/backends/sqlalchemy/alembic/env.py +0 -0
  230. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/persistence/backends/sqlalchemy/alembic/script.py.mako +0 -0
  231. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/persistence/backends/sqlalchemy/alembic/versions/0bc3e1a3c135_set_result_meduimtext_type.py +0 -0
  232. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/persistence/backends/sqlalchemy/alembic/versions/14b227d79a87_add_intention_column.py +0 -0
  233. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/persistence/backends/sqlalchemy/alembic/versions/1c783c0c2875_replace_exception_an.py +0 -0
  234. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/persistence/backends/sqlalchemy/alembic/versions/1cea328f0f65_initial_logbook_deta.py +0 -0
  235. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/persistence/backends/sqlalchemy/alembic/versions/2ad4984f2864_switch_postgres_to_json_native.py +0 -0
  236. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/persistence/backends/sqlalchemy/alembic/versions/3162c0f3f8e4_add_revert_results_and_revert_failure_.py +0 -0
  237. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/persistence/backends/sqlalchemy/alembic/versions/40fc8c914bd2_fix_atomdetails_failure_size.py +0 -0
  238. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/persistence/backends/sqlalchemy/alembic/versions/589dccdf2b6e_rename_taskdetails_to_atomdetails.py +0 -0
  239. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/persistence/backends/sqlalchemy/alembic/versions/6df9422fcb43_fix_flowdetails_meta_size.py +0 -0
  240. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/persistence/backends/sqlalchemy/alembic/versions/84d6e888850_add_task_detail_type.py +0 -0
  241. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/persistence/backends/sqlalchemy/alembic/versions/README +0 -0
  242. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/persistence/backends/sqlalchemy/migration.py +0 -0
  243. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/persistence/backends/sqlalchemy/tables.py +0 -0
  244. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/persistence/base.py +0 -0
  245. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/persistence/models.py +0 -0
  246. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/persistence/path_based.py +0 -0
  247. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/retry.py +0 -0
  248. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/states.py +0 -0
  249. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/task.py +0 -0
  250. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/test.py +0 -0
  251. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/__init__.py +0 -0
  252. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/fixtures.py +0 -0
  253. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/test_examples.py +0 -0
  254. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/__init__.py +0 -0
  255. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/action_engine/__init__.py +0 -0
  256. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/action_engine/test_builder.py +0 -0
  257. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/action_engine/test_compile.py +0 -0
  258. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/action_engine/test_creation.py +0 -0
  259. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/action_engine/test_process_executor.py +0 -0
  260. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/action_engine/test_scoping.py +0 -0
  261. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/jobs/__init__.py +0 -0
  262. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/jobs/base.py +0 -0
  263. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/jobs/test_entrypoint.py +0 -0
  264. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/patterns/__init__.py +0 -0
  265. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/persistence/__init__.py +0 -0
  266. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/persistence/base.py +0 -0
  267. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/persistence/test_dir_persistence.py +0 -0
  268. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/persistence/test_memory_persistence.py +0 -0
  269. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/persistence/test_sql_persistence.py +0 -0
  270. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/persistence/test_zk_persistence.py +0 -0
  271. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/test_arguments_passing.py +0 -0
  272. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/test_check_transition.py +0 -0
  273. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/test_conductors.py +0 -0
  274. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/test_deciders.py +0 -0
  275. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/test_engine_helpers.py +0 -0
  276. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/test_engines.py +0 -0
  277. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/test_exceptions.py +0 -0
  278. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/test_failure.py +0 -0
  279. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/test_flow_dependencies.py +0 -0
  280. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/test_formatters.py +0 -0
  281. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/test_functor_task.py +0 -0
  282. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/test_listeners.py +0 -0
  283. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/test_mapfunctor_task.py +0 -0
  284. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/test_notifier.py +0 -0
  285. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/test_progress.py +0 -0
  286. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/test_reducefunctor_task.py +0 -0
  287. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/test_retries.py +0 -0
  288. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/test_states.py +0 -0
  289. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/test_storage.py +0 -0
  290. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/test_suspend.py +0 -0
  291. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/test_task.py +0 -0
  292. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/test_types.py +0 -0
  293. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/test_utils.py +0 -0
  294. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/test_utils_async_utils.py +0 -0
  295. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/test_utils_binary.py +0 -0
  296. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/test_utils_iter_utils.py +0 -0
  297. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/test_utils_kazoo_utils.py +0 -0
  298. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/test_utils_threading_utils.py +0 -0
  299. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/worker_based/__init__.py +0 -0
  300. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/worker_based/test_creation.py +0 -0
  301. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/worker_based/test_dispatcher.py +0 -0
  302. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/worker_based/test_endpoint.py +0 -0
  303. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/worker_based/test_executor.py +0 -0
  304. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/worker_based/test_message_pump.py +0 -0
  305. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/worker_based/test_pipeline.py +0 -0
  306. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/worker_based/test_protocol.py +0 -0
  307. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/worker_based/test_proxy.py +0 -0
  308. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/worker_based/test_server.py +0 -0
  309. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/worker_based/test_types.py +0 -0
  310. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/worker_based/test_worker.py +0 -0
  311. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/utils.py +0 -0
  312. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/types/__init__.py +0 -0
  313. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/types/entity.py +0 -0
  314. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/types/failure.py +0 -0
  315. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/types/graph.py +0 -0
  316. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/types/latch.py +0 -0
  317. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/types/notifier.py +0 -0
  318. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/types/sets.py +0 -0
  319. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/types/timing.py +0 -0
  320. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/types/tree.py +0 -0
  321. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/utils/__init__.py +0 -0
  322. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/utils/async_utils.py +0 -0
  323. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/utils/banner.py +0 -0
  324. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/utils/eventlet_utils.py +0 -0
  325. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/utils/iter_utils.py +0 -0
  326. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/utils/kazoo_utils.py +0 -0
  327. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/utils/kombu_utils.py +0 -0
  328. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/utils/misc.py +0 -0
  329. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/utils/persistence_utils.py +0 -0
  330. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/utils/redis_utils.py +0 -0
  331. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/utils/schema_utils.py +0 -0
  332. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/utils/threading_utils.py +0 -0
  333. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/version.py +0 -0
  334. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow.egg-info/dependency_links.txt +0 -0
  335. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow.egg-info/entry_points.txt +0 -0
  336. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow.egg-info/not-zip-safe +0 -0
  337. {taskflow-5.4.0 → taskflow-5.6.0}/taskflow.egg-info/top_level.txt +0 -0
  338. {taskflow-5.4.0 → taskflow-5.6.0}/tools/clear_zk.sh +0 -0
  339. {taskflow-5.4.0 → taskflow-5.6.0}/tools/env_builder.sh +0 -0
  340. {taskflow-5.4.0 → taskflow-5.6.0}/tools/pretty_tox.sh +0 -0
  341. {taskflow-5.4.0 → taskflow-5.6.0}/tools/speed_test.py +0 -0
  342. {taskflow-5.4.0 → taskflow-5.6.0}/tools/test-setup.sh +0 -0
  343. {taskflow-5.4.0 → taskflow-5.6.0}/tools/update_states.sh +0 -0
@@ -1,7 +1,7 @@
1
1
  [run]
2
2
  branch = True
3
3
  source = taskflow
4
- omit = taskflow/tests/*,taskflow/openstack/*,taskflow/test.py
4
+ omit = taskflow/tests/*,taskflow/test.py
5
5
 
6
6
  [report]
7
7
  ignore_errors = True
@@ -32,7 +32,7 @@ repos:
32
32
  - id: flake8
33
33
  name: flake8
34
34
  additional_dependencies:
35
- - hacking>=3.0.1,<3.1.0
35
+ - hacking>=6.1.0,<6.2.0
36
36
  language: python
37
37
  entry: flake8
38
38
  files: '^.*\.py$'
@@ -6,7 +6,9 @@
6
6
  Run unit tests with main branch of SQLAlchemy, alembic and oslo.db.
7
7
  Takes advantage of the base tox job's install-siblings feature.
8
8
  # The job only tests the latest and shouldn't be run on the stable branches
9
- branches: ^(?!stable)
9
+ branches:
10
+ regex: ^stable/.*$
11
+ negate: true
10
12
  required-projects:
11
13
  - name: github.com/sqlalchemy/sqlalchemy
12
14
  override-checkout: main
@@ -70,6 +70,7 @@ Stanislav Kudriashev <skudriashev@griddynamics.com>
70
70
  Stanislav Kudriashev <stas.kudriashev@gmail.com>
71
71
  Stephen Finucane <stephenfin@redhat.com>
72
72
  Suneel Bomminayuni <suneelb@yahoo-inc.com>
73
+ Takashi Kajinami <kajinamit@oss.nttdata.com>
73
74
  Takashi Kajinami <tkajinam@redhat.com>
74
75
  Theodoros Tsioutsias <theodoros.tsioutsias@cern.ch>
75
76
  Thomas Bechtold <tbechtold@suse.com>
@@ -1,6 +1,32 @@
1
1
  CHANGES
2
2
  =======
3
3
 
4
+ 5.6.0
5
+ -----
6
+
7
+ * Revert "Use consistent credential for Redis and Redis Sentinel"
8
+ * Update TOX\_CONSTRAINTS\_FILE for stable/2024.1
9
+ * Update .gitreview for stable/2024.1
10
+
11
+ 5.5.0
12
+ -----
13
+
14
+ * Prevent potential ReDoS attack
15
+ * redis: Support fallback servers
16
+ * Use consistent credential for Redis and Redis Sentinel
17
+ * redis: Enable SSL for sentinel
18
+ * redis: Add username
19
+ * Bump hacking
20
+ * Replace deprecated perl-style regex
21
+ * Cleanup setup.py and requirements
22
+ * Update python classifier in setup.cfg
23
+ * coveragerc: Remove non-existent path
24
+ * Fix python shebang
25
+ * Avoid endless backtraces on StorageFailure
26
+ * Fix incorrect handling of storage exceptions
27
+ * bindep: Use new mysql-\* package names
28
+ * Update master for stable/2023.2
29
+
4
30
  5.4.0
5
31
  -----
6
32
 
@@ -41,6 +67,7 @@ CHANGES
41
67
  * Fix formattiing of release list
42
68
  * Remove six
43
69
  * Drop python3.6/3.7 support in testing runtime
70
+ * Delete the job from backend if it cannot be consumed
44
71
 
45
72
  4.7.0
46
73
  -----
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: taskflow
3
- Version: 5.4.0
3
+ Version: 5.6.0
4
4
  Summary: Taskflow structured state management library.
5
5
  Home-page: https://docs.openstack.org/taskflow/latest/
6
6
  Author: OpenStack
@@ -94,6 +94,7 @@ Classifier: Programming Language :: Python :: 3
94
94
  Classifier: Programming Language :: Python :: 3.8
95
95
  Classifier: Programming Language :: Python :: 3.9
96
96
  Classifier: Programming Language :: Python :: 3.10
97
+ Classifier: Programming Language :: Python :: 3.11
97
98
  Classifier: Programming Language :: Python :: 3 :: Only
98
99
  Classifier: Programming Language :: Python :: Implementation :: CPython
99
100
  Classifier: Topic :: Software Development :: Libraries
@@ -0,0 +1,17 @@
1
+ # This is a cross-platform list tracking distribution packages needed for install and tests;
2
+ # see https://docs.openstack.org/infra/bindep/ for additional information.
3
+
4
+ graphviz [!platform:gentoo]
5
+ media-gfx/graphviz [platform:gentoo]
6
+
7
+ mariadb [platform:rpm]
8
+ mariadb-server [platform:redhat platform:debian]
9
+ mariadb-devel [platform:redhat]
10
+ libmariadb-dev-compat [platform:debian]
11
+ libmysqlclient-dev [platform:ubuntu]
12
+ libmysqlclient-devel [platform:suse]
13
+ mysql-client [platform:dpkg !platform:debian]
14
+ mysql-server [platform:dpkg !platform:debian]
15
+ postgresql
16
+ postgresql-client [platform:dpkg]
17
+ libpq-dev [platform:dpkg]
@@ -0,0 +1,7 @@
1
+ ---
2
+ fixes:
3
+ - |
4
+ Redis job board driver no longer uses ``username`` and ``password`` for
5
+ its connections to Redis Sentinel, to restore the previous behavior which
6
+ was already used by some deployment tools. Add credential to
7
+ ``sentinel_kwargs`` to enable authentication for Redis Sentinel.
@@ -0,0 +1,5 @@
1
+ ---
2
+ fixes:
3
+ - |
4
+ Fixed potential endless loop of exceptions when the storage is down and
5
+ Taskflow loads a logbook.
@@ -0,0 +1,6 @@
1
+ ---
2
+ fixes:
3
+ - |
4
+ Fixed an issue with the handling of exceptions when running a flow, some
5
+ jobs may have been incorrectly consumed (and not rescheduled) during
6
+ outages.
@@ -0,0 +1,5 @@
1
+ ---
2
+ features:
3
+ - |
4
+ The redis jobboard driver now supports the username option, which is
5
+ required in authentication request to Redis with ACL enabled.
@@ -0,0 +1,5 @@
1
+ ---
2
+ features:
3
+ - |
4
+ The redis driver now supports ``sentinel_fallbacks`` option. This allows
5
+ using additional sentinel servers as fallbacks.
@@ -0,0 +1,5 @@
1
+ ---
2
+ features:
3
+ - |
4
+ Redis jobboard driver now enables SSL for connections to Redis Sentinel
5
+ when SSL is enabled for connections to Redis.
@@ -0,0 +1,11 @@
1
+ ---
2
+ features:
3
+ - |
4
+ Now the redis driver uses the credential for redis servers in connections
5
+ to Redis Sentinel servers.
6
+
7
+ upgrade:
8
+ - |
9
+ Now the redis driver uses the same credentials as redis by default. If
10
+ a different credentials need to be used, override these via
11
+ ``sentinel_kwargs``.
@@ -0,0 +1,6 @@
1
+ ===========================
2
+ 2023.2 Series Release Notes
3
+ ===========================
4
+
5
+ .. release-notes::
6
+ :branch: stable/2023.2
@@ -6,6 +6,7 @@
6
6
  :maxdepth: 1
7
7
 
8
8
  unreleased
9
+ 2023.2
9
10
  2023.1
10
11
  victoria
11
12
  ussuri
@@ -1,7 +1,3 @@
1
- # The order of packages is significant, because pip processes them in the order
2
- # of appearance. Changing the order has an impact on the overall integration
3
- # process, which may cause wedges in the gate later.
4
-
5
1
  # See: https://bugs.launchpad.net/pbr/+bug/1384919 for why this is here...
6
2
  pbr!=2.1.0,>=2.0.0 # Apache-2.0
7
3
 
@@ -20,6 +20,7 @@ classifier =
20
20
  Programming Language :: Python :: 3.8
21
21
  Programming Language :: Python :: 3.9
22
22
  Programming Language :: Python :: 3.10
23
+ Programming Language :: Python :: 3.11
23
24
  Programming Language :: Python :: 3 :: Only
24
25
  Programming Language :: Python :: Implementation :: CPython
25
26
  Topic :: Software Development :: Libraries
@@ -56,7 +57,7 @@ zookeeper =
56
57
  kazoo>=2.6.0 # Apache-2.0
57
58
  zake>=0.1.6 # Apache-2.0
58
59
  redis =
59
- redis>=3.0.0 # MIT
60
+ redis>=4.0.0 # MIT
60
61
  workers =
61
62
  kombu>=4.3.0 # BSD
62
63
  eventlet =
@@ -13,17 +13,8 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
 
16
- # THIS FILE IS MANAGED BY THE GLOBAL REQUIREMENTS REPO - DO NOT EDIT
17
16
  import setuptools
18
17
 
19
- # In python < 2.7.4, a lazy loading of package `pbr` will break
20
- # setuptools if some other modules registered functions in `atexit`.
21
- # solution from: http://bugs.python.org/issue15881#msg170215
22
- try:
23
- import multiprocessing # noqa
24
- except ImportError:
25
- pass
26
-
27
18
  setuptools.setup(
28
19
  setup_requires=['pbr>=2.0.0'],
29
20
  pbr=True)
@@ -209,7 +209,7 @@ class ExecutorConductor(base.Conductor, metaclass=abc.ABCMeta):
209
209
  self._log.info("Job completed successfully: %s", job)
210
210
  return consume
211
211
 
212
- def _try_finish_job(self, job, consume):
212
+ def _try_finish_job(self, job, consume, trash=False):
213
213
  try:
214
214
  if consume:
215
215
  self._jobboard.consume(job, self._name)
@@ -218,6 +218,13 @@ class ExecutorConductor(base.Conductor, metaclass=abc.ABCMeta):
218
218
  'conductor': self,
219
219
  'persistence': self._persistence,
220
220
  })
221
+ elif trash:
222
+ self._jobboard.trash(job, self._name)
223
+ self._notifier.notify("job_trashed", {
224
+ 'job': job,
225
+ 'conductor': self,
226
+ 'persistence': self._persistence,
227
+ })
221
228
  else:
222
229
  self._jobboard.abandon(job, self._name)
223
230
  self._notifier.notify("job_abandoned", {
@@ -235,6 +242,7 @@ class ExecutorConductor(base.Conductor, metaclass=abc.ABCMeta):
235
242
 
236
243
  def _on_job_done(self, job, fut):
237
244
  consume = False
245
+ trash = False
238
246
  try:
239
247
  consume = fut.result()
240
248
  except KeyboardInterrupt:
@@ -242,8 +250,9 @@ class ExecutorConductor(base.Conductor, metaclass=abc.ABCMeta):
242
250
  self._log.warn("Job dispatching interrupted: %s", job)
243
251
  except Exception:
244
252
  self._log.warn("Job dispatching failed: %s", job, exc_info=True)
253
+ trash = True
245
254
  try:
246
- self._try_finish_job(job, consume)
255
+ self._try_finish_job(job, consume, trash)
247
256
  finally:
248
257
  self._dispatched.discard(fut)
249
258
 
@@ -17,6 +17,7 @@
17
17
  import contextlib
18
18
  import datetime
19
19
  import functools
20
+ import re
20
21
  import string
21
22
  import threading
22
23
  import time
@@ -263,6 +264,7 @@ class RedisJobBoard(base.JobBoard):
263
264
  ('port', int),
264
265
 
265
266
  # See: http://redis.io/commands/auth
267
+ ('username', str),
266
268
  ('password', str),
267
269
 
268
270
  # Data encoding/decoding + error handling
@@ -557,6 +559,18 @@ return cmsgpack.pack(result)
557
559
  ut-were-afraid-to-ask
558
560
  """
559
561
 
562
+ @classmethod
563
+ def _parse_sentinel(cls, sentinel):
564
+ # IPv6 (eg. [::1]:6379 )
565
+ match = re.search(r'^\[(\S+)\]:(\d+)$', sentinel)
566
+ if match:
567
+ return (match[1], int(match[2]))
568
+ # IPv4 or hostname (eg. 127.0.0.1:6379 or localhost:6379)
569
+ match = re.search(r'^(\S+):(\d+)$', sentinel)
570
+ if match:
571
+ return (match[1], int(match[2]))
572
+ raise ValueError('Malformed sentinel server format')
573
+
560
574
  @classmethod
561
575
  def _make_client(cls, conf):
562
576
  client_conf = {}
@@ -567,15 +581,12 @@ return cmsgpack.pack(result)
567
581
  else:
568
582
  client_conf[key] = conf[key]
569
583
  if conf.get('sentinel') is not None:
570
- sentinel_conf = {}
571
- # sentinel do not have ssl kwargs
572
- for key in client_conf:
573
- if 'ssl' not in key:
574
- sentinel_conf[key] = client_conf[key]
575
- s = sentinel.Sentinel([(sentinel_conf.pop('host'),
576
- sentinel_conf.pop('port'))],
584
+ sentinels = [(client_conf.pop('host'), client_conf.pop('port'))]
585
+ for fallback in conf.get('sentinel_fallbacks', []):
586
+ sentinels.append(cls._parse_sentinel(fallback))
587
+ s = sentinel.Sentinel(sentinels,
577
588
  sentinel_kwargs=conf.get('sentinel_kwargs'),
578
- **sentinel_conf)
589
+ **client_conf)
579
590
  return s.master_for(conf['sentinel'])
580
591
  else:
581
592
  return ru.RedisClient(**client_conf)
@@ -856,4 +856,4 @@ class ZookeeperJobBoard(base.NotifyingJobBoard):
856
856
  "Failed to do post-connection"
857
857
  " initialization", cause=exc)
858
858
  finally:
859
- del(exc_type, exc, exc_tb)
859
+ del (exc_type, exc, exc_tb)
@@ -24,6 +24,7 @@ import time
24
24
  import enum
25
25
  from oslo_utils import timeutils
26
26
  from oslo_utils import uuidutils
27
+ import tenacity
27
28
 
28
29
  from taskflow import exceptions as excp
29
30
  from taskflow import states
@@ -31,6 +32,10 @@ from taskflow.types import notifier
31
32
  from taskflow.utils import iter_utils
32
33
 
33
34
 
35
+ RETRY_ATTEMPTS = 3
36
+ RETRY_WAIT_TIMEOUT = 5
37
+
38
+
34
39
  class JobPriority(enum.Enum):
35
40
  """Enum of job priorities (modeled after hadoop job priorities)."""
36
41
 
@@ -251,6 +256,11 @@ class Job(object, metaclass=abc.ABCMeta):
251
256
  """The non-uniquely identifying name of this job."""
252
257
  return self._name
253
258
 
259
+ @tenacity.retry(retry=tenacity.retry_if_exception_type(
260
+ exception_types=excp.StorageFailure),
261
+ stop=tenacity.stop_after_attempt(RETRY_ATTEMPTS),
262
+ wait=tenacity.wait_fixed(RETRY_WAIT_TIMEOUT),
263
+ reraise=True)
254
264
  def _load_book(self):
255
265
  book_uuid = self.book_uuid
256
266
  if self._backend is not None and book_uuid is not None:
@@ -454,7 +454,8 @@ class Storage(object):
454
454
  @tenacity.retry(retry=tenacity.retry_if_exception_type(
455
455
  exception_types=exceptions.StorageFailure),
456
456
  stop=tenacity.stop_after_attempt(RETRY_ATTEMPTS),
457
- wait=tenacity.wait_fixed(RETRY_WAIT_TIMEOUT))
457
+ wait=tenacity.wait_fixed(RETRY_WAIT_TIMEOUT),
458
+ reraise=True)
458
459
  def _save_flow_detail(self, conn, original_flow_detail, flow_detail):
459
460
  # NOTE(harlowja): we need to update our contained flow detail if
460
461
  # the result of the update actually added more (aka another process
@@ -491,7 +492,8 @@ class Storage(object):
491
492
  @tenacity.retry(retry=tenacity.retry_if_exception_type(
492
493
  exception_types=exceptions.StorageFailure),
493
494
  stop=tenacity.stop_after_attempt(RETRY_ATTEMPTS),
494
- wait=tenacity.wait_fixed(RETRY_WAIT_TIMEOUT))
495
+ wait=tenacity.wait_fixed(RETRY_WAIT_TIMEOUT),
496
+ reraise=True)
495
497
  def _save_atom_detail(self, conn, original_atom_detail, atom_detail):
496
498
  # NOTE(harlowja): we need to update our contained atom detail if
497
499
  # the result of the update actually added more (aka another process
@@ -106,12 +106,14 @@ class RedisJobboardTest(test.TestCase, base.BoardTestMixin):
106
106
  def test__make_client(self):
107
107
  conf = {'host': '127.0.0.1',
108
108
  'port': 6379,
109
+ 'username': 'default',
109
110
  'password': 'secret',
110
111
  'namespace': 'test'
111
112
  }
112
113
  test_conf = {
113
114
  'host': '127.0.0.1',
114
115
  'port': 6379,
116
+ 'username': 'default',
115
117
  'password': 'secret',
116
118
  }
117
119
  with mock.patch('taskflow.utils.redis_utils.RedisClient') as mock_ru:
@@ -121,15 +123,73 @@ class RedisJobboardTest(test.TestCase, base.BoardTestMixin):
121
123
  def test__make_client_sentinel(self):
122
124
  conf = {'host': '127.0.0.1',
123
125
  'port': 26379,
126
+ 'username': 'default',
124
127
  'password': 'secret',
125
128
  'namespace': 'test',
126
129
  'sentinel': 'mymaster',
127
- 'sentinel_kwargs': {'password': 'senitelsecret'}}
130
+ 'sentinel_kwargs': {
131
+ 'username': 'default',
132
+ 'password': 'senitelsecret'
133
+ }}
128
134
  with mock.patch('redis.sentinel.Sentinel') as mock_sentinel:
129
135
  impl_redis.RedisJobBoard('test-board', conf)
130
136
  test_conf = {
137
+ 'username': 'default',
131
138
  'password': 'secret',
132
139
  }
140
+ mock_sentinel.assert_called_once_with(
141
+ [('127.0.0.1', 26379)],
142
+ sentinel_kwargs={
143
+ 'username': 'default',
144
+ 'password': 'senitelsecret'
145
+ },
146
+ **test_conf)
147
+ mock_sentinel().master_for.assert_called_once_with('mymaster')
148
+
149
+ def test__make_client_sentinel_fallbacks(self):
150
+ conf = {'host': '127.0.0.1',
151
+ 'port': 26379,
152
+ 'username': 'default',
153
+ 'password': 'secret',
154
+ 'namespace': 'test',
155
+ 'sentinel': 'mymaster',
156
+ 'sentinel_fallbacks': [
157
+ '[::1]:26379', '127.0.0.2:26379', 'localhost:26379'
158
+ ]}
159
+ with mock.patch('redis.sentinel.Sentinel') as mock_sentinel:
160
+ impl_redis.RedisJobBoard('test-board', conf)
161
+ test_conf = {
162
+ 'username': 'default',
163
+ 'password': 'secret',
164
+ }
165
+ mock_sentinel.assert_called_once_with(
166
+ [('127.0.0.1', 26379), ('::1', 26379),
167
+ ('127.0.0.2', 26379), ('localhost', 26379)],
168
+ sentinel_kwargs={
169
+ 'username': 'default',
170
+ 'password': 'secret'
171
+ },
172
+ **test_conf)
173
+ mock_sentinel().master_for.assert_called_once_with('mymaster')
174
+
175
+ def test__make_client_sentinel_ssl(self):
176
+ conf = {'host': '127.0.0.1',
177
+ 'port': 26379,
178
+ 'username': 'default',
179
+ 'password': 'secret',
180
+ 'namespace': 'test',
181
+ 'sentinel': 'mymaster',
182
+ 'sentinel_kwargs': {'password': 'senitelsecret'},
183
+ 'ssl': True,
184
+ 'ssl_ca_certs': '/etc/ssl/certs'}
185
+ with mock.patch('redis.sentinel.Sentinel') as mock_sentinel:
186
+ impl_redis.RedisJobBoard('test-board', conf)
187
+ test_conf = {
188
+ 'username': 'default',
189
+ 'password': 'secret',
190
+ 'ssl': True,
191
+ 'ssl_ca_certs': '/etc/ssl/certs',
192
+ }
133
193
  mock_sentinel.assert_called_once_with(
134
194
  [('127.0.0.1', 26379)],
135
195
  sentinel_kwargs={'password': 'senitelsecret'},
@@ -271,12 +271,12 @@ class ZakeJobboardTest(test.TestCase, ZookeeperBoardTestMixin):
271
271
  with base.connect_close(self.board):
272
272
  self.board.register_entity(entity_instance)
273
273
  # Check '.entity' node has been created
274
- self.assertTrue(self.board.entity_path in self.client.storage.paths)
274
+ self.assertIn(self.board.entity_path, self.client.storage.paths)
275
275
 
276
276
  conductor_entity_path = k_paths.join(self.board.entity_path,
277
277
  'conductor',
278
278
  conductor_name)
279
- self.assertTrue(conductor_entity_path in self.client.storage.paths)
279
+ self.assertIn(conductor_entity_path, self.client.storage.paths)
280
280
  conductor_data = (
281
281
  self.client.storage.paths[conductor_entity_path]['data'])
282
282
  self.assertTrue(len(conductor_data) > 0)
@@ -239,7 +239,7 @@ class GraphFlowTest(test.TestCase):
239
239
  tasks = set([task1, task2, f1])
240
240
  f = gf.Flow('test').add(task1, task2, f1)
241
241
  for (n, data) in f.iter_nodes():
242
- self.assertTrue(n in tasks)
242
+ self.assertIn(n, tasks)
243
243
  self.assertDictEqual({}, data)
244
244
 
245
245
  def test_iter_links(self):
@@ -251,8 +251,8 @@ class GraphFlowTest(test.TestCase):
251
251
  tasks = set([task1, task2, f1])
252
252
  f = gf.Flow('test').add(task1, task2, f1)
253
253
  for (u, v, data) in f.iter_links():
254
- self.assertTrue(u in tasks)
255
- self.assertTrue(v in tasks)
254
+ self.assertIn(u, tasks)
255
+ self.assertIn(v, tasks)
256
256
  self.assertDictEqual({}, data)
257
257
 
258
258
 
@@ -130,7 +130,7 @@ class LinearFlowTest(test.TestCase):
130
130
  f = lf.Flow('test').add(task1, task2, task3)
131
131
  tasks = set([task1, task2, task3])
132
132
  for (node, data) in f.iter_nodes():
133
- self.assertTrue(node in tasks)
133
+ self.assertIn(node, tasks)
134
134
  self.assertDictEqual({}, data)
135
135
 
136
136
  def test_iter_links(self):
@@ -140,6 +140,6 @@ class LinearFlowTest(test.TestCase):
140
140
  f = lf.Flow('test').add(task1, task2, task3)
141
141
  tasks = set([task1, task2, task3])
142
142
  for (u, v, data) in f.iter_links():
143
- self.assertTrue(u in tasks)
144
- self.assertTrue(v in tasks)
143
+ self.assertIn(u, tasks)
144
+ self.assertIn(v, tasks)
145
145
  self.assertDictEqual({'invariant': True}, data)
@@ -126,7 +126,7 @@ class UnorderedFlowTest(test.TestCase):
126
126
  f = uf.Flow('test')
127
127
  f.add(task2, task1)
128
128
  for (node, data) in f.iter_nodes():
129
- self.assertTrue(node in tasks)
129
+ self.assertIn(node, tasks)
130
130
  self.assertDictEqual({}, data)
131
131
 
132
132
  def test_iter_links(self):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: taskflow
3
- Version: 5.4.0
3
+ Version: 5.6.0
4
4
  Summary: Taskflow structured state management library.
5
5
  Home-page: https://docs.openstack.org/taskflow/latest/
6
6
  Author: OpenStack
@@ -94,6 +94,7 @@ Classifier: Programming Language :: Python :: 3
94
94
  Classifier: Programming Language :: Python :: 3.8
95
95
  Classifier: Programming Language :: Python :: 3.9
96
96
  Classifier: Programming Language :: Python :: 3.10
97
+ Classifier: Programming Language :: Python :: 3.11
97
98
  Classifier: Programming Language :: Python :: 3 :: Only
98
99
  Classifier: Programming Language :: Python :: Implementation :: CPython
99
100
  Classifier: Topic :: Software Development :: Libraries
@@ -60,12 +60,20 @@ doc/source/user/img/wbe_request_states.svg
60
60
  doc/source/user/img/worker-engine.svg
61
61
  releasenotes/notes/.placeholder
62
62
  releasenotes/notes/add-sentinel-redis-support-9fd16e2a5dd5c0c9.yaml
63
+ releasenotes/notes/bug-2056656-871b67ddbc8cfc92.yaml
63
64
  releasenotes/notes/drop-python-2-7-73d3113c69d724d6.yaml
64
65
  releasenotes/notes/fix-endless-loop-on-storage-error-dd4467f0bbc66abf.yaml
66
+ releasenotes/notes/fix-endless-loop-on-storage-failures-b98b30f0c34d25e1.yaml
67
+ releasenotes/notes/fix-storage-failure-handling-5c115d92daa0eb82.yaml
65
68
  releasenotes/notes/fix-zookeeper-option-parsing-f9d37fbc39af47f4.yaml
69
+ releasenotes/notes/redis-username-df0eb33869db09a2.yaml
66
70
  releasenotes/notes/remove-strict-redis-f2a5a924b314de41.yaml
71
+ releasenotes/notes/sentinel-fallbacks-6fe2ab0d68959cdf.yaml
72
+ releasenotes/notes/sentinel-ssl-399c56ed7067d282.yaml
73
+ releasenotes/notes/sentinel-use-redis-creds-63f58b12ad46a2b5.yaml
67
74
  releasenotes/notes/zookeeper-ssl-support-b9abf24a39096b62.yaml
68
75
  releasenotes/source/2023.1.rst
76
+ releasenotes/source/2023.2.rst
69
77
  releasenotes/source/conf.py
70
78
  releasenotes/source/index.rst
71
79
  releasenotes/source/ocata.rst
@@ -0,0 +1 @@
1
+ {"git_version": "39440b74", "is_release": true}
@@ -22,7 +22,7 @@ psycopg2>=2.8.0
22
22
  eventlet!=0.18.3,!=0.20.1,!=0.21.0,>=0.18.2
23
23
 
24
24
  [redis]
25
- redis>=3.0.0
25
+ redis>=4.0.0
26
26
 
27
27
  [test]
28
28
  hacking<0.11,>=0.10.0
@@ -7,7 +7,7 @@ kazoo>=2.6.0 # Apache-2.0
7
7
  zake>=0.1.6 # Apache-2.0
8
8
 
9
9
  # redis
10
- redis>=2.10.0 # MIT
10
+ redis>=4.0.0 # MIT
11
11
 
12
12
  # workers
13
13
  kombu>=4.3.0 # BSD
@@ -24,7 +24,7 @@ psycopg2>=2.8.0 # LGPL/ZPL
24
24
 
25
25
  # test
26
26
  pydotplus>=2.0.2 # MIT License
27
- hacking<2.1,>=2.0
27
+ hacking<6.2.0,>=6.1.0
28
28
  oslotest>=3.2.0 # Apache-2.0
29
29
  testtools>=2.2.0 # MIT
30
30
  testscenarios>=0.4 # Apache-2.0/BSD
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env python
1
+ #!/usr/bin/env python3
2
2
 
3
3
  # Copyright (C) 2014 Yahoo! Inc. All Rights Reserved.
4
4
  #
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env python
1
+ #!/usr/bin/env python3
2
2
 
3
3
  # Copyright (C) 2014 Yahoo! Inc. All Rights Reserved.
4
4
  #
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env python
1
+ #!/usr/bin/env python3
2
2
 
3
3
  # Copyright 2014 Hewlett-Packard Development Company, L.P.
4
4
  # Copyright 2014 Samsung Electronics
@@ -9,7 +9,7 @@ setenv =
9
9
  # We need to install a bit more than just `test' because those drivers have
10
10
  # custom tests that we always run
11
11
  deps =
12
- -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master}
12
+ -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/2024.1}
13
13
  -r{toxinidir}/test-requirements.txt
14
14
  -r{toxinidir}/requirements.txt
15
15
  commands =