dynflow 1.3.0 → 1.4.0

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 (225) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +1 -1
  3. data/.travis.yml +3 -4
  4. data/Dockerfile +9 -0
  5. data/Gemfile +6 -0
  6. data/Rakefile +1 -0
  7. data/doc/pages/Gemfile +1 -0
  8. data/doc/pages/Rakefile +1 -0
  9. data/doc/pages/plugins/alert_block.rb +1 -0
  10. data/doc/pages/plugins/div_tag.rb +1 -0
  11. data/doc/pages/plugins/graphviz.rb +1 -0
  12. data/doc/pages/plugins/plantuml.rb +1 -0
  13. data/doc/pages/plugins/play.rb +1 -0
  14. data/doc/pages/plugins/tags.rb +1 -0
  15. data/doc/pages/plugins/toc.rb +1 -0
  16. data/docker-compose.yml +41 -0
  17. data/dynflow.gemspec +1 -0
  18. data/examples/clock_benchmark.rb +1 -0
  19. data/examples/example_helper.rb +19 -2
  20. data/examples/future_execution.rb +2 -1
  21. data/examples/memory_limit_watcher.rb +1 -0
  22. data/examples/orchestrate.rb +4 -5
  23. data/examples/orchestrate_evented.rb +3 -2
  24. data/examples/remote_executor.rb +68 -0
  25. data/examples/singletons.rb +4 -3
  26. data/examples/sub_plan_concurrency_control.rb +2 -1
  27. data/examples/sub_plans.rb +3 -2
  28. data/examples/termination.rb +1 -0
  29. data/lib/dynflow.rb +20 -0
  30. data/lib/dynflow/action.rb +28 -3
  31. data/lib/dynflow/action/cancellable.rb +1 -0
  32. data/lib/dynflow/action/format.rb +1 -0
  33. data/lib/dynflow/action/missing.rb +1 -0
  34. data/lib/dynflow/action/polling.rb +3 -1
  35. data/lib/dynflow/action/progress.rb +1 -0
  36. data/lib/dynflow/action/rescue.rb +1 -0
  37. data/lib/dynflow/action/singleton.rb +1 -0
  38. data/lib/dynflow/action/suspended.rb +9 -2
  39. data/lib/dynflow/action/timeouts.rb +2 -1
  40. data/lib/dynflow/action/with_bulk_sub_plans.rb +2 -1
  41. data/lib/dynflow/action/with_polling_sub_plans.rb +7 -5
  42. data/lib/dynflow/action/with_sub_plans.rb +1 -0
  43. data/lib/dynflow/active_job/queue_adapter.rb +1 -0
  44. data/lib/dynflow/actor.rb +13 -5
  45. data/lib/dynflow/actors.rb +1 -0
  46. data/lib/dynflow/actors/execution_plan_cleaner.rb +1 -0
  47. data/lib/dynflow/clock.rb +27 -47
  48. data/lib/dynflow/config.rb +11 -2
  49. data/lib/dynflow/connectors.rb +1 -0
  50. data/lib/dynflow/connectors/abstract.rb +1 -0
  51. data/lib/dynflow/connectors/database.rb +1 -0
  52. data/lib/dynflow/connectors/direct.rb +1 -0
  53. data/lib/dynflow/coordinator.rb +1 -0
  54. data/lib/dynflow/coordinator_adapters.rb +1 -0
  55. data/lib/dynflow/coordinator_adapters/abstract.rb +1 -0
  56. data/lib/dynflow/coordinator_adapters/sequel.rb +1 -0
  57. data/lib/dynflow/dead_letter_silencer.rb +2 -0
  58. data/lib/dynflow/debug/telemetry/persistence.rb +1 -0
  59. data/lib/dynflow/delayed_executors.rb +1 -0
  60. data/lib/dynflow/delayed_executors/abstract.rb +1 -0
  61. data/lib/dynflow/delayed_executors/abstract_core.rb +1 -0
  62. data/lib/dynflow/delayed_executors/polling.rb +1 -0
  63. data/lib/dynflow/delayed_plan.rb +1 -0
  64. data/lib/dynflow/director.rb +80 -15
  65. data/lib/dynflow/director/execution_plan_manager.rb +17 -3
  66. data/lib/dynflow/director/flow_manager.rb +1 -0
  67. data/lib/dynflow/director/{work_queue.rb → queue_hash.rb} +9 -8
  68. data/lib/dynflow/director/running_steps_manager.rb +55 -18
  69. data/lib/dynflow/director/sequence_cursor.rb +1 -0
  70. data/lib/dynflow/director/sequential_manager.rb +12 -2
  71. data/lib/dynflow/dispatcher.rb +4 -2
  72. data/lib/dynflow/dispatcher/abstract.rb +1 -0
  73. data/lib/dynflow/dispatcher/client_dispatcher.rb +6 -4
  74. data/lib/dynflow/dispatcher/executor_dispatcher.rb +13 -1
  75. data/lib/dynflow/errors.rb +1 -0
  76. data/lib/dynflow/execution_history.rb +1 -0
  77. data/lib/dynflow/execution_plan.rb +3 -2
  78. data/lib/dynflow/execution_plan/dependency_graph.rb +1 -0
  79. data/lib/dynflow/execution_plan/hooks.rb +1 -0
  80. data/lib/dynflow/execution_plan/output_reference.rb +2 -1
  81. data/lib/dynflow/execution_plan/steps.rb +1 -0
  82. data/lib/dynflow/execution_plan/steps/abstract.rb +10 -5
  83. data/lib/dynflow/execution_plan/steps/abstract_flow_step.rb +2 -0
  84. data/lib/dynflow/execution_plan/steps/error.rb +1 -0
  85. data/lib/dynflow/execution_plan/steps/finalize_step.rb +1 -0
  86. data/lib/dynflow/execution_plan/steps/plan_step.rb +1 -0
  87. data/lib/dynflow/execution_plan/steps/run_step.rb +1 -0
  88. data/lib/dynflow/executors.rb +1 -1
  89. data/lib/dynflow/executors/abstract/core.rb +132 -0
  90. data/lib/dynflow/executors/parallel.rb +24 -11
  91. data/lib/dynflow/executors/parallel/core.rb +10 -91
  92. data/lib/dynflow/executors/parallel/pool.rb +4 -2
  93. data/lib/dynflow/executors/parallel/worker.rb +2 -1
  94. data/lib/dynflow/executors/sidekiq/core.rb +121 -0
  95. data/lib/dynflow/executors/sidekiq/internal_job_base.rb +24 -0
  96. data/lib/dynflow/executors/sidekiq/orchestrator_jobs.rb +60 -0
  97. data/lib/dynflow/executors/sidekiq/redis_locking.rb +69 -0
  98. data/lib/dynflow/executors/sidekiq/serialization.rb +33 -0
  99. data/lib/dynflow/executors/sidekiq/worker_jobs.rb +42 -0
  100. data/lib/dynflow/flows.rb +1 -0
  101. data/lib/dynflow/flows/abstract.rb +1 -0
  102. data/lib/dynflow/flows/abstract_composed.rb +1 -0
  103. data/lib/dynflow/flows/atom.rb +1 -0
  104. data/lib/dynflow/flows/concurrence.rb +1 -0
  105. data/lib/dynflow/flows/sequence.rb +1 -0
  106. data/lib/dynflow/logger_adapters.rb +1 -0
  107. data/lib/dynflow/logger_adapters/abstract.rb +1 -0
  108. data/lib/dynflow/logger_adapters/delegator.rb +1 -0
  109. data/lib/dynflow/logger_adapters/formatters.rb +1 -0
  110. data/lib/dynflow/logger_adapters/formatters/abstract.rb +1 -0
  111. data/lib/dynflow/logger_adapters/formatters/exception.rb +1 -0
  112. data/lib/dynflow/logger_adapters/simple.rb +1 -0
  113. data/lib/dynflow/middleware.rb +1 -0
  114. data/lib/dynflow/middleware/common/singleton.rb +1 -0
  115. data/lib/dynflow/middleware/common/transaction.rb +1 -0
  116. data/lib/dynflow/middleware/register.rb +1 -0
  117. data/lib/dynflow/middleware/resolver.rb +1 -0
  118. data/lib/dynflow/middleware/stack.rb +1 -0
  119. data/lib/dynflow/middleware/world.rb +1 -0
  120. data/lib/dynflow/persistence.rb +3 -2
  121. data/lib/dynflow/persistence_adapters.rb +1 -0
  122. data/lib/dynflow/persistence_adapters/abstract.rb +1 -0
  123. data/lib/dynflow/persistence_adapters/sequel.rb +10 -7
  124. data/lib/dynflow/persistence_adapters/sequel_migrations/001_initial.rb +1 -0
  125. data/lib/dynflow/persistence_adapters/sequel_migrations/002_incremental_progress.rb +1 -0
  126. data/lib/dynflow/persistence_adapters/sequel_migrations/003_parent_action.rb +1 -0
  127. data/lib/dynflow/persistence_adapters/sequel_migrations/004_coordinator_records.rb +1 -0
  128. data/lib/dynflow/persistence_adapters/sequel_migrations/005_envelopes.rb +1 -0
  129. data/lib/dynflow/persistence_adapters/sequel_migrations/006_fix_data_length.rb +1 -0
  130. data/lib/dynflow/persistence_adapters/sequel_migrations/007_future_execution.rb +1 -0
  131. data/lib/dynflow/persistence_adapters/sequel_migrations/008_rename_scheduled_plans_to_delayed_plans.rb +1 -0
  132. data/lib/dynflow/persistence_adapters/sequel_migrations/009_fix_mysql_data_length.rb +1 -0
  133. data/lib/dynflow/persistence_adapters/sequel_migrations/010_add_execution_plans_label.rb +1 -0
  134. data/lib/dynflow/persistence_adapters/sequel_migrations/011_placeholder.rb +1 -0
  135. data/lib/dynflow/persistence_adapters/sequel_migrations/012_add_delayed_plans_serialized_args.rb +1 -0
  136. data/lib/dynflow/persistence_adapters/sequel_migrations/013_add_action_columns.rb +1 -0
  137. data/lib/dynflow/persistence_adapters/sequel_migrations/014_add_step_columns.rb +1 -0
  138. data/lib/dynflow/persistence_adapters/sequel_migrations/015_add_execution_plan_columns.rb +1 -0
  139. data/lib/dynflow/persistence_adapters/sequel_migrations/016_add_step_queue.rb +1 -0
  140. data/lib/dynflow/persistence_adapters/sequel_migrations/017_add_delayed_plan_frozen.rb +1 -0
  141. data/lib/dynflow/persistence_adapters/sequel_migrations/018_add_uuid_column.rb +1 -0
  142. data/lib/dynflow/persistence_adapters/sequel_migrations/019_update_mysql_time_precision.rb +48 -0
  143. data/lib/dynflow/rails.rb +1 -0
  144. data/lib/dynflow/rails/configuration.rb +6 -3
  145. data/lib/dynflow/rails/daemon.rb +1 -0
  146. data/lib/dynflow/round_robin.rb +1 -0
  147. data/lib/dynflow/semaphores.rb +1 -0
  148. data/lib/dynflow/semaphores/abstract.rb +1 -0
  149. data/lib/dynflow/semaphores/aggregating.rb +1 -0
  150. data/lib/dynflow/semaphores/dummy.rb +1 -0
  151. data/lib/dynflow/semaphores/stateful.rb +1 -0
  152. data/lib/dynflow/serializable.rb +13 -4
  153. data/lib/dynflow/serializer.rb +24 -0
  154. data/lib/dynflow/serializers.rb +1 -0
  155. data/lib/dynflow/serializers/abstract.rb +1 -0
  156. data/lib/dynflow/serializers/noop.rb +1 -0
  157. data/lib/dynflow/stateful.rb +1 -0
  158. data/lib/dynflow/telemetry.rb +1 -0
  159. data/lib/dynflow/telemetry_adapters/abstract.rb +1 -0
  160. data/lib/dynflow/telemetry_adapters/dummy.rb +1 -0
  161. data/lib/dynflow/telemetry_adapters/statsd.rb +1 -0
  162. data/lib/dynflow/testing.rb +1 -0
  163. data/lib/dynflow/testing/assertions.rb +6 -5
  164. data/lib/dynflow/testing/dummy_execution_plan.rb +1 -0
  165. data/lib/dynflow/testing/dummy_executor.rb +19 -2
  166. data/lib/dynflow/testing/dummy_planned_action.rb +1 -0
  167. data/lib/dynflow/testing/dummy_step.rb +3 -1
  168. data/lib/dynflow/testing/dummy_world.rb +9 -0
  169. data/lib/dynflow/testing/factories.rb +6 -1
  170. data/lib/dynflow/testing/in_thread_executor.rb +22 -3
  171. data/lib/dynflow/testing/in_thread_world.rb +9 -0
  172. data/lib/dynflow/testing/managed_clock.rb +1 -0
  173. data/lib/dynflow/testing/mimic.rb +1 -0
  174. data/lib/dynflow/throttle_limiter.rb +1 -0
  175. data/lib/dynflow/transaction_adapters.rb +1 -0
  176. data/lib/dynflow/transaction_adapters/abstract.rb +1 -0
  177. data/lib/dynflow/transaction_adapters/active_record.rb +1 -0
  178. data/lib/dynflow/transaction_adapters/none.rb +1 -0
  179. data/lib/dynflow/utils.rb +1 -0
  180. data/lib/dynflow/utils/indifferent_hash.rb +1 -0
  181. data/lib/dynflow/utils/priority_queue.rb +1 -0
  182. data/lib/dynflow/version.rb +2 -1
  183. data/lib/dynflow/watchers/memory_consumption_watcher.rb +1 -0
  184. data/lib/dynflow/web.rb +1 -0
  185. data/lib/dynflow/web/console.rb +1 -0
  186. data/lib/dynflow/web/console_helpers.rb +1 -0
  187. data/lib/dynflow/web/filtering_helpers.rb +1 -0
  188. data/lib/dynflow/web/world_helpers.rb +1 -0
  189. data/lib/dynflow/web_console.rb +1 -0
  190. data/lib/dynflow/world.rb +11 -1
  191. data/lib/dynflow/world/invalidation.rb +7 -1
  192. data/test/abnormal_states_recovery_test.rb +41 -40
  193. data/test/action_test.rb +160 -110
  194. data/test/activejob_adapter_test.rb +1 -0
  195. data/test/batch_sub_tasks_test.rb +12 -11
  196. data/test/clock_test.rb +2 -1
  197. data/test/concurrency_control_test.rb +20 -19
  198. data/test/coordinator_test.rb +20 -21
  199. data/test/daemon_test.rb +2 -1
  200. data/test/dead_letter_silencer_test.rb +9 -7
  201. data/test/dispatcher_test.rb +2 -1
  202. data/test/execution_plan_cleaner_test.rb +13 -12
  203. data/test/execution_plan_hooks_test.rb +3 -2
  204. data/test/execution_plan_test.rb +33 -32
  205. data/test/executor_test.rb +533 -489
  206. data/test/future_execution_test.rb +45 -44
  207. data/test/memory_cosumption_watcher_test.rb +5 -4
  208. data/test/middleware_test.rb +55 -54
  209. data/test/persistence_test.rb +56 -53
  210. data/test/rescue_test.rb +36 -35
  211. data/test/round_robin_test.rb +13 -12
  212. data/test/semaphores_test.rb +31 -30
  213. data/test/support/code_workflow_example.rb +1 -0
  214. data/test/support/dummy_example.rb +14 -1
  215. data/test/support/middleware_example.rb +2 -1
  216. data/test/support/rails/config/environment.rb +1 -0
  217. data/test/support/rescue_example.rb +1 -0
  218. data/test/support/test_execution_log.rb +1 -0
  219. data/test/test_helper.rb +18 -17
  220. data/test/testing_test.rb +45 -44
  221. data/test/utils_test.rb +18 -17
  222. data/test/web_console_test.rb +1 -0
  223. data/test/world_test.rb +7 -6
  224. metadata +13 -4
  225. data/lib/dynflow/executors/abstract.rb +0 -40
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require_relative 'test_helper'
2
3
 
