use crate::{
resource_envelope::{
DeploymentResourceAttestation, ResourceEnvelopeVerificationError, VerifiedResourceEnvelope,
verify_resource_envelope,
},
termination_service::{
DeploymentSchedulerServiceAttestation, RuntimeServiceTarget, TerminationServiceProofError,
VerifiedSchedulerServiceOwner, runtime_component_work_proof, verify_scheduler_service,
},
};
#[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];
}
#[doc(hidden)]
pub struct VerifiedRuntimeProductionProviderCapability {
envelope: VerifiedResourceEnvelope,
scheduler: VerifiedSchedulerServiceOwner,
}
impl VerifiedRuntimeProductionProviderCapability {
#[doc(hidden)]
pub fn into_startup_owners(self) -> (VerifiedResourceEnvelope, VerifiedSchedulerServiceOwner) {
(self.envelope, self.scheduler)
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
#[doc(hidden)]
pub enum RuntimeProductionProviderError {
Resource(ResourceEnvelopeVerificationError),
Scheduler(TerminationServiceProofError),
}
#[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()
}
}