From 0439f362dd7cbceaad69d5dcf055b130aad87a2d Mon Sep 17 00:00:00 2001 From: Tamipes Date: Mon, 15 Jun 2026 21:58:57 +0200 Subject: [PATCH] feat: add support for setting multiple address I did it like this, due to the fact that it would have been a pain to work out syntax for labels. So I moved the url to annotations --- Cargo.lock | 10 ++++++++++ Cargo.toml | 1 + src/kube_cache.rs | 18 ++++++++++++++++-- 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 599e7b8..2644623 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -745,6 +745,15 @@ dependencies = [ "hashbrown 0.16.1", ] +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.15" @@ -970,6 +979,7 @@ dependencies = [ "either", "evalexpr", "futures", + "itertools", "k8s-openapi", "kube", "nix", diff --git a/Cargo.toml b/Cargo.toml index 85040c9..63cec66 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -43,3 +43,4 @@ strip-ansi-escapes = "0.2.1" evalexpr = { version = "13.1.0", features = ["regex"] } async-trait = "0.1.89" tokio-util = { version = "0.7.18", features = ["rt"] } +itertools = "0.14.0" diff --git a/src/kube_cache.rs b/src/kube_cache.rs index 199109d..1e73cd5 100644 --- a/src/kube_cache.rs +++ b/src/kube_cache.rs @@ -2,6 +2,7 @@ use std::{collections::HashMap, fmt, sync::Arc, time::Duration}; use async_trait::async_trait; use futures::StreamExt; +use itertools::Itertools; use k8s_openapi::api::{apps::v1::Deployment, core::v1::Service}; use kube::{ api::{ListParams, ObjectList, Patch, PatchParams}, @@ -347,15 +348,28 @@ fn filter_label_value(res: &R, addr: &str, port: &str) -> bool where R: ResourceExt, { + let labels_iter = res.labels().iter(); + let annotations_iter = res.annotations().iter(); + let iters = labels_iter.merge(annotations_iter); + let mut found_port = false; - res.labels() - .iter() + iters .filter(|(key, value)| match key.as_str() { MAIN_LABEL => value.as_str() == addr, PORT_LABEL => { found_port = true; value.as_str() == port } + URL_ANNOTATION => value + .lines() + .find(|str| { + if str.find(':').is_some() { + str == &format!("{addr}:{port}").as_str() + } else { + str == &addr + } + }) + .is_some(), _ => false, }) .count()