3
4
  module Dynflow
@@ -13,11 +14,11 @@ module Dynflow
13
14
  input = { 'input' => 'input' }
14
15
  action = create_and_plan_action Support::DummyExample::WeightedPolling, input
15
16
 
16
- action.must_be_kind_of Support::DummyExample::WeightedPolling
17
- action.phase.must_equal Action::Plan
18
- action.input.must_equal input
19
- action.execution_plan.must_be_kind_of Testing::DummyExecutionPlan
20
- action.state.must_equal :success
17
+ _(action).must_be_kind_of Support::DummyExample::WeightedPolling
18
+ _(action.phase).must_equal Action::Plan
19
+ _(action.input).must_equal input
20
+ _(action.execution_plan).must_be_kind_of Testing::DummyExecutionPlan
21
+ _(action.state).must_equal :success
21
22
  assert_run_phase action
22
23
  assert_finalize_phase action
23
24
  assert_action_planned action, Support::DummyExample::Polling
@@ -31,13 +32,13 @@ module Dynflow
31
32
  end
32
33
  plan_action(action, {})
33
34
  stubbed_action = action.execution_plan.planned_plan_steps.first
34
- stubbed_action.test.must_equal "test"
35
+ _(stubbed_action.test).must_equal "test"
35
36
  end
