From c4850e79c18cd0e46b974cbb23cfc15b4a06682b Mon Sep 17 00:00:00 2001 From: tahahawa Date: Thu, 15 May 2025 12:03:21 -0400 Subject: [PATCH] Use custom aliased type for ingress path and new macro to check path validity --- examples/lamp/src/main.rs | 3 +-- harmony/src/modules/k8s/ingress.rs | 8 ++++++-- harmony/src/modules/lamp.rs | 3 ++- harmony_macros/src/lib.rs | 16 ++++++++++++++++ 4 files changed, 25 insertions(+), 5 deletions(-) diff --git a/examples/lamp/src/main.rs b/examples/lamp/src/main.rs index a1c124a..ca99d7e 100644 --- a/examples/lamp/src/main.rs +++ b/examples/lamp/src/main.rs @@ -3,13 +3,12 @@ use harmony::{ inventory::Inventory, maestro::Maestro, modules::{ - k8s::{self, ingress::K8sIngressScore, resource::K8sResourceScore}, { lamp::{LAMPConfig, LAMPScore}, }, monitoring::monitoring_alerting::MonitoringAlertingStackScore, }, - topology::{K8sAnywhereTopology, Url, k8s::K8sClient}, + topology::{K8sAnywhereTopology, Url}, }; #[tokio::main] diff --git a/harmony/src/modules/k8s/ingress.rs b/harmony/src/modules/k8s/ingress.rs index b7b5a63..37bc38e 100644 --- a/harmony/src/modules/k8s/ingress.rs +++ b/harmony/src/modules/k8s/ingress.rs @@ -1,3 +1,4 @@ +use harmony_macros::k8s_ingress_path; use k8s_openapi::api::networking::v1::Ingress; use serde::Serialize; use serde_json::json; @@ -27,13 +28,15 @@ impl PathType { } } +type K8sIngressPath = String; + #[derive(Debug, Clone, Serialize)] pub struct K8sIngressScore { pub name: fqdn::FQDN, pub host: fqdn::FQDN, pub backend_service: fqdn::FQDN, pub port: u16, - pub path: Option, + pub path: Option, pub path_type: Option, pub namespace: Option, } @@ -42,8 +45,9 @@ impl Score for K8sIngressScore { fn create_interpret(&self) -> Box> { let path = match self.path.clone() { Some(p) => p, - None => "/".to_string(), + None => k8s_ingress_path!("/"), }; + let path_type = match self.path_type.clone() { Some(p) => p, None => PathType::Prefix, diff --git a/harmony/src/modules/lamp.rs b/harmony/src/modules/lamp.rs index 2c96101..bd883e5 100644 --- a/harmony/src/modules/lamp.rs +++ b/harmony/src/modules/lamp.rs @@ -2,6 +2,7 @@ use convert_case::{Case, Casing}; use dockerfile_builder::instruction::{CMD, COPY, ENV, EXPOSE, FROM, RUN, WORKDIR}; use dockerfile_builder::{Dockerfile, instruction_builder::EnvBuilder}; use fqdn::fqdn; +use harmony_macros::k8s_ingress_path; use non_blank_string_rs::NonBlankString; use serde_json::json; use std::collections::HashMap; @@ -143,7 +144,7 @@ impl Interpret for LAMPInterpret { .as_str() ), port: 8080, - path: None, + path: Some(k8s_ingress_path!("/")), path_type: None, namespace: self .get_namespace() diff --git a/harmony_macros/src/lib.rs b/harmony_macros/src/lib.rs index 2cc4c37..8aded2e 100644 --- a/harmony_macros/src/lib.rs +++ b/harmony_macros/src/lib.rs @@ -116,3 +116,19 @@ pub fn yaml(input: TokenStream) -> TokenStream { } .into() } + +/// Verify that a string is a valid(ish) kubernetes path +/// Panics if path does not start with `/` +#[proc_macro] +pub fn k8s_ingress_path(input: TokenStream) -> TokenStream { + let input = parse_macro_input!(input as LitStr); + let path_str = input.value(); + + match path_str.starts_with("/") { + true => { + let expanded = quote! {(#path_str.to_string()) }; + return TokenStream::from(expanded); + } + false => panic!("Invalid k8s path"), + } +}