From cbaea166c44c143e1f92673d043b4b6fa237687e Mon Sep 17 00:00:00 2001 From: weisd Date: Fri, 27 Sep 2024 22:00:45 +0800 Subject: [PATCH] init bucketmeta struct --- ecstore/src/bucket/event/config.rs | 69 ------------ ecstore/src/bucket/event/mod.rs | 71 +++++++++++- ecstore/src/bucket/lifecycle/and.rs | 4 +- ecstore/src/bucket/lifecycle/delmarker.rs | 4 +- ecstore/src/bucket/lifecycle/expiration.rs | 12 +- ecstore/src/bucket/lifecycle/fileter.rs | 9 +- ecstore/src/bucket/lifecycle/lifecycle.rs | 6 +- .../src/bucket/lifecycle/noncurrentversion.rs | 5 +- ecstore/src/bucket/lifecycle/prefix.rs | 4 +- ecstore/src/bucket/lifecycle/rule.rs | 6 +- ecstore/src/bucket/lifecycle/tag.rs | 4 +- ecstore/src/bucket/lifecycle/transition.rs | 7 +- ecstore/src/bucket/metadata.rs | 68 +++++++++--- ecstore/src/bucket/mod.rs | 2 + ecstore/src/bucket/objectlock/mod.rs | 11 +- ecstore/src/bucket/policy/action.rs | 7 +- ecstore/src/bucket/policy/bucket_policy.rs | 7 +- .../src/bucket/policy/condition/function.rs | 42 +++---- ecstore/src/bucket/policy/effect.rs | 3 +- ecstore/src/bucket/policy/principal.rs | 3 +- ecstore/src/bucket/policy/resource.rs | 9 +- ecstore/src/bucket/replication/and.rs | 3 +- ecstore/src/bucket/replication/filter.rs | 3 +- ecstore/src/bucket/replication/mod.rs | 7 +- ecstore/src/bucket/replication/rule.rs | 18 +-- ecstore/src/bucket/replication/tag.rs | 4 +- ecstore/src/bucket/target/mod.rs | 105 +++++++----------- ecstore/src/bucket/versioning/mod.rs | 9 +- ecstore/src/disk/mod.rs | 4 +- ecstore/src/lib.rs | 2 +- ecstore/src/store.rs | 2 +- 31 files changed, 275 insertions(+), 235 deletions(-) delete mode 100644 ecstore/src/bucket/event/config.rs diff --git a/ecstore/src/bucket/event/config.rs b/ecstore/src/bucket/event/config.rs deleted file mode 100644 index c9ff6033f..000000000 --- a/ecstore/src/bucket/event/config.rs +++ /dev/null @@ -1,69 +0,0 @@ -use serde::{Deserialize, Serialize}; - -use super::name::Name; - -// 定义common结构体 -#[derive(Serialize, Deserialize, Debug)] -struct Common { - pub id: String, - pub filter: S3Key, - pub events: Vec, -} - -// 定义Queue结构体 -#[derive(Serialize, Deserialize, Debug)] -struct Queue { - pub common: Common, - pub arn: ARN, -} - -// 定义ARN结构体 -#[derive(Serialize, Deserialize, Debug)] -pub struct ARN { - pub target_id: TargetID, - pub region: String, -} - -// 定义TargetID结构体 -#[derive(Serialize, Deserialize, Debug)] -pub struct TargetID { - pub id: String, - pub name: String, -} - -// 定义FilterRule结构体 -#[derive(Serialize, Deserialize, Debug)] -pub struct FilterRule { - pub name: String, - pub value: String, -} - -// 定义FilterRuleList结构体 -#[derive(Serialize, Deserialize, Debug)] -pub struct FilterRuleList { - pub rules: Vec, -} - -// 定义S3Key结构体 -#[derive(Serialize, Deserialize, Debug)] -pub struct S3Key { - pub rule_list: FilterRuleList, -} - -#[derive(Serialize, Deserialize, Debug)] -pub struct Lambda { - arn: String, -} - -// 定义Topic结构体 -#[derive(Serialize, Deserialize, Debug)] -pub struct Topic { - arn: String, -} - -#[derive(Serialize, Deserialize, Debug)] -pub struct Config { - queue_list: Vec, - lambda_list: Vec, - topic_list: Vec, -} diff --git a/ecstore/src/bucket/event/mod.rs b/ecstore/src/bucket/event/mod.rs index 96afdffed..48944fee5 100644 --- a/ecstore/src/bucket/event/mod.rs +++ b/ecstore/src/bucket/event/mod.rs @@ -1,2 +1,71 @@ -pub(crate) mod config; mod name; + +use serde::{Deserialize, Serialize}; + +use name::Name; + +// 定义common结构体 +#[derive(Serialize, Deserialize, Debug)] +struct Common { + pub id: String, + pub filter: S3Key, + pub events: Vec, +} + +// 定义Queue结构体 +#[derive(Serialize, Deserialize, Debug)] +struct Queue { + pub common: Common, + pub arn: ARN, +} + +// 定义ARN结构体 +#[derive(Serialize, Deserialize, Debug)] +pub struct ARN { + pub target_id: TargetID, + pub region: String, +} + +// 定义TargetID结构体 +#[derive(Serialize, Deserialize, Debug)] +pub struct TargetID { + pub id: String, + pub name: String, +} + +// 定义FilterRule结构体 +#[derive(Serialize, Deserialize, Debug)] +pub struct FilterRule { + pub name: String, + pub value: String, +} + +// 定义FilterRuleList结构体 +#[derive(Serialize, Deserialize, Debug)] +pub struct FilterRuleList { + pub rules: Vec, +} + +// 定义S3Key结构体 +#[derive(Serialize, Deserialize, Debug)] +pub struct S3Key { + pub rule_list: FilterRuleList, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct Lambda { + arn: String, +} + +// 定义Topic结构体 +#[derive(Serialize, Deserialize, Debug)] +pub struct Topic { + arn: String, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct Config { + queue_list: Vec, + lambda_list: Vec, + topic_list: Vec, +} diff --git a/ecstore/src/bucket/lifecycle/and.rs b/ecstore/src/bucket/lifecycle/and.rs index e3ea21a5b..38bee9176 100644 --- a/ecstore/src/bucket/lifecycle/and.rs +++ b/ecstore/src/bucket/lifecycle/and.rs @@ -1,6 +1,6 @@ use super::{prefix::Prefix, tag::Tag}; - -#[derive(Debug)] +use serde::{Deserialize, Serialize}; +#[derive(Debug, Deserialize, Serialize, Default)] pub struct And { pub object_size_greater_than: i64, pub object_size_less_than: i64, diff --git a/ecstore/src/bucket/lifecycle/delmarker.rs b/ecstore/src/bucket/lifecycle/delmarker.rs index 08e787ac5..06102f216 100644 --- a/ecstore/src/bucket/lifecycle/delmarker.rs +++ b/ecstore/src/bucket/lifecycle/delmarker.rs @@ -1,4 +1,6 @@ -#[derive(Debug)] +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Deserialize, Serialize, Default)] pub struct DelMarkerExpiration { pub days: usize, } diff --git a/ecstore/src/bucket/lifecycle/expiration.rs b/ecstore/src/bucket/lifecycle/expiration.rs index d4ac898de..8fa2e08c2 100644 --- a/ecstore/src/bucket/lifecycle/expiration.rs +++ b/ecstore/src/bucket/lifecycle/expiration.rs @@ -1,23 +1,23 @@ +use serde::{Deserialize, Serialize}; use time::OffsetDateTime; - // ExpirationDays is a type alias to unmarshal Days in Expiration pub type ExpirationDays = usize; -#[derive(Debug, Clone, PartialEq)] -pub struct ExpirationDate(OffsetDateTime); +#[derive(Debug, Deserialize, Serialize, Default)] +pub struct ExpirationDate(Option); -#[derive(Debug)] +#[derive(Debug, Deserialize, Serialize, Default)] pub struct ExpireDeleteMarker { pub marker: Boolean, } -#[derive(Debug)] +#[derive(Debug, Deserialize, Serialize, Default)] pub struct Boolean { pub val: bool, pub set: bool, } -#[derive(Debug)] +#[derive(Debug, Deserialize, Serialize, Default)] pub struct Expiration { pub days: Option, pub date: Option, diff --git a/ecstore/src/bucket/lifecycle/fileter.rs b/ecstore/src/bucket/lifecycle/fileter.rs index 972ff0e35..3604384be 100644 --- a/ecstore/src/bucket/lifecycle/fileter.rs +++ b/ecstore/src/bucket/lifecycle/fileter.rs @@ -1,6 +1,9 @@ -use super::{and::And, prefix::Prefix, tag::Tag}; +use std::collections::HashMap; -#[derive(Debug)] +use super::{and::And, prefix::Prefix, tag::Tag}; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Deserialize, Serialize, Default)] pub struct Filter { pub set: bool, @@ -16,5 +19,5 @@ pub struct Filter { pub tag_set: bool, // 使用HashMap存储缓存的标签 - pub cached_tags: std::collections::HashMap, + pub cached_tags: HashMap, } diff --git a/ecstore/src/bucket/lifecycle/lifecycle.rs b/ecstore/src/bucket/lifecycle/lifecycle.rs index d1e319c0c..b4ef834cf 100644 --- a/ecstore/src/bucket/lifecycle/lifecycle.rs +++ b/ecstore/src/bucket/lifecycle/lifecycle.rs @@ -1,8 +1,8 @@ +use super::rule::Rule; +use serde::{Deserialize, Serialize}; use time::OffsetDateTime; -use super::rule::Rule; - -#[derive(Debug)] +#[derive(Debug, Deserialize, Serialize, Default)] pub struct Lifecycle { pub rules: Vec, pub expiry_updated_at: Option, diff --git a/ecstore/src/bucket/lifecycle/noncurrentversion.rs b/ecstore/src/bucket/lifecycle/noncurrentversion.rs index 4a6449ed2..5f39d7d81 100644 --- a/ecstore/src/bucket/lifecycle/noncurrentversion.rs +++ b/ecstore/src/bucket/lifecycle/noncurrentversion.rs @@ -1,13 +1,14 @@ use super::{expiration::ExpirationDays, transition::TransitionDays}; +use serde::{Deserialize, Serialize}; -#[derive(Debug)] +#[derive(Debug, Deserialize, Serialize, Default)] pub struct NoncurrentVersionExpiration { pub noncurrent_days: ExpirationDays, pub newer_noncurrent_versions: usize, set: bool, } -#[derive(Debug)] +#[derive(Debug, Deserialize, Serialize, Default)] pub struct NoncurrentVersionTransition { pub noncurrent_days: TransitionDays, pub storage_class: String, diff --git a/ecstore/src/bucket/lifecycle/prefix.rs b/ecstore/src/bucket/lifecycle/prefix.rs index 4c5ad04ae..abc093205 100644 --- a/ecstore/src/bucket/lifecycle/prefix.rs +++ b/ecstore/src/bucket/lifecycle/prefix.rs @@ -1,4 +1,6 @@ -#[derive(Debug)] +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Deserialize, Serialize, Default)] pub struct Prefix { pub val: String, pub set: bool, diff --git a/ecstore/src/bucket/lifecycle/rule.rs b/ecstore/src/bucket/lifecycle/rule.rs index 67a07198a..4c69c7bb0 100644 --- a/ecstore/src/bucket/lifecycle/rule.rs +++ b/ecstore/src/bucket/lifecycle/rule.rs @@ -6,14 +6,16 @@ use super::{ prefix::Prefix, transition::Transition, }; +use serde::{Deserialize, Serialize}; -#[derive(Debug)] +#[derive(Debug, Deserialize, Serialize, Default)] pub enum Status { + #[default] Enabled, Disabled, } -#[derive(Debug)] +#[derive(Debug, Deserialize, Serialize, Default)] pub struct Rule { pub id: String, pub status: Status, diff --git a/ecstore/src/bucket/lifecycle/tag.rs b/ecstore/src/bucket/lifecycle/tag.rs index 5bb7c0b46..95687a49f 100644 --- a/ecstore/src/bucket/lifecycle/tag.rs +++ b/ecstore/src/bucket/lifecycle/tag.rs @@ -1,4 +1,6 @@ -#[derive(Debug)] +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Deserialize, Serialize, Default)] pub struct Tag { pub key: String, pub value: String, diff --git a/ecstore/src/bucket/lifecycle/transition.rs b/ecstore/src/bucket/lifecycle/transition.rs index d0fc011e8..5950de290 100644 --- a/ecstore/src/bucket/lifecycle/transition.rs +++ b/ecstore/src/bucket/lifecycle/transition.rs @@ -1,11 +1,12 @@ +use serde::{Deserialize, Serialize}; use time::OffsetDateTime; pub type TransitionDays = usize; -#[derive(Debug)] -pub struct TransitionDate(OffsetDateTime); +#[derive(Debug, Deserialize, Serialize, Default)] +pub struct TransitionDate(Option); -#[derive(Debug)] +#[derive(Debug, Deserialize, Serialize, Default)] pub struct Transition { pub days: Option, pub date: Option, diff --git a/ecstore/src/bucket/metadata.rs b/ecstore/src/bucket/metadata.rs index f82cb650e..c71506911 100644 --- a/ecstore/src/bucket/metadata.rs +++ b/ecstore/src/bucket/metadata.rs @@ -1,11 +1,23 @@ +use std::collections::HashMap; + +use rmp_serde::Serializer; +use serde::{Deserialize, Serialize}; use time::OffsetDateTime; use super::{ encryption::BucketSSEConfig, event, lifecycle::lifecycle::Lifecycle, objectlock, policy::bucket_policy::BucketPolicy, - quota::BucketQuota, replication, tags::Tags, versioning::Versioning, + quota::BucketQuota, replication, tags::Tags, target::BucketTargets, versioning::Versioning, }; -#[derive(Debug, Default)] +use crate::error::Result; + +use crate::disk::BUCKET_META_PREFIX; + +pub const BUCKET_METADATA_FILE: &str = ".metadata.bin"; +pub const BUCKET_METADATA_FORMAT: u16 = 1; +pub const BUCKET_METADATA_VERSION: u16 = 1; + +#[derive(Debug, Deserialize, Serialize, Default)] pub struct BucketMetadata { format: u16, version: u16, @@ -37,21 +49,45 @@ pub struct BucketMetadata { pub bucket_targets_config_meta_updated_at: Option, // 新增UpdatedAt字段 - new_field_updated_at: Option, + pub new_field_updated_at: Option, // 私有字段,需要原子更新 - policy_config: Option, // 假设Policy是一个已经定义好的结构体 - notification_config: Option, - lifecycle_config: Option, - object_lock_config: Option, - versioning_config: Option, - sse_config: Option, - tagging_config: Option, - quota_config: Option, - replication_config: Option, - bucket_target_config: Option, - bucket_target_config_meta: Option>, + pub policy_config: Option, // 假设Policy是一个已经定义好的结构体 + pub notification_config: Option, + pub lifecycle_config: Option, + pub object_lock_config: Option, + pub versioning_config: Option, + pub sse_config: Option, + pub tagging_config: Option, + pub quota_config: Option, + pub replication_config: Option, + pub bucket_target_config: Option, + pub bucket_target_config_meta: Option>, } -#[derive(Debug, Default)] -struct BucketTargets; +impl BucketMetadata { + pub fn new(name: &str) -> Self { + BucketMetadata { + format: BUCKET_METADATA_FORMAT, + version: BUCKET_METADATA_VERSION, + name: name.to_string(), + ..Default::default() + } + } + + pub fn save_file_path(&self) -> String { + format!("{}/{}/{}", BUCKET_META_PREFIX, self.name.as_str(), BUCKET_METADATA_FILE) + } + + fn msg_size(&self) -> usize { + unimplemented!() + } + + pub fn marshal_msg(&self) -> Result> { + unimplemented!() + } + + pub fn unmarshal(_buf: &[u8]) -> Result { + unimplemented!() + } +} diff --git a/ecstore/src/bucket/mod.rs b/ecstore/src/bucket/mod.rs index ac07a6e30..9667266f4 100644 --- a/ecstore/src/bucket/mod.rs +++ b/ecstore/src/bucket/mod.rs @@ -9,3 +9,5 @@ mod replication; mod tags; mod target; mod versioning; + +pub use metadata::BucketMetadata; diff --git a/ecstore/src/bucket/objectlock/mod.rs b/ecstore/src/bucket/objectlock/mod.rs index ab95ee2ea..c88383980 100644 --- a/ecstore/src/bucket/objectlock/mod.rs +++ b/ecstore/src/bucket/objectlock/mod.rs @@ -1,5 +1,8 @@ -#[derive(Debug, Clone, PartialEq, Eq, Hash)] +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Deserialize, Serialize, Default, PartialEq, Eq, Hash)] pub enum RetMode { + #[default] Govenance, Compliance, } @@ -17,19 +20,19 @@ impl std::str::FromStr for RetMode { } } -#[derive(Debug)] +#[derive(Debug, Deserialize, Serialize, Default)] pub struct DefaultRetention { pub mode: RetMode, pub days: Option, pub years: Option, } -#[derive(Debug)] +#[derive(Debug, Deserialize, Serialize, Default)] pub struct Rule { pub default_retention: DefaultRetention, } -#[derive(Debug)] +#[derive(Debug, Deserialize, Serialize, Default)] pub struct Config { pub object_lock_enabled: String, pub rule: Option, diff --git a/ecstore/src/bucket/policy/action.rs b/ecstore/src/bucket/policy/action.rs index d0d4901cb..d448727c9 100644 --- a/ecstore/src/bucket/policy/action.rs +++ b/ecstore/src/bucket/policy/action.rs @@ -1,12 +1,13 @@ -use std::{collections::HashSet, default}; +use serde::{Deserialize, Serialize}; +use std::collections::HashSet; -#[derive(Debug, Default)] +#[derive(Debug, Deserialize, Serialize, Default)] pub struct ActionSet(HashSet); impl ActionSet {} // 定义Action枚举类型 -#[derive(Debug, Clone, PartialEq, Eq, Default)] +#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize, Default, Hash)] pub enum Action { AbortMultipartUpload, CreateBucket, diff --git a/ecstore/src/bucket/policy/bucket_policy.rs b/ecstore/src/bucket/policy/bucket_policy.rs index 42e34492b..6e0345c52 100644 --- a/ecstore/src/bucket/policy/bucket_policy.rs +++ b/ecstore/src/bucket/policy/bucket_policy.rs @@ -1,3 +1,4 @@ +use serde::{Deserialize, Serialize}; use std::collections::HashMap; use super::{ @@ -8,7 +9,7 @@ use super::{ resource::ResourceSet, }; -#[derive(Debug, Default)] +#[derive(Debug, Deserialize, Serialize, Default)] pub struct BucketPolicyArgs { account_name: String, groups: Vec, @@ -19,7 +20,7 @@ pub struct BucketPolicyArgs { object_name: String, } -#[derive(Debug, Default)] +#[derive(Debug, Deserialize, Serialize, Default)] pub struct BPStatement { sid: String, effect: Effect, @@ -31,7 +32,7 @@ pub struct BPStatement { conditions: Option, } -#[derive(Debug, Default)] +#[derive(Debug, Deserialize, Serialize, Default)] pub struct BucketPolicy { pub id: String, pub version: String, diff --git a/ecstore/src/bucket/policy/condition/function.rs b/ecstore/src/bucket/policy/condition/function.rs index c9d4edaf0..7863c5c75 100644 --- a/ecstore/src/bucket/policy/condition/function.rs +++ b/ecstore/src/bucket/policy/condition/function.rs @@ -1,10 +1,10 @@ +use super::name::Name; +use serde::{Deserialize, Serialize}; use std::{ collections::{HashMap, HashSet}, - fmt::{Debug, Display}, + fmt::Debug, }; -use super::name::Name; - #[derive(Debug, Clone)] pub struct Key { name: String, @@ -15,7 +15,7 @@ pub struct Key { pub type ValueSet = HashSet; // 定义Function trait -pub trait Function { +pub trait FunctionApi { // evaluate方法 fn evaluate(&self, values: &HashMap) -> bool; @@ -32,34 +32,24 @@ pub trait Function { fn to_map(&self) -> HashMap; // clone方法 - fn clone(&self) -> Box; + fn clone(&self) -> Box; } -impl Display for dyn Function { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "{:?}", self.to_string()) - } -} +// impl Debug for dyn Function { +// fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { +// write!(f, "{:?}", self.to_string()) +// } +// } -impl Debug for dyn Function { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "{:?}", self.to_string()) - } +#[derive(Debug, Deserialize, Serialize, Default)] +enum Function { + #[default] + Test, } // 定义Functions类型 -pub struct Functions(Vec>); - -impl Display for Functions { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "[")?; - for v in self.0.iter() { - write!(f, "{:?}", v.to_string())?; - } - - write!(f, "]") - } -} +#[derive(Deserialize, Serialize, Default)] +pub struct Functions(Vec); impl Debug for Functions { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { diff --git a/ecstore/src/bucket/policy/effect.rs b/ecstore/src/bucket/policy/effect.rs index adcd9ec63..fc6ff0e28 100644 --- a/ecstore/src/bucket/policy/effect.rs +++ b/ecstore/src/bucket/policy/effect.rs @@ -1,6 +1,7 @@ +use serde::{Deserialize, Serialize}; use std::str::FromStr; -#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize, Default)] pub enum Effect { #[default] Allow, diff --git a/ecstore/src/bucket/policy/principal.rs b/ecstore/src/bucket/policy/principal.rs index 6d63c4b79..9a0be7d10 100644 --- a/ecstore/src/bucket/policy/principal.rs +++ b/ecstore/src/bucket/policy/principal.rs @@ -1,6 +1,7 @@ +use serde::{Deserialize, Serialize}; use std::collections::HashSet; -#[derive(Debug, Clone, Default)] +#[derive(Debug, Clone, Deserialize, Serialize, Default)] pub struct Principal { aws: HashSet, } diff --git a/ecstore/src/bucket/policy/resource.rs b/ecstore/src/bucket/policy/resource.rs index c2b67010e..c02fd7dcc 100644 --- a/ecstore/src/bucket/policy/resource.rs +++ b/ecstore/src/bucket/policy/resource.rs @@ -1,7 +1,8 @@ -use std::{collections::HashSet, default}; +use serde::{Deserialize, Serialize}; +use std::collections::HashSet; // 定义ResourceARNType枚举类型 -#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Deserialize, Serialize, Default)] pub enum ResourceARNType { #[default] UnknownARN, @@ -14,11 +15,11 @@ const RESOURCE_ARN_PREFIX: &str = "arn:aws:s3:::"; const RESOURCE_ARN_KMS_PREFIX: &str = "arn:rustfs:kms::::"; // 定义Resource结构体 -#[derive(Debug, Default)] +#[derive(Debug, Deserialize, Serialize, Default, PartialEq, Eq, Hash)] pub struct Resource { pattern: String, r#type: ResourceARNType, } -#[derive(Debug, Default)] +#[derive(Debug, Deserialize, Serialize, Default)] pub struct ResourceSet(HashSet); diff --git a/ecstore/src/bucket/replication/and.rs b/ecstore/src/bucket/replication/and.rs index cbf3dffa5..812dd29ef 100644 --- a/ecstore/src/bucket/replication/and.rs +++ b/ecstore/src/bucket/replication/and.rs @@ -1,7 +1,8 @@ use super::tag::Tag; +use serde::{Deserialize, Serialize}; // 定义And结构体 -#[derive(Debug)] +#[derive(Debug, Deserialize, Serialize, Default)] pub struct And { prefix: Option, tags: Option>, diff --git a/ecstore/src/bucket/replication/filter.rs b/ecstore/src/bucket/replication/filter.rs index 3210ea674..a194ec34a 100644 --- a/ecstore/src/bucket/replication/filter.rs +++ b/ecstore/src/bucket/replication/filter.rs @@ -1,8 +1,9 @@ use super::and::And; use super::tag::Tag; +use serde::{Deserialize, Serialize}; use std::collections::HashMap; -#[derive(Debug)] +#[derive(Debug, Deserialize, Serialize, Default)] pub struct Filter { prefix: String, and: And, diff --git a/ecstore/src/bucket/replication/mod.rs b/ecstore/src/bucket/replication/mod.rs index 5f8664c99..56abce488 100644 --- a/ecstore/src/bucket/replication/mod.rs +++ b/ecstore/src/bucket/replication/mod.rs @@ -1,11 +1,12 @@ -use rule::Rule; - mod and; mod filter; mod rule; mod tag; -#[derive(Debug)] +use rule::Rule; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Deserialize, Serialize, Default)] pub struct Config { rules: Vec, role_arn: String, diff --git a/ecstore/src/bucket/replication/rule.rs b/ecstore/src/bucket/replication/rule.rs index 2d5495029..ca688bb94 100644 --- a/ecstore/src/bucket/replication/rule.rs +++ b/ecstore/src/bucket/replication/rule.rs @@ -1,27 +1,29 @@ use super::filter::Filter; +use serde::{Deserialize, Serialize}; -#[derive(Debug)] +#[derive(Debug, Deserialize, Serialize, Default)] pub enum Status { + #[default] Enabled, Disabled, } -#[derive(Debug)] +#[derive(Debug, Deserialize, Serialize, Default)] pub struct DeleteMarkerReplication { pub status: Status, } -#[derive(Debug)] +#[derive(Debug, Deserialize, Serialize, Default)] pub struct DeleteReplication { pub status: Status, } -#[derive(Debug)] +#[derive(Debug, Deserialize, Serialize, Default)] pub struct ExistingObjectReplication { pub status: Status, } -#[derive(Debug)] +#[derive(Debug, Deserialize, Serialize, Default)] pub struct Destination { pub bucket: String, pub storage_class: String, @@ -29,18 +31,18 @@ pub struct Destination { } // 定义ReplicaModifications结构体 -#[derive(Debug)] +#[derive(Debug, Deserialize, Serialize, Default)] pub struct ReplicaModifications { status: Status, } // 定义SourceSelectionCriteria结构体 -#[derive(Debug)] +#[derive(Debug, Deserialize, Serialize, Default)] pub struct SourceSelectionCriteria { replica_modifications: ReplicaModifications, } -#[derive(Debug)] +#[derive(Debug, Deserialize, Serialize, Default)] pub struct Rule { pub id: String, pub status: Status, diff --git a/ecstore/src/bucket/replication/tag.rs b/ecstore/src/bucket/replication/tag.rs index 83a8cec15..565aeeea9 100644 --- a/ecstore/src/bucket/replication/tag.rs +++ b/ecstore/src/bucket/replication/tag.rs @@ -1,4 +1,6 @@ -#[derive(Debug)] +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Deserialize, Serialize, Default)] pub struct Tag { pub key: Option, pub value: Option, diff --git a/ecstore/src/bucket/target/mod.rs b/ecstore/src/bucket/target/mod.rs index c2f2aecfd..cb4fcbdef 100644 --- a/ecstore/src/bucket/target/mod.rs +++ b/ecstore/src/bucket/target/mod.rs @@ -1,6 +1,8 @@ +use serde::{Deserialize, Serialize}; +use std::time::Duration; use time::OffsetDateTime; -#[derive(Debug)] +#[derive(Debug, Deserialize, Serialize, Default)] pub struct Credentials { access_key: String, secret_key: String, @@ -8,93 +10,70 @@ pub struct Credentials { expiration: Option, } -#[derive(Debug)] +#[derive(Debug, Deserialize, Serialize, Default)] pub enum ServiceType { + #[default] Replication, } -// pub struct LatencyStat { -// curr: Duration, // 当前延迟 -// avg: Duration, // 平均延迟 -// max: Duration, // 最大延迟 -// } +#[derive(Debug, Deserialize, Serialize, Default)] +pub struct LatencyStat { + curr: Duration, // 当前延迟 + avg: Duration, // 平均延迟 + max: Duration, // 最大延迟 +} -// #[derive(Serialize, Deserialize, Debug)] -// pub struct LatencyStat { -// curr: Duration, -// avg: Duration, -// max: Duration, -// } +// 定义BucketTarget结构体 +#[derive(Debug, Deserialize, Serialize, Default)] +pub struct BucketTarget { + source_bucket: String, -// // 定义BucketTarget结构体 -// #[derive(Serialize, Deserialize, Debug)] -// pub struct BucketTarget { -// #[serde(rename = "sourcebucket")] -// source_bucket: String, + endpoint: String, -// #[serde(rename = "endpoint")] -// endpoint: String, + credentials: Option, -// #[serde(rename = "credentials")] -// credentials: Option, + target_bucket: String, -// #[serde(rename = "targetbucket")] -// target_bucket: String, + secure: bool, -// #[serde(rename = "secure")] -// secure: bool, + path: Option, -// #[serde(rename = "path", skip_serializing_if = "Option::is_none")] -// path: Option, + api: Option, -// #[serde(rename = "api", skip_serializing_if = "Option::is_none")] -// api: Option, + arn: Option, -// #[serde(rename = "arn", skip_serializing_if = "Option::is_none")] -// arn: Option, + type_: ServiceType, -// #[serde(rename = "type")] -// type_: ServiceType, + region: Option, -// #[serde(rename = "region", skip_serializing_if = "Option::is_none")] -// region: Option, + bandwidth_limit: Option, -// #[serde(rename = "bandwidthlimit")] -// bandwidth_limit: Option, + replication_sync: bool, -// #[serde(rename = "replicationSync")] -// replication_sync: bool, + storage_class: Option, -// #[serde(rename = "storageclass", skip_serializing_if = "Option::is_none")] -// storage_class: Option, + health_check_duration: Option, -// #[serde(rename = "healthCheckDuration")] -// health_check_duration: Option, + disable_proxy: bool, -// #[serde(rename = "disableProxy")] -// disable_proxy: bool, + reset_before_date: Option, -// #[serde(rename = "resetBeforeDate", skip_serializing_if = "Option::is_none")] -// reset_before_date: Option, + reset_id: Option, -// #[serde(rename = "resetID", skip_serializing_if = "Option::is_none")] -// reset_id: Option, + total_downtime: Duration, -// #[serde(rename = "totalDowntime")] -// total_downtime: Duration, + last_online: Option, -// #[serde(rename = "lastOnline")] -// last_online: SystemTime, + online: bool, -// #[serde(rename = "isOnline")] -// online: bool, + latency: LatencyStat, -// #[serde(rename = "latency")] -// latency: LatencyStat, + deployment_id: Option, -// #[serde(rename = "deploymentID", skip_serializing_if = "Option::is_none")] -// deployment_id: Option, + edge: bool, +} -// #[serde(rename = "edge")] -// edge: bool, -// } +#[derive(Debug, Deserialize, Serialize, Default)] +pub struct BucketTargets { + pub targets: Vec, +} diff --git a/ecstore/src/bucket/versioning/mod.rs b/ecstore/src/bucket/versioning/mod.rs index fac9a9516..45d114c28 100644 --- a/ecstore/src/bucket/versioning/mod.rs +++ b/ecstore/src/bucket/versioning/mod.rs @@ -1,5 +1,8 @@ -#[derive(Debug, Clone, PartialEq, Eq, Hash)] +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, PartialEq, Eq, Hash, Default, Deserialize, Serialize)] pub enum State { + #[default] Enabled, Suspended, // 如果未来可能会使用到Disabled状态,可以在这里添加 @@ -22,12 +25,12 @@ impl std::fmt::Display for State { } } -#[derive(Debug)] +#[derive(Debug, Deserialize, Serialize, Default)] pub struct ExcludedPrefix { pub prefix: String, } -#[derive(Debug)] +#[derive(Debug, Deserialize, Serialize, Default)] pub struct Versioning { pub status: State, pub excluded_prefixes: Vec, diff --git a/ecstore/src/disk/mod.rs b/ecstore/src/disk/mod.rs index b691afff6..6261c73b2 100644 --- a/ecstore/src/disk/mod.rs +++ b/ecstore/src/disk/mod.rs @@ -364,6 +364,7 @@ pub struct ReadOptions { // } // } +#[derive(Debug)] pub enum FileWriter { Local(LocalFileWriter), Remote(RemoteFileWriter), @@ -378,7 +379,7 @@ impl Write for FileWriter { } } } - +#[derive(Debug)] pub struct LocalFileWriter { pub inner: File, } @@ -399,6 +400,7 @@ impl Write for LocalFileWriter { } } +#[derive(Debug)] pub struct RemoteFileWriter { pub root: PathBuf, pub volume: String, diff --git a/ecstore/src/lib.rs b/ecstore/src/lib.rs index 7750647e8..059c3f41a 100644 --- a/ecstore/src/lib.rs +++ b/ecstore/src/lib.rs @@ -16,4 +16,4 @@ pub mod store_api; mod store_init; mod utils; -mod bucket; +pub mod bucket; diff --git a/ecstore/src/store.rs b/ecstore/src/store.rs index a92177a6e..cdea15eb1 100644 --- a/ecstore/src/store.rs +++ b/ecstore/src/store.rs @@ -1,6 +1,6 @@ #![allow(clippy::map_entry)] use crate::{ - bucket_meta::BucketMetadata, + bucket::BucketMetadata, disk::{error::DiskError, new_disk, DiskOption, DiskStore, WalkDirOptions, BUCKET_META_PREFIX, RUSTFS_META_BUCKET}, endpoints::{EndpointServerPools, SetupType}, error::{Error, Result},