diff --git a/harmony/src/modules/k8s/apps/crd/mod.rs b/harmony/src/modules/k8s/apps/crd/mod.rs index e83b27b..e45f172 100644 --- a/harmony/src/modules/k8s/apps/crd/mod.rs +++ b/harmony/src/modules/k8s/apps/crd/mod.rs @@ -1,2 +1,4 @@ mod catalogsources_operators_coreos_com; pub use catalogsources_operators_coreos_com::*; +mod subscriptions_operators_coreos_com; +pub use subscriptions_operators_coreos_com::*; diff --git a/harmony/src/modules/k8s/apps/crd/subscriptions_operators_coreos_com.rs b/harmony/src/modules/k8s/apps/crd/subscriptions_operators_coreos_com.rs new file mode 100644 index 0000000..981cd09 --- /dev/null +++ b/harmony/src/modules/k8s/apps/crd/subscriptions_operators_coreos_com.rs @@ -0,0 +1,68 @@ +use k8s_openapi::apimachinery::pkg::apis::meta::v1::ObjectMeta; +use kube::CustomResource; +use serde::{Deserialize, Serialize}; + +#[derive(CustomResource, Deserialize, Serialize, Clone, Debug)] +#[kube( + group = "operators.coreos.com", + version = "v1alpha1", + kind = "Subscription", + plural = "subscriptions", + namespaced = true, + schema = "disabled" +)] +#[serde(rename_all = "camelCase")] +pub struct SubscriptionSpec { + #[serde(skip_serializing_if = "Option::is_none")] + pub channel: Option, + + #[serde(skip_serializing_if = "Option::is_none")] + pub config: Option, + + #[serde(skip_serializing_if = "Option::is_none")] + pub install_plan_approval: Option, + + pub name: String, + + pub source: String, + + pub source_namespace: String, + + #[serde(skip_serializing_if = "Option::is_none")] + pub starting_csv: Option, +} +#[derive(Deserialize, Serialize, Clone, Debug)] +#[serde(rename_all = "camelCase")] +pub struct SubscriptionConfig { + #[serde(skip_serializing_if = "Option::is_none")] + pub env: Option>, + + #[serde(skip_serializing_if = "Option::is_none")] + pub node_selector: Option>, + + #[serde(skip_serializing_if = "Option::is_none")] + pub tolerations: Option>, +} + +impl Default for Subscription { + fn default() -> Self { + Subscription { + metadata: ObjectMeta::default(), + spec: SubscriptionSpec::default(), + } + } +} + +impl Default for SubscriptionSpec { + fn default() -> SubscriptionSpec { + SubscriptionSpec { + name: String::new(), + source: String::new(), + source_namespace: String::new(), + channel: None, + config: None, + install_plan_approval: None, + starting_csv: None, + } + } +} diff --git a/harmony/src/modules/postgresql/mod.rs b/harmony/src/modules/postgresql/mod.rs index fd47d6f..539a298 100644 --- a/harmony/src/modules/postgresql/mod.rs +++ b/harmony/src/modules/postgresql/mod.rs @@ -2,3 +2,5 @@ pub mod capability; mod score; pub mod failover; +mod operator; +pub use operator::*; diff --git a/harmony/src/modules/postgresql/operator.rs b/harmony/src/modules/postgresql/operator.rs new file mode 100644 index 0000000..4f442e6 --- /dev/null +++ b/harmony/src/modules/postgresql/operator.rs @@ -0,0 +1,66 @@ +use k8s_openapi::apimachinery::pkg::apis::meta::v1::ObjectMeta; +use serde::Serialize; + +use crate::interpret::Interpret; +use crate::modules::k8s::apps::crd::{Subscription, SubscriptionSpec}; +use crate::modules::k8s::resource::K8sResourceScore; +use crate::score::Score; +use crate::topology::{K8sclient, Topology}; + +#[derive(Debug, Clone, Serialize)] +pub struct CloudNativePgOperatorScore { + pub namespace: String, + pub channel: String, + pub install_plan_approval: String, + pub source: String, + pub source_namespace: String, +} + +impl Default for CloudNativePgOperatorScore { + fn default() -> Self { + Self { + namespace: "cnpg-system".to_string(), + channel: "stable".to_string(), + install_plan_approval: "Automatic".to_string(), + source: "operatorhubio-catalog".to_string(), + source_namespace: "openshift-marketplace".to_string(), + } + } +} + +impl CloudNativePgOperatorScore { + pub fn new(namespace: &str) -> Self { + Self { + namespace: namespace.to_string(), + ..Default::default() + } + } +} + +impl Score for CloudNativePgOperatorScore { + fn create_interpret(&self) -> Box> { + let metadata = ObjectMeta { + name: Some("cloudnative-pg".to_string()), + namespace: Some(self.namespace.clone()), + ..ObjectMeta::default() + }; + + let spec = SubscriptionSpec { + channel: Some(self.channel.clone()), + config: None, + install_plan_approval: Some(self.install_plan_approval.clone()), + name: "cloudnative-pg".to_string(), + source: self.source.clone(), + source_namespace: self.source_namespace.clone(), + starting_csv: None, + }; + + let subscription = Subscription { metadata, spec }; + + K8sResourceScore::single(subscription, Some(self.namespace.clone())).create_interpret() + } + + fn name(&self) -> String { + format!("CloudNativePgOperatorScore({})", self.namespace) + } +}