#[non_exhaustive]pub enum TenantStatus {
Active,
Provisioning,
Degraded,
Offboarding,
Archived,
}Expand description
A tenant database’s reconciliation status.
Serializes as the registry’s own text ("active"), not the variant
name, so a structured log field and a registry row cannot drift apart.
round_trips_through_the_registry_text and
serializes_as_the_registry_text together pin that.
Variants (Non-exhaustive)§
This enum is marked as non-exhaustive
Active
Reconciled and serving.
Provisioning
Registered, reconciliation not yet succeeded.
Degraded
The last reconciliation failed: requests answer
503 tenant-degraded until a boot succeeds.
Offboarding
Being retired: the export and key shred of
docs/TENANT-ONBOARDING.md §2 are under way. It has stopped
serving and will not start again.
Archived
Retired. The database is dropped and the keys are destroyed; nothing about this tenant can be served or recovered.
Implementations§
Source§impl TenantStatus
impl TenantStatus
Sourcepub fn is_reconciled(self) -> bool
pub fn is_reconciled(self) -> bool
Whether boot-time reconciliation should fly this tenant.
A match and not a negation, which is the whole point. The
reconciler asked status != Degraded while there were three
statuses, so it was accidentally right; adding Offboarding and
Archived silently enrolled both in the fleet, which would have
reconnected to a shredded tenant’s database and flipped it back to
active. Written this way, the next variant added to this
#[non_exhaustive] enum cannot compile until someone says which
side of the line it is on.
Sourcepub fn is_terminal(self) -> bool
pub fn is_terminal(self) -> bool
Whether the lifecycle ends here. Only TenantStatus::Archived
does: the database is dropped and the data keys are destroyed
(docs/TENANT-ONBOARDING.md §2), so there is nothing left to
serve and no honest way back. The registry enforces it — see
Postgres::register_tenant.
Sourcepub const fn admits(self) -> &'static [TenantStatus]
pub const fn admits(self) -> &'static [TenantStatus]
The statuses a tenant may be in and still become this one.
The lifecycle rule, in one place, because more than one writer
moves a tenant through it: the reconciler, the offboarding
runbook’s tooling and the lifecycle API of #154. A rule that lived
in one adapter’s WHERE clause would be a rule the next writer
did not have.
Written as “who may become me” rather than “who may I become” so
the match is on the target, which is what a caller setting a
status has in its hand — and so the list drops straight into the
UPDATE’s WHERE as the set of previous values that may be
overwritten, making the check part of the same statement rather
than a read the write races.
Each status admits itself, because writing the status a tenant is
already in changes nothing and a reconciler that runs twice must
not fail the second time. TenantStatus::Archived is the
exception: it admits nothing, itself included. The row is the
record that the database was dropped and the keys destroyed, and a
record of an irreversible act is not rewritten.
Sourcepub fn can_become(self, next: TenantStatus) -> bool
pub fn can_become(self, next: TenantStatus) -> bool
Whether self may become next. The same rule as
TenantStatus::admits, asked from the other end.
Sourcepub fn parse(status: &str) -> TenantStatus
pub fn parse(status: &str) -> TenantStatus
Parses the registry’s text form; anything else (a future version
wrote a status this binary does not know) reads as
TenantStatus::Degraded — refuse, do not guess.
Trait Implementations§
Source§impl Clone for TenantStatus
impl Clone for TenantStatus
Source§fn clone(&self) -> TenantStatus
fn clone(&self) -> TenantStatus
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreimpl Copy for TenantStatus
Source§impl Debug for TenantStatus
impl Debug for TenantStatus
Source§impl Display for TenantStatus
impl Display for TenantStatus
impl Eq for TenantStatus
Source§impl PartialEq for TenantStatus
impl PartialEq for TenantStatus
Source§impl Serialize for TenantStatus
impl Serialize for TenantStatus
Source§fn serialize<__S>(
&self,
__serializer: __S,
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>where
__S: Serializer,
fn serialize<__S>(
&self,
__serializer: __S,
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>where
__S: Serializer,
impl StructuralPartialEq for TenantStatus
Auto Trait Implementations§
impl Freeze for TenantStatus
impl RefUnwindSafe for TenantStatus
impl Send for TenantStatus
impl Sync for TenantStatus
impl Unpin for TenantStatus
impl UnsafeUnpin for TenantStatus
impl UnwindSafe for TenantStatus
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
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,
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<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