pub struct MachineRegistration {
pub hostkey_fingerprint: Option<String>,
pub mesh_ipv4: Option<String>,
pub joined_at: Option<String>,
}Expand description
[registration] — facts observed about a running box, written by the
fleet rather than declared by an operator (R707-T1).
The rest of machine.toml is declaration: intent, operator-authored,
reviewed and diffed like any other source. This block is the other half —
what the box turned out to be once it booted and joined. Keeping the two
apart is what lets the published fleet index (R707-F3) say which half it is
carrying; publishing them under one schema would bake the confusion into a
permanent record.
The split is a provenance boundary, not a trust or reach one:
- Declaration answers “what did we ask for” —
name,region,arch,mesh_tags,[allocatable], and the declared reach inConnectSpec. - Registration answers “what did we observe” — the hostkey TOFU’d at attach, the mesh address headscale assigned at join.
It stays in the git-tracked TOML on purpose. Registration is not local
scratch state: every consumer needs the mesh address to dial a node, so it
has to travel with the declaration. (.yah/infra/state/machines/<name>.json
— crate::state::MachineState — remains the gitignored sidecar for
provider-side derivatives that nobody but this camp needs.)
Fields§
§hostkey_fingerprint: Option<String>Yubaba’s ed25519 /identity fingerprint, TOFU-recorded by
yah cloud machine attach on first contact (SHA256:…). An observed
property of a running process — not the operator’s intent — which is
why it moved out of the top level here.
mesh_ipv4: Option<String>Mesh (headscale/tailnet) IPv4 assigned at join, e.g. "100.64.0.1".
Bare address, not a URL: the port is declared reach and lives on
ConnectSpec::yubaba_port. MachineConfig::yubaba_url composes the
two. Absent until the node has joined the mesh.
joined_at: Option<String>RFC3339 timestamp of the mesh join that produced mesh_ipv4. Free-form
audit; nothing keys off it.
Implementations§
Trait Implementations§
Source§impl Clone for MachineRegistration
impl Clone for MachineRegistration
Source§fn clone(&self) -> MachineRegistration
fn clone(&self) -> MachineRegistration
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 MachineRegistration
impl Debug for MachineRegistration
Source§impl Default for MachineRegistration
impl Default for MachineRegistration
Source§fn default() -> MachineRegistration
fn default() -> MachineRegistration
Source§impl<'de> Deserialize<'de> for MachineRegistration
impl<'de> Deserialize<'de> for MachineRegistration
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>,
impl Eq for MachineRegistration
Source§impl PartialEq for MachineRegistration
impl PartialEq for MachineRegistration
Source§impl Serialize for MachineRegistration
impl Serialize for MachineRegistration
impl StructuralPartialEq for MachineRegistration
Auto Trait Implementations§
impl Freeze for MachineRegistration
impl RefUnwindSafe for MachineRegistration
impl Send for MachineRegistration
impl Sync for MachineRegistration
impl Unpin for MachineRegistration
impl UnsafeUnpin for MachineRegistration
impl UnwindSafe for MachineRegistration
Blanket Implementations§
impl<T> Allocation for T
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
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> DowncastSend for T
impl<T> DowncastSend for T
Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<K, Q> Equivalent<Q> for K
impl<K, Q> Equivalent<Q> for K
Source§fn equivalent(&self, key: &Q) -> bool
fn equivalent(&self, key: &Q) -> bool
key and return true if they are equal.impl<T> ErasedDestructor for Twhere
T: 'static,
impl<T> Fruit for T
impl<A, B, T> HttpServerConnExec<A, B> for Twhere
B: Body,
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