floe 0.13.1 → 0.15.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.codeclimate.yml +21 -1
- data/CHANGELOG.md +27 -1
- data/README.md +8 -0
- data/examples/map.asl +46 -0
- data/examples/parallel.asl +32 -0
- data/lib/floe/cli.rb +15 -8
- data/lib/floe/container_runner/docker.rb +10 -9
- data/lib/floe/container_runner/kubernetes.rb +10 -8
- data/lib/floe/container_runner/podman.rb +8 -5
- data/lib/floe/validation_mixin.rb +9 -1
- data/lib/floe/version.rb +1 -1
- data/lib/floe/workflow/branch.rb +8 -0
- data/lib/floe/workflow/choice_rule/data.rb +88 -32
- data/lib/floe/workflow/item_processor.rb +14 -0
- data/lib/floe/workflow/state.rb +2 -2
- data/lib/floe/workflow/states/child_workflow_mixin.rb +58 -0
- data/lib/floe/workflow/states/choice.rb +6 -6
- data/lib/floe/workflow/states/map.rb +116 -2
- data/lib/floe/workflow/states/parallel.rb +65 -2
- data/lib/floe/workflow/states/retry_catch_mixin.rb +57 -0
- data/lib/floe/workflow/states/task.rb +1 -48
- data/lib/floe/workflow.rb +16 -35
- data/lib/floe/workflow_base.rb +108 -0
- data/lib/floe.rb +21 -3
- data/tools/step_functions +110 -0
- metadata +10 -3
- data/sig/floe.rbs/floe.rbs +0 -4
data/lib/floe.rb
CHANGED
@@ -8,8 +8,11 @@ require_relative "floe/logging"
|
|
8
8
|
require_relative "floe/runner"
|
9
9
|
|
10
10
|
require_relative "floe/validation_mixin"
|
11
|
+
require_relative "floe/workflow_base"
|
11
12
|
require_relative "floe/workflow"
|
13
|
+
# mixins used by workflow components
|
12
14
|
require_relative "floe/workflow/error_matcher_mixin"
|
15
|
+
require_relative "floe/workflow/branch"
|
13
16
|
require_relative "floe/workflow/catcher"
|
14
17
|
require_relative "floe/workflow/choice_rule"
|
15
18
|
require_relative "floe/workflow/choice_rule/not"
|
@@ -17,6 +20,7 @@ require_relative "floe/workflow/choice_rule/or"
|
|
17
20
|
require_relative "floe/workflow/choice_rule/and"
|
18
21
|
require_relative "floe/workflow/choice_rule/data"
|
19
22
|
require_relative "floe/workflow/context"
|
23
|
+
require_relative "floe/workflow/item_processor"
|
20
24
|
require_relative "floe/workflow/intrinsic_function"
|
21
25
|
require_relative "floe/workflow/intrinsic_function/parser"
|
22
26
|
require_relative "floe/workflow/intrinsic_function/transformer"
|
@@ -25,11 +29,14 @@ require_relative "floe/workflow/payload_template"
|
|
25
29
|
require_relative "floe/workflow/reference_path"
|
26
30
|
require_relative "floe/workflow/retrier"
|
27
31
|
require_relative "floe/workflow/state"
|
32
|
+
# mixins used by states
|
33
|
+
require_relative "floe/workflow/states/child_workflow_mixin"
|
34
|
+
require_relative "floe/workflow/states/input_output_mixin"
|
35
|
+
require_relative "floe/workflow/states/non_terminal_mixin"
|
36
|
+
require_relative "floe/workflow/states/retry_catch_mixin"
|
28
37
|
require_relative "floe/workflow/states/choice"
|
29
38
|
require_relative "floe/workflow/states/fail"
|
30
|
-
require_relative "floe/workflow/states/input_output_mixin"
|
31
39
|
require_relative "floe/workflow/states/map"
|
32
|
-
require_relative "floe/workflow/states/non_terminal_mixin"
|
33
40
|
require_relative "floe/workflow/states/parallel"
|
34
41
|
require_relative "floe/workflow/states/pass"
|
35
42
|
require_relative "floe/workflow/states/succeed"
|
@@ -43,7 +50,18 @@ module Floe
|
|
43
50
|
class Error < StandardError; end
|
44
51
|
class InvalidWorkflowError < Error; end
|
45
52
|
class InvalidExecutionInput < Error; end
|
46
|
-
|
53
|
+
|
54
|
+
class ExecutionError < Error
|
55
|
+
attr_reader :floe_error
|
56
|
+
|
57
|
+
def initialize(message, floe_error = "States.Runtime")
|
58
|
+
super(message)
|
59
|
+
@floe_error = floe_error
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
class PathError < ExecutionError
|
64
|
+
end
|
47
65
|
|
48
66
|
def self.logger
|
49
67
|
@logger ||= NullLogger.new
|
@@ -0,0 +1,110 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "bundler/inline"
|
4
|
+
gemfile do
|
5
|
+
source "https://rubygems.org"
|
6
|
+
gem "optimist"
|
7
|
+
gem "colorize"
|
8
|
+
end
|
9
|
+
require "pp"
|
10
|
+
|
11
|
+
SUB_COMMANDS = {
|
12
|
+
"execute" => "Execute an .asl file through the stepfunctions simulator.",
|
13
|
+
"intrinsic" => "Execute an intrinsic function or JSONPath standalone."
|
14
|
+
}.freeze
|
15
|
+
Optimist.options do
|
16
|
+
banner "Run the aws stepfunctions simulator."
|
17
|
+
banner ""
|
18
|
+
banner "Notes:"
|
19
|
+
banner " This tool requires the stepfunctions simulator to be installed locally and running."
|
20
|
+
banner " Installation instructions can be found at https://docs.aws.amazon.com/step-functions/latest/dg/sfn-local.html."
|
21
|
+
banner ""
|
22
|
+
banner "Commands:"
|
23
|
+
SUB_COMMANDS.each { |k, v| banner " #{k.ljust(14)}#{v}" }
|
24
|
+
banner ""
|
25
|
+
banner " For more help with a specific command use #{$PROGRAM_NAME} <command> --help"
|
26
|
+
banner ""
|
27
|
+
banner "Global Options:"
|
28
|
+
stop_on SUB_COMMANDS.keys
|
29
|
+
end
|
30
|
+
cmd = ARGV.shift
|
31
|
+
Optimist.educate if cmd.nil?
|
32
|
+
Optimist.die "unknown subcommand #{cmd.inspect}" unless SUB_COMMANDS.include?(cmd)
|
33
|
+
|
34
|
+
def aws_stepfunctions(args)
|
35
|
+
cmd = "aws stepfunctions --endpoint-url http://localhost:8083 #{args}"
|
36
|
+
puts "** #{cmd}".light_black if ENV["DEBUG"]
|
37
|
+
output = `#{cmd}`.chomp
|
38
|
+
output = output.empty? ? {} : JSON.parse(output)
|
39
|
+
puts output.pretty_inspect.light_black if ENV["DEBUG"]
|
40
|
+
output
|
41
|
+
rescue JSON::ParserError => err
|
42
|
+
warn "ERROR: #{err}".light_red if ENV["DEBUG"]
|
43
|
+
{}
|
44
|
+
end
|
45
|
+
|
46
|
+
def execute_stepfunction(definition, input)
|
47
|
+
require "json"
|
48
|
+
require "shellwords"
|
49
|
+
|
50
|
+
begin
|
51
|
+
state_machine_arn = aws_stepfunctions("create-state-machine --definition #{Shellwords.escape(definition)} --name 'StateMachine' --role-arn 'arn:aws:iam::012345678901:role/DummyRole'")["stateMachineArn"]
|
52
|
+
exit 1 if state_machine_arn.nil?
|
53
|
+
|
54
|
+
input = input ? "--input #{Shellwords.escape(input)}" : ""
|
55
|
+
execution_arn = aws_stepfunctions("start-execution --state-machine-arn #{state_machine_arn} #{input}")["executionArn"]
|
56
|
+
exit 1 if execution_arn.nil?
|
57
|
+
|
58
|
+
status, output = aws_stepfunctions("describe-execution --execution-arn #{execution_arn}").values_at("status", "output")
|
59
|
+
if status == "FAILED"
|
60
|
+
warn "ERROR: Execution failed. See simulator for reason.".light_red
|
61
|
+
exit 1
|
62
|
+
end
|
63
|
+
ensure
|
64
|
+
aws_stepfunctions("stop-execution --execution-arn #{execution_arn}") if execution_arn
|
65
|
+
aws_stepfunctions("delete-state-machine --state-machine-arn #{state_machine_arn}") if state_machine_arn
|
66
|
+
end
|
67
|
+
|
68
|
+
puts output if output
|
69
|
+
end
|
70
|
+
|
71
|
+
def execute
|
72
|
+
opts = Optimist.options do
|
73
|
+
banner SUB_COMMANDS["execute"]
|
74
|
+
banner ""
|
75
|
+
|
76
|
+
opt :file, "The .asl file to execute", :default => "definition.asl"
|
77
|
+
opt :input, "Input to the execution", :type => :string
|
78
|
+
end
|
79
|
+
|
80
|
+
definition = File.read(opts[:file]).chomp
|
81
|
+
execute_stepfunction(definition, opts[:input])
|
82
|
+
end
|
83
|
+
|
84
|
+
def intrinsic
|
85
|
+
opts = Optimist.options do
|
86
|
+
banner SUB_COMMANDS["intrinsic"]
|
87
|
+
banner ""
|
88
|
+
|
89
|
+
opt :function, "The intrinsic function or JSONPath to run", :type => :string, :required => true
|
90
|
+
opt :input, "Input to the execution", :type => :string
|
91
|
+
end
|
92
|
+
|
93
|
+
require "json"
|
94
|
+
|
95
|
+
definition = {
|
96
|
+
"StartAt" => "ExecState",
|
97
|
+
"States" => {
|
98
|
+
"ExecState" => {
|
99
|
+
"Type" => "Pass",
|
100
|
+
"Parameters" => {"data.$" => opts[:function]},
|
101
|
+
"OutputPath" => "$.data",
|
102
|
+
"End" => true
|
103
|
+
}
|
104
|
+
}
|
105
|
+
}.to_json
|
106
|
+
|
107
|
+
execute_stepfunction(definition, opts[:input])
|
108
|
+
end
|
109
|
+
|
110
|
+
send(cmd)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: floe
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.15.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ManageIQ Developers
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-10-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: awesome_spawn
|
@@ -182,6 +182,8 @@ files:
|
|
182
182
|
- LICENSE.txt
|
183
183
|
- README.md
|
184
184
|
- Rakefile
|
185
|
+
- examples/map.asl
|
186
|
+
- examples/parallel.asl
|
185
187
|
- examples/set-credential.asl
|
186
188
|
- examples/workflow.asl
|
187
189
|
- exe/floe
|
@@ -199,6 +201,7 @@ files:
|
|
199
201
|
- lib/floe/validation_mixin.rb
|
200
202
|
- lib/floe/version.rb
|
201
203
|
- lib/floe/workflow.rb
|
204
|
+
- lib/floe/workflow/branch.rb
|
202
205
|
- lib/floe/workflow/catcher.rb
|
203
206
|
- lib/floe/workflow/choice_rule.rb
|
204
207
|
- lib/floe/workflow/choice_rule/and.rb
|
@@ -210,11 +213,13 @@ files:
|
|
210
213
|
- lib/floe/workflow/intrinsic_function.rb
|
211
214
|
- lib/floe/workflow/intrinsic_function/parser.rb
|
212
215
|
- lib/floe/workflow/intrinsic_function/transformer.rb
|
216
|
+
- lib/floe/workflow/item_processor.rb
|
213
217
|
- lib/floe/workflow/path.rb
|
214
218
|
- lib/floe/workflow/payload_template.rb
|
215
219
|
- lib/floe/workflow/reference_path.rb
|
216
220
|
- lib/floe/workflow/retrier.rb
|
217
221
|
- lib/floe/workflow/state.rb
|
222
|
+
- lib/floe/workflow/states/child_workflow_mixin.rb
|
218
223
|
- lib/floe/workflow/states/choice.rb
|
219
224
|
- lib/floe/workflow/states/fail.rb
|
220
225
|
- lib/floe/workflow/states/input_output_mixin.rb
|
@@ -222,11 +227,13 @@ files:
|
|
222
227
|
- lib/floe/workflow/states/non_terminal_mixin.rb
|
223
228
|
- lib/floe/workflow/states/parallel.rb
|
224
229
|
- lib/floe/workflow/states/pass.rb
|
230
|
+
- lib/floe/workflow/states/retry_catch_mixin.rb
|
225
231
|
- lib/floe/workflow/states/succeed.rb
|
226
232
|
- lib/floe/workflow/states/task.rb
|
227
233
|
- lib/floe/workflow/states/wait.rb
|
234
|
+
- lib/floe/workflow_base.rb
|
228
235
|
- renovate.json
|
229
|
-
-
|
236
|
+
- tools/step_functions
|
230
237
|
homepage: https://github.com/ManageIQ/floe
|
231
238
|
licenses:
|
232
239
|
- Apache-2.0
|
data/sig/floe.rbs/floe.rbs
DELETED