gitdataai/apps/operator/src/main.rs
2026-04-15 09:08:09 +08:00

101 lines
3.0 KiB
Rust

//! Code System Kubernetes Operator
//!
//! Manages the lifecycle of: App, GitServer, EmailWorker, GitHook, Migrate CRDs.
use operator::context::ReconcileCtx;
use std::sync::Arc;
use tracing::{Level, error, info};
use tracing_subscriber::FmtSubscriber;
#[tokio::main]
async fn main() -> anyhow::Result<()> {
// ---- Logging ----
let log_level = std::env::var("OPERATOR_LOG_LEVEL").unwrap_or_else(|_| "info".to_string());
let level = match log_level.to_lowercase().as_str() {
"trace" => Level::TRACE,
"debug" => Level::DEBUG,
"info" => Level::INFO,
"warn" => Level::WARN,
"error" => Level::ERROR,
_ => Level::INFO,
};
FmtSubscriber::builder()
.with_max_level(level)
.with_target(false)
.with_thread_ids(false)
.with_file(true)
.with_line_number(true)
.compact()
.init();
let ctx = Arc::new(ReconcileCtx::from_env().await?);
info!(
namespace = ctx.operator_namespace,
image_prefix = ctx.image_prefix,
"code-operator starting"
);
// ---- Spawn all 5 controllers ----
let app_handle = tokio::spawn({
let ctx = ctx.clone();
let client = ctx.client.clone();
async move {
use operator::controller;
if let Err(e) = controller::start_app(client, ctx).await {
error!(%e, "app controller stopped");
}
}
});
let gs_handle = tokio::spawn({
let ctx = ctx.clone();
let client = ctx.client.clone();
async move {
use operator::controller;
if let Err(e) = controller::start_gitserver(client, ctx).await {
error!(%e, "gitserver controller stopped");
}
}
});
let ew_handle = tokio::spawn({
let ctx = ctx.clone();
let client = ctx.client.clone();
async move {
use operator::controller;
if let Err(e) = controller::start_email_worker(client, ctx).await {
error!(%e, "email_worker controller stopped");
}
}
});
let gh_handle = tokio::spawn({
let ctx = ctx.clone();
let client = ctx.client.clone();
async move {
use operator::controller;
if let Err(e) = controller::start_git_hook(client, ctx).await {
error!(%e, "git_hook controller stopped");
}
}
});
let mig_handle = tokio::spawn({
let ctx = ctx.clone();
let client = ctx.client.clone();
async move {
use operator::controller;
if let Err(e) = controller::start_migrate(client, ctx).await {
error!(%e, "migrate controller stopped");
}
}
});
// ---- Graceful shutdown on SIGINT / SIGTERM ----
tokio::signal::ctrl_c().await.ok();
info!("code-operator stopped");
let _ = tokio::join!(app_handle, gs_handle, ew_handle, gh_handle, mig_handle,);
Ok(())
}