saddle-runtime 0.2.0

Saddle managed asynchronous runtime and lifecycle
Documentation
//! Public, atomic Runtime half of a production provider.
//!
//! Deployment code supplies one indivisible observation. Runtime validates its
//! resource and scheduler domains together and returns one opaque capability;
//! the former independent test-only verifiers remain unavailable.

use crate::{
    resource_envelope::{
        DeploymentResourceAttestation, ResourceEnvelopeVerificationError, VerifiedResourceEnvelope,
        verify_resource_envelope,
    },
    termination_service::{
        DeploymentSchedulerServiceAttestation, RuntimeServiceTarget, TerminationServiceProofError,
        VerifiedSchedulerServiceOwner, runtime_component_work_proof, verify_scheduler_service,
    },
};

/// Complete Runtime observation required from an external production provider.
///
/// This is the only public provider observation boundary. It cannot mint either
/// successful owner independently.
#[doc(hidden)]
pub trait RuntimeProductionProviderObservation: Sized {
    fn cpu_quota_us(&self) -> u64;
    fn cpu_period_us(&self) -> u64;
    fn effective_cpuset(&self) -> &[usize];
    fn memory_max_bytes(&self) -> usize;
    fn memory_high_bytes(&self) -> usize;
    fn saddle_logical_memory_bytes(&self) -> usize;
    fn saddle_requested_memory_bytes(&self) -> usize;
    fn registration_credits(&self) -> usize;
    fn event_credits(&self) -> usize;
    fn db_connection_credits(&self) -> usize;
    fn db_operation_credits(&self) -> usize;
    fn public_time_policy_ms(&self) -> [u64; 2];
    fn resource_attestation(&self) -> [u8; 32];
    fn public_time_policy_attestation(&self) -> [u8; 32];
    fn environment_identity(&self) -> [u8; 32];
    fn supervisor_attestation(&self) -> [u8; 32];
    fn build_identity(&self) -> [u8; 32];
    fn gate_identity(&self) -> [u8; 32];

    fn approved(&self) -> bool;
    fn reproducible_measurement(&self) -> bool;
    fn conservative_upper_bound(&self) -> bool;
    fn target(&self) -> RuntimeServiceTarget;
    fn tokio_version(&self) -> (u16, u16, u16);
    fn max_worker_threads(&self) -> u16;
    fn max_active_tasks(&self) -> u16;
    fn max_registrations(&self) -> u16;
    fn max_runnable_polls(&self) -> u64;
    fn max_wake_deliveries(&self) -> u64;
    fn max_join_observations(&self) -> u64;
    fn max_timer_deliveries(&self) -> u64;
    fn poll_delivery_nanos(&self) -> u64;
    fn wake_delivery_nanos(&self) -> u64;
    fn join_delivery_nanos(&self) -> u64;
    fn timer_delivery_nanos(&self) -> u64;
    fn calibration_identity(&self) -> [u8; 32];
    fn scheduler_service_attestation(&self) -> [u8; 32];
}

/// Opaque, non-Clone Runtime provider capability.
///
/// ```compile_fail
/// use saddle_runtime::production_provider::VerifiedRuntimeProductionProviderCapability;
/// fn duplicate(value: VerifiedRuntimeProductionProviderCapability) {
///     let _ = value.clone();
/// }
/// ```
///
/// ```compile_fail
/// use saddle_runtime::production_provider::VerifiedRuntimeProductionProviderCapability;
/// let _ = VerifiedRuntimeProductionProviderCapability {};
/// ```
#[doc(hidden)]
pub struct VerifiedRuntimeProductionProviderCapability {
    envelope: VerifiedResourceEnvelope,
    scheduler: VerifiedSchedulerServiceOwner,
}

impl VerifiedRuntimeProductionProviderCapability {
    /// Consumes the single capability at the existing framework assembly seam.
    #[doc(hidden)]
    pub fn into_startup_owners(self) -> (VerifiedResourceEnvelope, VerifiedSchedulerServiceOwner) {
        (self.envelope, self.scheduler)
    }
}

/// Failure is intentionally scalar: an invalid external observation has not
/// acquired authority and is not reusable as a successful capability.
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
#[doc(hidden)]
pub enum RuntimeProductionProviderError {
    Resource(ResourceEnvelopeVerificationError),
    Scheduler(TerminationServiceProofError),
}

/// Verifies the public Runtime provider boundary atomically.
#[doc(hidden)]
pub fn verify_runtime_production_provider<P: RuntimeProductionProviderObservation>(
    provider: P,
) -> Result<VerifiedRuntimeProductionProviderCapability, RuntimeProductionProviderError> {
    let envelope = verify_resource_envelope(ResourceView(&provider))
        .map_err(RuntimeProductionProviderError::Resource)?;
    let scheduler = verify_scheduler_service(
        &envelope,
        SchedulerView(&provider),
        runtime_component_work_proof(),
    )
    .map_err(RuntimeProductionProviderError::Scheduler)?;
    Ok(VerifiedRuntimeProductionProviderCapability {
        envelope,
        scheduler,
    })
}

