use std::sync::Arc;
use std::time::Duration;
use crate::adapters::ansible::AnsibleClient;
use crate::adapters::lxd::LxdClient;
use crate::adapters::ssh::SshCredentials;
use crate::adapters::tofu::OpenTofuClient;
use crate::config::Config;
use crate::domain::provider::ProviderConfig;
use crate::domain::template::TemplateManager;
use crate::domain::InstanceName;
use crate::infrastructure::persistence::file_repository_factory::FileRepositoryFactory;
use crate::infrastructure::templating::ansible::AnsibleProjectGenerator;
use crate::infrastructure::templating::ansible::ANSIBLE_SUBFOLDER;
use crate::infrastructure::templating::tofu::TofuProjectGenerator;
use crate::shared::Clock;
use crate::testing::e2e::LXD_OPENTOFU_SUBFOLDER;
use crate::testing::mock_clock::MockClock;
use chrono::DateTime;
const REPOSITORY_LOCK_TIMEOUT_SECS: u64 = 30;
pub struct Services {
pub opentofu_client: Arc<OpenTofuClient>,
pub lxd_client: Arc<LxdClient>,
pub ansible_client: Arc<AnsibleClient>,
pub template_manager: Arc<TemplateManager>,
pub tofu_template_renderer: Arc<TofuProjectGenerator>,
pub ansible_project_generator: Arc<AnsibleProjectGenerator>,
pub clock: Arc<dyn Clock>,
pub file_repository_factory: Arc<FileRepositoryFactory>,
}
impl Services {
#[must_use]
pub fn new(
config: &Config,
ssh_credentials: SshCredentials,
instance_name: InstanceName,
provider_config: ProviderConfig,
) -> Self {
let template_manager = TemplateManager::new(config.templates_dir.clone());
let template_manager = Arc::new(template_manager);
let opentofu_client = OpenTofuClient::new(config.build_dir.join(LXD_OPENTOFU_SUBFOLDER));
let lxd_client = LxdClient::new();
let ansible_client = AnsibleClient::new(config.build_dir.join(ANSIBLE_SUBFOLDER));
let clock = Arc::new(MockClock::new(DateTime::UNIX_EPOCH));
let tofu_template_renderer = TofuProjectGenerator::new(
template_manager.clone(),
config.build_dir.clone(),
ssh_credentials,
22, instance_name,
provider_config,
clock,
);
let ansible_project_generator =
AnsibleProjectGenerator::new(config.build_dir.clone(), template_manager.clone());
let file_repository_factory =
FileRepositoryFactory::new(Duration::from_secs(REPOSITORY_LOCK_TIMEOUT_SECS));
let clock: Arc<dyn Clock> = Arc::new(crate::shared::SystemClock);
Self {
opentofu_client: Arc::new(opentofu_client),
lxd_client: Arc::new(lxd_client),
ansible_client: Arc::new(ansible_client),
template_manager: template_manager.clone(),
tofu_template_renderer: Arc::new(tofu_template_renderer),
ansible_project_generator: Arc::new(ansible_project_generator),
clock,
file_repository_factory: Arc::new(file_repository_factory),
}
}
}