36
37
 
37
38
  specify '#create_action_presentation' do
38
39
  action = create_action_presentation(Support::DummyExample::WeightedPolling)
39
40
  action.output['message'] = 'make the world a better place'
40
- action.humanized_output.must_equal 'You should make the world a better place'
41
+ _(action.humanized_output).must_equal 'You should make the world a better place'
41
42
  end
42
43
 
43
44
  specify '#run_action without suspend' do
@@ -45,12 +46,12 @@ module Dynflow
45
46
  plan = create_and_plan_action Support::DummyExample::WeightedPolling, input
46
47
  action = run_action plan
47
48
 
48
- action.must_be_kind_of Support::DummyExample::WeightedPolling
49
- action.phase.must_equal Action::Run
50
- action.input.must_equal input
51
- action.world.must_equal plan.world
52
- action.run_step_id.wont_equal action.plan_step_id
53
- action.state.must_equal :success
49
+ _(action).must_be_kind_of Support::DummyExample::WeightedPolling
50
+ _(action.phase).must_equal Action::Run
51
+ _(action.input).must_equal input
52
+ _(action.world).must_equal plan.world
53
+ _(action.run_step_id).wont_equal action.plan_step_id
54
+ _(action.state).must_equal :success
54
55
  end
55
56
 
56
57
  specify '#run_action with suspend' do
