initial commit
This commit is contained in:
106
cmd/supervisor.rs
Normal file
106
cmd/supervisor.rs
Normal file
@@ -0,0 +1,106 @@
|
||||
//! # Hero Supervisor Binary
|
||||
//!
|
||||
//! Main supervisor binary that manages multiple actors and listens to jobs over Redis.
|
||||
//! The supervisor builds with actor configuration, starts actors, and dispatches jobs
|
||||
//! to the appropriate runners based on the job's runner_name field.
|
||||
|
||||
|
||||
|
||||
use hero_supervisor::{SupervisorApp, SupervisorBuilder};
|
||||
use clap::Parser;
|
||||
use log::{info, error};
|
||||
use std::path::PathBuf;
|
||||
|
||||
|
||||
|
||||
|
||||
/// Command line arguments for the supervisor
|
||||
#[derive(Parser, Debug)]
|
||||
#[command(name = "supervisor")]
|
||||
#[command(about = "Hero Supervisor - manages multiple actors and dispatches jobs")]
|
||||
struct Args {
|
||||
/// Path to the configuration TOML file
|
||||
#[arg(short, long, value_name = "FILE")]
|
||||
config: Option<PathBuf>,
|
||||
|
||||
/// Redis URL for job queue
|
||||
#[arg(long, default_value = "redis://localhost:6379")]
|
||||
redis_url: String,
|
||||
|
||||
/// Namespace for Redis keys
|
||||
#[arg(long, default_value = "")]
|
||||
namespace: String,
|
||||
|
||||
/// Admin secrets (can be specified multiple times)
|
||||
#[arg(long = "admin-secret", value_name = "SECRET")]
|
||||
admin_secrets: Vec<String>,
|
||||
|
||||
/// User secrets (can be specified multiple times)
|
||||
#[arg(long = "user-secret", value_name = "SECRET")]
|
||||
user_secrets: Vec<String>,
|
||||
|
||||
/// Register secrets (can be specified multiple times)
|
||||
#[arg(long = "register-secret", value_name = "SECRET")]
|
||||
register_secrets: Vec<String>,
|
||||
|
||||
/// OpenRPC server bind address
|
||||
#[arg(long, default_value = "127.0.0.1")]
|
||||
bind_address: String,
|
||||
|
||||
/// OpenRPC server port
|
||||
#[arg(long, default_value = "3030")]
|
||||
port: u16,
|
||||
}
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||
// Initialize logging
|
||||
env_logger::init();
|
||||
|
||||
info!("Starting Hero Supervisor");
|
||||
|
||||
// Parse command line arguments
|
||||
let args = Args::parse();
|
||||
|
||||
|
||||
|
||||
// Create and initialize supervisor using builder pattern
|
||||
let mut builder = SupervisorBuilder::new()
|
||||
.redis_url(&args.redis_url)
|
||||
.namespace(&args.namespace);
|
||||
|
||||
// Add secrets from CLI arguments
|
||||
if !args.admin_secrets.is_empty() {
|
||||
info!("Adding {} admin secret(s)", args.admin_secrets.len());
|
||||
builder = builder.admin_secrets(args.admin_secrets);
|
||||
}
|
||||
|
||||
if !args.user_secrets.is_empty() {
|
||||
info!("Adding {} user secret(s)", args.user_secrets.len());
|
||||
builder = builder.user_secrets(args.user_secrets);
|
||||
}
|
||||
|
||||
if !args.register_secrets.is_empty() {
|
||||
info!("Adding {} register secret(s)", args.register_secrets.len());
|
||||
builder = builder.register_secrets(args.register_secrets);
|
||||
}
|
||||
|
||||
let supervisor = match args.config {
|
||||
Some(_config_path) => {
|
||||
info!("Loading configuration from config file not yet implemented");
|
||||
// For now, use CLI configuration
|
||||
builder.build().await?
|
||||
}
|
||||
None => {
|
||||
info!("Using CLI configuration");
|
||||
builder.build().await?
|
||||
}
|
||||
};
|
||||
|
||||
let mut app = SupervisorApp::new(supervisor, args.bind_address, args.port);
|
||||
|
||||
// Start the complete supervisor application
|
||||
app.start().await?;
|
||||
|
||||
Ok(())
|
||||
}
|
Reference in New Issue
Block a user