use std::net::SocketAddr;
#[cfg(test)]
use mockall::{automock, predicate::*};
use scion_proto::address::IsdAsn;
use snap_dataplane::session::manager::{SessionOpenError, SessionTokenError};
use snap_tokens::snap_token::SnapTokenClaims;
use thiserror::Error;
use crate::crpc_api::api_service::model::SessionGrant;
#[cfg_attr(test, automock)]
pub trait DataPlaneDiscovery: Send + Sync {
fn list_snap_data_planes(&self) -> Vec<SnapDataPlane>;
fn list_udp_data_planes(&self) -> Vec<UdpDataPlane>;
}
#[cfg_attr(test, automock)]
pub trait SessionGranter: Send + Sync {
fn create_session(
&self,
addr: SocketAddr,
snap_token: SnapTokenClaims,
) -> Result<SessionGrant, CreateSessionError>;
}
#[derive(Debug, Error)]
pub enum CreateSessionError {
#[error("no data plane with matching address exists")]
DataPlaneNotFound,
#[error("open session error: {0}")]
OpenSession(#[from] SessionOpenError),
#[error("failed to issue session token: {0}")]
IssueSessionToken(#[from] SessionTokenError),
}
pub struct SnapDataPlane {
pub address: SocketAddr,
pub isd_ases: Vec<IsdAsn>,
}
pub struct UdpDataPlane {
pub endpoint: SocketAddr,
pub isd_ases: Vec<IsdAsInterfaces>,
}
pub struct IsdAsInterfaces {
pub isd_as: IsdAsn,
pub interfaces: Vec<u32>,
}