Some checks failed
Run Check Script / check (pull_request) Failing after 33s
81 lines
2.4 KiB
Rust
81 lines
2.4 KiB
Rust
use serde::Serialize;
|
|
|
|
use crate::interpret::Interpret;
|
|
use crate::modules::k8s::resource::K8sResourceScore;
|
|
use crate::modules::postgresql::capability::PostgreSQLConfig;
|
|
use crate::modules::postgresql::cnpg::{Bootstrap, Cluster, ClusterSpec, Initdb, Storage};
|
|
use crate::score::Score;
|
|
use crate::topology::{K8sclient, Topology};
|
|
use k8s_openapi::apimachinery::pkg::apis::meta::v1::ObjectMeta;
|
|
|
|
/// Deploys an opinionated, highly available PostgreSQL cluster managed by CNPG.
|
|
///
|
|
/// # Usage
|
|
/// ```
|
|
/// use harmony::modules::postgresql::PostgreSQLScore;
|
|
/// let score = PostgreSQLScore::new("my-app-ns");
|
|
/// ```
|
|
///
|
|
/// # Limitations (Happy Path)
|
|
/// - Requires CNPG operator installed (use CloudNativePgOperatorScore).
|
|
/// - No backups, monitoring, extensions configured.
|
|
///
|
|
/// TODO : refactor this to declare a clean dependency on cnpg operator. Then cnpg operator will
|
|
/// self-deploy either using operatorhub or helm chart depending on k8s flavor. This is cnpg
|
|
/// specific behavior
|
|
#[derive(Debug, Clone, Serialize)]
|
|
pub struct K8sPostgreSQLScore {
|
|
pub config: PostgreSQLConfig,
|
|
}
|
|
|
|
impl Default for K8sPostgreSQLScore {
|
|
fn default() -> Self {
|
|
Self {
|
|
config: PostgreSQLConfig::default(),
|
|
}
|
|
}
|
|
}
|
|
|
|
impl K8sPostgreSQLScore {
|
|
pub fn new(namespace: &str) -> Self {
|
|
Self {
|
|
config: PostgreSQLConfig {
|
|
namespace: namespace.to_string(),
|
|
..Default::default()
|
|
},
|
|
}
|
|
}
|
|
}
|
|
|
|
impl<T: Topology + K8sclient> Score<T> for K8sPostgreSQLScore {
|
|
fn create_interpret(&self) -> Box<dyn Interpret<T>> {
|
|
let metadata = ObjectMeta {
|
|
name: Some(self.config.cluster_name.clone()),
|
|
namespace: Some(self.config.namespace.clone()),
|
|
..ObjectMeta::default()
|
|
};
|
|
|
|
let spec = ClusterSpec {
|
|
instances: self.config.instances,
|
|
storage: Storage {
|
|
size: self.config.storage_size.to_string(),
|
|
},
|
|
bootstrap: Bootstrap {
|
|
initdb: Initdb {
|
|
database: "app".to_string(),
|
|
owner: "app".to_string(),
|
|
},
|
|
},
|
|
..ClusterSpec::default()
|
|
};
|
|
|
|
let cluster = Cluster { metadata, spec };
|
|
|
|
K8sResourceScore::single(cluster, Some(self.config.namespace.clone())).create_interpret()
|
|
}
|
|
|
|
fn name(&self) -> String {
|
|
format!("PostgreSQLScore({})", self.config.namespace)
|
|
}
|
|
}
|