dynflow 1.9.0 → 1.9.2

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c1eddd0493e79287abacde548a9237bf6d13c0ec6f5d2e67d802a85de9be29db
4
- data.tar.gz: f0826ba6cc0c8066a70d6c7b2cf5f11e5e7d29e1c96915057b4f099546fd1a16
3
+ metadata.gz: 7fdd259a8ad2f40e3edb40e284606c9e9d8193e24ecc7841dde568f966e52da0
4
+ data.tar.gz: 1c5d8ef5922bdf6a9a4bae86ee1b9f6c72bc99ed34f016b201a6550d8960925f
5
5
  SHA512:
6
- metadata.gz: 7f2f82d41dbe9fa17ed1dc184dfaba98fc8e49ced49ec14ba523de6a4965b5ea0d9626d859b9f439647e47c1216a6d2b35a41d0dcb4a4e2d479e83cee736cd91
7
- data.tar.gz: f362ca21ed154a5bd0b4ec5e5814cbb1fd48b78a51390bb17fb259d097fd5f12471c7022b85275ee4af3ee88e5efe2cc6dd199256ac6603bb13464c1ef1fe662
6
+ metadata.gz: 5871133e3cf66929ccbe6bf2e7b585f411b3465b7dca8c283e9d588d8ea8c95d716f659882b4a9607720cb8cae45735251bae5cb2ee2ce6c03f3572851cd286c
7
+ data.tar.gz: ec3d09a5de46cf12152b1ce203cebad813d1f0601313315c748f9b6c473cc7df33ee25ff543c0155da0fb9bbd267a78b0a472f055868f18da325ebc2df2e977b
@@ -38,6 +38,7 @@ jobs:
38
38
  - 2.7.0
39
39
  - 3.0.0
40
40
  - 3.2.0
41
+ - 3.4
41
42
  concurrent_ruby_ext:
42
43
  - 'true'
43
44
  - 'false'
@@ -57,12 +58,16 @@ jobs:
57
58
  ruby_version: 3.0.0
58
59
  - db: mysql
59
60
  ruby_version: 3.2.0
61
+ - db: mysql
62
+ ruby_version: 3.4
60
63
  - db: mysql
61
64
  concurrent_ruby_ext: 'true'
62
65
  - db: sqlite3
63
66
  ruby_version: 3.0.0
64
67
  - db: sqlite3
65
68
  ruby_version: 3.2.0
69
+ - db: sqlite3
70
+ ruby_version: 3.4
66
71
  - db: sqlite3
67
72
  concurrent_ruby_ext: 'true'
68
73
  - db: postgresql
@@ -71,6 +76,9 @@ jobs:
71
76
  - db: postgresql
72
77
  ruby_version: 3.2.0
73
78
  concurrent_ruby_ext: 'true'
79
+ - db: postgresql
80
+ ruby_version: 3.4
81
+ concurrent_ruby_ext: 'true'
74
82
 
75
83
  services:
76
84
  postgres:
data/dynflow.gemspec CHANGED
@@ -24,18 +24,23 @@ Gem::Specification.new do |s|
24
24
  s.add_dependency "apipie-params"
25
25
  s.add_dependency "concurrent-ruby", '~> 1.1.3'
26
26
  s.add_dependency "concurrent-ruby-edge", '~> 0.6.0'
27
+ s.add_dependency "csv", "~> 3.1"
27
28
  s.add_dependency "msgpack", '~> 1.3', '>= 1.3.3'
28
29
  s.add_dependency "multi_json"
29
30
  s.add_dependency "sequel", '>= 4.0.0'
30
31
 
31
32
  s.add_development_dependency 'activejob'
32
33
  s.add_development_dependency "activerecord"
34
+ s.add_development_dependency 'drb' # ActiveSupport requires this, but doesn't explicitly depend on it
33
35
  s.add_development_dependency "minitest", "< 5.19"
34
36
  s.add_development_dependency "minitest-reporters"
35
37
  s.add_development_dependency "minitest-stub-const"
36
38
  s.add_development_dependency 'mocha'
39
+ s.add_development_dependency 'mutex_m' # Rails require this, but don't explicitly depend on it
40
+ s.add_development_dependency 'ostruct'
37
41
  s.add_development_dependency "rack-test"
38
42
  s.add_development_dependency "rake"
39
43
  s.add_development_dependency "sinatra"
40
44
  s.add_development_dependency "sqlite3"
45
+ s.add_development_dependency 'syslog' # logging requires this, but doesn't explicitly depend on it
41
46
  end
@@ -102,7 +102,7 @@ module Dynflow::Action::V2
102
102
 
103
103
  def increase_counts(planned, failed)
104
104
  output[:planned_count] += planned + failed
105
- output[:failed_count] = output.fetch(:failed_count, 0) + failed
105
+ output[:failed_count] = output.fetch(:failed_count, 0) + failed
106
106
  output[:pending_count] = output.fetch(:pending_count, 0) + planned
