Added Group controller (#8)

This commit is contained in:
Dreaded_X 2025-03-22 04:43:57 +01:00
parent 10354ee11a
commit 5a254164cf
Signed by: Dreaded_X
GPG Key ID: FA5F485356B0D2D4
3 changed files with 30 additions and 13 deletions

View File

@ -4,6 +4,7 @@ use kube::{Resource, ResourceExt};
use crate::lldap::LldapConfig;
#[derive(Clone)]
pub struct Context {
pub client: kube::Client,
pub lldap_config: LldapConfig,

View File

@ -42,6 +42,7 @@ fn check_graphql_errors<T>(response: GraphQlResponse<T>) -> Result<T> {
.expect("Data should be valid if there are no error"))
}
#[derive(Clone)]
pub struct LldapConfig {
username: String,
password: String,

View File

@ -3,22 +3,34 @@ use std::time::Duration;
use futures::StreamExt;
use k8s_openapi::api::core::v1::Secret;
use kube::runtime::Controller;
use kube::runtime::controller::Action;
use kube::{Api, Client as KubeClient};
use kube::runtime::controller::{self, Action};
use kube::runtime::reflector::ObjectRef;
use kube::runtime::{Controller, watcher};
use kube::{Api, Client as KubeClient, Resource};
use lldap_controller::context::Context;
use lldap_controller::lldap::LldapConfig;
use lldap_controller::resources::{self, ServiceUser, reconcile};
use lldap_controller::resources::{self, Error, Group, ServiceUser, reconcile};
use tracing::{debug, info, warn};
use tracing_subscriber::layer::SubscriberExt;
use tracing_subscriber::util::SubscriberInitExt;
use tracing_subscriber::{EnvFilter, Registry};
fn error_policy(_obj: Arc<ServiceUser>, err: &resources::Error, _ctx: Arc<Context>) -> Action {
fn error_policy<T>(_obj: Arc<T>, err: &resources::Error, _ctx: Arc<Context>) -> Action {
warn!("error: {}", err);
Action::requeue(Duration::from_secs(5))
}
async fn log_status<T>(
res: Result<(ObjectRef<T>, Action), controller::Error<Error, watcher::Error>>,
) where
T: Resource,
{
match res {
Ok(obj) => debug!("reconciled {:?}", obj.0.name),
Err(err) => warn!("reconcile failed: {}", err),
}
}
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let logger = tracing_subscriber::fmt::layer().json();
@ -41,17 +53,20 @@ async fn main() -> anyhow::Result<()> {
let service_users = Api::<ServiceUser>::all(client.clone());
let secrets = Api::<Secret>::all(client.clone());
Controller::new(service_users.clone(), Default::default())
let service_user_controller = Controller::new(service_users, Default::default())
.owns(secrets, Default::default())
.shutdown_on_signal()
.run(reconcile, error_policy, Arc::new(data.clone()))
.for_each(log_status);
let groups = Api::<Group>::all(client.clone());
let group_controller = Controller::new(groups, Default::default())
.shutdown_on_signal()
.run(reconcile, error_policy, Arc::new(data))
.for_each(|res| async move {
match res {
Ok(obj) => debug!("reconciled {:?}", obj.0.name),
Err(err) => warn!("reconcile failed: {}", err),
}
})
.await;
.for_each(log_status);
tokio::join!(service_user_controller, group_controller);
Ok(())
}