Skip to content

Commit ed5a0e0

Browse files
committed
refactor: require provision_method parameter in provisioned() transition
This enforces the invariant at the type level - a Provisioned environment must have provision_method set. Previously it was set separately after transition, now it's required as a parameter. Also cleaned up long import paths (e.g., crate::domain::..::ProvisionMethod to just ProvisionMethod) throughout test code by adding proper use statements, following project conventions for short, unambiguous import names.
1 parent eab48b3 commit ed5a0e0

File tree

15 files changed

+442
-104
lines changed

15 files changed

+442
-104
lines changed

src/application/command_handlers/provision/handler.rs

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -112,12 +112,7 @@ impl ProvisionCommandHandler {
112112
// Execute provisioning workflow with explicit step tracking
113113
// This allows us to know exactly which step failed if an error occurs
114114
match self.execute_provisioning_workflow(&environment).await {
115-
Ok((provisioned, instance_ip)) => {
116-
// Store instance IP and provision method in the environment context
117-
let provisioned = provisioned
118-
.with_instance_ip(instance_ip)
119-
.with_provision_method(ProvisionMethod::Provisioned);
120-
115+
Ok(provisioned) => {
121116
info!(
122117
command = "provision",
123118
environment = %provisioned.name(),
@@ -154,7 +149,7 @@ impl ProvisionCommandHandler {
154149
/// This method orchestrates the complete provisioning workflow across multiple phases:
155150
/// 1. Infrastructure provisioning (`OpenTofu`)
156151
/// 2. Configuration preparation (Ansible templates and system readiness)
157-
/// 3. State transition to Provisioned
152+
/// 3. State transition to Provisioned (with instance IP and provision method)
158153
///
159154
/// If an error occurs, it returns both the error and the step that was being
160155
/// executed, enabling accurate failure context generation.
@@ -165,14 +160,11 @@ impl ProvisionCommandHandler {
165160
///
166161
/// # Returns
167162
///
168-
/// Returns a tuple of:
169-
/// - The provisioned environment
170-
/// - The instance IP address
163+
/// Returns the provisioned environment with instance IP and provision method set
171164
async fn execute_provisioning_workflow(
172165
&self,
173166
environment: &Environment<Provisioning>,
174-
) -> StepResult<(Environment<Provisioned>, IpAddr), ProvisionCommandHandlerError, ProvisionStep>
175-
{
167+
) -> StepResult<Environment<Provisioned>, ProvisionCommandHandlerError, ProvisionStep> {
176168
let instance_ip = self.provision_infrastructure(environment).await?;
177169

178170
self.prepare_for_configuration(environment, instance_ip)
@@ -181,9 +173,11 @@ impl ProvisionCommandHandler {
181173
self.wait_for_system_readiness(environment, instance_ip)
182174
.await?;
183175

184-
let provisioned = environment.clone().provisioned();
176+
let provisioned = environment
177+
.clone()
178+
.provisioned(instance_ip, ProvisionMethod::Provisioned);
185179

186-
Ok((provisioned, instance_ip))
180+
Ok(provisioned)
187181
}
188182

189183
// Private helper methods - organized from higher to lower level of abstraction

src/domain/environment/mod.rs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1283,6 +1283,8 @@ mod tests {
12831283

12841284
// State transition tests
12851285
mod state_transitions {
1286+
use std::net::{IpAddr, Ipv4Addr};
1287+
12861288
use super::*;
12871289

12881290
/// Helper function to create a test environment for state transition tests
@@ -1313,7 +1315,10 @@ mod tests {
13131315
// Act: Complete happy path: Created -> Running
13141316
let env = env
13151317
.start_provisioning()
1316-
.provisioned()
1318+
.provisioned(
1319+
IpAddr::V4(Ipv4Addr::new(192, 168, 1, 100)),
1320+
ProvisionMethod::Provisioned,
1321+
)
13171322
.start_configuring()
13181323
.configured()
13191324
.start_releasing()
@@ -1343,7 +1348,10 @@ mod tests {
13431348
// Act: Go through several transitions
13441349
let env = env
13451350
.start_provisioning()
1346-
.provisioned()
1351+
.provisioned(
1352+
IpAddr::V4(Ipv4Addr::new(192, 168, 1, 100)),
1353+
ProvisionMethod::Provisioned,
1354+
)
13471355
.start_configuring()
13481356
.configured();
13491357

@@ -1392,7 +1400,10 @@ mod tests {
13921400

13931401
let _env = env
13941402
.start_provisioning()
1395-
.provisioned()
1403+
.provisioned(
1404+
IpAddr::V4(Ipv4Addr::new(192, 168, 1, 100)),
1405+
ProvisionMethod::Provisioned,
1406+
)
13961407
.start_configuring()
13971408
.configured();
13981409

src/domain/environment/state/configure_failed.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,9 +155,11 @@ mod tests {
155155
use super::*;
156156
use crate::adapters::ssh::SshCredentials;
157157
use crate::domain::environment::name::EnvironmentName;
158+
use crate::domain::environment::runtime_outputs::ProvisionMethod;
158159
use crate::domain::provider::{LxdConfig, ProviderConfig};
159160
use crate::domain::ProfileName;
160161
use crate::shared::Username;
162+
use std::net::{IpAddr, Ipv4Addr};
161163
use std::path::PathBuf;
162164

163165
fn default_lxd_provider_config(env_name: &EnvironmentName) -> ProviderConfig {
@@ -185,7 +187,10 @@ mod tests {
185187
22,
186188
)
187189
.start_provisioning()
188-
.provisioned()
190+
.provisioned(
191+
IpAddr::V4(Ipv4Addr::new(192, 168, 1, 100)),
192+
ProvisionMethod::Provisioned,
193+
)
189194
.start_configuring()
190195
.configure_failed(super::create_test_context())
191196
}

src/domain/environment/state/configured.rs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,11 @@ mod tests {
7575
use super::*;
7676
use crate::adapters::ssh::SshCredentials;
7777
use crate::domain::environment::name::EnvironmentName;
78+
use crate::domain::environment::runtime_outputs::ProvisionMethod;
7879
use crate::domain::provider::{LxdConfig, ProviderConfig};
7980
use crate::domain::ProfileName;
8081
use crate::shared::Username;
82+
use std::net::{IpAddr, Ipv4Addr};
8183
use std::path::PathBuf;
8284

8385
fn default_lxd_provider_config(env_name: &EnvironmentName) -> ProviderConfig {
@@ -105,7 +107,10 @@ mod tests {
105107
22,
106108
)
107109
.start_provisioning()
108-
.provisioned()
110+
.provisioned(
111+
IpAddr::V4(Ipv4Addr::new(192, 168, 1, 100)),
112+
ProvisionMethod::Provisioned,
113+
)
109114
.start_configuring()
110115
.configured()
111116
}
@@ -130,10 +135,12 @@ mod tests {
130135
use super::*;
131136
use crate::adapters::ssh::SshCredentials;
132137
use crate::domain::environment::name::EnvironmentName;
138+
use crate::domain::environment::runtime_outputs::ProvisionMethod;
133139
use crate::domain::environment::state::Releasing;
134140
use crate::domain::provider::{LxdConfig, ProviderConfig};
135141
use crate::domain::ProfileName;
136142
use crate::shared::Username;
143+
use std::net::{IpAddr, Ipv4Addr};
137144
use std::path::PathBuf;
138145

139146
fn default_lxd_provider_config(env_name: &EnvironmentName) -> ProviderConfig {
@@ -157,7 +164,10 @@ mod tests {
157164
22,
158165
)
159166
.start_provisioning()
160-
.provisioned()
167+
.provisioned(
168+
IpAddr::V4(Ipv4Addr::new(192, 168, 1, 100)),
169+
ProvisionMethod::Provisioned,
170+
)
161171
.start_configuring()
162172
.configured()
163173
}

src/domain/environment/state/configuring.rs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,9 +92,11 @@ mod tests {
9292
use super::*;
9393
use crate::adapters::ssh::SshCredentials;
9494
use crate::domain::environment::name::EnvironmentName;
95+
use crate::domain::environment::runtime_outputs::ProvisionMethod;
9596
use crate::domain::provider::{LxdConfig, ProviderConfig};
9697
use crate::domain::ProfileName;
9798
use crate::shared::Username;
99+
use std::net::{IpAddr, Ipv4Addr};
98100
use std::path::PathBuf;
99101

100102
fn default_lxd_provider_config(env_name: &EnvironmentName) -> ProviderConfig {
@@ -122,7 +124,10 @@ mod tests {
122124
22,
123125
)
124126
.start_provisioning()
125-
.provisioned()
127+
.provisioned(
128+
IpAddr::V4(Ipv4Addr::new(192, 168, 1, 100)),
129+
ProvisionMethod::Provisioned,
130+
)
126131
.start_configuring()
127132
}
128133

@@ -146,10 +151,12 @@ mod tests {
146151
use super::*;
147152
use crate::adapters::ssh::SshCredentials;
148153
use crate::domain::environment::name::EnvironmentName;
154+
use crate::domain::environment::runtime_outputs::ProvisionMethod;
149155
use crate::domain::environment::state::Configured;
150156
use crate::domain::provider::{LxdConfig, ProviderConfig};
151157
use crate::domain::ProfileName;
152158
use crate::shared::Username;
159+
use std::net::{IpAddr, Ipv4Addr};
153160
use std::path::PathBuf;
154161

155162
fn default_lxd_provider_config(env_name: &EnvironmentName) -> ProviderConfig {
@@ -173,7 +180,10 @@ mod tests {
173180
22,
174181
)
175182
.start_provisioning()
176-
.provisioned()
183+
.provisioned(
184+
IpAddr::V4(Ipv4Addr::new(192, 168, 1, 100)),
185+
ProvisionMethod::Provisioned,
186+
)
177187
.start_configuring()
178188
}
179189

src/domain/environment/state/destroy_failed.rs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -164,9 +164,11 @@ mod tests {
164164
use super::*;
165165
use crate::adapters::ssh::SshCredentials;
166166
use crate::domain::environment::name::EnvironmentName;
167+
use crate::domain::environment::runtime_outputs::ProvisionMethod;
167168
use crate::domain::provider::{LxdConfig, ProviderConfig};
168169
use crate::domain::ProfileName;
169170
use crate::shared::Username;
171+
use std::net::{IpAddr, Ipv4Addr};
170172
use std::path::PathBuf;
171173

172174
fn default_lxd_provider_config(env_name: &EnvironmentName) -> ProviderConfig {
@@ -194,7 +196,10 @@ mod tests {
194196
22,
195197
)
196198
.start_provisioning()
197-
.provisioned()
199+
.provisioned(
200+
IpAddr::V4(Ipv4Addr::new(192, 168, 1, 100)),
201+
ProvisionMethod::Provisioned,
202+
)
198203
.start_destroying()
199204
.destroy_failed(super::create_test_context())
200205
}
@@ -226,7 +231,10 @@ mod tests {
226231
22,
227232
)
228233
.start_provisioning()
229-
.provisioned()
234+
.provisioned(
235+
IpAddr::V4(Ipv4Addr::new(192, 168, 1, 100)),
236+
ProvisionMethod::Provisioned,
237+
)
230238
.start_destroying()
231239
.destroy_failed(context.clone());
232240

src/domain/environment/state/destroying.rs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,9 +92,11 @@ mod tests {
9292
use super::*;
9393
use crate::adapters::ssh::SshCredentials;
9494
use crate::domain::environment::name::EnvironmentName;
95+
use crate::domain::environment::runtime_outputs::ProvisionMethod;
9596
use crate::domain::provider::{LxdConfig, ProviderConfig};
9697
use crate::domain::ProfileName;
9798
use crate::shared::Username;
99+
use std::net::{IpAddr, Ipv4Addr};
98100
use std::path::PathBuf;
99101

100102
fn default_lxd_provider_config(env_name: &EnvironmentName) -> ProviderConfig {
@@ -122,7 +124,10 @@ mod tests {
122124
22,
123125
)
124126
.start_provisioning()
125-
.provisioned()
127+
.provisioned(
128+
IpAddr::V4(Ipv4Addr::new(192, 168, 1, 100)),
129+
ProvisionMethod::Provisioned,
130+
)
126131
.start_destroying()
127132
}
128133

@@ -164,10 +169,12 @@ mod tests {
164169
use super::super::*;
165170
use crate::adapters::ssh::SshCredentials;
166171
use crate::domain::environment::name::EnvironmentName;
172+
use crate::domain::environment::runtime_outputs::ProvisionMethod;
167173
use crate::domain::environment::state::Destroyed;
168174
use crate::domain::provider::{LxdConfig, ProviderConfig};
169175
use crate::domain::ProfileName;
170176
use crate::shared::Username;
177+
use std::net::{IpAddr, Ipv4Addr};
171178
use std::path::PathBuf;
172179

173180
fn default_lxd_provider_config(env_name: &EnvironmentName) -> ProviderConfig {
@@ -195,7 +202,10 @@ mod tests {
195202
22,
196203
)
197204
.start_provisioning()
198-
.provisioned()
205+
.provisioned(
206+
IpAddr::V4(Ipv4Addr::new(192, 168, 1, 100)),
207+
ProvisionMethod::Provisioned,
208+
)
199209
.start_destroying()
200210
}
201211

0 commit comments

Comments
 (0)