Integrate host escalation with production sessions
This commit is contained in:
parent
254bb37764
commit
696dae610a
1 changed files with 1175 additions and 96 deletions
|
|
@ -11,7 +11,7 @@ use lazaret_core::records::{
|
|||
Generation, GenerationIdentity, Participant, ParticipantOwnership, ParticipantRole,
|
||||
ParticipantState, PreparedArtifact,
|
||||
};
|
||||
use lazaret_linux::process::current_process_identity;
|
||||
use lazaret_linux::process::{ProcessOwnershipContext, current_process_identity};
|
||||
use lazaret_runtime_supervisor::network::NetworkProbeRequest;
|
||||
use lazaret_runtime_supervisor::sandbox::SandboxBundle;
|
||||
use lazaret_runtime_supervisor::supervision::RuntimeSupervisorLaunch;
|
||||
|
|
@ -25,6 +25,9 @@ use crate::control::{
|
|||
TrustAnchor,
|
||||
};
|
||||
use crate::domain_store::{DomainStoreMutation, HostCoordinatorDomainStore};
|
||||
use crate::escalation::{
|
||||
ProductionEscalation, ProductionEscalationHandle, ProductionEscalationInputs,
|
||||
};
|
||||
use crate::git_routing::GitRoutingCoordinator;
|
||||
use crate::lifecycle::{
|
||||
HostCoordinatorLifecycle, LifecycleAction, LifecycleAdapter, SessionAdmissionIdentity,
|
||||
|
|
@ -94,6 +97,8 @@ pub struct ProductionLifecycleAdapter<'a> {
|
|||
trust_anchor: Option<TrustAnchor>,
|
||||
staged_control: Option<StagedControlFace>,
|
||||
published_control: Option<Arc<PublishedControlFace>>,
|
||||
escalation: Option<ProductionEscalation<'a>>,
|
||||
escalation_handle: Option<ProductionEscalationHandle>,
|
||||
awaiting_runtime: Option<AwaitingAttachedRunsc>,
|
||||
runtime: Option<CommittedSandboxRuntime>,
|
||||
state_anchor_mount: Option<MountIdentity>,
|
||||
|
|
@ -191,6 +196,8 @@ impl<'a> ProductionLifecycleAdapter<'a> {
|
|||
trust_anchor: None,
|
||||
staged_control: None,
|
||||
published_control: None,
|
||||
escalation: None,
|
||||
escalation_handle: None,
|
||||
awaiting_runtime: None,
|
||||
runtime: None,
|
||||
state_anchor_mount: None,
|
||||
|
|
@ -207,6 +214,12 @@ impl<'a> ProductionLifecycleAdapter<'a> {
|
|||
self.published_control.as_ref().map(Arc::clone)
|
||||
}
|
||||
|
||||
pub(crate) fn take_escalation(
|
||||
&mut self,
|
||||
) -> Option<(ProductionEscalation<'a>, ProductionEscalationHandle)> {
|
||||
Some((self.escalation.take()?, self.escalation_handle.take()?))
|
||||
}
|
||||
|
||||
fn require_generation(&self, generation: &Generation) -> Result<(), ProductionLifecycleError> {
|
||||
if generation.domain_id == self.plan.generation_identity.domain_id
|
||||
&& generation.generation_id == self.plan.generation_identity.generation_id
|
||||
|
|
@ -382,10 +395,48 @@ impl<'a> ProductionLifecycleAdapter<'a> {
|
|||
}
|
||||
|
||||
fn stage_publication(&mut self) -> Result<(), ProductionLifecycleError> {
|
||||
let anchor = self
|
||||
let mut anchor = self
|
||||
.trust_anchor
|
||||
.take()
|
||||
.ok_or_else(|| ProductionLifecycleError("Trust Anchor is absent".into()))?;
|
||||
if self
|
||||
.plan
|
||||
.configuration
|
||||
.fingerprint_record()
|
||||
.escalation_enabled
|
||||
{
|
||||
let publication = anchor.publication_identity();
|
||||
let coordinator_key = anchor.coordinator_protocol_key();
|
||||
let credentials = anchor.take_sandbox_credential_bundle().map_err(failure)?;
|
||||
let (credential_files, inbox, outbox) = self
|
||||
.plan
|
||||
.runtime_staging
|
||||
.escalation_mailboxes(self.plan.invoking_uid)
|
||||
.map_err(failure)?;
|
||||
let ownership = ProcessOwnershipContext {
|
||||
domain_id: self.plan.generation_identity.domain_id,
|
||||
generation_id: self.plan.generation_identity.generation_id,
|
||||
coordinator_id: self.plan.generation_identity.coordinator_id,
|
||||
slot: lazaret_core::records::HostProcessOwnershipSlot::EscalationHostProcess(
|
||||
lazaret_core::identity::RequestId::new([0; 32]),
|
||||
),
|
||||
};
|
||||
let (escalation, handle) = ProductionEscalation::new(ProductionEscalationInputs {
|
||||
configuration: self.plan.configuration,
|
||||
publication,
|
||||
credentials,
|
||||
credential_files,
|
||||
inbox,
|
||||
outbox,
|
||||
prompt_transport: Arc::clone(&self.plan.prompt_transport),
|
||||
coordinator_key,
|
||||
ownership,
|
||||
invoking_uid: self.plan.invoking_uid,
|
||||
})
|
||||
.map_err(failure)?;
|
||||
self.escalation = Some(escalation);
|
||||
self.escalation_handle = Some(handle);
|
||||
}
|
||||
let generation_id = self.plan.generation_identity.generation_id;
|
||||
self.plan
|
||||
.store
|
||||
|
|
@ -691,6 +742,15 @@ pub(crate) fn serve_production_control_connection(
|
|||
lifecycle: &Mutex<ProductionHostCoordinatorLifecycle<'_, '_>>,
|
||||
face: &PublishedControlFace,
|
||||
connection: AcceptedControlConnection,
|
||||
) -> Result<(), ControlError> {
|
||||
serve_production_control_connection_with_escalation(lifecycle, face, connection, None)
|
||||
}
|
||||
|
||||
pub(crate) fn serve_production_control_connection_with_escalation(
|
||||
lifecycle: &Mutex<ProductionHostCoordinatorLifecycle<'_, '_>>,
|
||||
face: &PublishedControlFace,
|
||||
connection: AcceptedControlConnection,
|
||||
escalation: Option<&ProductionEscalationHandle>,
|
||||
) -> Result<(), ControlError> {
|
||||
face.serve_connection_coordinated(
|
||||
connection,
|
||||
|
|
@ -701,7 +761,20 @@ pub(crate) fn serve_production_control_connection(
|
|||
.admit_session(admission)
|
||||
.map_err(|error| ControlError::Lifecycle(error.to_string()))
|
||||
},
|
||||
|binding, registration| {
|
||||
if let Some(escalation) = escalation {
|
||||
escalation
|
||||
.register(binding, registration)
|
||||
.map_err(|error| ControlError::Lifecycle(error.to_string()))?;
|
||||
}
|
||||
Ok(())
|
||||
},
|
||||
|session_id| {
|
||||
if let Some(escalation) = escalation {
|
||||
escalation
|
||||
.disconnect(session_id)
|
||||
.map_err(|error| ControlError::Lifecycle(error.to_string()))?;
|
||||
}
|
||||
let mut lifecycle = lifecycle.lock().map_err(|_| ControlError::LockPoisoned)?;
|
||||
lifecycle
|
||||
.disconnect_session(session_id)
|
||||
|
|
|
|||
Loading…
Reference in a new issue