@@ -58,25 +59,25 @@ module Dynflow
58
59
  plan = create_and_plan_action Support::DummyExample::Polling, input
59
60
  action = run_action plan
60
61
 
61
- action.output.must_equal 'task' => { 'progress' => 0, 'done' => false }
62
- action.run_progress.must_equal 0
62
+ _(action.output).must_equal 'task' => { 'progress' => 0, 'done' => false }
63
+ _(action.run_progress).must_equal 0
63
64
 
64
65
  3.times { progress_action_time action }
65
- action.output.must_equal('task' => { 'progress' => 30, 'done' => false } ,
66
+ _(action.output).must_equal('task' => { 'progress' => 30, 'done' => false } ,
66
67
  'poll_attempts' => {'total' => 2, 'failed'=> 0 })
67
- action.run_progress.must_equal 0.3
68
+ _(action.run_progress).must_equal 0.3
68
69
 
69
70
  run_action action, Dynflow::Action::Polling::Poll
70
71
  run_action action, Dynflow::Action::Polling::Poll
71
- action.output.must_equal('task' => { 'progress' => 50, 'done' => false },
72
+ _(action.output).must_equal('task' => { 'progress' => 50, 'done' => false },
72
73
  'poll_attempts' => {'total' => 4, 'failed' => 0 })
73
- action.run_progress.must_equal 0.5
74
+ _(action.run_progress).must_equal 0.5
74
75
 
75
76
  5.times { progress_action_time action }
76
77
 
77
- action.output.must_equal('task' => { 'progress' => 100, 'done' => true },
78
+ _(action.output).must_equal('task' => { 'progress' => 100, 'done' => true },
78
79
  'poll_attempts' => {'total' => 9, 'failed' => 0 })
79
- action.run_progress.must_equal 1
80
+ _(action.run_progress).must_equal 1
80
81
  end
81
82
 
82
83
  specify '#finalize_action' do
@@ -86,15 +87,15 @@ module Dynflow
86
87
  $dummy_heavy_progress = false
87
88
  action = finalize_action run
88
89
 
89
- action.must_be_kind_of Support::DummyExample::WeightedPolling
90
- action.phase.must_equal Action::Finalize
91
- action.input.must_equal input
92
- action.output.must_equal run.output
93
- action.world.must_equal plan.world
94
- action.finalize_step_id.wont_equal action.run_step_id
95
- action.state.must_equal :success
90
+ _(action).must_be_kind_of Support::DummyExample::WeightedPolling
91
+ _(action.phase).must_equal Action::Finalize
92
+ _(action.input).must_equal input
93
+ _(action.output).must_equal run.output
94
+ _(action.world).must_equal plan.world
95
+ _(action.finalize_step_id).wont_equal action.run_step_id
96
+ _(action.state).must_equal :success
96
97
 
97
- $dummy_heavy_progress.must_equal 'dummy_heavy_progress'
98
+ _($dummy_heavy_progress).must_equal 'dummy_heavy_progress'
98
99
  end
99
100
  end
100
101
 
@@ -104,7 +105,7 @@ module Dynflow
104
105
  it 'plans' do
105
106
  action = create_and_plan_action CWE::Commit, sha = 'commit-sha'
106
107
 
107
- action.input.must_equal({})
108
+ _(action.input).must_equal({})
108
109
  refute_run_phase action
109
110
  refute_finalize_phase action
110
111
 
@@ -123,15 +124,15 @@ module Dynflow
123
124
  let(:runned_action) { run_action planned_action }
124
125
 
125
126
  it 'plans' do
126
- planned_action.input.must_equal Utils.stringify_keys(input)
127
+ _(planned_action.input).must_equal Utils.stringify_keys(input)
127
128
  assert_run_phase planned_action, { commit: "sha", reviewer: "name", result: true}
128
129
  refute_finalize_phase planned_action
129
130
 
130
- planned_action.execution_plan.planned_plan_steps.must_be_empty
131
+ _(planned_action.execution_plan.planned_plan_steps).must_be_empty
131
132
  end
132
133
 
133
134
  it 'runs' do
134
- runned_action.output.fetch(:passed).must_equal runned_action.input.fetch(:result)
135
+ _(runned_action.output.fetch(:passed)).must_equal runned_action.input.fetch(:result)
135
136
  end
136
137
  end
137
138
 
@@ -143,15 +144,15 @@ module Dynflow
143
144
 
144
145
  it 'plans' do
145
146
  assert_run_phase planned_action do |input|
146
- input[:commit].must_equal "sha"
147
+ _(input[:commit]).must_equal "sha"
147
148
  end
148
149
  refute_finalize_phase planned_action
149
150
 
150
- planned_action.execution_plan.planned_plan_steps.must_be_empty
151
+ _(planned_action.execution_plan.planned_plan_steps).must_be_empty
151
152
  end
152
153
 
153
154
  it 'runs' do
154
- runned_action.output.fetch(:passed).must_equal true
155
+ _(runned_action.output.fetch(:passed)).must_equal true
155
156
  end
156
157
 
157
158
  describe 'when something fails' do
@@ -160,7 +161,7 @@ module Dynflow
160
161
  end
161
162
 
162
163
  it 'runs' do
163
- runned_action.output.fetch(:passed).must_equal false
164
+ _(runned_action.output.fetch(:passed)).must_equal false
164
165
  end
165
166
  end
166
167
  end
@@ -196,7 +197,7 @@ module Dynflow
196
197
  f.wait
197
198
 
198
199
  f.value.tap do |plan|
199
- plan.state.must_equal :stopped
200
+ _(plan.state).must_equal :stopped
200
201
  end
201
202
  end
202
203
  end
@@ -228,7 +229,7 @@ module Dynflow
228
229
  let :failed_execution_plan do
229
230
  plan = world.plan(Support::CodeWorkflowExample::IncomingIssues, failing_issues_data)
230
231
  plan = world.execute(plan.id).value
231
- plan.state.must_equal :paused
232
+ _(plan.state).must_equal :paused
232
233
  plan
233
234
  end
234
235
 
@@ -238,19 +239,19 @@ module Dynflow
238
239
 
239
240
  it "is able to execute plans inside the thread" do
240
241
  world.execute(execution_plan.id).value.tap do |plan|
241
- plan.state.must_equal :stopped
242
+ _(plan.state).must_equal :stopped
242
243
  end
243
244
  end
244
245
 
245
246
  it "is able to handle errors in the plan" do
246
247
  world.execute(failed_execution_plan.id).value.tap do |plan|
247
- plan.state.must_equal :paused
248
+ _(plan.state).must_equal :paused
248
249
  end
249
250
  end
250
251
 
251
252
  it "is able to handle when events" do
252
253
  world.execute(polling_execution_plan.id).value.tap do |plan|
253
- plan.state.must_equal :stopped
254
+ _(plan.state).must_equal :stopped
254
255
  end
255
256
  end
256
257
 
@@ -268,8 +269,8 @@ module Dynflow
268
269
  end
269
270
 
270
271
  it 'skips the action and continues automatically' do
271
- execution_plan.state.must_equal :stopped
272
- execution_plan.result.must_equal :warning
272
+ _(execution_plan.state).must_equal :stopped
273
+ _(execution_plan.result).must_equal :warning
273
274
  end
274
275
  end
275
276
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require_relative 'test_helper'
2
3
 
3
4
  module Dynflow
@@ -7,49 +8,49 @@ module Dynflow
7
8
 
8
9
  it 'can insert elements' do
9
10
  queue.push 1
10
- queue.top.must_equal 1
11
+ _(queue.top).must_equal 1
11
12
  queue.push 2
12
- queue.top.must_equal 2
13
+ _(queue.top).must_equal 2
13
14
  queue.push 3
14
- queue.top.must_equal 3
15
- queue.to_a.must_equal [1, 2, 3]
15
+ _(queue.top).must_equal 3
16
+ _(queue.to_a).must_equal [1, 2, 3]
16
17
  end
17
18
 
18
19
  it 'can override the comparator' do
19
20
  queue = Utils::PriorityQueue.new { |a, b| b <=> a }
20
21
  queue.push 1
21
- queue.top.must_equal 1
22
+ _(queue.top).must_equal 1
22
23
  queue.push 2
23
- queue.top.must_equal 1
24
+ _(queue.top).must_equal 1
24
25
  queue.push 3
25
- queue.top.must_equal 1
26
- queue.to_a.must_equal [3, 2, 1]
26
+ _(queue.top).must_equal 1
27
+ _(queue.to_a).must_equal [3, 2, 1]
27
28
  end
28
29
 
29
30
  it 'can inspect top element without removing it' do
30
- queue.top.must_be_nil
31
+ assert_nil queue.top
31
32
  queue.push(1)
32
- queue.top.must_equal 1
33
+ _(queue.top).must_equal 1
33
34
  queue.push(3)
34
- queue.top.must_equal 3
35
+ _(queue.top).must_equal 3
35
36
  queue.push(2)
36
- queue.top.must_equal 3
37
+ _(queue.top).must_equal 3
37
38
  end
38
39
 
39
40
  it 'can report size' do
40
41
  count = 5
41
42
  count.times { queue.push 1 }
42
- queue.size.must_equal count
43
+ _(queue.size).must_equal count
43
44
  end
44
45
 
45
46
  it 'pops elements in correct order' do
46
47
  queue.push 1
47
48
  queue.push 3
48
49
  queue.push 2
49
- queue.pop.must_equal 3
50
- queue.pop.must_equal 2
51
- queue.pop.must_equal 1
52
- queue.pop.must_equal nil
50
+ _(queue.pop).must_equal 3
51
+ _(queue.pop).must_equal 2
52
+ _(queue.pop).must_equal 1
53
+ assert_nil queue.pop
53
54
  end
54
55
  end
55
56
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require_relative 'test_helper'
2
3
 
3
4
  ENV['RACK_ENV'] = 'test'
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require_relative 'test_helper'
2
3
  require 'fileutils'
3
4
 
@@ -11,14 +12,14 @@ module Dynflow
11
12
  it 'by default informs about the hostname and the pid running the world' do
12
13
  registered_world = world.coordinator.find_worlds(false, id: world.id).first
13
14
  registered_world.meta.delete('last_seen')
14
- registered_world.meta.must_equal('hostname' => Socket.gethostname, 'pid' => Process.pid,
15
+ _(registered_world.meta).must_equal('hostname' => Socket.gethostname, 'pid' => Process.pid,
15
16
  'queues' => { 'default' => { 'pool_size' => 5 },
16
17
  'slow' => { 'pool_size' => 1 }})
17
18
  end
18
19
 
19
20
  it 'is configurable' do
20
21
  registered_world = world.coordinator.find_worlds(false, id: world_with_custom_meta.id).first
21
- registered_world.meta['fast'].must_equal true
22
+ _(registered_world.meta['fast']).must_equal true
22
23
  end
23
24
  end
24
25
 
@@ -29,24 +30,24 @@ module Dynflow
29
30
  end
30
31
 
31
32
  it 'retrieves correct execution items count' do
32
- world.get_execution_status(world.id, nil, 5).value!.must_equal(base)
33
+ _(world.get_execution_status(world.id, nil, 5).value!).must_equal(base)
33
34
  id = 'something like uuid'
34
35
  expected = base.dup
35
36
  expected[:default][:queue_size] = 0
36
37
  expected[:slow][:queue_size] = 0
37
- world.get_execution_status(world.id, id, 5).value!.must_equal(expected)
38
+ _(world.get_execution_status(world.id, id, 5).value!).must_equal(expected)
38
39
  end
39
40
  end
40
41
 
41
42
  describe '#terminate' do
42
43
  it 'fires an event after termination' do
43
44
  terminated_event = world.terminated
44
- terminated_event.resolved?.must_equal false
45
+ _(terminated_event.resolved?).must_equal false
45
46
  world.terminate
46
47
  # wait for termination process to finish, but don't block
47
48
  # the test from running.
48
49
  terminated_event.wait(10)
49
- terminated_event.resolved?.must_equal true
50
+ _(terminated_event.resolved?).must_equal true
50
51
  end
51
52
  end
52
53
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dynflow
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ivan Necas
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2019-08-15 00:00:00.000000000 Z
12
+ date: 2019-10-22 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: multi_json
@@ -232,6 +232,7 @@ files:
232
232
  - ".rubocop.yml"
233
233
  - ".rubocop_todo.yml"
234
234
  - ".travis.yml"
235
+ - Dockerfile
235
236
  - Gemfile
236
237
  - MIT-LICENSE
237
238
  - README.md
@@ -369,6 +370,7 @@ files:
369
370
  - doc/pages/source/index.md
370
371
  - doc/pages/source/media/index.md
371
372
  - doc/pages/source/projects/index.md
373
+ - docker-compose.yml
372
374
  - dynflow.gemspec
373
375
  - examples/clock_benchmark.rb
374
376
  - examples/example_helper.rb
@@ -420,10 +422,10 @@ files:
420
422
  - lib/dynflow/director.rb
421
423
  - lib/dynflow/director/execution_plan_manager.rb
422
424
  - lib/dynflow/director/flow_manager.rb
425
+ - lib/dynflow/director/queue_hash.rb
423
426
  - lib/dynflow/director/running_steps_manager.rb
424
427
  - lib/dynflow/director/sequence_cursor.rb
425
428
  - lib/dynflow/director/sequential_manager.rb
426
- - lib/dynflow/director/work_queue.rb
427
429
  - lib/dynflow/dispatcher.rb
428
430
  - lib/dynflow/dispatcher/abstract.rb
429
431
  - lib/dynflow/dispatcher/client_dispatcher.rb
@@ -442,11 +444,17 @@ files:
442
444
  - lib/dynflow/execution_plan/steps/plan_step.rb
443
445
  - lib/dynflow/execution_plan/steps/run_step.rb
444
446
  - lib/dynflow/executors.rb
445
- - lib/dynflow/executors/abstract.rb
447
+ - lib/dynflow/executors/abstract/core.rb
446
448
  - lib/dynflow/executors/parallel.rb
447
449
  - lib/dynflow/executors/parallel/core.rb
448
450
  - lib/dynflow/executors/parallel/pool.rb
449
451
  - lib/dynflow/executors/parallel/worker.rb
452
+ - lib/dynflow/executors/sidekiq/core.rb
453
+ - lib/dynflow/executors/sidekiq/internal_job_base.rb
454
+ - lib/dynflow/executors/sidekiq/orchestrator_jobs.rb
455
+ - lib/dynflow/executors/sidekiq/redis_locking.rb
456
+ - lib/dynflow/executors/sidekiq/serialization.rb
457
+ - lib/dynflow/executors/sidekiq/worker_jobs.rb
450
458
  - lib/dynflow/flows.rb
451
459
  - lib/dynflow/flows/abstract.rb
452
460
  - lib/dynflow/flows/abstract_composed.rb
@@ -489,6 +497,7 @@ files:
489
497
  - lib/dynflow/persistence_adapters/sequel_migrations/016_add_step_queue.rb
490
498
  - lib/dynflow/persistence_adapters/sequel_migrations/017_add_delayed_plan_frozen.rb
491
499
  - lib/dynflow/persistence_adapters/sequel_migrations/018_add_uuid_column.rb
500
+ - lib/dynflow/persistence_adapters/sequel_migrations/019_update_mysql_time_precision.rb
492
501
  - lib/dynflow/rails.rb
493
502
  - lib/dynflow/rails/configuration.rb
494
503
  - lib/dynflow/rails/daemon.rb
@@ -1,40 +0,0 @@
1
- module Dynflow
2
- module Executors
3
- class Abstract
4
- include Algebrick::TypeCheck
5
- attr_reader :world, :logger
6
-
7
- def initialize(world)
8
- @world = Type! world, World
9
- @logger = world.logger
10
- end
11
-
12
- # @param execution_plan_id [String] id of execution plan
13
- # @param finished [Concurrent::Promises::ResolvableFuture]
14
- # @param wait_for_acceptance [TrueClass|FalseClass] should the executor confirm receiving
15
- # the event, disable if calling executor from within executor
16
- # @return [Concurrent::Promises::ResolvableFuture]
17
- # @raise when execution_plan_id is not accepted
18
- def execute(execution_plan_id, finished = Concurrent::Promises.resolvable_future, wait_for_acceptance = true)
19
- raise NotImplementedError
20
- end
21
-
22
- def event(execution_plan_id, step_id, event, future = Concurrent::Promises.resolvable_future)
23
- raise NotImplementedError
24
- end
25
-
26
- def terminate(future = Concurrent::Promises.resolvable_future)
27
- raise NotImplementedError
28
- end
29
-
30
- def execution_status(execution_plan_id = nil)
31
- raise NotImplementedError
32
- end
33
-
34
- # @return [Concurrent::Promises::ResolvableFuture]
35
- def initialized
36
- raise NotImplementedError
37
- end
38
- end
39
- end
40
- end