Skip to content

Commit 0a2752f

Browse files
committed
Refactor: Rename TofuTemplateRenderer to TofuProjectGenerator
1 parent e079adb commit 0a2752f

File tree

11 files changed

+134
-135
lines changed

11 files changed

+134
-135
lines changed

src/application/command_handlers/provision/errors.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use crate::adapters::tofu::client::OpenTofuError;
55
use crate::application::services::AnsibleTemplateServiceError;
66
use crate::application::steps::RenderAnsibleTemplatesError;
77
use crate::domain::environment::state::StateTypeError;
8-
use crate::infrastructure::external_tools::tofu::TofuTemplateRendererError;
8+
use crate::infrastructure::external_tools::tofu::TofuProjectGeneratorError;
99
use crate::shared::command::CommandError;
1010

1111
/// Comprehensive error type for the `ProvisionCommandHandler`
@@ -15,7 +15,7 @@ pub enum ProvisionCommandHandlerError {
1515
EnvironmentNotFound { name: String },
1616

1717
#[error("OpenTofu template rendering failed: {0}")]
18-
OpenTofuTemplateRendering(#[from] TofuTemplateRendererError),
18+
OpenTofuTemplateRendering(#[from] TofuProjectGeneratorError),
1919

2020
#[error("Ansible template rendering failed: {0}")]
2121
AnsibleTemplateRendering(#[from] RenderAnsibleTemplatesError),
@@ -284,10 +284,10 @@ mod tests {
284284

285285
#[test]
286286
fn it_should_provide_help_for_opentofu_template_rendering() {
287-
use crate::infrastructure::external_tools::tofu::TofuTemplateRendererError;
287+
use crate::infrastructure::external_tools::tofu::TofuProjectGeneratorError;
288288

289289
let error = ProvisionCommandHandlerError::OpenTofuTemplateRendering(
290-
TofuTemplateRendererError::DirectoryCreationFailed {
290+
TofuProjectGeneratorError::DirectoryCreationFailed {
291291
directory: "test".to_string(),
292292
source: std::io::Error::new(std::io::ErrorKind::PermissionDenied, "test"),
293293
},
@@ -397,15 +397,15 @@ mod tests {
397397
use crate::adapters::ssh::SshError;
398398
use crate::application::steps::RenderAnsibleTemplatesError;
399399
use crate::infrastructure::external_tools::ansible::template::wrappers::inventory::InventoryContextError;
400-
use crate::infrastructure::external_tools::tofu::TofuTemplateRendererError;
400+
use crate::infrastructure::external_tools::tofu::TofuProjectGeneratorError;
401401
use crate::shared::command::CommandError;
402402

403403
let errors = vec![
404404
ProvisionCommandHandlerError::EnvironmentNotFound {
405405
name: "test-env".to_string(),
406406
},
407407
ProvisionCommandHandlerError::OpenTofuTemplateRendering(
408-
TofuTemplateRendererError::DirectoryCreationFailed {
408+
TofuProjectGeneratorError::DirectoryCreationFailed {
409409
directory: "test".to_string(),
410410
source: std::io::Error::new(std::io::ErrorKind::PermissionDenied, "test"),
411411
},

src/application/command_handlers/provision/handler.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ use crate::domain::environment::repository::{EnvironmentRepository, TypedEnviron
2121
use crate::domain::environment::state::{ProvisionFailureContext, ProvisionStep};
2222
use crate::domain::environment::{Environment, Provisioned, Provisioning};
2323
use crate::domain::EnvironmentName;
24-
use crate::infrastructure::external_tools::tofu::TofuTemplateRenderer;
24+
use crate::infrastructure::external_tools::tofu::TofuProjectGenerator;
2525
use crate::shared::error::Traceable;
2626

2727
/// `ProvisionCommandHandler` orchestrates the complete infrastructure provisioning workflow
@@ -237,18 +237,18 @@ impl ProvisionCommandHandler {
237237
/// # Returns
238238
///
239239
/// Returns a tuple of:
240-
/// - `TofuTemplateRenderer` - For rendering `OpenTofu` templates
240+
/// - `TofuProjectGenerator` - For rendering `OpenTofu` templates
241241
/// - `OpenTofuClient` - For executing `OpenTofu` operations
242242
fn build_infrastructure_dependencies(
243243
environment: &Environment<Provisioning>,
244-
) -> (Arc<TofuTemplateRenderer>, Arc<OpenTofuClient>) {
244+
) -> (Arc<TofuProjectGenerator>, Arc<OpenTofuClient>) {
245245
let opentofu_client = Arc::new(OpenTofuClient::new(environment.tofu_build_dir()));
246246

247247
let template_manager = Arc::new(crate::domain::TemplateManager::new(
248248
environment.templates_dir(),
249249
));
250250

251-
let tofu_template_renderer = Arc::new(TofuTemplateRenderer::new(
251+
let tofu_template_renderer = Arc::new(TofuProjectGenerator::new(
252252
template_manager,
253253
environment.build_dir(),
254254
environment.ssh_credentials().clone(),
@@ -355,7 +355,7 @@ impl ProvisionCommandHandler {
355355
/// Returns an error if template rendering fails
356356
async fn render_opentofu_templates(
357357
&self,
358-
tofu_template_renderer: &Arc<TofuTemplateRenderer>,
358+
tofu_template_renderer: &Arc<TofuProjectGenerator>,
359359
) -> Result<(), ProvisionCommandHandlerError> {
360360
RenderOpenTofuTemplatesStep::new(tofu_template_renderer.clone())
361361
.execute()

src/application/command_handlers/provision/tests/integration.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@
55
use crate::adapters::ssh::SshError;
66
use crate::adapters::tofu::client::OpenTofuError;
77
use crate::application::command_handlers::provision::ProvisionCommandHandlerError;
8-
use crate::infrastructure::external_tools::tofu::TofuTemplateRendererError;
8+
use crate::infrastructure::external_tools::tofu::TofuProjectGeneratorError;
99
use crate::shared::command::CommandError;
1010

1111
#[test]
1212
fn it_should_have_correct_error_type_conversions() {
1313
// Test that all error types can convert to ProvisionCommandHandlerError
14-
let template_error = TofuTemplateRendererError::DirectoryCreationFailed {
14+
let template_error = TofuProjectGeneratorError::DirectoryCreationFailed {
1515
directory: "/test".to_string(),
1616
source: std::io::Error::new(std::io::ErrorKind::PermissionDenied, "test"),
1717
};

src/application/steps/rendering/opentofu_templates.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,17 +22,17 @@ use std::sync::Arc;
2222
use tracing::{info, instrument};
2323

2424
use crate::infrastructure::external_tools::tofu::{
25-
TofuTemplateRenderer, TofuTemplateRendererError,
25+
TofuProjectGenerator, TofuProjectGeneratorError,
2626
};
2727

2828
/// Simple step that renders `OpenTofu` templates to the build directory
2929
pub struct RenderOpenTofuTemplatesStep {
30-
tofu_template_renderer: Arc<TofuTemplateRenderer>,
30+
tofu_template_renderer: Arc<TofuProjectGenerator>,
3131
}
3232

3333
impl RenderOpenTofuTemplatesStep {
3434
#[must_use]
35-
pub fn new(tofu_template_renderer: Arc<TofuTemplateRenderer>) -> Self {
35+
pub fn new(tofu_template_renderer: Arc<TofuProjectGenerator>) -> Self {
3636
Self {
3737
tofu_template_renderer,
3838
}
@@ -49,7 +49,7 @@ impl RenderOpenTofuTemplatesStep {
4949
skip_all,
5050
fields(step_type = "rendering", template_type = "opentofu")
5151
)]
52-
pub async fn execute(&self) -> Result<(), TofuTemplateRendererError> {
52+
pub async fn execute(&self) -> Result<(), TofuProjectGeneratorError> {
5353
info!(
5454
step = "render_opentofu_templates",
5555
"Rendering OpenTofu templates"

src/infrastructure/external_tools/tofu/mod.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@
66
//! ## Components
77
//!
88
//! - `template` - Template renderers and context wrappers for infrastructure configuration files
9-
//! - `TofuTemplateRenderer` - Handles generation of `OpenTofu` configuration files
10-
//! - `CloudInitTemplateRenderer` - Specialized collaborator for cloud-init.yml.tera templates
9+
//! - `TofuProjectGenerator` - Handles generation of `OpenTofu` configuration files
10+
//! - `CloudInitRenderer` - Specialized collaborator for cloud-init.yml.tera templates
1111
//!
1212
//! Note: The `OpenTofu` adapter (`OpenTofuClient`) has been moved to `crate::adapters::tofu`
1313
1414
pub mod template;
1515

16-
pub use template::{CloudInitTemplateRenderer, TofuTemplateRenderer, TofuTemplateRendererError};
16+
pub use template::{CloudInitRenderer, TofuProjectGenerator, TofuProjectGeneratorError};

src/infrastructure/external_tools/tofu/template/common/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
pub mod renderer;
77
pub mod wrappers;
88

9-
pub use renderer::cloud_init::{CloudInitTemplateError, CloudInitTemplateRenderer};
10-
pub use renderer::{TofuTemplateRenderer, TofuTemplateRendererError};
9+
pub use renderer::cloud_init::{CloudInitRenderer, CloudInitRendererError};
10+
pub use renderer::{TofuProjectGenerator, TofuProjectGeneratorError};
1111
pub use wrappers::{
1212
CloudInitContext, CloudInitContextBuilder, CloudInitContextError, CloudInitTemplate,
1313
};

src/infrastructure/external_tools/tofu/template/common/renderer/cloud_init.rs

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
//! # Cloud-Init Template Renderer
22
//!
3-
//! This module provides the `CloudInitTemplateRenderer`, a specialized template renderer for cloud-init.yml.tera
3+
//! This module provides the `CloudInitRenderer`, a specialized template renderer for cloud-init.yml.tera
44
//! rendering within the `OpenTofu` deployment workflow. It extracts all cloud-init specific logic
5-
//! from the main `TofuTemplateRenderer` to follow the single responsibility principle.
5+
//! from the main `TofuProjectGenerator` to follow the single responsibility principle.
66
//!
77
//! ## Purpose
88
//!
9-
//! The `CloudInitTemplateRenderer` is responsible for:
9+
//! The `CloudInitRenderer` is responsible for:
1010
//! - Handling the `cloud-init.yml.tera` template file specifically
1111
//! - Managing SSH public key injection into cloud-init configuration
1212
//! - Creating appropriate contexts from SSH credentials
@@ -20,7 +20,7 @@
2020
//! ```rust
2121
//! # use std::sync::Arc;
2222
//! # use std::path::Path;
23-
//! # use torrust_tracker_deployer_lib::infrastructure::external_tools::tofu::template::common::renderer::cloud_init::CloudInitTemplateRenderer;
23+
//! # use torrust_tracker_deployer_lib::infrastructure::external_tools::tofu::template::common::renderer::cloud_init::CloudInitRenderer;
2424
//! # use torrust_tracker_deployer_lib::domain::template::TemplateManager;
2525
//! # use torrust_tracker_deployer_lib::domain::provider::Provider;
2626
//! # use torrust_tracker_deployer_lib::shared::Username;
@@ -35,7 +35,7 @@
3535
//! PathBuf::from("fixtures/testing_rsa.pub"),
3636
//! Username::new("username").unwrap()
3737
//! );
38-
//! let renderer = CloudInitTemplateRenderer::new(template_manager, Provider::Lxd);
38+
//! let renderer = CloudInitRenderer::new(template_manager, Provider::Lxd);
3939
//!
4040
//! // Just demonstrate creating the renderer - actual rendering requires
4141
//! // a proper template manager setup with cloud-init templates
@@ -54,7 +54,7 @@ use crate::domain::template::{TemplateManager, TemplateManagerError};
5454

5555
/// Errors that can occur during cloud-init template rendering
5656
#[derive(Error, Debug)]
57-
pub enum CloudInitTemplateError {
57+
pub enum CloudInitRendererError {
5858
/// Failed to get cloud-init template path from template manager
5959
#[error("Failed to get template path for 'cloud-init.yml.tera': {source}")]
6060
TemplatePathFailed {
@@ -98,17 +98,17 @@ pub enum CloudInitTemplateError {
9898
/// - Template rendering and output file writing
9999
///
100100
/// It follows the Single Responsibility Principle by focusing solely on cloud-init
101-
/// template operations, making the main `TofuTemplateRenderer` simpler and more focused.
101+
/// template operations, making the main `TofuProjectGenerator` simpler and more focused.
102102
///
103103
/// Note: The provider field is kept for potential future provider-specific customization,
104104
/// but currently all providers use the same common cloud-init template.
105-
pub struct CloudInitTemplateRenderer {
105+
pub struct CloudInitRenderer {
106106
template_manager: Arc<TemplateManager>,
107107
#[allow(dead_code)]
108108
provider: Provider,
109109
}
110110

111-
impl CloudInitTemplateRenderer {
111+
impl CloudInitRenderer {
112112
/// Template file name for cloud-init configuration
113113
const CLOUD_INIT_TEMPLATE_FILE: &'static str = "cloud-init.yml.tera";
114114

@@ -129,7 +129,7 @@ impl CloudInitTemplateRenderer {
129129
///
130130
/// # Returns
131131
///
132-
/// A new `CloudInitTemplateRenderer` instance ready to render cloud-init templates
132+
/// * `CloudInitRenderer` - A new renderer instance
133133
#[must_use]
134134
pub fn new(template_manager: Arc<TemplateManager>, provider: Provider) -> Self {
135135
Self {
@@ -154,7 +154,7 @@ impl CloudInitTemplateRenderer {
154154
/// # Returns
155155
///
156156
/// * `Ok(())` on successful template rendering
157-
/// * `Err(CloudInitTemplateError)` on any failure during the rendering process
157+
/// * `Err(CloudInitRendererError)` on any failure during the rendering process
158158
///
159159
/// # Errors
160160
///
@@ -170,7 +170,7 @@ impl CloudInitTemplateRenderer {
170170
&self,
171171
ssh_credentials: &SshCredentials,
172172
output_dir: &Path,
173-
) -> Result<(), CloudInitTemplateError> {
173+
) -> Result<(), CloudInitRendererError> {
174174
tracing::debug!(
175175
provider = %self.provider,
176176
"Rendering cloud-init template with SSH public key injection"
@@ -181,16 +181,16 @@ impl CloudInitTemplateRenderer {
181181
let source_path = self
182182
.template_manager
183183
.get_template_path(&template_path)
184-
.map_err(|source| CloudInitTemplateError::TemplatePathFailed { source })?;
184+
.map_err(|source| CloudInitRendererError::TemplatePathFailed { source })?;
185185

186186
// Read template content from file
187187
let template_content = tokio::fs::read_to_string(&source_path)
188188
.await
189-
.map_err(|source| CloudInitTemplateError::TemplateReadError { source })?;
189+
.map_err(|source| CloudInitRendererError::TemplateReadError { source })?;
190190

191191
// Create File object for template processing
192192
let template_file = File::new(Self::CLOUD_INIT_TEMPLATE_FILE, template_content)
193-
.map_err(|_| CloudInitTemplateError::FileCreationFailed)?;
193+
.map_err(|_| CloudInitRendererError::FileCreationFailed)?;
194194

195195
// Render cloud-init template (shared logic for all providers)
196196
self.render_cloud_init(&template_file, ssh_credentials, output_dir)
@@ -202,7 +202,7 @@ impl CloudInitTemplateRenderer {
202202
template_file: &File,
203203
ssh_credentials: &SshCredentials,
204204
output_dir: &Path,
205-
) -> Result<(), CloudInitTemplateError> {
205+
) -> Result<(), CloudInitRendererError> {
206206
use crate::infrastructure::external_tools::tofu::template::common::wrappers::cloud_init::{
207207
CloudInitContext, CloudInitTemplate,
208208
};
@@ -211,21 +211,21 @@ impl CloudInitTemplateRenderer {
211211
// Note: All providers use the same context structure for cloud-init
212212
let cloud_init_context = CloudInitContext::builder()
213213
.with_ssh_public_key_from_file(&ssh_credentials.ssh_pub_key_path)
214-
.map_err(|_| CloudInitTemplateError::SshKeyReadError)?
214+
.map_err(|_| CloudInitRendererError::SshKeyReadError)?
215215
.with_username(ssh_credentials.ssh_username.as_str())
216-
.map_err(|_| CloudInitTemplateError::ContextCreationFailed)?
216+
.map_err(|_| CloudInitRendererError::ContextCreationFailed)?
217217
.build()
218-
.map_err(|_| CloudInitTemplateError::ContextCreationFailed)?;
218+
.map_err(|_| CloudInitRendererError::ContextCreationFailed)?;
219219

220220
// Create CloudInitTemplate with context
221221
let cloud_init_template = CloudInitTemplate::new(template_file, cloud_init_context)
222-
.map_err(|_| CloudInitTemplateError::CloudInitTemplateCreationFailed)?;
222+
.map_err(|_| CloudInitRendererError::CloudInitTemplateCreationFailed)?;
223223

224224
// Render template to output file
225225
let output_path = output_dir.join(Self::CLOUD_INIT_OUTPUT_FILE);
226226
cloud_init_template
227227
.render(&output_path)
228-
.map_err(|_| CloudInitTemplateError::CloudInitTemplateRenderFailed)?;
228+
.map_err(|_| CloudInitRendererError::CloudInitTemplateRenderFailed)?;
229229

230230
tracing::debug!(
231231
provider = %self.provider,
@@ -310,7 +310,7 @@ users:
310310
#[test]
311311
fn it_should_create_cloud_init_renderer_with_template_manager_and_provider() {
312312
let template_manager = Arc::new(TemplateManager::new(std::env::temp_dir()));
313-
let renderer = CloudInitTemplateRenderer::new(template_manager, Provider::Lxd);
313+
let renderer = CloudInitRenderer::new(template_manager, Provider::Lxd);
314314

315315
// Verify the renderer was created successfully
316316
// Just check that it contains the expected template manager reference
@@ -321,14 +321,14 @@ users:
321321
#[test]
322322
fn it_should_build_common_template_path() {
323323
// All providers use the common template path
324-
let template_path = CloudInitTemplateRenderer::build_template_path("cloud-init.yml.tera");
324+
let template_path = CloudInitRenderer::build_template_path("cloud-init.yml.tera");
325325
assert_eq!(template_path, "tofu/common/cloud-init.yml.tera");
326326
}
327327

328328
#[tokio::test]
329329
async fn it_should_render_cloud_init_template_successfully() {
330330
let template_manager = create_mock_template_manager_with_cloud_init();
331-
let renderer = CloudInitTemplateRenderer::new(template_manager, Provider::Lxd);
331+
let renderer = CloudInitRenderer::new(template_manager, Provider::Lxd);
332332

333333
let temp_dir = TempDir::new().expect("Failed to create temp dir");
334334
let ssh_credentials = create_mock_ssh_credentials(temp_dir.path());
@@ -367,7 +367,7 @@ users:
367367
#[tokio::test]
368368
async fn it_should_fail_when_ssh_key_file_missing() {
369369
let template_manager = create_mock_template_manager_with_cloud_init();
370-
let renderer = CloudInitTemplateRenderer::new(template_manager, Provider::Lxd);
370+
let renderer = CloudInitRenderer::new(template_manager, Provider::Lxd);
371371

372372
// Create SSH credentials with non-existent key file
373373
let temp_dir = TempDir::new().expect("Failed to create temp dir");
@@ -384,7 +384,7 @@ users:
384384

385385
assert!(result.is_err(), "Should fail when SSH key file is missing");
386386
match result.unwrap_err() {
387-
CloudInitTemplateError::SshKeyReadError => {
387+
CloudInitRendererError::SshKeyReadError => {
388388
// Expected error type
389389
}
390390
other => panic!("Expected SshKeyReadError, got: {other:?}"),
@@ -394,7 +394,7 @@ users:
394394
#[tokio::test]
395395
async fn it_should_fail_when_output_directory_is_readonly() {
396396
let template_manager = create_mock_template_manager_with_cloud_init();
397-
let renderer = CloudInitTemplateRenderer::new(template_manager, Provider::Lxd);
397+
let renderer = CloudInitRenderer::new(template_manager, Provider::Lxd);
398398

399399
let temp_dir = TempDir::new().expect("Failed to create temp dir");
400400
let ssh_credentials = create_mock_ssh_credentials(temp_dir.path());
@@ -415,7 +415,7 @@ users:
415415
"Should fail when output directory is readonly"
416416
);
417417
match result.unwrap_err() {
418-
CloudInitTemplateError::CloudInitTemplateRenderFailed => {
418+
CloudInitRendererError::CloudInitTemplateRenderFailed => {
419419
// Expected error type
420420
}
421421
other => panic!("Expected CloudInitTemplateRenderFailed, got: {other:?}"),

src/infrastructure/external_tools/tofu/template/common/renderer/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,6 @@
4242
//! operations and reduce I/O overhead.
4343
4444
pub mod cloud_init;
45-
mod tofu_template_renderer;
45+
mod project_generator;
4646

47-
pub use tofu_template_renderer::{TofuTemplateRenderer, TofuTemplateRendererError};
47+
pub use project_generator::{TofuProjectGenerator, TofuProjectGeneratorError};

0 commit comments

Comments
 (0)