use crate::adapters::ssh::SshCredentials;
use crate::domain::backup::BackupConfig;
use crate::domain::environment::{
EnvironmentName, EnvironmentParams, InternalConfig, RuntimeOutputs, UserInputs,
};
use crate::domain::grafana::GrafanaConfig;
use crate::domain::prometheus::PrometheusConfig;
use crate::domain::provider::ProviderConfig;
use chrono::{DateTime, TimeZone, Utc};
use serde::{Deserialize, Serialize};
use std::path::PathBuf;
fn default_created_at() -> DateTime<Utc> {
Utc.timestamp_opt(0, 0).unwrap()
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EnvironmentContext {
#[serde(default = "default_created_at")]
pub created_at: DateTime<Utc>,
pub user_inputs: UserInputs,
pub internal_config: InternalConfig,
pub runtime_outputs: RuntimeOutputs,
}
impl EnvironmentContext {
#[must_use]
pub fn new(
name: &EnvironmentName,
provider_config: ProviderConfig,
ssh_credentials: SshCredentials,
ssh_port: u16,
created_at: DateTime<Utc>,
) -> Self {
Self {
created_at,
user_inputs: UserInputs::new(name, provider_config, ssh_credentials, ssh_port)
.expect("UserInputs::new with defaults should never fail - default config always passes validation"),
internal_config: InternalConfig::new(name),
runtime_outputs: RuntimeOutputs::new(),
}
}
pub fn create(
params: EnvironmentParams,
working_dir: &std::path::Path,
created_at: DateTime<Utc>,
) -> Result<Self, crate::domain::environment::UserInputsError> {
Ok(Self {
created_at,
user_inputs: UserInputs::with_tracker(
¶ms.environment_name,
params.provider_config,
params.ssh_credentials,
params.ssh_port,
params.tracker_config,
params.prometheus_config,
params.grafana_config,
params.https_config,
params.backup_config,
)?,
internal_config: InternalConfig::with_working_dir(
¶ms.environment_name,
working_dir,
),
runtime_outputs: RuntimeOutputs::new(),
})
}
#[must_use]
pub fn ssh_username(&self) -> &crate::shared::Username {
&self.user_inputs.ssh_credentials().ssh_username
}
#[must_use]
pub fn ssh_private_key_path(&self) -> &PathBuf {
&self.user_inputs.ssh_credentials().ssh_priv_key_path
}
#[must_use]
pub fn ssh_public_key_path(&self) -> &PathBuf {
&self.user_inputs.ssh_credentials().ssh_pub_key_path
}
#[must_use]
pub fn templates_dir(&self) -> PathBuf {
self.internal_config.templates_dir()
}
#[must_use]
pub fn traces_dir(&self) -> PathBuf {
self.internal_config.traces_dir()
}
#[must_use]
pub fn ansible_build_dir(&self) -> PathBuf {
self.internal_config.ansible_build_dir()
}
#[must_use]
pub fn tofu_build_dir(&self) -> PathBuf {
let provider = self.user_inputs.provider_config().provider();
self.internal_config.tofu_build_dir_for_provider(provider)
}
#[must_use]
pub fn ansible_templates_dir(&self) -> PathBuf {
self.internal_config.ansible_templates_dir()
}
#[must_use]
pub fn tofu_templates_dir(&self) -> PathBuf {
self.internal_config.tofu_templates_dir()
}
#[must_use]
pub fn name(&self) -> &EnvironmentName {
self.user_inputs.name()
}
#[must_use]
pub fn instance_name(&self) -> &crate::domain::InstanceName {
self.user_inputs.instance_name()
}
#[must_use]
pub fn provider_config(&self) -> &ProviderConfig {
self.user_inputs.provider_config()
}
#[must_use]
pub fn ssh_credentials(&self) -> &SshCredentials {
self.user_inputs.ssh_credentials()
}
#[must_use]
pub fn ssh_port(&self) -> u16 {
self.user_inputs.ssh_port()
}
#[must_use]
pub fn database_config(&self) -> &crate::domain::tracker::DatabaseConfig {
self.user_inputs.tracker().core().database()
}
#[must_use]
pub fn tracker_config(&self) -> &crate::domain::tracker::TrackerConfig {
self.user_inputs.tracker()
}
#[must_use]
pub fn admin_token(&self) -> &str {
self.user_inputs
.tracker()
.http_api()
.admin_token()
.expose_secret()
}
#[must_use]
pub fn prometheus_config(&self) -> Option<&PrometheusConfig> {
self.user_inputs.prometheus()
}
#[must_use]
pub fn grafana_config(&self) -> Option<&GrafanaConfig> {
self.user_inputs.grafana()
}
#[must_use]
pub fn backup_config(&self) -> Option<&BackupConfig> {
self.user_inputs.backup()
}
#[must_use]
pub fn build_dir(&self) -> &PathBuf {
&self.internal_config.build_dir
}
#[must_use]
pub fn data_dir(&self) -> &PathBuf {
&self.internal_config.data_dir
}
#[must_use]
pub fn instance_ip(&self) -> Option<std::net::IpAddr> {
self.runtime_outputs.instance_ip()
}
#[must_use]
pub fn provision_method(&self) -> Option<crate::domain::environment::ProvisionMethod> {
self.runtime_outputs.provision_method()
}
#[must_use]
pub fn created_at(&self) -> DateTime<Utc> {
self.created_at
}
}