Skip to content

Commit 20125ae

Browse files
committed
fix(workflows): Throw errors for duplicate workflows
1 parent 4b510d7 commit 20125ae

File tree

5 files changed

+43
-23
lines changed

5 files changed

+43
-23
lines changed

lib/chirp-workflow/core/src/error.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,9 @@ pub enum WorkflowError {
128128

129129
#[error("operation timed out")]
130130
OperationTimeout,
131+
132+
#[error("duplicate registered workflow: {0}")]
133+
DuplicateRegisteredWorkflow(String),
131134
}
132135

133136
impl WorkflowError {

lib/chirp-workflow/core/src/registry.rs

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,25 @@ impl Registry {
2727
Arc::new(self)
2828
}
2929

30-
pub fn merge(mut self, registry: Registry) -> Registry {
30+
pub fn merge(mut self, registry: Registry) -> WorkflowResult<Registry> {
31+
// Check for duplicates
32+
for (workflow_name, _) in &registry.workflows {
33+
if self.workflows.contains_key(workflow_name.as_str()) {
34+
return Err(WorkflowError::DuplicateRegisteredWorkflow(workflow_name.clone()));
35+
}
36+
}
37+
3138
self.workflows.extend(registry.workflows.into_iter());
3239

33-
self
40+
Ok(self)
3441
}
3542

36-
pub fn register_workflow<W: Workflow>(&mut self) {
43+
pub fn register_workflow<W: Workflow>(&mut self) -> WorkflowResult<()> {
44+
// Check for duplicates
45+
if self.workflows.contains_key(W::NAME) {
46+
return Err(WorkflowError::DuplicateRegisteredWorkflow(W::NAME.to_string()));
47+
}
48+
3749
self.workflows.insert(
3850
W::NAME.to_string(),
3951
Arc::new(RegistryWorkflow {
@@ -72,6 +84,8 @@ impl Registry {
7284
},
7385
}),
7486
);
87+
88+
Ok(())
7589
}
7690

7791
pub fn get_workflow(&self, name: &str) -> WorkflowResult<&Arc<RegistryWorkflow>> {

svc/pkg/cluster/src/lib.rs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,21 @@ pub mod types;
55
pub mod util;
66
pub mod workflows;
77

8-
pub fn registry() -> Registry {
8+
pub fn registry() -> WorkflowResult<Registry> {
99
use workflows::*;
1010

1111
let mut registry = Registry::new();
12-
registry.register_workflow::<cluster::Workflow>();
13-
registry.register_workflow::<datacenter::Workflow>();
14-
registry.register_workflow::<datacenter::scale::Workflow>();
15-
registry.register_workflow::<datacenter::tls_issue::Workflow>();
16-
registry.register_workflow::<server::Workflow>();
17-
registry.register_workflow::<server::install::Workflow>();
18-
registry.register_workflow::<server::dns_create::Workflow>();
19-
registry.register_workflow::<server::dns_delete::Workflow>();
20-
registry.register_workflow::<server::drain::Workflow>();
21-
registry.register_workflow::<server::undrain::Workflow>();
22-
registry.register_workflow::<prebake::Workflow>();
12+
registry.register_workflow::<cluster::Workflow>()?;
13+
registry.register_workflow::<datacenter::Workflow>()?;
14+
registry.register_workflow::<datacenter::scale::Workflow>()?;
15+
registry.register_workflow::<datacenter::tls_issue::Workflow>()?;
16+
registry.register_workflow::<server::Workflow>()?;
17+
registry.register_workflow::<server::install::Workflow>()?;
18+
registry.register_workflow::<server::dns_create::Workflow>()?;
19+
registry.register_workflow::<server::dns_delete::Workflow>()?;
20+
registry.register_workflow::<server::drain::Workflow>()?;
21+
registry.register_workflow::<server::undrain::Workflow>()?;
22+
registry.register_workflow::<prebake::Workflow>()?;
2323

24-
registry
24+
Ok(registry)
2525
}

svc/pkg/cluster/src/workflows/datacenter/mod.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,11 @@ pub(crate) async fn cluster_datacenter(ctx: &mut WorkflowCtx, input: &Input) ->
6161
)
6262
.await?;
6363

64-
// Scale
65-
ctx.signal(ctx.workflow_id(), Scale {}).await?;
64+
// Scale initially
65+
ctx.workflow(scale::Input {
66+
datacenter_id: input.datacenter_id,
67+
})
68+
.await?;
6669

6770
ctx.repeat(|ctx| {
6871
let datacenter_id = input.datacenter_id;

svc/pkg/linode/src/lib.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@ pub mod types;
55
pub mod util;
66
pub mod workflows;
77

8-
pub fn registry() -> Registry {
8+
pub fn registry() -> WorkflowResult<Registry> {
99
use workflows::*;
1010

1111
let mut registry = Registry::new();
12-
registry.register_workflow::<image::Workflow>();
13-
registry.register_workflow::<server::Workflow>();
14-
registry.register_workflow::<server::cleanup::Workflow>();
12+
registry.register_workflow::<image::Workflow>()?;
13+
registry.register_workflow::<server::Workflow>()?;
14+
registry.register_workflow::<server::cleanup::Workflow>()?;
1515

16-
registry
16+
Ok(registry)
1717
}

0 commit comments

Comments
 (0)