pub struct EncryptedSpawnPodRequest {
pub cashu_token: String,
pub pod_spec_id: Option<String>,
pub pod_image: String,
pub ssh_username: String,
pub ssh_password: String,
pub template_slug: Option<String>,
pub replication: Option<ReplicationMode>,
pub primary_npub: Option<String>,
pub workload_id: Option<String>,
pub volume_encryption: Option<VolumeEncryption>,
}Fields§
§cashu_token: String§pod_spec_id: Option<String>§pod_image: String§ssh_username: String§ssh_password: String§template_slug: Option<String>Optional template slug. When set, the provider materializes
the workload’s image / ports / env from its OWN local
template registry (paygress::templates) rather than
trusting consumer-supplied bytes — so a consumer cannot
smuggle an arbitrary image past the provider’s vetted
list. pod_image is ignored when template_slug resolves.
Old clients that don’t set this field continue to work
(#[serde(default)]).
replication: Option<ReplicationMode>Replication mode requested by the consumer (Unit 5 wiring
completion). Old clients that don’t set this field default to
ReplicationMode::None — same shape as before, no behavior
change for unspecified spawns.
WarmStandby { standby_providers } is the load-bearing
variant: the consumer sends the SAME spawn request to every
provider in the standby set; each provider determines its own
role (primary if it is not in the standby list, standby
otherwise) and the orchestrator coordinates failover via the
LeaseRevocation event published by #34’s wiring.
primary_npub: Option<String>Primary provider’s npub. Required when replication is
WarmStandby; ignored otherwise. Lets each receiving
provider self-determine its role: if self.npub == primary_npub
it acts as the primary (spawns + heartbeats); otherwise (and
only if it is in standby_providers) it acts as a standby
(reserves a slot, listens for revocations, promotes on signal).
workload_id: Option<String>Consumer-assigned workload identifier (UUID-shaped string).
Required when replication is WarmStandby so the primary
and N standbys share one stable id across providers — the
LeaseRevocation event uses this id, and the standby looks
up its reserved slot by it on receipt. Single-provider spawns
can leave this unset; the provider derives a vmid-based id
internally.
volume_encryption: Option<VolumeEncryption>Optional encryption key for the workload’s persistent data
volume. When set, the provider creates a LUKS-encrypted
volume (instead of a plain one) for template.data_path and
destroys the volume header on tenancy end so post-eviction
disk forensics reveal only ciphertext.
Threat model: protects against post-eviction snooping, lazy
host-operator backups, co-tenant attacks on shared storage,
and cold-disk forensics if the host is seized. Does NOT
protect against a live host with CAP_SYS_PTRACE reading
/proc/attested-research-tier IsolationLevel is reserved for.
The key travels inside this Nostr DM, which is itself NIP-04 / NIP-17 encrypted to the provider’s pubkey, so it is never visible on relays or in transit. The provider holds it only in memory while the workload runs.
Old clients that don’t set this field get plain volumes — same shape as before, no behavior change for unspecified spawns.
Trait Implementations§
Source§impl Clone for EncryptedSpawnPodRequest
impl Clone for EncryptedSpawnPodRequest
Source§fn clone(&self) -> EncryptedSpawnPodRequest
fn clone(&self) -> EncryptedSpawnPodRequest
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for EncryptedSpawnPodRequest
impl Debug for EncryptedSpawnPodRequest
Source§impl<'de> Deserialize<'de> for EncryptedSpawnPodRequest
impl<'de> Deserialize<'de> for EncryptedSpawnPodRequest
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Auto Trait Implementations§
impl Freeze for EncryptedSpawnPodRequest
impl RefUnwindSafe for EncryptedSpawnPodRequest
impl Send for EncryptedSpawnPodRequest
impl Sync for EncryptedSpawnPodRequest
impl Unpin for EncryptedSpawnPodRequest
impl UnsafeUnpin for EncryptedSpawnPodRequest
impl UnwindSafe for EncryptedSpawnPodRequest
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more