mod circuit;
mod circuit_node;
mod circuit_proposal;
#[cfg(any(feature = "postgres", feature = "sqlite"))]
pub mod diesel;
pub mod error;
mod event;
mod proposed_circuit;
mod proposed_node;
mod proposed_service;
mod service;
pub mod yaml;
use std::cmp::Ordering;
use std::fmt;
use crate::admin::service::messages;
pub use self::circuit::{
AuthorizationType, Circuit, CircuitBuilder, CircuitStatus, DurabilityType, PersistenceType,
RouteType,
};
pub use self::circuit_node::{CircuitNode, CircuitNodeBuilder};
pub use self::circuit_proposal::{
CircuitProposal, CircuitProposalBuilder, ProposalType, Vote, VoteRecord, VoteRecordBuilder,
};
use self::error::AdminServiceStoreError;
pub use self::event::{AdminServiceEvent, AdminServiceEventBuilder, EventType};
pub use self::proposed_circuit::{ProposedCircuit, ProposedCircuitBuilder};
pub use self::proposed_node::{ProposedNode, ProposedNodeBuilder};
pub use self::proposed_service::{ProposedService, ProposedServiceBuilder};
pub use self::service::{Service, ServiceBuilder};
pub const UNSET_CIRCUIT_VERSION: i32 = 1;
#[derive(Clone, Debug, PartialEq)]
pub struct ServiceId {
circuit_id: String,
service_id: String,
}
impl ServiceId {
pub fn new(circuit_id: String, service_id: String) -> Self {
ServiceId {
circuit_id,
service_id,
}
}
pub fn circuit(&self) -> &str {
&self.circuit_id
}
pub fn service_id(&self) -> &str {
&self.service_id
}
pub fn into_parts(self) -> (String, String) {
(self.circuit_id, self.service_id)
}
}
impl fmt::Display for ServiceId {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}::{}", self.circuit_id, self.service_id)
}
}
impl Eq for ServiceId {}
impl Ord for ServiceId {
fn cmp(&self, other: &Self) -> Ordering {
let compare = self.circuit_id.cmp(&other.circuit_id);
if compare == Ordering::Equal {
self.service_id.cmp(&other.service_id)
} else {
compare
}
}
}
impl PartialOrd for ServiceId {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
Some(self.cmp(other))
}
}
pub enum CircuitPredicate {
ManagementTypeEq(String),
MembersInclude(Vec<String>),
CircuitStatus(CircuitStatus),
}
impl CircuitPredicate {
pub fn apply_to_circuit(&self, circuit: &Circuit) -> bool {
match self {
CircuitPredicate::ManagementTypeEq(man_type) => {
circuit.circuit_management_type() == man_type
}
CircuitPredicate::MembersInclude(nodes) => {
for node_id in nodes.iter() {
if !circuit
.members()
.iter()
.any(|node| node.node_id() == node_id)
{
return false;
}
}
true
}
CircuitPredicate::CircuitStatus(status) => circuit.circuit_status() == status,
}
}
pub fn apply_to_proposals(&self, proposal: &CircuitProposal) -> bool {
match self {
CircuitPredicate::ManagementTypeEq(man_type) => {
proposal.circuit().circuit_management_type() == man_type
}
CircuitPredicate::MembersInclude(nodes) => {
for node_id in nodes {
if !proposal
.circuit()
.members()
.iter()
.any(|node| node_id == node.node_id())
{
return false;
}
}
true
}
CircuitPredicate::CircuitStatus(status) => {
proposal.circuit().circuit_status() == status
}
}
}
}
pub type EventIter = Box<dyn ExactSizeIterator<Item = AdminServiceEvent> + Send>;
pub trait AdminServiceStore: Send + Sync {
fn add_proposal(&self, proposal: CircuitProposal) -> Result<(), AdminServiceStoreError>;
fn update_proposal(&self, proposal: CircuitProposal) -> Result<(), AdminServiceStoreError>;
fn remove_proposal(&self, proposal_id: &str) -> Result<(), AdminServiceStoreError>;
fn get_proposal(
&self,
proposal_id: &str,
) -> Result<Option<CircuitProposal>, AdminServiceStoreError>;
fn list_proposals(
&self,
predicates: &[CircuitPredicate],
) -> Result<Box<dyn ExactSizeIterator<Item = CircuitProposal>>, AdminServiceStoreError>;
fn count_proposals(
&self,
predicates: &[CircuitPredicate],
) -> Result<u32, AdminServiceStoreError>;
fn add_circuit(
&self,
circuit: Circuit,
nodes: Vec<CircuitNode>,
) -> Result<(), AdminServiceStoreError>;
fn update_circuit(&self, circuit: Circuit) -> Result<(), AdminServiceStoreError>;
fn remove_circuit(&self, circuit_id: &str) -> Result<(), AdminServiceStoreError>;
fn get_circuit(&self, circuit_id: &str) -> Result<Option<Circuit>, AdminServiceStoreError>;
fn list_circuits(
&self,
predicates: &[CircuitPredicate],
) -> Result<Box<dyn ExactSizeIterator<Item = Circuit>>, AdminServiceStoreError>;
fn count_circuits(
&self,
predicates: &[CircuitPredicate],
) -> Result<u32, AdminServiceStoreError>;
fn upgrade_proposal_to_circuit(&self, circuit_id: &str) -> Result<(), AdminServiceStoreError>;
fn get_node(&self, node_id: &str) -> Result<Option<CircuitNode>, AdminServiceStoreError>;
fn list_nodes(
&self,
) -> Result<Box<dyn ExactSizeIterator<Item = CircuitNode>>, AdminServiceStoreError>;
fn get_service(
&self,
service_id: &ServiceId,
) -> Result<Option<Service>, AdminServiceStoreError>;
fn list_services(
&self,
circuit_id: &str,
) -> Result<Box<dyn ExactSizeIterator<Item = Service>>, AdminServiceStoreError>;
fn add_event(
&self,
event: messages::AdminServiceEvent,
) -> Result<AdminServiceEvent, AdminServiceStoreError>;
fn list_events_since(&self, start: i64) -> Result<EventIter, AdminServiceStoreError>;
fn list_events_by_management_type_since(
&self,
management_type: String,
start: i64,
) -> Result<EventIter, AdminServiceStoreError>;
fn clone_boxed(&self) -> Box<dyn AdminServiceStore>;
}
impl Clone for Box<dyn AdminServiceStore> {
fn clone(&self) -> Self {
self.clone_boxed()
}
}