floe 0.4.1 → 0.5.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -0
- data/examples/workflow.asl +4 -4
- data/exe/floe +1 -0
- data/lib/floe/version.rb +1 -1
- data/lib/floe/workflow/runner/docker.rb +4 -22
- data/lib/floe/workflow/runner/kubernetes.rb +4 -28
- data/lib/floe/workflow/runner/podman.rb +4 -21
- data/lib/floe/workflow/states/task.rb +2 -2
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0aac9121f1d393173b2fb11f9422f9e689693318a97dada576f054d827901024
|
4
|
+
data.tar.gz: 8118d4632e54c6fa3beb94384be517d5f3bf494890855901ce36af7ea94ee1c2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3872e70c2bb41e46570bcba95ef63716cdf3ea93bed77e9654db6614f8225982e13e3a83256b97854b6aa4376799e803f2edd5066dc3e304e75e2970c55d60f2
|
7
|
+
data.tar.gz: fac7e8815bcff8d93e443653759a6cdf8371c78f9114e3fef133212c0a1ef49d76bb35a0f491ef5abfeb134a21dc11cbbc00a6694d1f05d0e90f5bdae3471c41
|
data/CHANGELOG.md
CHANGED
@@ -4,6 +4,16 @@ This project adheres to [Semantic Versioning](http://semver.org/).
|
|
4
4
|
|
5
5
|
## [Unreleased]
|
6
6
|
|
7
|
+
## [0.5.0] - 2023-10-12
|
8
|
+
### Added
|
9
|
+
- For task errors, use the json on the last line ([#128](https://github.com/ManageIQ/floe/pull/128))
|
10
|
+
- Add ability to pass task service account to kube runner ([#131](https://github.com/ManageIQ/floe/pull/131))
|
11
|
+
|
12
|
+
### Fixed
|
13
|
+
- Don't put credentials file into input ([#124](https://github.com/ManageIQ/floe/pull/124))
|
14
|
+
- exe/floe return success status if the workflow was successful ([#129](https://github.com/ManageIQ/floe/pull/129))
|
15
|
+
- For error output, drop trailing newline ([#126](https://github.com/ManageIQ/floe/pull/126))
|
16
|
+
|
7
17
|
## [0.4.1] - 2023-10-06
|
8
18
|
### Added
|
9
19
|
- Add Fail#CausePath and Fail#ErrorPath ([#110](https://github.com/ManageIQ/floe/pull/110))
|
data/examples/workflow.asl
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
"States": {
|
5
5
|
"FirstState": {
|
6
6
|
"Type": "Task",
|
7
|
-
"Resource": "docker://agrare/hello-world:latest",
|
7
|
+
"Resource": "docker://docker.io/agrare/hello-world:latest",
|
8
8
|
"Credentials": {
|
9
9
|
"mysecret": "dont tell anyone"
|
10
10
|
},
|
@@ -49,13 +49,13 @@
|
|
49
49
|
|
50
50
|
"FirstMatchState": {
|
51
51
|
"Type" : "Task",
|
52
|
-
"Resource": "docker://agrare/hello-world:latest",
|
52
|
+
"Resource": "docker://docker.io/agrare/hello-world:latest",
|
53
53
|
"Next": "PassState"
|
54
54
|
},
|
55
55
|
|
56
56
|
"SecondMatchState": {
|
57
57
|
"Type" : "Task",
|
58
|
-
"Resource": "docker://agrare/hello-world:latest",
|
58
|
+
"Resource": "docker://docker.io/agrare/hello-world:latest",
|
59
59
|
"Next": "NextState"
|
60
60
|
},
|
61
61
|
|
@@ -87,7 +87,7 @@
|
|
87
87
|
|
88
88
|
"NextState": {
|
89
89
|
"Type": "Task",
|
90
|
-
"Resource": "docker://agrare/hello-world:latest",
|
90
|
+
"Resource": "docker://docker.io/agrare/hello-world:latest",
|
91
91
|
"Secrets": ["vmdb:aaa-bbb-ccc"],
|
92
92
|
"End": true
|
93
93
|
}
|
data/exe/floe
CHANGED
data/lib/floe/version.rb
CHANGED
@@ -13,24 +13,6 @@ module Floe
|
|
13
13
|
@network = options.fetch("network", "bridge")
|
14
14
|
end
|
15
15
|
|
16
|
-
def run!(resource, env = {}, secrets = {})
|
17
|
-
raise ArgumentError, "Invalid resource" unless resource&.start_with?("docker://")
|
18
|
-
|
19
|
-
image = resource.sub("docker://", "")
|
20
|
-
|
21
|
-
secrets_file = nil
|
22
|
-
if secrets && !secrets.empty?
|
23
|
-
secrets_file = create_secret(secrets)
|
24
|
-
env["_CREDENTIALS"] = "/run/secrets"
|
25
|
-
end
|
26
|
-
|
27
|
-
output = run_container(image, env, secrets_file)
|
28
|
-
|
29
|
-
{"exit_code" => 0, "output" => output}
|
30
|
-
ensure
|
31
|
-
cleanup({"secrets_ref" => secrets_file})
|
32
|
-
end
|
33
|
-
|
34
16
|
def run_async!(resource, env = {}, secrets = {})
|
35
17
|
raise ArgumentError, "Invalid resource" unless resource&.start_with?("docker://")
|
36
18
|
|
@@ -40,11 +22,10 @@ module Floe
|
|
40
22
|
|
41
23
|
if secrets && !secrets.empty?
|
42
24
|
runner_context["secrets_ref"] = create_secret(secrets)
|
43
|
-
env["_CREDENTIALS"] = "/run/secrets"
|
44
25
|
end
|
45
26
|
|
46
27
|
begin
|
47
|
-
runner_context["container_ref"] = run_container(image, env, runner_context["secrets_ref"]
|
28
|
+
runner_context["container_ref"] = run_container(image, env, runner_context["secrets_ref"])
|
48
29
|
rescue
|
49
30
|
cleanup(runner_context)
|
50
31
|
raise
|
@@ -81,10 +62,11 @@ module Floe
|
|
81
62
|
|
82
63
|
attr_reader :network
|
83
64
|
|
84
|
-
def run_container(image, env, secrets_file
|
65
|
+
def run_container(image, env, secrets_file)
|
85
66
|
params = ["run"]
|
86
|
-
params <<
|
67
|
+
params << :detach
|
87
68
|
params += env.map { |k, v| [:e, "#{k}=#{v}"] }
|
69
|
+
params << [:e, "_CREDENTIALS=/run/secrets"] if secrets_file
|
88
70
|
params << [:net, "host"] if @network == "host"
|
89
71
|
params << [:v, "#{secrets_file}:/run/secrets:z"] if secrets_file
|
90
72
|
params << image
|
@@ -35,35 +35,9 @@ module Floe
|
|
35
35
|
|
36
36
|
@namespace = options.fetch("namespace", "default")
|
37
37
|
|
38
|
-
|
39
|
-
end
|
40
|
-
|
41
|
-
def run!(resource, env = {}, secrets = {})
|
42
|
-
raise ArgumentError, "Invalid resource" unless resource&.start_with?("docker://")
|
43
|
-
|
44
|
-
image = resource.sub("docker://", "")
|
45
|
-
name = pod_name(image)
|
46
|
-
secret = create_secret!(secrets) if secrets && !secrets.empty?
|
47
|
-
|
48
|
-
begin
|
49
|
-
runner_context = {"container_ref" => name}
|
38
|
+
@task_service_account = options["task_service_account"]
|
50
39
|
|
51
|
-
|
52
|
-
loop do
|
53
|
-
case pod_info(name).dig("status", "phase")
|
54
|
-
when "Pending", "Running"
|
55
|
-
sleep(1)
|
56
|
-
else # also "Succeeded"
|
57
|
-
runner_context["exit_code"] = 0
|
58
|
-
output(runner_context)
|
59
|
-
break
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
runner_context
|
64
|
-
ensure
|
65
|
-
cleanup({"container_ref" => name, "secrets_ref" => secret})
|
66
|
-
end
|
40
|
+
super
|
67
41
|
end
|
68
42
|
|
69
43
|
def run_async!(resource, env = {}, secrets = {})
|
@@ -148,6 +122,8 @@ module Floe
|
|
148
122
|
}
|
149
123
|
}
|
150
124
|
|
125
|
+
spec[:spec][:serviceAccountName] = @task_service_account if @task_service_account
|
126
|
+
|
151
127
|
if secret
|
152
128
|
spec[:spec][:volumes] = [
|
153
129
|
{
|
@@ -26,23 +26,6 @@ module Floe
|
|
26
26
|
@volumepath = options["volumepath"]
|
27
27
|
end
|
28
28
|
|
29
|
-
def run!(resource, env = {}, secrets = {})
|
30
|
-
raise ArgumentError, "Invalid resource" unless resource&.start_with?("docker://")
|
31
|
-
|
32
|
-
image = resource.sub("docker://", "")
|
33
|
-
|
34
|
-
if secrets && !secrets.empty?
|
35
|
-
secret = create_secret(secrets)
|
36
|
-
env["_CREDENTIALS"] = "/run/secrets/#{secret}"
|
37
|
-
end
|
38
|
-
|
39
|
-
output = run_container(image, env, secret)
|
40
|
-
|
41
|
-
{"exit_code" => 0, :output => output}
|
42
|
-
ensure
|
43
|
-
delete_secret(secret) if secret
|
44
|
-
end
|
45
|
-
|
46
29
|
def run_async!(resource, env = {}, secrets = {})
|
47
30
|
raise ArgumentError, "Invalid resource" unless resource&.start_with?("docker://")
|
48
31
|
|
@@ -50,11 +33,10 @@ module Floe
|
|
50
33
|
|
51
34
|
if secrets && !secrets.empty?
|
52
35
|
secret_guid = create_secret(secrets)
|
53
|
-
env["_CREDENTIALS"] = "/run/secrets/#{secret_guid}"
|
54
36
|
end
|
55
37
|
|
56
38
|
begin
|
57
|
-
container_id = run_container(image, env, secret_guid
|
39
|
+
container_id = run_container(image, env, secret_guid)
|
58
40
|
rescue
|
59
41
|
cleanup({"container_ref" => container_id, "secrets_ref" => secret_guid})
|
60
42
|
raise
|
@@ -89,10 +71,11 @@ module Floe
|
|
89
71
|
|
90
72
|
private
|
91
73
|
|
92
|
-
def run_container(image, env, secret
|
74
|
+
def run_container(image, env, secret)
|
93
75
|
params = ["run"]
|
94
|
-
params <<
|
76
|
+
params << :detach
|
95
77
|
params += env.map { |k, v| [:e, "#{k}=#{v}"] }
|
78
|
+
params << [:e, "_CREDENTIALS=/run/secrets/#{secret}"] if secret
|
96
79
|
params << [:net, "host"] if @network == "host"
|
97
80
|
params << [:secret, secret] if secret
|
98
81
|
params << image
|
@@ -127,9 +127,9 @@ module Floe
|
|
127
127
|
def parse_error(output)
|
128
128
|
return if output.nil?
|
129
129
|
|
130
|
-
JSON.parse(output)
|
130
|
+
JSON.parse(output.split("\n").last)
|
131
131
|
rescue JSON::ParserError
|
132
|
-
{"Error" => output}
|
132
|
+
{"Error" => output.chomp}
|
133
133
|
end
|
134
134
|
|
135
135
|
def parse_output(output)
|
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.5.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: 2023-10-
|
11
|
+
date: 2023-10-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: awesome_spawn
|
@@ -152,7 +152,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
152
152
|
- !ruby/object:Gem::Version
|
153
153
|
version: '0'
|
154
154
|
requirements: []
|
155
|
-
rubygems_version: 3.
|
155
|
+
rubygems_version: 3.2.33
|
156
156
|
signing_key:
|
157
157
|
specification_version: 4
|
158
158
|
summary: Simple Workflow Runner.
|