struct ResourceView<'a, P>(&'a P);
struct SchedulerView<'a, P>(&'a P);

impl<P: RuntimeProductionProviderObservation> DeploymentResourceAttestation
    for ResourceView<'_, P>
{
    fn cpu_quota_us(&self) -> u64 {
        self.0.cpu_quota_us()
    }
    fn cpu_period_us(&self) -> u64 {
        self.0.cpu_period_us()
    }
    fn effective_cpuset(&self) -> &[usize] {
        self.0.effective_cpuset()
    }
    fn memory_max_bytes(&self) -> usize {
        self.0.memory_max_bytes()
    }
    fn memory_high_bytes(&self) -> usize {
        self.0.memory_high_bytes()
    }
    fn saddle_logical_memory_bytes(&self) -> usize {
        self.0.saddle_logical_memory_bytes()
    }
    fn saddle_requested_memory_bytes(&self) -> usize {
        self.0.saddle_requested_memory_bytes()
    }
    fn registration_credits(&self) -> usize {
        self.0.registration_credits()
    }
    fn event_credits(&self) -> usize {
        self.0.event_credits()
    }
    fn db_connection_credits(&self) -> usize {
        self.0.db_connection_credits()
    }
    fn db_operation_credits(&self) -> usize {
        self.0.db_operation_credits()
    }
    fn public_time_policy_ms(&self) -> [u64; 2] {
        self.0.public_time_policy_ms()
    }
    fn resource_attestation(&self) -> [u8; 32] {
        self.0.resource_attestation()
    }
    fn public_time_policy_attestation(&self) -> [u8; 32] {
        self.0.public_time_policy_attestation()
    }
    fn environment_identity(&self) -> [u8; 32] {
        self.0.environment_identity()
    }
    fn supervisor_attestation(&self) -> [u8; 32] {
        self.0.supervisor_attestation()
    }
    fn build_identity(&self) -> [u8; 32] {
        self.0.build_identity()
    }
    fn gate_identity(&self) -> [u8; 32] {
        self.0.gate_identity()
    }
}

impl<P: RuntimeProductionProviderObservation> DeploymentSchedulerServiceAttestation
    for SchedulerView<'_, P>
{
    fn approved(&self) -> bool {
        self.0.approved()
    }
    fn reproducible_measurement(&self) -> bool {
        self.0.reproducible_measurement()
    }
    fn conservative_upper_bound(&self) -> bool {
        self.0.conservative_upper_bound()
    }
    fn target(&self) -> RuntimeServiceTarget {
        self.0.target()
    }
    fn tokio_version(&self) -> (u16, u16, u16) {
        self.0.tokio_version()
    }
    fn max_worker_threads(&self) -> u16 {
        self.0.max_worker_threads()
    }
    fn max_active_tasks(&self) -> u16 {
        self.0.max_active_tasks()
    }
    fn max_registrations(&self) -> u16 {
        self.0.max_registrations()
    }
    fn max_runnable_polls(&self) -> u64 {
        self.0.max_runnable_polls()
    }
    fn max_wake_deliveries(&self) -> u64 {
        self.0.max_wake_deliveries()
    }
    fn max_join_observations(&self) -> u64 {
        self.0.max_join_observations()
    }
    fn max_timer_deliveries(&self) -> u64 {
        self.0.max_timer_deliveries()
    }
    fn poll_delivery_nanos(&self) -> u64 {
        self.0.poll_delivery_nanos()
    }
    fn wake_delivery_nanos(&self) -> u64 {
        self.0.wake_delivery_nanos()
    }
    fn join_delivery_nanos(&self) -> u64 {
        self.0.join_delivery_nanos()
    }
    fn timer_delivery_nanos(&self) -> u64 {
        self.0.timer_delivery_nanos()
    }
    fn resource_attestation(&self) -> [u8; 32] {
        self.0.resource_attestation()
    }
    fn environment_identity(&self) -> [u8; 32] {
        self.0.environment_identity()
    }
    fn calibration_identity(&self) -> [u8; 32] {
        self.0.calibration_identity()
    }
    fn service_attestation(&self) -> [u8; 32] {
        self.0.scheduler_service_attestation()
    }
    fn build_identity(&self) -> [u8; 32] {
        self.0.build_identity()
    }
    fn gate_identity(&self) -> [u8; 32] {
        self.0.gate_identity()
    }
}