use crate::naming::model::{Instance, InstanceKey};
use crate::raft::filestore::model::SnapshotRecordDto;
use crate::raft::filestore::raftsnapshot::SnapshotWriterActor;
use actix::prelude::*;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::sync::Arc;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum NamingRaftReq {
RegisterInstance { param: InstanceRegisterParam },
UpdateInstance { param: InstanceRegisterParam },
RemoveInstance(InstanceKey),
}
impl Message for NamingRaftReq {
type Result = anyhow::Result<NamingRaftResult>;
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum NamingRaftResult {
InstanceInfo(Arc<Instance>),
None,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct InstanceRegisterParam {
pub ip: Arc<String>,
pub port: u32,
pub weight: f32,
pub enabled: bool,
pub healthy: bool,
pub ephemeral: bool,
pub metadata: Arc<HashMap<String, String>>,
pub namespace_id: Arc<String>,
pub group_name: Arc<String>,
pub service_name: Arc<String>,
pub cluster_name: Option<String>,
pub app_name: Option<String>,
pub last_modified_millis: i64,
}
impl From<InstanceRegisterParam> for Instance {
fn from(param: InstanceRegisterParam) -> Self {
let mut instance = Instance::default();
instance.ip = param.ip;
instance.port = param.port;
instance.namespace_id = param.namespace_id;
instance.group_name = param.group_name;
instance.service_name = param.service_name;
instance.weight = param.weight;
instance.enabled = param.enabled;
instance.healthy = param.healthy;
instance.ephemeral = param.ephemeral;
instance.metadata = param.metadata.into();
if let Some(cluster_name) = param.cluster_name {
instance.cluster_name = cluster_name;
}
if let Some(app_name) = param.app_name {
instance.app_name = app_name;
}
instance.last_modified_millis = param.last_modified_millis;
instance.generate_key();
instance
}
}
impl From<&Instance> for InstanceRegisterParam {
fn from(instance: &Instance) -> Self {
Self {
ip: instance.ip.clone(),
port: instance.port,
weight: instance.weight,
enabled: instance.enabled,
healthy: instance.healthy,
ephemeral: instance.ephemeral,
metadata: instance.metadata.clone(),
namespace_id: instance.namespace_id.clone(),
group_name: instance.group_name.clone(),
service_name: instance.service_name.clone(),
cluster_name: Some(instance.cluster_name.clone()),
app_name: Some(instance.app_name.clone()),
last_modified_millis: instance.last_modified_millis,
}
}
}
#[derive(Debug, Clone, Message)]
#[rtype(result = "anyhow::Result<()>")]
pub struct SnapshotBuildRequest {
pub writer: Addr<SnapshotWriterActor>,
}
#[derive(Debug, Clone, Message)]
#[rtype(result = "anyhow::Result<LoadResult>")]
pub struct SnapshotLoadRequest {
pub record: SnapshotRecordDto,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum LoadResult {
Success,
Error(String),
}
impl Default for InstanceRegisterParam {
fn default() -> Self {
Self {
ip: Default::default(),
port: Default::default(),
weight: 1f32,
enabled: true,
healthy: true,
ephemeral: true,
metadata: Default::default(),
namespace_id: Default::default(),
group_name: Default::default(),
service_name: Default::default(),
cluster_name: None,
app_name: None,
last_modified_millis: 0,
}
}
}