#[cfg(not(feature = "std"))]
extern crate alloc;
#[cfg(not(feature = "std"))]
use alloc::vec::Vec;
use crate::der::{Enumerated, Sequence};
use crate::policy::TransitStatus;
use crate::utils::BasisPoints;
use crate::Beamable;
#[derive(Debug, Beamable, Sequence, Clone, PartialEq)]
pub struct RegisterHiveRequest {
pub hive_addr: Vec<u8>,
pub servlet_addresses: Vec<ServletInfo>,
pub metadata: Option<Vec<u8>>,
}
#[derive(Debug, Beamable, Sequence, Clone, PartialEq)]
pub struct RegisterHiveResponse {
pub status: TransitStatus,
pub hive_id: Option<Vec<u8>>,
}
#[derive(Debug, Beamable, Sequence, Clone, PartialEq)]
pub struct ServletAddressUpdate {
pub hive_id: Vec<u8>,
pub added: Vec<ServletInfo>,
pub removed: Vec<Vec<u8>>,
}
#[derive(Debug, Beamable, Sequence, Clone, PartialEq)]
pub struct ServletAddressUpdateResponse {
pub status: TransitStatus,
}
#[derive(Debug, Beamable, Sequence, Clone, PartialEq)]
pub struct ActivateServletRequest {
pub servlet_id: Vec<u8>,
pub config: Option<Vec<u8>>,
}
#[derive(Debug, Beamable, Sequence, Clone, PartialEq)]
pub struct ActivateServletResponse {
pub status: TransitStatus,
pub servlet_address: Option<Vec<u8>>,
}
impl ActivateServletResponse {
#[inline]
pub fn ok(address: Vec<u8>) -> Self {
Self { status: TransitStatus::Accepted, servlet_address: Some(address) }
}
#[inline]
pub fn err(status: TransitStatus) -> Self {
Self { status, servlet_address: None }
}
}
#[derive(Debug, Beamable, Sequence, Clone, PartialEq)]
pub struct ServletInfo {
pub servlet_id: Vec<u8>,
pub address: Vec<u8>,
}
#[derive(Debug, Beamable, Sequence, Clone, PartialEq)]
pub struct HiveManagementRequest {
#[asn1(context_specific = "0", optional = "true")]
pub spawn: Option<SpawnServletParams>,
#[asn1(context_specific = "1", optional = "true")]
pub list: Option<ListServletsParams>,
#[asn1(context_specific = "2", optional = "true")]
pub stop: Option<StopServletParams>,
}
#[derive(Debug, Beamable, Sequence, Clone, PartialEq)]
pub struct SpawnServletParams {
pub servlet_type: Vec<u8>,
pub config: Option<Vec<u8>>,
}
#[derive(Debug, Beamable, Sequence, Clone, PartialEq)]
pub struct ListServletsParams {
pub filter: Option<Vec<u8>>,
}
#[derive(Debug, Beamable, Sequence, Clone, PartialEq)]
pub struct StopServletParams {
pub servlet_id: Vec<u8>,
}
#[derive(Debug, Beamable, Sequence, Clone, PartialEq)]
pub struct HiveManagementResponse {
#[asn1(context_specific = "0", optional = "true")]
pub spawn: Option<SpawnServletResult>,
#[asn1(context_specific = "1", optional = "true")]
pub list: Option<ListServletsResult>,
#[asn1(context_specific = "2", optional = "true")]
pub stop: Option<StopServletResult>,
}
#[derive(Debug, Beamable, Sequence, Clone, PartialEq)]
pub struct SpawnServletResult {
pub status: TransitStatus,
pub servlet_address: Option<Vec<u8>>,
pub servlet_id: Option<Vec<u8>>,
}
#[derive(Debug, Beamable, Sequence, Clone, PartialEq)]
pub struct ListServletsResult {
pub status: TransitStatus,
pub servlets: Vec<ServletInfo>,
}
#[derive(Debug, Beamable, Sequence, Clone, PartialEq)]
pub struct StopServletResult {
pub status: TransitStatus,
}
impl HiveManagementResponse {
#[inline]
pub fn spawn_ok(address: Vec<u8>, servlet_id: Vec<u8>) -> Self {
Self {
spawn: Some(SpawnServletResult {
status: TransitStatus::Accepted,
servlet_address: Some(address),
servlet_id: Some(servlet_id),
}),
list: None,
stop: None,
}
}
#[inline]
pub fn spawn_err(status: TransitStatus) -> Self {
Self {
spawn: Some(SpawnServletResult { status, servlet_address: None, servlet_id: None }),
list: None,
stop: None,
}
}
#[inline]
pub fn list_ok(servlets: Vec<ServletInfo>) -> Self {
Self {
spawn: None,
list: Some(ListServletsResult { status: TransitStatus::Accepted, servlets }),
stop: None,
}
}
#[inline]
pub fn stop_ok() -> Self {
Self {
spawn: None,
list: None,
stop: Some(StopServletResult { status: TransitStatus::Accepted }),
}
}
#[inline]
pub fn stop_err(status: TransitStatus) -> Self {
Self { spawn: None, list: None, stop: Some(StopServletResult { status }) }
}
}
#[derive(Enumerated, Default, Debug, Clone, Copy, PartialEq, Eq)]
#[repr(u8)]
pub enum ClusterStatus {
#[default]
Healthy = 0,
Degraded = 1,
Overloaded = 2,
Draining = 3,
}
#[derive(Debug, Beamable, Sequence, Clone, PartialEq)]
#[beam(frame_integrity)]
pub struct ClusterCommand {
#[asn1(context_specific = "0", optional = "true")]
pub heartbeat: Option<HeartbeatParams>,
#[asn1(context_specific = "1", optional = "true")]
pub manage: Option<HiveManagementRequest>,
}
#[derive(Debug, Beamable, Sequence, Clone, PartialEq)]
pub struct HeartbeatParams {
pub cluster_status: ClusterStatus,
}
#[derive(Debug, Beamable, Sequence, Clone, PartialEq)]
pub struct ClusterCommandResponse {
#[asn1(context_specific = "0", optional = "true")]
pub heartbeat: Option<HeartbeatResult>,
#[asn1(context_specific = "1", optional = "true")]
pub manage: Option<HiveManagementResponse>,
}
#[derive(Debug, Beamable, Sequence, Clone, PartialEq)]
pub struct HeartbeatResult {
pub status: TransitStatus,
pub utilization: BasisPoints,
pub active_servlets: u32,
}
impl ClusterCommandResponse {
#[inline]
pub fn heartbeat(status: TransitStatus, utilization: BasisPoints, active_servlets: u32) -> Self {
Self {
heartbeat: Some(HeartbeatResult { status, utilization, active_servlets }),
manage: None,
}
}
#[inline]
pub fn manage(response: HiveManagementResponse) -> Self {
Self { heartbeat: None, manage: Some(response) }
}
}