pub enum Backend {
S3(S3Backend),
Azure(AzureBackend),
Gcs(GcsBackend),
B2(B2Backend),
Filesystem(FilesystemBackend),
Sftp(SftpBackend),
WebDav(WebDavBackend),
Rclone(RcloneBackend),
}Expand description
The discriminated backend union. Exactly one variant by construction.
§Representation choice
ADR-0003 §3.1 sketches this as #[serde(tag = "kind")] (a kind: S3 inline
discriminant). In practice an internally-tagged enum cannot produce a valid
Kubernetes structural schema: kube’s schema rewriter hoists oneOf branch
properties to the root and requires the shared kind property to be identical
across branches, but each variant needs a distinct kind const — a hard
conflict. We therefore use serde’s externally-tagged representation
(backend: { s3: {...} }), which:
- is exactly the YAML shape ADR-0001 §3.1 actually used (
backend.s3.bucket); - generates a valid structural schema (a
oneOfof distinct optional properties — kubectl enforces “exactly one backend”); - preserves the ADR’s type-safety thesis verbatim — this is still a Rust
enum, a value is still exactly one variant, and reconcilers stillmatchit exhaustively.
The webhook (api::validate) validates content (bucket-name format,
credential-secret reachability) that the schema can’t express.
Variants§
S3(S3Backend)
Amazon S3 or any S3-compatible object store (MinIO, RustFS, Ceph RGW, …).
Azure(AzureBackend)
Azure Blob Storage.
Gcs(GcsBackend)
Google Cloud Storage.
B2(B2Backend)
Backblaze B2.
Filesystem(FilesystemBackend)
A local filesystem path, backed by a PVC the operator mounts into the mover.
Sftp(SftpBackend)
SFTP server.
WebDav(WebDavBackend)
WebDAV endpoint.
Rclone(RcloneBackend)
Any rclone remote (kopia shells out to rclone), broadening reach to
providers without a native kopia backend.
Implementations§
Source§impl Backend
impl Backend
Sourcepub fn kind_str(&self) -> &'static str
pub fn kind_str(&self) -> &'static str
Stable discriminant string for status/metrics/printcolumns.
Returns the variant’s PascalCase name, independent of the camelCase wire
key (backend: { s3: ... } deserializes to Backend::S3, whose
kind_str() is "S3").
use kopiur_api::backend::{Backend, FilesystemBackend};
let b = Backend::Filesystem(FilesystemBackend {
path: "/repo".into(),
pvc_name: None,
});
assert_eq!(b.kind_str(), "Filesystem");
// The wire key is camelCase, but the discriminant stays PascalCase.
let s3: Backend = serde_json::from_value(serde_json::json!({
"s3": { "bucket": "my-backups" }
}))
.unwrap();
assert_eq!(s3.kind_str(), "S3");Trait Implementations§
Source§impl<'de> Deserialize<'de> for Backend
impl<'de> Deserialize<'de> for Backend
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>,
Source§impl JsonSchema for Backend
impl JsonSchema for Backend
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 moreimpl Eq for Backend
impl StructuralPartialEq for Backend
Auto Trait Implementations§
impl Freeze for Backend
impl RefUnwindSafe for Backend
impl Send for Backend
impl Sync for Backend
impl Unpin for Backend
impl UnsafeUnpin for Backend
impl UnwindSafe for Backend
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,
§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