Skip to content

Commit 5840815

Browse files
committed
refactor: apply ProjectGenerator pattern to Ansible renderer
1 parent 0a2752f commit 5840815

File tree

9 files changed

+577
-555
lines changed

9 files changed

+577
-555
lines changed

src/application/services/ansible_template_service.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ use tracing::info;
2929
use crate::adapters::ssh::SshCredentials;
3030
use crate::application::steps::RenderAnsibleTemplatesStep;
3131
use crate::domain::TemplateManager;
32-
use crate::infrastructure::external_tools::ansible::AnsibleTemplateRenderer;
32+
use crate::infrastructure::external_tools::ansible::AnsibleProjectGenerator;
3333

3434
/// Errors that can occur during Ansible template rendering
3535
#[derive(Error, Debug)]
@@ -57,7 +57,7 @@ pub enum AnsibleTemplateServiceError {
5757
/// This allows the service to be configured once and reused with different
5858
/// runtime parameters.
5959
pub struct AnsibleTemplateService {
60-
ansible_template_renderer: Arc<AnsibleTemplateRenderer>,
60+
ansible_template_renderer: Arc<AnsibleProjectGenerator>,
6161
}
6262

6363
impl AnsibleTemplateService {
@@ -67,7 +67,7 @@ impl AnsibleTemplateService {
6767
///
6868
/// * `ansible_template_renderer` - The renderer for Ansible templates
6969
#[must_use]
70-
pub fn new(ansible_template_renderer: Arc<AnsibleTemplateRenderer>) -> Self {
70+
pub fn new(ansible_template_renderer: Arc<AnsibleProjectGenerator>) -> Self {
7171
Self {
7272
ansible_template_renderer,
7373
}
@@ -103,7 +103,7 @@ impl AnsibleTemplateService {
103103
let template_manager = Arc::new(TemplateManager::new(templates_dir));
104104

105105
let ansible_template_renderer =
106-
Arc::new(AnsibleTemplateRenderer::new(build_dir, template_manager));
106+
Arc::new(AnsibleProjectGenerator::new(build_dir, template_manager));
107107

108108
Self::new(ansible_template_renderer)
109109
}

src/application/steps/rendering/ansible_templates.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,12 @@ use thiserror::Error;
2525
use tracing::{info, instrument};
2626

2727
use crate::adapters::ssh::credentials::SshCredentials;
28-
use crate::infrastructure::external_tools::ansible::template::renderer::ConfigurationTemplateError;
28+
use crate::infrastructure::external_tools::ansible::template::renderer::AnsibleProjectGeneratorError;
2929
use crate::infrastructure::external_tools::ansible::template::wrappers::inventory::{
3030
AnsibleHost, AnsiblePort, AnsiblePortError, InventoryContext, InventoryContextError,
3131
SshPrivateKeyFile, SshPrivateKeyFileError,
3232
};
33-
use crate::infrastructure::external_tools::ansible::AnsibleTemplateRenderer;
33+
use crate::infrastructure::external_tools::ansible::AnsibleProjectGenerator;
3434

3535
/// Errors that can occur during Ansible template rendering step execution
3636
#[derive(Error, Debug)]
@@ -49,7 +49,7 @@ pub enum RenderAnsibleTemplatesError {
4949

5050
/// Template rendering failed
5151
#[error("Template rendering failed: {0}")]
52-
TemplateRenderingError(#[from] ConfigurationTemplateError),
52+
TemplateRenderingError(#[from] AnsibleProjectGeneratorError),
5353
}
5454

5555
impl crate::shared::Traceable for RenderAnsibleTemplatesError {
@@ -82,20 +82,20 @@ impl crate::shared::Traceable for RenderAnsibleTemplatesError {
8282

8383
/// Simple step that renders `Ansible` templates to the build directory with runtime variables
8484
pub struct RenderAnsibleTemplatesStep {
85-
ansible_template_renderer: Arc<AnsibleTemplateRenderer>,
85+
ansible_project_generator: Arc<AnsibleProjectGenerator>,
8686
ssh_credentials: SshCredentials,
8787
ssh_socket_addr: SocketAddr,
8888
}
8989

9090
impl RenderAnsibleTemplatesStep {
9191
#[must_use]
9292
pub fn new(
93-
ansible_template_renderer: Arc<AnsibleTemplateRenderer>,
93+
ansible_project_generator: Arc<AnsibleProjectGenerator>,
9494
ssh_credentials: SshCredentials,
9595
ssh_socket_addr: SocketAddr,
9696
) -> Self {
9797
Self {
98-
ansible_template_renderer,
98+
ansible_project_generator,
9999
ssh_credentials,
100100
ssh_socket_addr,
101101
}
@@ -122,7 +122,7 @@ impl RenderAnsibleTemplatesStep {
122122
let inventory_context = self.create_inventory_context()?;
123123

124124
// Use the configuration renderer to handle all template rendering
125-
self.ansible_template_renderer
125+
self.ansible_project_generator
126126
.render(&inventory_context)
127127
.await?;
128128

src/infrastructure/external_tools/ansible/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
1212
pub mod template;
1313

14-
pub use template::{AnsibleTemplateRenderer, InventoryTemplateRenderer};
14+
pub use template::{AnsibleProjectGenerator, InventoryRenderer};
1515

1616
/// Subdirectory name for Ansible-related files within the build directory.
1717
///

src/infrastructure/external_tools/ansible/template/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,4 @@
77
pub mod renderer;
88
pub mod wrappers;
99

10-
pub use renderer::{AnsibleTemplateRenderer, InventoryTemplateRenderer};
10+
pub use renderer::{AnsibleProjectGenerator, InventoryRenderer};

src/infrastructure/external_tools/ansible/template/renderer/inventory.rs

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,14 @@
1414
//! ```rust
1515
//! # use std::sync::Arc;
1616
//! # use tempfile::TempDir;
17-
//! use torrust_tracker_deployer_lib::infrastructure::external_tools::ansible::template::renderer::inventory::InventoryTemplateRenderer;
17+
//! use torrust_tracker_deployer_lib::infrastructure::external_tools::ansible::template::renderer::inventory::InventoryRenderer;
1818
//! use torrust_tracker_deployer_lib::domain::template::TemplateManager;
1919
//! use torrust_tracker_deployer_lib::infrastructure::external_tools::ansible::template::wrappers::inventory::InventoryContext;
2020
//!
2121
//! # async fn example() -> Result<(), Box<dyn std::error::Error>> {
2222
//! let temp_dir = TempDir::new()?;
2323
//! let template_manager = Arc::new(TemplateManager::new("/path/to/templates"));
24-
//! let renderer = InventoryTemplateRenderer::new(template_manager);
24+
//! let renderer = InventoryRenderer::new(template_manager);
2525
//!
2626
//! let inventory_context = InventoryContext::builder().build()?;
2727
//! renderer.render(&inventory_context, temp_dir.path())?;
@@ -41,7 +41,7 @@ use crate::infrastructure::external_tools::ansible::template::wrappers::inventor
4141

4242
/// Errors that can occur during inventory template rendering
4343
#[derive(Error, Debug)]
44-
pub enum InventoryTemplateError {
44+
pub enum InventoryRendererError {
4545
/// Failed to get template path from template manager
4646
#[error("Failed to get template path for '{file_name}': {source}")]
4747
TemplatePathFailed {
@@ -87,11 +87,11 @@ pub enum InventoryTemplateError {
8787
/// - Loading the inventory.yml.tera template
8888
/// - Processing it with runtime context (hosts, SSH keys, etc.)
8989
/// - Rendering the final inventory.yml file for Ansible consumption
90-
pub struct InventoryTemplateRenderer {
90+
pub struct InventoryRenderer {
9191
template_manager: Arc<TemplateManager>,
9292
}
9393

94-
impl InventoryTemplateRenderer {
94+
impl InventoryRenderer {
9595
/// Template filename for the inventory Tera template
9696
const INVENTORY_TEMPLATE_FILE: &'static str = "inventory.yml.tera";
9797

@@ -137,29 +137,29 @@ impl InventoryTemplateRenderer {
137137
&self,
138138
inventory_context: &InventoryContext,
139139
output_dir: &Path,
140-
) -> Result<(), InventoryTemplateError> {
140+
) -> Result<(), InventoryRendererError> {
141141
tracing::debug!("Rendering inventory template with runtime variables");
142142

143143
// Get the inventory template path
144144
let inventory_template_path = self
145145
.template_manager
146146
.get_template_path(&Self::build_template_path())
147-
.map_err(|source| InventoryTemplateError::TemplatePathFailed {
147+
.map_err(|source| InventoryRendererError::TemplatePathFailed {
148148
file_name: Self::INVENTORY_TEMPLATE_FILE.to_string(),
149149
source,
150150
})?;
151151

152152
// Read template content
153153
let inventory_template_content = std::fs::read_to_string(&inventory_template_path)
154-
.map_err(|source| InventoryTemplateError::TeraTemplateReadFailed {
154+
.map_err(|source| InventoryRendererError::TeraTemplateReadFailed {
155155
file_name: Self::INVENTORY_TEMPLATE_FILE.to_string(),
156156
source,
157157
})?;
158158

159159
// Create File object for template processing
160160
let inventory_template_file =
161161
File::new(Self::INVENTORY_TEMPLATE_FILE, inventory_template_content).map_err(
162-
|source| InventoryTemplateError::FileCreationFailed {
162+
|source| InventoryRendererError::FileCreationFailed {
163163
file_name: Self::INVENTORY_TEMPLATE_FILE.to_string(),
164164
source,
165165
},
@@ -168,14 +168,14 @@ impl InventoryTemplateRenderer {
168168
// Create InventoryTemplate with runtime context
169169
let inventory_template =
170170
InventoryTemplate::new(&inventory_template_file, inventory_context.clone()).map_err(
171-
|source| InventoryTemplateError::InventoryTemplateCreationFailed { source },
171+
|source| InventoryRendererError::InventoryTemplateCreationFailed { source },
172172
)?;
173173

174174
// Render to output file
175175
let inventory_output_path = output_dir.join(Self::INVENTORY_OUTPUT_FILE);
176176
inventory_template
177177
.render(&inventory_output_path)
178-
.map_err(|source| InventoryTemplateError::InventoryTemplateRenderFailed { source })?;
178+
.map_err(|source| InventoryRendererError::InventoryTemplateRenderFailed { source })?;
179179

180180
tracing::debug!(
181181
"Successfully rendered inventory template to {}",
@@ -252,7 +252,7 @@ mod tests {
252252
let temp_dir = TempDir::new().expect("Failed to create temp directory");
253253
let template_manager = Arc::new(TemplateManager::new(temp_dir.path()));
254254

255-
let renderer = InventoryTemplateRenderer::new(template_manager.clone());
255+
let renderer = InventoryRenderer::new(template_manager.clone());
256256

257257
assert!(Arc::ptr_eq(&renderer.template_manager, &template_manager));
258258
}
@@ -261,9 +261,9 @@ mod tests {
261261
fn it_should_build_correct_template_path() {
262262
let temp_dir = TempDir::new().expect("Failed to create temp directory");
263263
let template_manager = Arc::new(TemplateManager::new(temp_dir.path()));
264-
let _renderer = InventoryTemplateRenderer::new(template_manager);
264+
let _renderer = InventoryRenderer::new(template_manager);
265265

266-
let template_path = InventoryTemplateRenderer::build_template_path();
266+
let template_path = InventoryRenderer::build_template_path();
267267

268268
assert_eq!(template_path, "ansible/inventory.yml.tera");
269269
}
@@ -284,7 +284,7 @@ mod tests {
284284
.ensure_templates_dir()
285285
.expect("Failed to ensure templates directory");
286286

287-
let renderer = InventoryTemplateRenderer::new(template_manager);
287+
let renderer = InventoryRenderer::new(template_manager);
288288
let inventory_context = create_test_inventory_context(temp_dir.path());
289289

290290
// Render template
@@ -339,7 +339,7 @@ mod tests {
339339
.ensure_templates_dir()
340340
.expect("Failed to ensure templates directory");
341341

342-
let renderer = InventoryTemplateRenderer::new(template_manager);
342+
let renderer = InventoryRenderer::new(template_manager);
343343
let inventory_context = create_test_inventory_context(temp_dir.path());
344344

345345
let result = renderer.render(&inventory_context, &output_dir);
@@ -349,7 +349,7 @@ mod tests {
349349
"Should fail when template references non-existent context field"
350350
);
351351
match result.unwrap_err() {
352-
InventoryTemplateError::InventoryTemplateCreationFailed { .. } => {
352+
InventoryRendererError::InventoryTemplateCreationFailed { .. } => {
353353
// Expected error type when template engine fails to process template
354354
}
355355
other => panic!("Expected InventoryTemplateCreationFailed, got: {other:?}"),
@@ -379,7 +379,7 @@ mod tests {
379379
.ensure_templates_dir()
380380
.expect("Failed to ensure templates directory");
381381

382-
let renderer = InventoryTemplateRenderer::new(template_manager);
382+
let renderer = InventoryRenderer::new(template_manager);
383383
let inventory_context = create_test_inventory_context(temp_dir.path());
384384

385385
let result = renderer.render(&inventory_context, &output_dir);
@@ -388,7 +388,7 @@ mod tests {
388388
// The exact error type will depend on the template engine's error handling
389389
assert!(matches!(
390390
result.unwrap_err(),
391-
InventoryTemplateError::InventoryTemplateCreationFailed { .. }
391+
InventoryRendererError::InventoryTemplateCreationFailed { .. }
392392
));
393393
}
394394

@@ -414,7 +414,7 @@ mod tests {
414414
.ensure_templates_dir()
415415
.expect("Failed to ensure templates directory");
416416

417-
let renderer = InventoryTemplateRenderer::new(template_manager);
417+
let renderer = InventoryRenderer::new(template_manager);
418418
let inventory_context = create_test_inventory_context(temp_dir.path());
419419

420420
let result = renderer.render(&inventory_context, &output_dir);
@@ -424,7 +424,7 @@ mod tests {
424424
"Should fail when output directory is read-only"
425425
);
426426
match result.unwrap_err() {
427-
InventoryTemplateError::InventoryTemplateRenderFailed { .. } => {
427+
InventoryRendererError::InventoryTemplateRenderFailed { .. } => {
428428
// Expected error type
429429
}
430430
other => panic!("Expected InventoryTemplateRenderFailed, got: {other:?}"),

0 commit comments

Comments
 (0)