107
107
  output[:success_count] ||= 0
108
108
  end
@@ -129,12 +129,20 @@ module Dynflow::Action::V2
129
129
  end
130
130
 
131
131
  def recalculate_counts
132
- total = total_count
133
- failed = sub_plans_count('state' => %w(paused stopped), 'result' => %w(error warning))
132
+ total = total_count
133
+ if output[:cancelled_timestamp]
134
+ cancelled_scheduled_plans = sub_plans_count_after(output[:cancelled_timestamp], { 'state' => %w(paused stopped), 'result' => %w(error warning) })
135
+ cancelled_unscheduled_plans = total_count - output[:planned_count]
136
+ cancelled = cancelled_unscheduled_plans + cancelled_scheduled_plans
137
+ else
138
+ cancelled = cancelled_scheduled_plans = 0
139
+ end
140
+ failed = sub_plans_count('state' => %w(paused stopped), 'result' => %w(error warning)) - cancelled_scheduled_plans
134
141
  success = sub_plans_count('state' => 'stopped', 'result' => 'success')
135
- output.update(:pending_count => total - failed - success,
136
- :failed_count => failed - output.fetch(:resumed_count, 0),
137
- :success_count => success)
142
+ output.update(:pending_count => total - failed - success - cancelled_scheduled_plans,
143
+ :failed_count => failed - output.fetch(:resumed_count, 0),
144
+ :success_count => success,
145
+ :cancelled_count => cancelled)
138
146
  end
139
147
 
140
148
  def counts_set?
@@ -142,7 +150,7 @@ module Dynflow::Action::V2
142
150
  end
143
151
 
144
152
  def check_for_errors!
145
- raise SubtaskFailedException.new("A sub task failed") if output[:failed_count] > 0
153
+ raise SubtaskFailedException.new("A sub task failed") if output[:failed_count] + output[:cancelled_count] > 0
146
154
  end
147
155
 
148
156
  # Helper for creating sub plans
@@ -173,6 +181,7 @@ module Dynflow::Action::V2
173
181
  def cancel!(force = false)
174
182
  # Count the not-yet-planned tasks as cancelled
175
183
  output[:cancelled_count] = total_count - output[:planned_count]
184
+ output[:cancelled_timestamp] ||= Time.now.utc.iso8601 # time in UTC for comparison with UTC times in the database
176
185
  on_planning_finished if output[:cancelled_count].positive?
177
186
  # Pass the cancel event to running sub plans if they can be cancelled
178
187
  sub_plans(:state => 'running').each { |sub_plan| sub_plan.cancel(force) if sub_plan.cancellable? }
@@ -198,7 +207,9 @@ module Dynflow::Action::V2
198
207
  end
199
208
 
200
209
  def remaining_count
201
- total_count - output[:cancelled_count] - output[:planned_count]
210
+ return 0 if output[:cancelled_timestamp]
211
+
212
+ total_count - output[:planned_count]
202
213
  end
203
214
 
204
215
  private
@@ -216,5 +227,9 @@ module Dynflow::Action::V2
216
227
  def sub_plans_count(filter = {})
217
228
  world.persistence.find_execution_plan_counts(filters: sub_plan_filter.merge(filter))
218
229
  end
230
+
231
+ def sub_plans_count_after(timestamp, filter = {})
232
+ world.persistence.find_execution_plan_counts_after(timestamp, { filters: sub_plan_filter.merge(filter) })
233
+ end
219
234
  end
220
235
  end
@@ -73,6 +73,10 @@ module Dynflow
73
73
  adapter.find_execution_plan_counts(options)
74
74
  end
75
75
 
76
+ def find_execution_plan_counts_after(timestamp, options)
77
+ adapter.find_execution_plan_counts_after(timestamp, options)
78
+ end
79
+
76
80
  def delete_execution_plans(filters, batch_size = 1000, enforce_backup_dir = nil)
77
81
  backup_dir = enforce_backup_dir || current_backup_dir
78
82
  adapter.delete_execution_plans(filters, batch_size, backup_dir)
@@ -46,6 +46,10 @@ module Dynflow
46
46
  filter(:execution_plan, options[:filters]).count
47
47
  end
48
48
 
49
+ def find_execution_plan_counts_after(timestamp, options = {})
50
+ raise NotImplementedError
51
+ end
52
+
49
53
  def find_execution_plan_statuses(options)
50
54
  raise NotImplementedError
51
55
  end
@@ -78,6 +78,10 @@ module Dynflow
78
78
  filter(:execution_plan, table(:execution_plan), options[:filters]).count
79
79
  end
80
80
 
81
+ def find_execution_plan_counts_after(timestamp, options = {})
82
+ filter(:execution_plan, table(:execution_plan), options[:filters]).filter(::Sequel.lit('ended_at >= ?', timestamp)).count
83
+ end
84
+
81
85
  def find_execution_plan_statuses(options)
