floe 0.2.0 → 0.2.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: 3a8984568027905b79c95ab066b45f0e87872bbb290022a018f3574d47e3054e
4
- data.tar.gz: 73390d044e75811f2b1c91acfa1aea1814b38f1d3a60ad4b9bd0eed88d131af0
3
+ metadata.gz: ad8fec2f632914594254c32b7871eb8a4f23f3dfd2263ef5fe0875d0cccce8fa
4
+ data.tar.gz: 7e12b5a1a197dc44a7c7bd1b1581891a56908e7ae26836d5e26b73eb41c2a3ae
5
5
  SHA512:
6
- metadata.gz: b5d6cec81ef1adc60cc5912cc34275c032f250d84361982ac556284ada3c807f3189eef5357c193ae5b76db795f328b761fd53fd5dbfcd3468e5fc439d54c9fe
7
- data.tar.gz: d4a9ce5beea167b41ec66b1b049c6466a41c91b64076792e87b34e92787e19120965580c638a755c5a1e406398f4b1842851105dad2d388c21b7db76944c7df7
6
+ metadata.gz: 0b02c0ff479ff69433994732d6f3371c2a3e27fa36a094d5dea8340798f249015319821de30ad61334bc2bd9a6b25fb1791dfb0b023e7d0097472f35b93279a7
7
+ data.tar.gz: 49b6adb80c1910c9d006d41418e1741e8c62510633507583d2b34dc526a0ce4b73bb1faaa83b7950f0e1d31cbb9b37bd3e4b566bd2c374c824390a840e2e2519
data/CHANGELOG.md CHANGED
@@ -4,6 +4,25 @@ This project adheres to [Semantic Versioning](http://semver.org/).
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [0.2.2] - 2023-07-24
8
+ ### Fixed
9
+ - Don't pick up real KUBECONFIG for tests (#73)
10
+ - Fix double json.parse and context default value (#69)
11
+
12
+ ### Added
13
+ - Configure Renovate (#46)
14
+
15
+ ### Changed
16
+ - Simplify next state handling (#66)
17
+ - Refactor Input/Output path handling (#68)
18
+
19
+ ## [0.2.1] - 2023-07-12
20
+ ### Fixed
21
+ - Fix State EnteredTime and FinishedTime (#59)
22
+
23
+ ### Added
24
+ - Add workflow output (#57)
25
+
7
26
  ## [0.2.0] - 2023-07-05
8
27
  ### Added
9
28
  - Add ability to pass options to `Floe::Workflow::Runner` (#48)
@@ -23,4 +42,9 @@ This project adheres to [Semantic Versioning](http://semver.org/).
23
42
  ### Added
24
43
  - Initial release
25
44
 
26
- [Unreleased]: https://github.com/ManageIQ/floe/compare/v0.1.0...HEAD
45
+ [Unreleased]: https://github.com/ManageIQ/floe/compare/v0.2.2...HEAD
46
+ [0.2.2]: https://github.com/ManageIQ/floe/compare/v0.2.1...v0.2.2
47
+ [0.2.1]: https://github.com/ManageIQ/floe/compare/v0.2.0...v0.2.1
48
+ [0.2.0]: https://github.com/ManageIQ/floe/compare/v0.1.1...v0.2.0
49
+ [0.1.1]: https://github.com/ManageIQ/floe/compare/v0.1.0...v0.1.1
50
+ [0.1.0]: https://github.com/ManageIQ/floe/tree/v0.1.0
data/exe/floe CHANGED
@@ -36,4 +36,4 @@ Floe::Workflow::Runner.docker_runner = runner_klass.new(runner_options)
36
36
 
37
37
  workflow.run!
38
38
 
39
- puts workflow.context.state["Output"].inspect
39
+ puts workflow.output.inspect
data/lib/floe/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Floe
4
- VERSION = "0.2.0"
4
+ VERSION = "0.2.2"
5
5
  end
@@ -25,6 +25,10 @@ module Floe
25
25
  @context["State"]
26
26
  end
27
27
 
28
+ def state=(val)
29
+ @context["State"] = val
30
+ end
31
+
28
32
  def states
29
33
  @context["States"]
30
34
  end
@@ -41,22 +41,6 @@ module Floe
41
41
  def status
42
42
  end? ? "success" : "running"
43
43
  end
44
-
45
- def run!(input)
46
- logger.info("Running state: [#{name}] with input [#{input}]")
47
-
48
- input = input_path.value(context, input)
49
-
50
- output, next_state = block_given? ? yield(input) : input
51
- next_state ||= workflow.states_by_name[payload["Next"]] unless end?
52
-
53
- output ||= input
54
- output = output_path&.value(context, output)
55
-
56
- logger.info("Running state: [#{name}] with input [#{input}]...Complete - next state: [#{next_state&.name}] output: [#{output}]")
57
-
58
- [next_state, output]
59
- end
60
44
  end
61
45
  end
62
46
  end
@@ -16,15 +16,12 @@ module Floe
16
16
  @output_path = Path.new(payload.fetch("OutputPath", "$"))
17
17
  end
18
18
 
19
- def run!(*)
20
- super do |input|
21
- next_state_name = choices.detect { |choice| choice.true?(context, input) }&.next || default
22
- next_state = workflow.states_by_name[next_state_name]
19
+ def run!(input)
20
+ input = input_path.value(context, input)
21
+ next_state = choices.detect { |choice| choice.true?(context, input) }&.next || default
22
+ output = output_path.value(context, input)
23
23
 
24
- output = input
25
-
26
- [output, next_state]
27
- end
24
+ [next_state, output]
28
25
  end
29
26
  end
30
27
  end
@@ -11,21 +11,11 @@ module Floe
11
11
 
12
12
  @cause = payload["Cause"]
13
13
  @error = payload["Error"]
14
+ @end = true
14
15
  end
15
16
 
16
17
  def run!(input)
17
- logger.info("Running state: [#{name}] with input [#{input}]")
18
-
19
- next_state = nil
20
- output = input
21
-
22
- logger.info("Running state: [#{name}] with input [#{input}]...Complete - next state: [#{next_state&.name}]")
23
-
24
- [next_state, output]
25
- end
26
-
27
- def end?
28
- true
18
+ [nil, input]
29
19
  end
30
20
 
31
21
  def status
@@ -18,12 +18,12 @@ module Floe
18
18
  @result_path = ReferencePath.new(payload.fetch("ResultPath", "$"))
19
19
  end
20
20
 
21
- def run!(*)
22
- super do |input|
23
- output = input
24
- output = result_path.set(output, result) if result && result_path
25
- output
26
- end
21
+ def run!(input)
22
+ output = input_path.value(context, input)
23
+ output = result_path.set(output, result) if result && result_path
24
+ output = output_path.value(context, output)
25
+
26
+ [@next, output]
27
27
  end
28
28
  end
29
29
  end
@@ -9,12 +9,11 @@ module Floe
9
9
  def initialize(workflow, name, payload)
10
10
  super
11
11
 
12
- @input_path = Path.new(payload.fetch("InputPath", "$"))
13
- @output_path = Path.new(payload.fetch("OutputPath", "$"))
12
+ @end = true
14
13
  end
15
14
 
16
- def end?
17
- true # TODO: Handle if this is ending a parallel or map state
15
+ def run!(input)
16
+ [nil, input]
18
17
  end
19
18
  end
20
19
  end
@@ -25,24 +25,23 @@ module Floe
25
25
  @credentials = PayloadTemplate.new(payload["Credentials"]) if payload["Credentials"]
26
26
  end
27
27
 
28
- def run!(*)
29
- super do |input|
30
- input = parameters.value(context, input) if parameters
28
+ def run!(input)
29
+ input = input_path.value(context, input)
30
+ input = parameters.value(context, input) if parameters
31
31
 
32
- runner = Floe::Workflow::Runner.for_resource(resource)
33
- _exit_status, results = runner.run!(resource, input, credentials&.value({}, workflow.credentials))
32
+ runner = Floe::Workflow::Runner.for_resource(resource)
33
+ _exit_status, results = runner.run!(resource, input, credentials&.value({}, workflow.credentials))
34
34
 
35
- output = input
36
- process_output!(output, results)
37
- rescue => err
38
- retrier = self.retry.detect { |r| (r.error_equals & [err.to_s, "States.ALL"]).any? }
39
- retry if retry!(retrier)
35
+ output = process_output!(input, results)
36
+ [@next, output]
37
+ rescue => err
38
+ retrier = self.retry.detect { |r| (r.error_equals & [err.to_s, "States.ALL"]).any? }
39
+ retry if retry!(retrier)
40
40
 
41
- catcher = self.catch.detect { |c| (c.error_equals & [err.to_s, "States.ALL"]).any? }
42
- raise if catcher.nil?
41
+ catcher = self.catch.detect { |c| (c.error_equals & [err.to_s, "States.ALL"]).any? }
42
+ raise if catcher.nil?
43
43
 
44
- [output, workflow.states_by_name[catcher.next]]
45
- end
44
+ [catcher.next, output]
46
45
  end
47
46
 
48
47
  private
@@ -75,7 +74,8 @@ module Floe
75
74
  end
76
75
 
77
76
  results = result_selector.value(context, results) if result_selector
78
- result_path.set(output, results)
77
+ output = result_path.set(output, results)
78
+ output_path.value(context, output)
79
79
  end
80
80
  end
81
81
  end
@@ -16,11 +16,11 @@ module Floe
16
16
  @output_path = Path.new(payload.fetch("OutputPath", "$"))
17
17
  end
18
18
 
19
- def run!(*)
20
- super do
21
- sleep(seconds)
22
- nil
23
- end
19
+ def run!(input)
20
+ input = input_path.value(context, input)
21
+ sleep(seconds)
22
+ output = output_path.value(context, input)
23
+ [@next, output]
24
24
  end
25
25
  end
26
26
  end
data/lib/floe/workflow.rb CHANGED
@@ -1,9 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "securerandom"
3
4
  require "json"
4
5
 
5
6
  module Floe
6
7
  class Workflow
8
+ include Logging
9
+
7
10
  class << self
8
11
  def load(path_or_io, context = nil, credentials = {})
9
12
  payload = path_or_io.respond_to?(:read) ? path_or_io.read : File.read(path_or_io)
@@ -11,23 +14,22 @@ module Floe
11
14
  end
12
15
  end
13
16
 
14
- attr_reader :context, :credentials, :payload, :states, :states_by_name, :current_state, :status
17
+ attr_reader :context, :credentials, :output, :payload, :states, :states_by_name, :current_state, :status
15
18
 
16
19
  def initialize(payload, context = nil, credentials = {})
17
20
  payload = JSON.parse(payload) if payload.kind_of?(String)
18
- context = JSON.parse(context) if context.kind_of?(String)
19
21
  credentials = JSON.parse(credentials) if credentials.kind_of?(String)
20
22
  context = Context.new(context) unless context.kind_of?(Context)
21
23
 
22
24
  @payload = payload
23
- @context = context || {"global" => {}}
25
+ @context = context
24
26
  @credentials = credentials
25
27
 
26
28
  @states = payload["States"].to_a.map { |name, state| State.build!(self, name, state) }
27
29
  @states_by_name = @states.each_with_object({}) { |state, result| result[state.name] = state }
28
30
  start_at = @payload["StartAt"]
29
31
 
30
- current_state_name = @context["State"]["Name"] || start_at
32
+ current_state_name = context.state["Name"] || start_at
31
33
  @current_state = @states_by_name[current_state_name]
32
34
 
33
35
  @status = current_state_name == start_at ? "pending" : current_state.status
@@ -37,29 +39,34 @@ module Floe
37
39
 
38
40
  def step
39
41
  @status = "running" if @status == "pending"
40
- @context["Execution"]["StartTime"] ||= Time.now.utc
42
+ context.execution["StartTime"] ||= Time.now.utc
43
+
44
+ input = context.state["Output"] || context.execution["Input"].dup
41
45
 
42
- input = @context["State"]["Output"] || @context["Execution"]["Input"].dup
46
+ logger.info("Running state: [#{current_state.name}] with input [#{input}]...")
47
+
48
+ context.state = {
49
+ "Guid" => SecureRandom.uuid,
50
+ "EnteredTime" => Time.now.utc,
51
+ "Input" => input,
52
+ "Name" => current_state.name
53
+ }
43
54
 
44
55
  tick = Process.clock_gettime(Process::CLOCK_MONOTONIC)
45
56
  next_state, output = current_state.run!(input)
46
57
  tock = Process.clock_gettime(Process::CLOCK_MONOTONIC)
47
58
 
48
- @context["State"] = {
49
- "EnteredTime" => tick,
50
- "FinishedTime" => tock,
51
- "Duration" => tock - tick,
52
- "Output" => output,
53
- "Name" => next_state&.name,
54
- "Input" => output
55
- }
59
+ context.state["FinishedTime"] = Time.now.utc
60
+ context.state["Duration"] = (tock - tick) / 1_000_000.0
61
+ context.state["Output"] = output
56
62
 
57
- @context["States"] << @context["State"]
63
+ logger.info("Running state: [#{current_state.name}] with input [#{input}]...Complete - next state: [#{next_state}] output: [#{output}]")
58
64
 
59
- @status = current_state.status
65
+ context.states << context.state
60
66
 
61
- next_state_name = next_state&.name
62
- @current_state = next_state_name && @states_by_name[next_state_name]
67
+ @status = current_state.status
68
+ @current_state = next_state && @states_by_name[next_state]
69
+ @output = output if end?
63
70
 
64
71
  self
65
72
  end
data/renovate.json ADDED
@@ -0,0 +1,6 @@
1
+ {
2
+ "$schema": "https://docs.renovatebot.com/renovate-schema.json",
3
+ "extends": [
4
+ "config:base"
5
+ ]
6
+ }
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.2.0
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - ManageIQ Developers
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-07-06 00:00:00.000000000 Z
11
+ date: 2023-07-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: awesome_spawn
@@ -168,6 +168,7 @@ files:
168
168
  - lib/floe/workflow/states/succeed.rb
169
169
  - lib/floe/workflow/states/task.rb
170
170
  - lib/floe/workflow/states/wait.rb
171
+ - renovate.json
171
172
  - sig/floe.rbs/floe.rbs
172
173
  homepage: https://github.com/ManageIQ/floe
173
174
  licenses: []