diff --git a/tardis/Cargo.toml b/tardis/Cargo.toml index 8d65948..62bef9c 100644 --- a/tardis/Cargo.toml +++ b/tardis/Cargo.toml @@ -218,7 +218,8 @@ lettre = { version = "0.11", features = [ # Object Storage # rust-s3 = { version = "0.33", optional = true } -rust-s3 = { git = "https://github.com/tuist/rust-s3.git", rev = "b80b231" , optional = true } +rust-s3 = { git = "https://github.com/tuist/rust-s3.git", rev = "55f2947", optional = true } +# rust-s3 = { path = "../../rust-s3/s3", optional = true } anyhow = { version = "1.0", optional = true } # K8s diff --git a/tardis/src/os.rs b/tardis/src/os.rs index 0230a85..5851df9 100644 --- a/tardis/src/os.rs +++ b/tardis/src/os.rs @@ -1 +1,2 @@ +pub use s3::serde_types; pub mod os_client; diff --git a/tardis/src/os/os_client.rs b/tardis/src/os/os_client.rs index a7db57f..6a20a3d 100644 --- a/tardis/src/os/os_client.rs +++ b/tardis/src/os/os_client.rs @@ -3,7 +3,7 @@ use std::ops::Deref; use async_trait::async_trait; use s3::creds::Credentials; -use s3::serde_types::Part; +use s3::serde_types::{BucketLifecycleConfiguration, Part}; use s3::{Bucket, BucketConfiguration, Region}; use tracing::{error, info, trace}; @@ -147,6 +147,18 @@ impl TardisOSClient { trace!("[Tardis.OSClient] Deleting object url {}", path); self.get_client().object_delete_url(path, expire_sec, bucket_name).await } + + pub async fn get_lifecycle(&self, bucket_name: Option<&str>) -> TardisResult { + self.get_client().get_lifecycle(bucket_name).await + } + + pub async fn put_lifecycle(&self, bucket_name: Option<&str>, config: BucketLifecycleConfiguration) -> TardisResult<()> { + self.get_client().put_lifecycle(bucket_name, config).await + } + + pub async fn delete_lifecycle(&self, bucket_name: Option<&str>) -> TardisResult<()> { + self.get_client().delete_lifecycle(bucket_name).await + } } #[async_trait] @@ -178,6 +190,12 @@ trait TardisOSOperations { async fn object_get_url(&self, path: &str, expire_sec: u32, bucket_name: Option<&str>) -> TardisResult; async fn object_delete_url(&self, path: &str, expire_sec: u32, bucket_name: Option<&str>) -> TardisResult; + + async fn get_lifecycle(&self, bucket_name: Option<&str>) -> TardisResult; + + async fn put_lifecycle(&self, bucket_name: Option<&str>, config: BucketLifecycleConfiguration) -> TardisResult<()>; + + async fn delete_lifecycle(&self, bucket_name: Option<&str>) -> TardisResult<()>; } #[async_trait] @@ -397,6 +415,23 @@ impl TardisOSOperations for TardisOSS3Client { async fn object_delete_url(&self, path: &str, expire_sec: u32, bucket_name: Option<&str>) -> TardisResult { Ok(self.get_bucket(bucket_name)?.presign_delete(path, expire_sec).await?) } + + async fn get_lifecycle(&self, bucket_name: Option<&str>) -> TardisResult { + let bucket = self.get_bucket(bucket_name)?; + Ok(bucket.get_bucket_lifecycle().await?) + } + + async fn put_lifecycle(&self, bucket_name: Option<&str>, config: BucketLifecycleConfiguration) -> TardisResult<()> { + let bucket = self.get_bucket(bucket_name)?; + bucket.put_bucket_lifecycle(config).await?; + Ok(()) + } + + async fn delete_lifecycle(&self, bucket_name: Option<&str>) -> TardisResult<()> { + let bucket = self.get_bucket(bucket_name)?; + bucket.delete_bucket_lifecycle().await?; + Ok(()) + } } impl TardisOSS3Client { diff --git a/tardis/tests/test_os_client.rs b/tardis/tests/test_os_client.rs index 13883ed..7c09a9a 100644 --- a/tardis/tests/test_os_client.rs +++ b/tardis/tests/test_os_client.rs @@ -1,5 +1,6 @@ use std::env; +use s3::serde_types::LifecycleFilter; use tracing::info; use tardis::basic::result::TardisResult; @@ -33,6 +34,16 @@ async fn test_os_client() -> TardisResult<()> { info!("object_create_url = {:?}", TardisFuns::os().object_exist("test/test1.txt", Some(bucket_name)).await?); + let put_config = s3::serde_types::BucketLifecycleConfiguration::new(vec![s3::serde_types::LifecycleRule::builder("Enabled") + .expiration(s3::serde_types::Expiration::new(None, Some(30), None)) + .filter(LifecycleFilter::new(None, None, None, Some("test".to_string()), None)) + .build()]); + TardisFuns::os().put_lifecycle(Some(bucket_name), put_config.clone()).await?; + + let get_config = TardisFuns::os().get_lifecycle(Some(bucket_name)).await?; + info!("get_lifecycle_rule = {:?}", get_config); + assert_eq!(serde_json::to_string(&put_config).unwrap(), serde_json::to_string(&get_config).unwrap()); + //info!("object_create_url = {}", TardisFuns::os().object_create_url("test/test2.txt", 1, Some(bucket_name.clone()))?); // //info!("object_delete_url = {}", TardisFuns::os().object_delete_url("test/test.txt", 60, Some(bucket_name.clone()))?);