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.
- {taskflow-5.4.0 → taskflow-5.6.0}/.coveragerc +1 -1
- {taskflow-5.4.0 → taskflow-5.6.0}/.pre-commit-config.yaml +1 -1
- {taskflow-5.4.0 → taskflow-5.6.0}/.zuul.yaml +3 -1
- {taskflow-5.4.0 → taskflow-5.6.0}/AUTHORS +1 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/ChangeLog +27 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/PKG-INFO +2 -1
- taskflow-5.6.0/bindep.txt +17 -0
- taskflow-5.6.0/releasenotes/notes/bug-2056656-871b67ddbc8cfc92.yaml +7 -0
- taskflow-5.6.0/releasenotes/notes/fix-endless-loop-on-storage-failures-b98b30f0c34d25e1.yaml +5 -0
- taskflow-5.6.0/releasenotes/notes/fix-storage-failure-handling-5c115d92daa0eb82.yaml +6 -0
- taskflow-5.6.0/releasenotes/notes/redis-username-df0eb33869db09a2.yaml +5 -0
- taskflow-5.6.0/releasenotes/notes/sentinel-fallbacks-6fe2ab0d68959cdf.yaml +5 -0
- taskflow-5.6.0/releasenotes/notes/sentinel-ssl-399c56ed7067d282.yaml +5 -0
- taskflow-5.6.0/releasenotes/notes/sentinel-use-redis-creds-63f58b12ad46a2b5.yaml +11 -0
- taskflow-5.6.0/releasenotes/source/2023.2.rst +6 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/releasenotes/source/index.rst +1 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/requirements.txt +0 -4
- {taskflow-5.4.0 → taskflow-5.6.0}/setup.cfg +2 -1
- {taskflow-5.4.0 → taskflow-5.6.0}/setup.py +0 -9
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/conductors/backends/impl_executor.py +11 -2
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/jobs/backends/impl_redis.py +19 -8
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/jobs/backends/impl_zookeeper.py +1 -1
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/jobs/base.py +10 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/storage.py +4 -2
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/jobs/test_redis_job.py +61 -1
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/jobs/test_zk_job.py +2 -2
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/patterns/test_graph_flow.py +3 -3
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/patterns/test_linear_flow.py +3 -3
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/patterns/test_unordered_flow.py +1 -1
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow.egg-info/PKG-INFO +2 -1
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow.egg-info/SOURCES.txt +8 -0
- taskflow-5.6.0/taskflow.egg-info/pbr.json +1 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow.egg-info/requires.txt +1 -1
- {taskflow-5.4.0 → taskflow-5.6.0}/test-requirements.txt +2 -2
- {taskflow-5.4.0 → taskflow-5.6.0}/tools/schema_generator.py +1 -1
- {taskflow-5.4.0 → taskflow-5.6.0}/tools/state_graph.py +1 -1
- {taskflow-5.4.0 → taskflow-5.6.0}/tools/subunit_trace.py +1 -1
- {taskflow-5.4.0 → taskflow-5.6.0}/tox.ini +1 -1
- taskflow-5.4.0/bindep.txt +0 -12
- taskflow-5.4.0/taskflow.egg-info/pbr.json +0 -1
- {taskflow-5.4.0 → taskflow-5.6.0}/.mailmap +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/.stestr.conf +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/CONTRIBUTING.rst +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/LICENSE +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/README.rst +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/doc/diagrams/area_of_influence.graffle.tgz +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/doc/diagrams/core.graffle.tgz +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/doc/diagrams/jobboard.graffle.tgz +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/doc/diagrams/tasks.graffle.tgz +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/doc/diagrams/worker-engine.graffle.tgz +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/doc/requirements.txt +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/conf.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/index.rst +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/templates/layout.html +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/arguments_and_results.rst +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/atoms.rst +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/conductors.rst +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/engines.rst +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/examples.rst +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/exceptions.rst +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/history.rst +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/img/area_of_influence.svg +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/img/conductor.png +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/img/conductor_cycle.png +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/img/distributed_flow_rpc.png +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/img/engine_states.svg +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/img/flow_states.svg +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/img/job_states.svg +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/img/jobboard.png +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/img/mandelbrot.png +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/img/retry_states.svg +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/img/task_states.svg +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/img/tasks.png +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/img/wbe_request_states.svg +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/img/worker-engine.svg +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/index.rst +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/inputs_and_outputs.rst +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/jobs.rst +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/notifications.rst +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/patterns.rst +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/persistence.rst +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/resumption.rst +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/shelf.rst +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/states.rst +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/types.rst +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/utils.rst +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/doc/source/user/workers.rst +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/pylintrc +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/releasenotes/notes/.placeholder +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/releasenotes/notes/add-sentinel-redis-support-9fd16e2a5dd5c0c9.yaml +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/releasenotes/notes/drop-python-2-7-73d3113c69d724d6.yaml +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/releasenotes/notes/fix-endless-loop-on-storage-error-dd4467f0bbc66abf.yaml +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/releasenotes/notes/fix-zookeeper-option-parsing-f9d37fbc39af47f4.yaml +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/releasenotes/notes/remove-strict-redis-f2a5a924b314de41.yaml +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/releasenotes/notes/zookeeper-ssl-support-b9abf24a39096b62.yaml +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/releasenotes/source/2023.1.rst +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/releasenotes/source/_static/.placeholder +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/releasenotes/source/_templates/.placeholder +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/releasenotes/source/conf.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/releasenotes/source/ocata.rst +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/releasenotes/source/pike.rst +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/releasenotes/source/queens.rst +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/releasenotes/source/rocky.rst +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/releasenotes/source/stein.rst +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/releasenotes/source/train.rst +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/releasenotes/source/unreleased.rst +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/releasenotes/source/ussuri.rst +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/releasenotes/source/victoria.rst +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/run_tests.sh +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/__init__.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/atom.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/conductors/__init__.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/conductors/backends/__init__.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/conductors/backends/impl_blocking.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/conductors/backends/impl_nonblocking.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/conductors/base.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/contrib/__init__.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/deciders.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/engines/__init__.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/engines/action_engine/__init__.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/engines/action_engine/actions/__init__.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/engines/action_engine/actions/base.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/engines/action_engine/actions/retry.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/engines/action_engine/actions/task.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/engines/action_engine/builder.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/engines/action_engine/compiler.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/engines/action_engine/completer.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/engines/action_engine/deciders.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/engines/action_engine/engine.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/engines/action_engine/executor.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/engines/action_engine/process_executor.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/engines/action_engine/runtime.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/engines/action_engine/scheduler.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/engines/action_engine/scopes.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/engines/action_engine/selector.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/engines/action_engine/traversal.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/engines/base.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/engines/helpers.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/engines/worker_based/__init__.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/engines/worker_based/dispatcher.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/engines/worker_based/endpoint.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/engines/worker_based/engine.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/engines/worker_based/executor.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/engines/worker_based/protocol.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/engines/worker_based/proxy.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/engines/worker_based/server.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/engines/worker_based/types.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/engines/worker_based/worker.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/99_bottles.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/alphabet_soup.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/build_a_car.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/buildsystem.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/calculate_in_parallel.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/calculate_linear.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/create_parallel_volume.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/delayed_return.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/distance_calculator.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/dump_memory_backend.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/echo_listener.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/example_utils.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/fake_billing.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/graph_flow.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/hello_world.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/jobboard_produce_consume_colors.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/parallel_table_multiply.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/persistence_example.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/pseudo_scoping.out.txt +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/pseudo_scoping.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/resume_from_backend.out.txt +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/resume_from_backend.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/resume_many_flows/my_flows.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/resume_many_flows/resume_all.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/resume_many_flows/run_flow.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/resume_many_flows.out.txt +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/resume_many_flows.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/resume_vm_boot.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/resume_volume_create.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/retry_flow.out.txt +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/retry_flow.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/reverting_linear.out.txt +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/reverting_linear.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/run_by_iter.out.txt +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/run_by_iter.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/run_by_iter_enumerate.out.txt +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/run_by_iter_enumerate.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/share_engine_thread.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/simple_linear.out.txt +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/simple_linear.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/simple_linear_listening.out.txt +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/simple_linear_listening.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/simple_linear_pass.out.txt +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/simple_linear_pass.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/simple_map_reduce.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/switch_graph_flow.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/timing_listener.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/tox_conductor.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/wbe_event_sender.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/wbe_mandelbrot.out.txt +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/wbe_mandelbrot.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/wbe_simple_linear.out.txt +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/wbe_simple_linear.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/examples/wrapped_exception.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/exceptions.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/flow.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/formatters.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/jobs/__init__.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/jobs/backends/__init__.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/listeners/__init__.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/listeners/base.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/listeners/capturing.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/listeners/claims.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/listeners/logging.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/listeners/printing.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/listeners/timing.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/logging.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/patterns/__init__.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/patterns/graph_flow.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/patterns/linear_flow.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/patterns/unordered_flow.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/persistence/__init__.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/persistence/backends/__init__.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/persistence/backends/impl_dir.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/persistence/backends/impl_memory.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/persistence/backends/impl_sqlalchemy.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/persistence/backends/impl_zookeeper.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/persistence/backends/sqlalchemy/__init__.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/persistence/backends/sqlalchemy/alembic/README +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/persistence/backends/sqlalchemy/alembic/alembic.ini +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/persistence/backends/sqlalchemy/alembic/env.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/persistence/backends/sqlalchemy/alembic/script.py.mako +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/persistence/backends/sqlalchemy/alembic/versions/0bc3e1a3c135_set_result_meduimtext_type.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/persistence/backends/sqlalchemy/alembic/versions/14b227d79a87_add_intention_column.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/persistence/backends/sqlalchemy/alembic/versions/1c783c0c2875_replace_exception_an.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/persistence/backends/sqlalchemy/alembic/versions/1cea328f0f65_initial_logbook_deta.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/persistence/backends/sqlalchemy/alembic/versions/2ad4984f2864_switch_postgres_to_json_native.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/persistence/backends/sqlalchemy/alembic/versions/3162c0f3f8e4_add_revert_results_and_revert_failure_.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/persistence/backends/sqlalchemy/alembic/versions/40fc8c914bd2_fix_atomdetails_failure_size.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/persistence/backends/sqlalchemy/alembic/versions/589dccdf2b6e_rename_taskdetails_to_atomdetails.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/persistence/backends/sqlalchemy/alembic/versions/6df9422fcb43_fix_flowdetails_meta_size.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/persistence/backends/sqlalchemy/alembic/versions/84d6e888850_add_task_detail_type.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/persistence/backends/sqlalchemy/alembic/versions/README +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/persistence/backends/sqlalchemy/migration.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/persistence/backends/sqlalchemy/tables.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/persistence/base.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/persistence/models.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/persistence/path_based.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/retry.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/states.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/task.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/test.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/__init__.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/fixtures.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/test_examples.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/__init__.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/action_engine/__init__.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/action_engine/test_builder.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/action_engine/test_compile.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/action_engine/test_creation.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/action_engine/test_process_executor.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/action_engine/test_scoping.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/jobs/__init__.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/jobs/base.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/jobs/test_entrypoint.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/patterns/__init__.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/persistence/__init__.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/persistence/base.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/persistence/test_dir_persistence.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/persistence/test_memory_persistence.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/persistence/test_sql_persistence.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/persistence/test_zk_persistence.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/test_arguments_passing.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/test_check_transition.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/test_conductors.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/test_deciders.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/test_engine_helpers.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/test_engines.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/test_exceptions.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/test_failure.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/test_flow_dependencies.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/test_formatters.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/test_functor_task.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/test_listeners.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/test_mapfunctor_task.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/test_notifier.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/test_progress.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/test_reducefunctor_task.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/test_retries.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/test_states.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/test_storage.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/test_suspend.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/test_task.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/test_types.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/test_utils.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/test_utils_async_utils.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/test_utils_binary.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/test_utils_iter_utils.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/test_utils_kazoo_utils.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/test_utils_threading_utils.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/worker_based/__init__.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/worker_based/test_creation.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/worker_based/test_dispatcher.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/worker_based/test_endpoint.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/worker_based/test_executor.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/worker_based/test_message_pump.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/worker_based/test_pipeline.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/worker_based/test_protocol.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/worker_based/test_proxy.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/worker_based/test_server.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/worker_based/test_types.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/unit/worker_based/test_worker.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/tests/utils.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/types/__init__.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/types/entity.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/types/failure.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/types/graph.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/types/latch.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/types/notifier.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/types/sets.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/types/timing.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/types/tree.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/utils/__init__.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/utils/async_utils.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/utils/banner.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/utils/eventlet_utils.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/utils/iter_utils.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/utils/kazoo_utils.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/utils/kombu_utils.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/utils/misc.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/utils/persistence_utils.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/utils/redis_utils.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/utils/schema_utils.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/utils/threading_utils.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow/version.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow.egg-info/dependency_links.txt +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow.egg-info/entry_points.txt +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow.egg-info/not-zip-safe +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/taskflow.egg-info/top_level.txt +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/tools/clear_zk.sh +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/tools/env_builder.sh +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/tools/pretty_tox.sh +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/tools/speed_test.py +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/tools/test-setup.sh +0 -0
- {taskflow-5.4.0 → taskflow-5.6.0}/tools/update_states.sh +0 -0
|
@@ -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:
|
|
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.
|
|
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,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``.
|
|
@@ -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>=
|
|
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
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
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
|
-
**
|
|
589
|
+
**client_conf)
|
|
579
590
|
return s.master_for(conf['sentinel'])
|
|
580
591
|
else:
|
|
581
592
|
return ru.RedisClient(**client_conf)
|
|
@@ -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': {
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
255
|
-
self.
|
|
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.
|
|
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.
|
|
144
|
-
self.
|
|
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.
|
|
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.
|
|
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}
|
|
@@ -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>=
|
|
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.
|
|
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
|
|
@@ -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/
|
|
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 =
|