- Add a new service manager crate for dynamic service management - Integrate service manager with Rhai for scripting - Provide examples for circle worker management and basic usage - Add comprehensive tests for service lifecycle and error handling - Implement cross-platform support for macOS and Linux (zinit/systemd)
142 lines
4.6 KiB
Plaintext
142 lines
4.6 KiB
Plaintext
// Circle Worker Manager Example
|
||
//
|
||
// This example demonstrates how to use the service manager to dynamically launch
|
||
// circle workers for new freezone residents. This is the primary use case requested
|
||
// by the team.
|
||
//
|
||
// Usage:
|
||
//
|
||
// On macOS (uses launchctl):
|
||
// herodo examples/service_manager/circle_worker_manager.rhai
|
||
//
|
||
// On Linux (uses zinit - requires zinit to be running):
|
||
// First start zinit: zinit -s /tmp/zinit.sock init
|
||
// herodo examples/service_manager/circle_worker_manager.rhai
|
||
|
||
// Circle Worker Manager Example
|
||
// This example uses the SAL service manager through Rhai integration
|
||
|
||
print("🚀 Circle Worker Manager Example");
|
||
print("=================================");
|
||
|
||
// Create the appropriate service manager for the current platform
|
||
let service_manager = create_service_manager();
|
||
print("✅ Created service manager for current platform");
|
||
|
||
// Simulate a new freezone resident registration
|
||
let resident_id = "resident_12345";
|
||
let worker_name = `circle-worker-${resident_id}`;
|
||
|
||
print(`\n📝 New freezone resident registered: ${resident_id}`);
|
||
print(`🔧 Creating circle worker service: ${worker_name}`);
|
||
|
||
// Create service configuration for the circle worker
|
||
let config = #{
|
||
name: worker_name,
|
||
binary_path: "/bin/sh",
|
||
args: [
|
||
"-c",
|
||
`echo 'Circle worker for ${resident_id} starting...'; sleep 30; echo 'Circle worker for ${resident_id} completed'`
|
||
],
|
||
working_directory: "/tmp",
|
||
environment: #{
|
||
"RESIDENT_ID": resident_id,
|
||
"WORKER_TYPE": "circle",
|
||
"LOG_LEVEL": "info"
|
||
},
|
||
auto_restart: true
|
||
};
|
||
|
||
print("📋 Service configuration created:");
|
||
print(` Name: ${config.name}`);
|
||
print(` Binary: ${config.binary_path}`);
|
||
print(` Args: ${config.args}`);
|
||
print(` Auto-restart: ${config.auto_restart}`);
|
||
|
||
print(`\n🔄 Demonstrating service lifecycle for: ${worker_name}`);
|
||
|
||
// 1. Check if service already exists
|
||
print("\n1️⃣ Checking if service exists...");
|
||
if exists(service_manager, worker_name) {
|
||
print("⚠️ Service already exists, removing it first...");
|
||
remove(service_manager, worker_name);
|
||
print("🗑️ Existing service removed");
|
||
} else {
|
||
print("✅ Service doesn't exist, ready to create");
|
||
}
|
||
|
||
// 2. Start the service
|
||
print("\n2️⃣ Starting the circle worker service...");
|
||
start(service_manager, config);
|
||
print("✅ Service started successfully");
|
||
|
||
// 3. Check service status
|
||
print("\n3️⃣ Checking service status...");
|
||
let status = status(service_manager, worker_name);
|
||
print(`📊 Service status: ${status}`);
|
||
|
||
// 4. List all services to show our service is there
|
||
print("\n4️⃣ Listing all managed services...");
|
||
let services = list(service_manager);
|
||
print(`📋 Managed services (${services.len()}):`);
|
||
for service in services {
|
||
let marker = if service == worker_name { "👉" } else { " " };
|
||
print(` ${marker} ${service}`);
|
||
}
|
||
|
||
// 5. Wait a moment and check status again
|
||
print("\n5️⃣ Waiting 3 seconds and checking status again...");
|
||
sleep(3000); // 3 seconds in milliseconds
|
||
let status = status(service_manager, worker_name);
|
||
print(`📊 Service status after 3s: ${status}`);
|
||
|
||
// 6. Get service logs
|
||
print("\n6️⃣ Retrieving service logs...");
|
||
let logs = logs(service_manager, worker_name, 10);
|
||
if logs.trim() == "" {
|
||
print("📄 No logs available yet (this is normal for new services)");
|
||
} else {
|
||
print("📄 Recent logs:");
|
||
let log_lines = logs.split('\n');
|
||
for i in 0..5 {
|
||
if i < log_lines.len() {
|
||
print(` ${log_lines[i]}`);
|
||
}
|
||
}
|
||
}
|
||
|
||
// 7. Demonstrate start_and_confirm with timeout
|
||
print("\n7️⃣ Testing start_and_confirm (should succeed quickly since already running)...");
|
||
start_and_confirm(service_manager, config, 5);
|
||
print("✅ Service confirmed running within timeout");
|
||
|
||
// 8. Stop the service
|
||
print("\n8️⃣ Stopping the service...");
|
||
stop(service_manager, worker_name);
|
||
print("🛑 Service stopped");
|
||
|
||
// 9. Check status after stopping
|
||
print("\n9️⃣ Checking status after stop...");
|
||
let status = status(service_manager, worker_name);
|
||
print(`📊 Service status after stop: ${status}`);
|
||
|
||
// 10. Restart the service
|
||
print("\n🔟 Restarting the service...");
|
||
restart(service_manager, worker_name);
|
||
print("🔄 Service restarted successfully");
|
||
|
||
// 11. Final cleanup
|
||
print("\n🧹 Cleaning up - removing the service...");
|
||
remove(service_manager, worker_name);
|
||
print("🗑️ Service removed successfully");
|
||
|
||
// 12. Verify removal
|
||
print("\n✅ Verifying service removal...");
|
||
if !exists(service_manager, worker_name) {
|
||
print("✅ Service successfully removed");
|
||
} else {
|
||
print("⚠️ Service still exists after removal");
|
||
}
|
||
|
||
print("\n🎉 Circle worker management demonstration complete!");
|