From 8932bf3cf718c33d0dffb735bad8f6fe44a578dd Mon Sep 17 00:00:00 2001 From: Willem Date: Tue, 21 Oct 2025 11:44:01 -0400 Subject: [PATCH] fix: use derive custom resource for kube-rs rather than a yaml string --- .../modules/cert_manager/cluster_issuer.rs | 104 +++++++++++++----- 1 file changed, 78 insertions(+), 26 deletions(-) diff --git a/harmony/src/modules/cert_manager/cluster_issuer.rs b/harmony/src/modules/cert_manager/cluster_issuer.rs index 2c4a199..70294fe 100644 --- a/harmony/src/modules/cert_manager/cluster_issuer.rs +++ b/harmony/src/modules/cert_manager/cluster_issuer.rs @@ -2,7 +2,9 @@ use std::sync::Arc; use async_trait::async_trait; use harmony_types::id::Id; -use serde::Serialize; +use kube::{CustomResource, api::ObjectMeta}; +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; use crate::{ data::Version, @@ -13,14 +15,14 @@ use crate::{ }; #[derive(Clone, Debug, Serialize)] -pub struct ClusterIssuer { +pub struct ClusterIssuerScore { email: String, server: String, issuer_name: String, namespace: String, } -impl Score for ClusterIssuer { +impl Score for ClusterIssuerScore { fn name(&self) -> String { "ClusterIssuerScore".to_string() } @@ -35,7 +37,7 @@ impl Score for ClusterIssuer { #[derive(Debug, Clone)] pub struct ClusterIssuerInterpret { - score: ClusterIssuer, + score: ClusterIssuerScore, } #[async_trait] @@ -71,7 +73,7 @@ impl ClusterIssuerInterpret { &self, client: &Arc, ) -> Result { - let cert_manager = "cet-manager".to_string(); + let cert_manager = "cert-manager".to_string(); let operator_namespace = "openshift-operators".to_string(); match client .get_deployment(&cert_manager, Some(&operator_namespace)) @@ -108,31 +110,35 @@ impl ClusterIssuerInterpret { } } - fn build_cluster_issuer(&self) -> Result { + fn build_cluster_issuer(&self) -> Result { let issuer_name = &self.score.issuer_name; let email = &self.score.email; let server = &self.score.server; let namespace = &self.score.namespace; - let cluster_issuer = format!( - r#" -apiVersion: cert-manager.io/v1 -kind: ClusterIssuer -metadata: - - apiVersion: cert-manager.io/v1 - manager: cert-manager-clusterissuers - name: {issuer_name} - namespace: {namespace} -spec: - acme: - email: {email} - privateKeySecretRef: - name: {issuer_name} - server: {server} - solvers: - - http01: - ingress: - class: nginx"#, - ); + let cluster_issuer = ClusterIssuer { + metadata: ObjectMeta { + name: Some(issuer_name.to_string()), + namespace: Some(namespace.to_string()), + ..Default::default() + }, + spec: ClusterIssuerSpec { + acme: AcmeSpec { + email: email.to_string(), + private_key_secret_ref: PrivateKeySecretRef { + name: issuer_name.to_string(), + }, + server: server.to_string(), + solvers: vec![SolverSpec { + http01: Some(Http01Solver { + ingress: Http01Ingress { + class: "nginx".to_string(), + }, + }), + }], + }, + }, + }; + Ok(cluster_issuer) } @@ -155,3 +161,49 @@ spec: ))) } } + +#[derive(CustomResource, Deserialize, Serialize, Clone, Debug, JsonSchema)] +#[kube( + group = "cert-manager.io", + version = "v1", + kind = "ClusterIssuer", + plural = "clusterissuers" +)] +#[serde(rename_all = "camelCase")] +pub struct ClusterIssuerSpec { + pub acme: AcmeSpec, +} + +#[derive(Deserialize, Serialize, Clone, Debug, JsonSchema)] +#[serde(rename_all = "camelCase")] +pub struct AcmeSpec { + pub email: String, + pub private_key_secret_ref: PrivateKeySecretRef, + pub server: String, + pub solvers: Vec, +} + +#[derive(Deserialize, Serialize, Clone, Debug, JsonSchema)] +#[serde(rename_all = "camelCase")] +pub struct PrivateKeySecretRef { + pub name: String, +} + +#[derive(Deserialize, Serialize, Clone, Debug, JsonSchema)] +#[serde(rename_all = "camelCase")] +pub struct SolverSpec { + pub http01: Option, + // Other solver types (e.g., dns01) would go here as Options +} + +#[derive(Deserialize, Serialize, Clone, Debug, JsonSchema)] +#[serde(rename_all = "camelCase")] +pub struct Http01Solver { + pub ingress: Http01Ingress, +} + +#[derive(Deserialize, Serialize, Clone, Debug, JsonSchema)] +#[serde(rename_all = "camelCase")] +pub struct Http01Ingress { + pub class: String, +}