diff --git a/examples/operatorhub_catalog/src/main.rs b/examples/operatorhub_catalog/src/main.rs index 66ba72a..8e35024 100644 --- a/examples/operatorhub_catalog/src/main.rs +++ b/examples/operatorhub_catalog/src/main.rs @@ -2,19 +2,19 @@ use std::str::FromStr; use harmony::{ inventory::Inventory, - modules::{k8s::apps::OperatorHubCatalogSourceScore, tenant::TenantScore}, - topology::{K8sAnywhereTopology, tenant::TenantConfig}, + modules::{k8s::apps::OperatorHubCatalogSourceScore, postgresql::CloudNativePgOperatorScore}, + topology::K8sAnywhereTopology, }; -use harmony_types::id::Id; #[tokio::main] async fn main() { let operatorhub_catalog = OperatorHubCatalogSourceScore::default(); + let cnpg_operator = CloudNativePgOperatorScore::default(); harmony_cli::run( Inventory::autoload(), K8sAnywhereTopology::from_env(), - vec![Box::new(operatorhub_catalog)], + vec![Box::new(operatorhub_catalog), Box::new(cnpg_operator)], None, ) .await diff --git a/harmony/src/modules/postgresql/operator.rs b/harmony/src/modules/postgresql/operator.rs index 4f442e6..d908361 100644 --- a/harmony/src/modules/postgresql/operator.rs +++ b/harmony/src/modules/postgresql/operator.rs @@ -7,6 +7,42 @@ use crate::modules::k8s::resource::K8sResourceScore; use crate::score::Score; use crate::topology::{K8sclient, Topology}; +/// Install the CloudNativePg (CNPG) Operator via an OperatorHub `Subscription`. +/// +/// This Score creates a a `Subscription` Custom Resource in the specified namespace. +/// +/// The default implementation pulls the `cloudnative-pg` operator from the +/// `operatorhubio-catalog` source. +/// +/// # Goals +/// - Deploy the CNPG Operator to manage PostgreSQL clusters in OpenShift/OKD environments. +/// +/// # Usage +/// ``` +/// use harmony::modules::postgresql::CloudNativePgOperatorScore; +/// let score = CloudNativePgOperatorScore::default(); +/// ``` +/// +/// Or, you can take control of most relevant fiedls this way : +/// +/// ``` +/// use harmony::modules::postgresql::CloudNativePgOperatorScore; +/// +/// let score = CloudNativePgOperatorScore { +/// namespace: "custom-cnpg-namespace".to_string(), +/// channel: "unstable-i-want-bleedingedge-v498437".to_string(), +/// install_plan_approval: "Manual".to_string(), +/// source: "operatorhubio-catalog-but-different".to_string(), +/// source_namespace: "i-customize-everything-marketplace".to_string(), +/// }; +/// ``` +/// +/// # Limitations +/// - **OperatorHub dependency**: Requires OperatorHub catalog sources (e.g., `operatorhubio-catalog` in `openshift-marketplace`). +/// - **OKD/OpenShift assumption**: Catalog/source names and namespaces are hardcoded for OKD-like setups; adjust for upstream OpenShift. +/// - **Hardcoded values in Default implementation**: Operator name (`cloudnative-pg`), channel (`stable-v1`), automatic install plan approval. +/// - **No config options**: Does not support custom `SubscriptionConfig` (env vars, node selectors, tolerations). +/// - **Single namespace**: Targets one namespace per score instance. #[derive(Debug, Clone, Serialize)] pub struct CloudNativePgOperatorScore { pub namespace: String, @@ -19,8 +55,8 @@ pub struct CloudNativePgOperatorScore { impl Default for CloudNativePgOperatorScore { fn default() -> Self { Self { - namespace: "cnpg-system".to_string(), - channel: "stable".to_string(), + namespace: "openshift-operators".to_string(), + channel: "stable-v1".to_string(), install_plan_approval: "Automatic".to_string(), source: "operatorhubio-catalog".to_string(), source_namespace: "openshift-marketplace".to_string(),