Skip to content

Commit e244469

Browse files
committed
Implement missing builders
Signed-off-by: Charles d'Avernas <[email protected]>
1 parent 8d199db commit e244469

File tree

10 files changed

+1225
-66
lines changed

10 files changed

+1225
-66
lines changed

Cargo.lock

+2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

builders/Cargo.toml

+3-1
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,6 @@ version = "0.1.0"
44
edition = "2021"
55

66
[dependencies]
7-
serverless_workflow_core = { path = "../core" }
7+
serverless_workflow_core = { path = "../core" }
8+
serde_json = "1.0"
9+
serde_yaml = "0.9"

builders/src/lib.rs

+232-18
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ mod unit_tests {
1010
use serverless_workflow_core::models::task::*;
1111
use serverless_workflow_core::models::timeout::*;
1212
use std::collections::HashMap;
13+
use serde_json::json;
1314

1415
#[test]
1516
fn build_workflow_should_work() {
@@ -56,10 +57,50 @@ mod unit_tests {
5657
let raise_error_title = "error-title";
5758
let raise_error_detail = "error-detail";
5859
let raise_error_instance = "error-instance";
59-
let run_task_name = "run-task-name";
60+
let run_container_task_name = "run-container-task-name";
61+
let container_image = "container-image-name";
62+
let container_command = "container-command";
63+
let container_ports: HashMap<u16, u16> = vec![
64+
(8080, 8081),
65+
(8082, 8083)]
66+
.into_iter()
67+
.collect();
68+
let container_volumes: HashMap<String, String> = vec![
69+
("volume-1".to_string(), "/some/fake/path".to_string())]
70+
.into_iter()
71+
.collect();
72+
let container_environment: HashMap<String, String> = vec![
73+
("env1-name".to_string(), "env1-value".to_string()),
74+
("env2-name".to_string(), "env2-value".to_string())]
75+
.into_iter()
76+
.collect();
77+
let run_script_task_name = "run-script-task-name";
78+
let script_code = "script-code";
79+
let run_shell_task_name = "run-shell-task-name";
80+
let shell_command_name = "run-shell-command";
81+
let run_workflow_task_name = "run-workflow-task-name";
82+
let workflow_namespace = "workflow-namespace";
83+
let workflow_name = "workflow-name";
84+
let workflow_version = "workflow-version";
85+
let workflow_input = AnyValue::Json(json!({"hello": "world"}));
6086
let set_task_name = "set-task-name";
87+
let set_task_variables : HashMap<String, AnyValue> = vec![
88+
("var1-name".to_string(), AnyValue::String("var1-value".to_string())),
89+
("var2-name".to_string(), AnyValue::UInt64(69))]
90+
.into_iter()
91+
.collect();
6192
let switch_task_name = "switch-task-name";
93+
let switch_case_name = "switch-case-name";
94+
let switch_case_when = "true";
95+
let switch_case_then = "continue";
6296
let try_task_name = "try-task-name";
97+
let catch_when = "catch-when";
98+
let catch_errors_attributes: HashMap<String, AnyValue> = vec![
99+
("var1-name".to_string(), AnyValue::String("var1-value".to_string())),
100+
("var2-name".to_string(), AnyValue::UInt64(69))]
101+
.into_iter()
102+
.collect();
103+
let retry_except_when = "retry-except-when";
63104
let wait_task_name = "wait-task";
64105
let wait_duration = OneOfDurationOrIso8601Expression::Duration(Duration::from_days(3));
65106

@@ -77,57 +118,128 @@ mod unit_tests {
77118
a.basic()
78119
.with_username(username)
79120
.with_password(password);})
80-
.do_(call_task_name, |t| {
81-
t.call(call_function_name)
121+
.do_(call_task_name, |task| {
122+
task.call(call_function_name)
82123
.with_arguments(call_task_with.clone());
83124
})
84-
.do_(do_task_name, |t| {
85-
t.do_()
125+
.do_(do_task_name, |task| {
126+
task.do_()
86127
.do_("fake-wait-task", |st| {
87128
st.wait(OneOfDurationOrIso8601Expression::Duration(Duration::from_seconds(25)));
88129
});
89130
})
90-
.do_(wait_task_name, |t| {
91-
t.wait(wait_duration.clone());
92-
})
93-
.do_(emit_task_name, |t| {
94-
t.emit(|e|{
131+
.do_(emit_task_name, |task| {
132+
task.emit(|e|{
95133
e.with_attributes(emit_event_attributes.clone());
96134
});
97135
})
98-
.do_(for_task_name, |t| {
99-
t.for_()
136+
.do_(for_task_name, |task| {
137+
task.for_()
100138
.each(for_each)
101139
.in_(for_each_in)
102140
.at(for_each_at)
103141
.do_("fake-wait-task", |st| {
104142
st.wait(OneOfDurationOrIso8601Expression::Duration(Duration::from_seconds(25)));
105143
});
106144
})
107-
.do_(fork_task_name, |t| {
108-
t.fork()
145+
.do_(fork_task_name, |task| {
146+
task.fork()
109147
.branch(|b| {
110148
b.do_("fake-wait-task", |st| {
111149
st.wait(OneOfDurationOrIso8601Expression::Duration(Duration::from_seconds(25)));
112150
});
113151
});
114152
})
115-
.do_(listen_task_name, |t| {
116-
t.listen()
153+
.do_(listen_task_name, |task| {
154+
task.listen()
117155
.to(|e|{
118156
e.one()
119157
.with("key", AnyValue::String("value".to_string()));
120158
});
121159
})
122-
.do_(raise_task_name, |t| {
123-
t.raise()
160+
.do_(raise_task_name, |task| {
161+
task.raise()
124162
.error()
125163
.with_type(raise_error_type)
126164
.with_status(raise_error_status)
127165
.with_title(raise_error_title)
128166
.with_detail(raise_error_detail)
129167
.with_instance(raise_error_instance);
130168
})
169+
.do_(run_container_task_name, |task|{
170+
task.run()
171+
.container()
172+
.with_image(container_image)
173+
.with_command(container_command)
174+
.with_ports(container_ports.clone())
175+
.with_volumes(container_volumes.clone())
176+
.with_environment_variables(container_environment.clone());
177+
})
178+
.do_(run_script_task_name, |task|{
179+
task.run()
180+
.script()
181+
.with_code(script_code);
182+
})
183+
.do_(run_shell_task_name, |task|{
184+
task.run()
185+
.shell()
186+
.with_command(shell_command_name);
187+
})
188+
.do_(run_workflow_task_name, |task|{
189+
task.run()
190+
.workflow()
191+
.with_namespace(workflow_namespace)
192+
.with_name(workflow_name)
193+
.with_version(workflow_version)
194+
.with_input(workflow_input.clone());
195+
})
196+
.do_(set_task_name, |task|{
197+
task.set()
198+
.variables(set_task_variables.clone());
199+
})
200+
.do_(switch_task_name, |task|{
201+
task.switch()
202+
.case(switch_case_name, |case|{
203+
case.when(switch_case_when)
204+
.then(switch_case_then);
205+
});
206+
207+
})
208+
.do_(try_task_name, |task|{
209+
task.try_()
210+
.do_(|tasks|{
211+
tasks
212+
.do_("fake-wait-task", |subtask|{
213+
subtask.wait(OneOfDurationOrIso8601Expression::Duration(Duration::from_seconds(5)));
214+
});
215+
})
216+
.catch(|catch| {
217+
catch
218+
.errors(|errors|{
219+
errors
220+
.with_attributes(catch_errors_attributes.clone());
221+
})
222+
.when(catch_when)
223+
.retry(|retry|{
224+
retry
225+
.except_when(retry_except_when)
226+
.delay(Duration::from_seconds(1))
227+
.backoff(|backoff|{
228+
backoff
229+
.linear()
230+
.with_increment(Duration::from_milliseconds(500));
231+
})
232+
.jitter(|jitter|{
233+
jitter
234+
.from(Duration::from_seconds(1))
235+
.to(Duration::from_seconds(3));
236+
});
237+
});
238+
});
239+
})
240+
.do_(wait_task_name, |task| {
241+
task.wait(wait_duration.clone());
242+
})
131243
.build();
132244

133245
//assert
@@ -262,6 +374,108 @@ mod unit_tests {
262374
raise_error_title,
263375
raise_error_detail,
264376
raise_error_instance);
377+
assert!(
378+
workflow
379+
.do_
380+
.entries
381+
.iter()
382+
.any(|entry| entry.get(&run_container_task_name.to_string()).map_or(false, |task| {
383+
if let TaskDefinition::Run(run_task) = task {
384+
if let Some(container) = &run_task.run.container {
385+
container.image == container_image
386+
&& container.command == Some(container_command.to_string())
387+
&& container.ports == Some(container_ports.clone())
388+
&& container.volumes == Some(container_volumes.clone())
389+
&& container.environment == Some(container_environment.clone())
390+
} else {
391+
false
392+
}
393+
} else {
394+
false
395+
}
396+
})),
397+
"Expected a task with key '{}' and a RunTaskDefinition with 'container.image'={}, 'container.command'={}, 'container.ports'={:?}, 'container.volumes'={:?}, and 'container.environment'={:?}",
398+
run_container_task_name,
399+
container_image,
400+
container_command,
401+
container_ports,
402+
container_volumes,
403+
container_environment);
404+
assert!(
405+
workflow
406+
.do_
407+
.entries
408+
.iter()
409+
.any(|entry| entry.get(&run_workflow_task_name.to_string()).map_or(false, |task| {
410+
if let TaskDefinition::Run(run_task) = task {
411+
if let Some(subflow) = &run_task.run.workflow{
412+
subflow.namespace == workflow_namespace.to_string()
413+
&& subflow.name == workflow_name.to_string()
414+
&& subflow.version == workflow_version.to_string()
415+
&& subflow.input == Some(workflow_input.clone())
416+
}
417+
else{
418+
false
419+
}
420+
} else {
421+
false
422+
}
423+
})),
424+
"Expected a task with key '{}' and a RunTaskDefinition with 'workflow.namespace'={}, 'workflow.name'={}, 'workflow.version'={}, and 'workflow.input'={:?}",
425+
run_container_task_name,
426+
workflow_namespace,
427+
workflow_name,
428+
workflow_version,
429+
workflow_input);
430+
assert!(
431+
workflow
432+
.do_
433+
.entries
434+
.iter()
435+
.any(|entry| entry.get(&set_task_name.to_string()).map_or(false, |task|{
436+
if let TaskDefinition::Set(set_task) = task {
437+
set_task.set == set_task_variables.clone()
438+
}
439+
else{
440+
false
441+
}
442+
})),
443+
"Expected a task with key '{}' and a SetTaskDefinition with specified variables",
444+
set_task_name);
445+
assert!(
446+
workflow
447+
.do_
448+
.entries
449+
.iter()
450+
.any(|entry| entry.get(&switch_task_name.to_string()).map_or(false, |task|{
451+
if let TaskDefinition::Switch(switch_task) = task{
452+
switch_task
453+
.switch
454+
.entries
455+
.iter()
456+
.any(|case| case.contains_key(switch_case_name))
457+
}
458+
else{
459+
false
460+
}
461+
})),
462+
"Expected a task with key '{}' and a SwitchTaskDefinition with a case named '{}'",
463+
set_task_name,
464+
switch_case_name);
465+
assert!(
466+
workflow.do_
467+
.entries
468+
.iter()
469+
.any(|entry| entry.get(&try_task_name.to_string()).map_or(false, |task| {
470+
if let TaskDefinition::Try(try_task) = task {
471+
try_task.catch.when == Some(catch_when.to_string())
472+
} else {
473+
false
474+
}
475+
})),
476+
"Expected a task with key '{}' and a TryTaskDefinition with 'catch.when'={}",
477+
try_task_name,
478+
catch_when);
265479
assert!(
266480
workflow.do_
267481
.entries

0 commit comments

Comments
 (0)