pub enum SeedSource {
Backend(Box<Backend>),
Repository(RepositoryRef),
}Expand description
Where a seed reads from — exactly one of, externally tagged
(from: { backend: { s3: {...} } } or from: { repository: {...} }).
The two variants are genuinely different operations, not two spellings of one: blob mode copies raw storage and inherits the source’s format and password; migrate mode copies snapshot manifests between two independently encrypted repositories. Making them one enum is what forces every handler to answer for both.
use kopiur_api::seed::SeedSource;
// Blob mode: the wire form is `{ "backend": { "s3": { ... } } }`.
let blob: SeedSource = serde_json::from_value(serde_json::json!({
"backend": { "s3": { "bucket": "offsite-mirror" } }
}))
.unwrap();
assert_eq!(blob.mode(), kopiur_api::seed::SeedMode::Blob);
assert_eq!(blob.describe(), "S3");
// Migrate mode: another repository CR.
let migrate: SeedSource = serde_json::from_value(serde_json::json!({
"repository": { "kind": "ClusterRepository", "name": "offsite" }
}))
.unwrap();
assert_eq!(migrate.mode(), kopiur_api::seed::SeedMode::Migrate);
assert_eq!(migrate.describe(), "ClusterRepository/offsite");Variants§
Backend(Box<Backend>)
A bare storage backend holding a byte-for-byte mirror of a kopia
repository (blob mode, kopia repository sync-to). The mirror’s format
and encryption password are inherited verbatim, so this repository’s
encryption.passwordSecretRef must already hold the MIRROR’s password
and spec.create’s format knobs are refused as inert.
Repository(RepositoryRef)
Another Repository/ClusterRepository, opened read-only (migrate mode,
kopia snapshot migrate). Snapshot identities and times are preserved,
so seeded history is restorable by identity/fromPolicy.
A kind: Repository reference with no namespace resolves in the
referrer’s own namespace — and, on a cluster-scoped ClusterRepository
(which has none), in the operator’s namespace, the same rule its
credential secretRefs follow. Set namespace explicitly whenever the
source lives anywhere else.
Implementations§
Source§impl SeedSource
impl SeedSource
Sourcepub fn mode(&self) -> SeedMode
pub fn mode(&self) -> SeedMode
Which copy mechanism this source selects. Exhaustive, so a new variant cannot compile until its mode is decided.
Sourcepub fn describe(&self) -> String
pub fn describe(&self) -> String
The rendering pinned into status.seed.source: the
Backend::kind_str discriminant (S3, Filesystem, …) for blob
mode, Kind/name (with namespace/ when the reference sets one) for
migrate mode.
Lives here so the controller, the CLI and any diagnostic describe a seed source identically instead of each re-deriving a string.
use kopiur_api::seed::SeedSource;
let cross_ns: SeedSource = serde_json::from_value(serde_json::json!({
"repository": { "name": "nas", "namespace": "backups" }
}))
.unwrap();
assert_eq!(cross_ns.describe(), "Repository/backups/nas");Trait Implementations§
Source§impl Clone for SeedSource
impl Clone for SeedSource
Source§fn clone(&self) -> SeedSource
fn clone(&self) -> SeedSource
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 SeedSource
impl Debug for SeedSource
Source§impl<'de> Deserialize<'de> for SeedSource
impl<'de> Deserialize<'de> for SeedSource
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 SeedSource
Source§impl JsonSchema for SeedSource
impl JsonSchema for SeedSource
Source§fn schema_id() -> Cow<'static, str>
fn schema_id() -> Cow<'static, str>
Source§fn json_schema(generator: &mut SchemaGenerator) -> Schema
fn json_schema(generator: &mut SchemaGenerator) -> Schema
Source§fn inline_schema() -> bool
fn inline_schema() -> bool
$ref keyword. Read moreSource§impl PartialEq for SeedSource
impl PartialEq for SeedSource
Source§fn eq(&self, other: &SeedSource) -> bool
fn eq(&self, other: &SeedSource) -> bool
self and other values to be equal, and is used by ==.Source§impl Serialize for SeedSource
impl Serialize for SeedSource
impl StructuralPartialEq for SeedSource
Auto Trait Implementations§
impl Freeze for SeedSource
impl RefUnwindSafe for SeedSource
impl Send for SeedSource
impl Sync for SeedSource
impl Unpin for SeedSource
impl UnsafeUnpin for SeedSource
impl UnwindSafe for SeedSource
Blanket Implementations§
§impl<T> AnyExt for T
impl<T> AnyExt for T
§fn downcast_ref<T>(this: &Self) -> Option<&T>where
T: Any,
fn downcast_ref<T>(this: &Self) -> Option<&T>where
T: Any,
T behind reference§fn downcast_mut<T>(this: &mut Self) -> Option<&mut T>where
T: Any,
fn downcast_mut<T>(this: &mut Self) -> Option<&mut T>where
T: Any,
T behind mutable reference§fn downcast_rc<T>(this: Rc<Self>) -> Result<Rc<T>, Rc<Self>>where
T: Any,
fn downcast_rc<T>(this: Rc<Self>) -> Result<Rc<T>, Rc<Self>>where
T: Any,
T behind Rc pointer§fn downcast_arc<T>(this: Arc<Self>) -> Result<Arc<T>, Arc<Self>>where
T: Any,
fn downcast_arc<T>(this: Arc<Self>) -> Result<Arc<T>, Arc<Self>>where
T: Any,
T behind Arc pointer§fn downcast_box<T>(this: Box<Self>) -> Result<Box<T>, Box<Self>>where
T: Any,
fn downcast_box<T>(this: Box<Self>) -> Result<Box<T>, Box<Self>>where
T: Any,
T behind Box pointer§fn downcast_move<T>(this: Self) -> Option<T>
fn downcast_move<T>(this: Self) -> Option<T>
Self to T,
useful only in generic context as a workaround for specializationSource§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, X> CoerceTo<T> for Xwhere
T: CoerceFrom<X> + ?Sized,
impl<T, X> CoerceTo<T> for Xwhere
T: CoerceFrom<X> + ?Sized,
fn coerce_rc_to(self: Rc<X>) -> Rc<T>
fn coerce_box_to(self: Box<X>) -> Box<T>
fn coerce_ref_to(&self) -> &T
fn coerce_mut_to(&mut self) -> &mut T
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§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