scirs2_metrics/optimization/distributed_advanced/
orchestration.rs1use crate::error::{MetricsError, Result};
6use std::collections::HashMap;
7
8#[derive(Debug, Clone)]
10pub struct OrchestrationManager {
11 node_id: String,
12 services: HashMap<String, ServiceInfo>,
13}
14
15#[derive(Debug, Clone)]
16pub struct ServiceInfo {
17 pub name: String,
18 pub status: ServiceStatus,
19 pub endpoint: String,
20}
21
22#[derive(Debug, Clone)]
23pub enum ServiceStatus {
24 Running,
25 Stopped,
26 Failed,
27}
28
29impl OrchestrationManager {
30 pub fn new(node_id: String) -> Self {
31 Self {
32 node_id,
33 services: HashMap::new(),
34 }
35 }
36
37 pub fn register_service(&mut self, name: String, endpoint: String) -> Result<()> {
38 let service = ServiceInfo {
39 name: name.clone(),
40 status: ServiceStatus::Stopped,
41 endpoint,
42 };
43 self.services.insert(name, service);
44 Ok(())
45 }
46
47 pub fn start_service(&mut self, name: &str) -> Result<()> {
48 if let Some(service) = self.services.get_mut(name) {
49 service.status = ServiceStatus::Running;
50 Ok(())
51 } else {
52 Err(MetricsError::InvalidOperation(format!(
53 "Service {} not found",
54 name
55 )))
56 }
57 }
58
59 pub fn stop_service(&mut self, name: &str) -> Result<()> {
60 if let Some(service) = self.services.get_mut(name) {
61 service.status = ServiceStatus::Stopped;
62 Ok(())
63 } else {
64 Err(MetricsError::InvalidOperation(format!(
65 "Service {} not found",
66 name
67 )))
68 }
69 }
70
71 pub fn get_service_status(&self, name: &str) -> Option<&ServiceStatus> {
72 self.services.get(name).map(|s| &s.status)
73 }
74}