use std::collections::HashMap;
use std::sync::{Arc, Mutex};
use std::time::Duration;
use cylinder::Verifier as SignatureVerifier;
use crate::admin::store::AdminServiceStore;
use crate::circuit::routing::RoutingTableWriter;
use crate::error::InvalidStateError;
use crate::keys::KeyPermissionManager;
use crate::orchestrator::ServiceOrchestrator;
use crate::peer::PeerManagerConnector;
use crate::public_key::PublicKey;
use crate::service::validation::ServiceArgValidator;
use super::shared::AdminServiceShared;
use super::{admin_service_id, AdminKeyVerifier, AdminService};
const DEFAULT_COORDINATOR_TIMEOUT: u64 = 30;
#[derive(Default)]
pub struct AdminServiceBuilder {
node_id: Option<String>,
orchestrator: Option<ServiceOrchestrator>,
service_arg_validators: HashMap<String, Box<dyn ServiceArgValidator + Send>>,
peer_connector: Option<PeerManagerConnector>,
admin_store: Option<Box<dyn AdminServiceStore>>,
signature_verifier: Option<Box<dyn SignatureVerifier>>,
key_verifier: Option<Box<dyn AdminKeyVerifier>>,
key_permission_manager: Option<Box<dyn KeyPermissionManager>>,
coordinator_timeout: Option<Duration>,
routing_table_writer: Option<Box<dyn RoutingTableWriter>>,
event_store: Option<Box<dyn AdminServiceStore>>,
public_keys: Option<Vec<PublicKey>>,
}
impl AdminServiceBuilder {
pub fn new() -> Self {
Self::default()
}
pub fn with_node_id(mut self, node_id: String) -> Self {
self.node_id = Some(node_id);
self
}
pub fn with_service_orchestrator(mut self, orchestrator: ServiceOrchestrator) -> Self {
self.orchestrator = Some(orchestrator);
self
}
pub fn with_service_arg_validators(
mut self,
service_arg_validators: HashMap<String, Box<dyn ServiceArgValidator + Send>>,
) -> Self {
self.service_arg_validators = service_arg_validators;
self
}
pub fn with_peer_manager_connector(mut self, peer_connector: PeerManagerConnector) -> Self {
self.peer_connector = Some(peer_connector);
self
}
pub fn with_admin_service_store(
mut self,
admin_service_store: Box<dyn AdminServiceStore>,
) -> Self {
self.admin_store = Some(admin_service_store);
self
}
pub fn with_signature_verifier(
mut self,
signature_verifier: Box<dyn SignatureVerifier>,
) -> Self {
self.signature_verifier = Some(signature_verifier);
self
}
pub fn with_admin_key_verifier(
mut self,
admin_key_verifier: Box<dyn AdminKeyVerifier>,
) -> Self {
self.key_verifier = Some(admin_key_verifier);
self
}
pub fn with_key_permission_manager(
mut self,
key_permission_manager: Box<dyn KeyPermissionManager>,
) -> Self {
self.key_permission_manager = Some(key_permission_manager);
self
}
pub fn with_coordinator_timeout(mut self, coordinator_timeout: Duration) -> Self {
self.coordinator_timeout = Some(coordinator_timeout);
self
}
pub fn with_routing_table_writer(
mut self,
routing_table_writer: Box<dyn RoutingTableWriter>,
) -> Self {
self.routing_table_writer = Some(routing_table_writer);
self
}
pub fn with_admin_event_store(mut self, event_store: Box<dyn AdminServiceStore>) -> Self {
self.event_store = Some(event_store);
self
}
pub fn with_public_keys(mut self, public_keys: Vec<PublicKey>) -> Self {
self.public_keys = Some(public_keys);
self
}
pub fn build(self) -> Result<super::AdminService, InvalidStateError> {
let coordinator_timeout = self
.coordinator_timeout
.unwrap_or_else(|| Duration::from_secs(DEFAULT_COORDINATOR_TIMEOUT));
let orchestrator = self.orchestrator.ok_or_else(|| {
InvalidStateError::with_message(
"An admin service requires a service_orchestrator".into(),
)
})?;
let orchestrator = Arc::new(Mutex::new(orchestrator));
let node_id = self.node_id.ok_or_else(|| {
InvalidStateError::with_message("An admin service requires a node_id".into())
})?;
let service_arg_validators = self.service_arg_validators;
let admin_store = self.admin_store.ok_or_else(|| {
InvalidStateError::with_message(
"An admin service requires an admin_service_store".into(),
)
})?;
let peer_connector = self.peer_connector.ok_or_else(|| {
InvalidStateError::with_message(
"An admin service requires a peer_manager_connector".into(),
)
})?;
let signature_verifier = self.signature_verifier.ok_or_else(|| {
InvalidStateError::with_message("An admin service requires a signature_verifier".into())
})?;
let key_verifier = self.key_verifier.ok_or_else(|| {
InvalidStateError::with_message(
"An admin service requires an admin_key_verifier".into(),
)
})?;
let key_permission_manager = self.key_permission_manager.ok_or_else(|| {
InvalidStateError::with_message(
"An admin service requires a key_permission_manager".into(),
)
})?;
let routing_table_writer = self.routing_table_writer.ok_or_else(|| {
InvalidStateError::with_message(
"An admin service requires an routing_table_writer".into(),
)
})?;
let admin_event_store = self.event_store.ok_or_else(|| {
InvalidStateError::with_message("An admin service requires an admin_event_store".into())
})?;
let service_id = admin_service_id(&node_id);
let public_keys = self.public_keys.unwrap_or_default();
let admin_service_shared = Arc::new(Mutex::new(AdminServiceShared::new(
node_id.clone(),
orchestrator.clone(),
service_arg_validators,
peer_connector.clone(),
admin_store,
signature_verifier,
key_verifier,
key_permission_manager,
routing_table_writer,
admin_event_store,
public_keys,
)));
Ok(AdminService {
service_id,
node_id,
admin_service_shared,
orchestrator,
coordinator_timeout,
consensus: None,
peer_connector,
peer_notification_run_state: None,
})
}
}