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
This commit is contained in:
Tamipes 2026-06-15 21:58:57 +02:00
parent 29ff12f115
commit 0439f362dd
3 changed files with 27 additions and 2 deletions

10
Cargo.lock generated
View file

@ -745,6 +745,15 @@ dependencies = [
"hashbrown 0.16.1", "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]] [[package]]
name = "itoa" name = "itoa"
version = "1.0.15" version = "1.0.15"
@ -970,6 +979,7 @@ dependencies = [
"either", "either",
"evalexpr", "evalexpr",
"futures", "futures",
"itertools",
"k8s-openapi", "k8s-openapi",
"kube", "kube",
"nix", "nix",

View file

@ -43,3 +43,4 @@ strip-ansi-escapes = "0.2.1"
evalexpr = { version = "13.1.0", features = ["regex"] } evalexpr = { version = "13.1.0", features = ["regex"] }
async-trait = "0.1.89" async-trait = "0.1.89"
tokio-util = { version = "0.7.18", features = ["rt"] } tokio-util = { version = "0.7.18", features = ["rt"] }
itertools = "0.14.0"

View file

@ -2,6 +2,7 @@ use std::{collections::HashMap, fmt, sync::Arc, time::Duration};
use async_trait::async_trait; use async_trait::async_trait;
use futures::StreamExt; use futures::StreamExt;
use itertools::Itertools;
use k8s_openapi::api::{apps::v1::Deployment, core::v1::Service}; use k8s_openapi::api::{apps::v1::Deployment, core::v1::Service};
use kube::{ use kube::{
api::{ListParams, ObjectList, Patch, PatchParams}, api::{ListParams, ObjectList, Patch, PatchParams},
@ -347,15 +348,28 @@ fn filter_label_value<R>(res: &R, addr: &str, port: &str) -> bool
where where
R: ResourceExt, 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; let mut found_port = false;
res.labels() iters
.iter()
.filter(|(key, value)| match key.as_str() { .filter(|(key, value)| match key.as_str() {
MAIN_LABEL => value.as_str() == addr, MAIN_LABEL => value.as_str() == addr,
PORT_LABEL => { PORT_LABEL => {
found_port = true; found_port = true;
value.as_str() == port 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, _ => false,
}) })
.count() .count()