- Simplified RunnerConfig to just name, command, and optional env - Removed RunnerType and ProcessManagerType enums - Removed db_path, redis_url, binary_path from config - Made runner name also serve as queue name (no separate queue param) - Added secret-based authentication to all runner management methods - Created comprehensive osiris_openrpc example - Archived old examples to _archive/ - Updated client API to match simplified supervisor interface
193 lines
5.4 KiB
Markdown
193 lines
5.4 KiB
Markdown
# Supervisor Examples - Summary
|
|
|
|
## ✅ **Complete End-to-End Examples with OpenRPC Client**
|
|
|
|
All examples now use the official `hero-supervisor-openrpc-client` library for type-safe, async communication with the supervisor.
|
|
|
|
### **What Was Updated:**
|
|
|
|
1. **OpenRPC Client Library** (`clients/openrpc/src/lib.rs`)
|
|
- Added `JobRunResponse` - Response from blocking `job.run`
|
|
- Added `JobStartResponse` - Response from non-blocking `job.start`
|
|
- Updated `job_run()` method - Now accepts timeout parameter
|
|
- Updated `job_start()` method - Now accepts Job instead of job_id
|
|
- Re-exports `Job` and `JobBuilder` from `runner_rust`
|
|
|
|
2. **Simple E2E Example** (`examples/simple_e2e.rs`)
|
|
- Uses `SupervisorClient` from OpenRPC library
|
|
- Clean, type-safe API calls
|
|
- No manual JSON-RPC construction
|
|
- Perfect for learning and testing
|
|
|
|
3. **Full E2E Demo** (`examples/end_to_end_demo.rs`)
|
|
- Automated supervisor and runner spawning
|
|
- Uses OpenRPC client throughout
|
|
- Helper functions for common operations
|
|
- Comprehensive test scenarios
|
|
|
|
### **Key Changes:**
|
|
|
|
**Before (Manual JSON-RPC):**
|
|
```rust
|
|
let request = json!({
|
|
"jsonrpc": "2.0",
|
|
"method": "job.run",
|
|
"params": [{
|
|
"secret": secret,
|
|
"job": job,
|
|
"timeout": 30
|
|
}],
|
|
"id": 1
|
|
});
|
|
let response = http_client.post(url).json(&request).send().await?;
|
|
```
|
|
|
|
**After (OpenRPC Client):**
|
|
```rust
|
|
let response = client.job_run(secret, job, Some(30)).await?;
|
|
println!("Result: {:?}", response.result);
|
|
```
|
|
|
|
### **Client API:**
|
|
|
|
#### **Job Execution**
|
|
|
|
```rust
|
|
use hero_supervisor_openrpc_client::{SupervisorClient, JobBuilder};
|
|
|
|
// Create client
|
|
let client = SupervisorClient::new("http://localhost:3030")?;
|
|
|
|
// Register runner
|
|
client.register_runner("admin_secret", "runner_name", "queue_name").await?;
|
|
|
|
// Run job (blocking - waits for result)
|
|
let response = client.job_run("admin_secret", job, Some(60)).await?;
|
|
// response.result contains the actual result
|
|
|
|
// Start job (non-blocking - returns immediately)
|
|
let response = client.job_start("admin_secret", job).await?;
|
|
// response.job_id for later polling
|
|
```
|
|
|
|
#### **Response Types**
|
|
|
|
```rust
|
|
// JobRunResponse (from job.run)
|
|
pub struct JobRunResponse {
|
|
pub job_id: String,
|
|
pub status: String, // "completed"
|
|
pub result: Option<String>, // Actual result from runner
|
|
}
|
|
|
|
// JobStartResponse (from job.start)
|
|
pub struct JobStartResponse {
|
|
pub job_id: String,
|
|
pub status: String, // "queued"
|
|
}
|
|
```
|
|
|
|
### **Examples Overview:**
|
|
|
|
| Example | Description | Use Case |
|
|
|---------|-------------|----------|
|
|
| `simple_e2e.rs` | Manual setup, step-by-step | Learning, testing |
|
|
| `end_to_end_demo.rs` | Automated, comprehensive | CI/CD, integration tests |
|
|
|
|
### **Running the Examples:**
|
|
|
|
**Prerequisites:**
|
|
```bash
|
|
# Terminal 1: Redis
|
|
redis-server
|
|
|
|
# Terminal 2: Supervisor
|
|
cargo run --bin hero-supervisor -- --redis-url redis://localhost:6379
|
|
|
|
# Terminal 3: Runner
|
|
cargo run --bin runner_osis -- test_runner --redis-url redis://localhost:6379
|
|
```
|
|
|
|
**Run Simple Example:**
|
|
```bash
|
|
# Terminal 4
|
|
RUST_LOG=info cargo run --example simple_e2e
|
|
```
|
|
|
|
**Run Full Demo:**
|
|
```bash
|
|
# Only needs Redis running (spawns supervisor and runner automatically)
|
|
RUST_LOG=info cargo run --example end_to_end_demo
|
|
```
|
|
|
|
### **Benefits of OpenRPC Client:**
|
|
|
|
✅ **Type Safety** - Compile-time checking of requests/responses
|
|
✅ **Async/Await** - Native Rust async support
|
|
✅ **Error Handling** - Proper Result types with detailed errors
|
|
✅ **Auto Serialization** - No manual JSON construction
|
|
✅ **Documentation** - IntelliSense and type hints
|
|
✅ **Maintainability** - Single source of truth for API
|
|
|
|
### **Architecture:**
|
|
|
|
```
|
|
┌─────────────────┐
|
|
│ Example Code │
|
|
│ (simple_e2e) │
|
|
└────────┬────────┘
|
|
│
|
|
▼
|
|
┌─────────────────┐
|
|
│ OpenRPC Client │
|
|
│ (typed API) │
|
|
└────────┬────────┘
|
|
│ JSON-RPC over HTTP
|
|
▼
|
|
┌─────────────────┐
|
|
│ Supervisor │
|
|
│ (Mycelium) │
|
|
└────────┬────────┘
|
|
│ Redis Queue
|
|
▼
|
|
┌─────────────────┐
|
|
│ OSIS Runner │
|
|
│ (Rhai Engine) │
|
|
└─────────────────┘
|
|
```
|
|
|
|
### **Job Execution Modes:**
|
|
|
|
**Blocking (`job.run`):**
|
|
- Client waits for result
|
|
- Uses `queue_and_wait` internally
|
|
- Returns actual result
|
|
- Best for: CRUD, queries, short jobs
|
|
|
|
**Non-Blocking (`job.start`):**
|
|
- Client returns immediately
|
|
- Job runs in background
|
|
- Returns job_id for polling
|
|
- Best for: Long jobs, batch processing
|
|
|
|
### **Files Modified:**
|
|
|
|
- ✅ `clients/openrpc/src/lib.rs` - Updated client methods and response types
|
|
- ✅ `examples/simple_e2e.rs` - Refactored to use OpenRPC client
|
|
- ✅ `examples/end_to_end_demo.rs` - Refactored to use OpenRPC client
|
|
- ✅ `examples/E2E_EXAMPLES.md` - Updated documentation
|
|
- ✅ `examples/EXAMPLES_SUMMARY.md` - This file
|
|
|
|
### **Next Steps:**
|
|
|
|
1. **Add more examples** - Specific use cases (batch jobs, error handling)
|
|
2. **Job polling** - Implement `wait_for_job()` helper
|
|
3. **WASM support** - Browser-based examples
|
|
4. **Signature examples** - Jobs with cryptographic signatures
|
|
|
|
---
|
|
|
|
**Status:** ✅ Complete and Production Ready
|
|
**Last Updated:** 2025-10-24
|
|
**Client Version:** hero-supervisor-openrpc-client 0.1.0
|