pub enum MigrationRefusal {
UnknownWorkload {
name: String,
declared: Vec<String>,
},
UnknownGroup {
group: String,
declared: Vec<String>,
},
NotDeployed {
workload: String,
},
AlreadyInGroup {
workload: String,
group: String,
machines: Vec<String>,
},
MultipleSources {
workload: String,
archetype: LifecycleArchetype,
machines: Vec<String>,
},
FungibleWithDurableVolumes {
workload: String,
archetype: LifecycleArchetype,
volumes: Vec<String>,
},
NoAdmissibleTarget {
workload: String,
group: String,
reason: String,
},
}Expand description
Why a migration cannot be planned.
Every variant names the thing to fix, not just the complaint — the same bar
check_inert_taints and judge_join hold themselves to. A refusal an
operator cannot act on trains them to pass --force, which is how the
guard stops being a guard.
Variants§
UnknownWorkload
No .yah/infra/workloads/<name>.toml.
UnknownGroup
No machine declares sovereign_group = "<group>". Indistinguishable
from a typo, so the declared vocabulary is named.
NotDeployed
The workload is not running anywhere the camp can see. Migration moves something; placing it for the first time is a different verb.
AlreadyInGroup
Every observed instance is already in the target group.
MultipleSources
More than one source machine outside the target group.
For an LifecycleArchetype::Appliance this is a pre-existing
violation — at most one live instance is the archetype’s defining
property — and migrating would carry it across the cut. For the fungible
half it is merely ambiguous: which replica moves first is a decision the
planner has no basis to make.
FungibleWithDurableVolumes
The spec declares a fungible archetype and carries durable volumes.
The declaration says “drop and reschedule me”; the volumes say “I have
state”. Rescheduling wins, and the state is silently left behind — so
this is refused rather than planned. Note that
WorkloadSpec::effective_archetype cannot catch it: its inference
only runs when archetype is absent, and an explicit archetype = "server" overrides exactly the volume signal that would have inferred
Appliance.
NoAdmissibleTarget
The group has members, but none of them admits the workload.
Carries the message from CloudConfig::admit_workload_in_group, which
names the failing axes and the candidate machines. The live case this
exists for is no-appliance on a dev node (W305 finding 2): a migration
verb must fail here for the same reason yah cloud apply would, not
route around the taint because the operator asked nicely.
Trait Implementations§
Source§impl Clone for MigrationRefusal
impl Clone for MigrationRefusal
Source§impl Debug for MigrationRefusal
impl Debug for MigrationRefusal
Source§impl Display for MigrationRefusal
impl Display for MigrationRefusal
impl Eq for MigrationRefusal
Source§impl Error for MigrationRefusal
impl Error for MigrationRefusal
1.30.0 · Source§fn source(&self) -> Option<&(dyn Error + 'static)>
fn source(&self) -> Option<&(dyn Error + 'static)>
1.0.0 · Source§fn description(&self) -> &str
fn description(&self) -> &str
use the Display impl or to_string()
Source§impl PartialEq for MigrationRefusal
impl PartialEq for MigrationRefusal
impl StructuralPartialEq for MigrationRefusal
Auto Trait Implementations§
impl Freeze for MigrationRefusal
impl RefUnwindSafe for MigrationRefusal
impl Send for MigrationRefusal
impl Sync for MigrationRefusal
impl Unpin for MigrationRefusal
impl UnsafeUnpin for MigrationRefusal
impl UnwindSafe for MigrationRefusal
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,
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