82
86
  plans = filter(:execution_plan, table(:execution_plan), options[:filters])
83
87
  .select(:uuid, :state, :result)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Dynflow
4
- VERSION = '1.9.0'
4
+ VERSION = '1.9.2'
5
5
  end
data/test/test_helper.rb CHANGED
@@ -331,7 +331,7 @@ module PlanAssertions
331
331
  def inspect_flow(execution_plan, flow)
332
332
  out = "".dup
333
333
  inspect_subflow(out, execution_plan, flow, "".dup)
334
- out
334
+ out.gsub(/ => /, '=>')
335
335
  end
336
336
 
337
337
  def inspect_plan_steps(execution_plan)
metadata CHANGED
@@ -1,15 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dynflow
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.9.0
4
+ version: 1.9.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ivan Necas
8
8
  - Petr Chalupa
9
- autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2024-06-11 00:00:00.000000000 Z
11
+ date: 2025-06-03 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: algebrick
@@ -67,6 +66,20 @@ dependencies:
67
66
  - - "~>"
68
67
  - !ruby/object:Gem::Version
69
68
  version: 0.6.0
69
+ - !ruby/object:Gem::Dependency
70
+ name: csv
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '3.1'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '3.1'
70
83
  - !ruby/object:Gem::Dependency
71
84
  name: msgpack
72
85
  requirement: !ruby/object:Gem::Requirement
@@ -143,6 +156,20 @@ dependencies:
143
156
  - - ">="
144
157
  - !ruby/object:Gem::Version
145
158
  version: '0'
159
+ - !ruby/object:Gem::Dependency
160
+ name: drb
161
+ requirement: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - ">="
164
+ - !ruby/object:Gem::Version
165
+ version: '0'
166
+ type: :development
167
+ prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - ">="
171
+ - !ruby/object:Gem::Version
172
+ version: '0'
146
173
  - !ruby/object:Gem::Dependency
147
174
  name: minitest
148
175
  requirement: !ruby/object:Gem::Requirement
@@ -199,6 +226,34 @@ dependencies:
199
226
  - - ">="
200
227
  - !ruby/object:Gem::Version
201
228
  version: '0'
229
+ - !ruby/object:Gem::Dependency
230
+ name: mutex_m
231
+ requirement: !ruby/object:Gem::Requirement
232
+ requirements:
233
+ - - ">="
234
+ - !ruby/object:Gem::Version
235
+ version: '0'
236
+ type: :development
237
+ prerelease: false
238
+ version_requirements: !ruby/object:Gem::Requirement
239
+ requirements:
240
+ - - ">="
241
+ - !ruby/object:Gem::Version
242
+ version: '0'
243
+ - !ruby/object:Gem::Dependency
244
+ name: ostruct
245
+ requirement: !ruby/object:Gem::Requirement
246
+ requirements:
247
+ - - ">="
248
+ - !ruby/object:Gem::Version
249
+ version: '0'
250
+ type: :development
251
+ prerelease: false
252
+ version_requirements: !ruby/object:Gem::Requirement
253
+ requirements:
254
+ - - ">="
255
+ - !ruby/object:Gem::Version
256
+ version: '0'
202
257
  - !ruby/object:Gem::Dependency
203
258
  name: rack-test
204
259
  requirement: !ruby/object:Gem::Requirement
@@ -255,6 +310,20 @@ dependencies:
255
310
  - - ">="
256
311
  - !ruby/object:Gem::Version
257
312
  version: '0'
313
+ - !ruby/object:Gem::Dependency
314
+ name: syslog
315
+ requirement: !ruby/object:Gem::Requirement
316
+ requirements:
317
+ - - ">="
318
+ - !ruby/object:Gem::Version
319
+ version: '0'
320
+ type: :development
321
+ prerelease: false
322
+ version_requirements: !ruby/object:Gem::Requirement
323
+ requirements:
324
+ - - ">="
325
+ - !ruby/object:Gem::Version
326
+ version: '0'
258
327
  description: Ruby workflow/orchestration engine
259
328
  email:
260
329
  - inecas@redhat.com
@@ -668,7 +737,6 @@ homepage: https://github.com/Dynflow/dynflow
668
737
  licenses:
669
738
  - MIT
670
739
  metadata: {}
671
- post_install_message:
672
740
  rdoc_options: []
673
741
  require_paths:
674
742
  - lib
@@ -683,8 +751,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
683
751
  - !ruby/object:Gem::Version
684
752
  version: '0'
685
753
  requirements: []
686
- rubygems_version: 3.1.2
687
- signing_key:
754
+ rubygems_version: 3.6.2
688
755
  specification_version: 4
689
756
  summary: DYNamic workFLOW engine
690
757
  test_files: