Skip to content

Commit c678304

Browse files
committed
add OpendalStore::new_from_aws_s3_builder
1 parent 0fb5c58 commit c678304

File tree

4 files changed

+61
-17
lines changed

4 files changed

+61
-17
lines changed

integrations/object_store/Cargo.toml

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ version = "0.51.0"
2929

3030
[features]
3131
send_wrapper = ["dep:send_wrapper"]
32-
services-s3 = ["opendal/services-s3"]
32+
services-s3 = ["opendal/services-s3", "object_store/aws"]
3333

3434
[[test]]
3535
harness = false
@@ -39,9 +39,7 @@ path = "tests/behavior/main.rs"
3939
[dependencies]
4040
async-trait = "0.1"
4141
bytes = "1"
42-
flagset = "0.4"
4342
futures = "0.3"
44-
futures-util = "0.3"
4543
object_store = "0.11"
4644
opendal = { version = "0.53.0", path = "../../core", default-features = false }
4745
pin-project = "1.1"

integrations/object_store/examples/basic.rs

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,13 @@
1-
use std::sync::Arc;
2-
31
use bytes::Bytes;
42
use object_store::path::Path;
53
use object_store::ObjectStore;
6-
74
#[cfg(feature = "services-s3")]
8-
use object_store_opendal::AmazonS3Builder;
5+
use object_store_opendal::S3Builder;
96

107
#[cfg(feature = "services-s3")]
118
#[tokio::main]
129
async fn main() {
13-
let s3_store = AmazonS3Builder::new()
10+
let s3_store = S3Builder::new()
1411
.with_access_key_id("my_access_key")
1512
.with_secret_access_key("my_secret_key")
1613
.with_endpoint("my_endpoint")
@@ -19,14 +16,12 @@ async fn main() {
1916
.build()
2017
.unwrap();
2118

22-
let object_store = Arc::new(s3_store);
23-
2419
let path = Path::from("data/nested/test.txt");
2520
let bytes = Bytes::from_static(b"hello, world! I am nested.");
2621

27-
object_store.put(&path, bytes.clone().into()).await.unwrap();
22+
s3_store.put(&path, bytes.clone().into()).await.unwrap();
2823

29-
let content = object_store
24+
let content = s3_store
3025
.get(&path)
3126
.await
3227
.unwrap()

integrations/object_store/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ mod utils;
6868
#[cfg(feature = "services-s3")]
6969
mod s3_builder;
7070
#[cfg(feature = "services-s3")]
71-
pub use s3_builder::AmazonS3Builder;
71+
pub use s3_builder::S3Builder;
7272

7373
// Make sure `send_wrapper` works as expected
7474
#[cfg(all(feature = "send_wrapper", test))]

integrations/object_store/src/s3_builder.rs

Lines changed: 55 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,22 +17,23 @@
1717

1818
use crate::utils::format_object_store_error;
1919
use crate::OpendalStore;
20+
use object_store::aws::AmazonS3ConfigKey;
2021
use opendal::services::S3;
2122
use opendal::Operator;
2223

23-
pub struct AmazonS3Builder {
24+
pub struct S3Builder {
2425
builder: S3,
2526
}
2627

27-
impl Default for AmazonS3Builder {
28+
impl Default for S3Builder {
2829
fn default() -> Self {
2930
Self::new()
3031
}
3132
}
3233

33-
impl AmazonS3Builder {
34+
impl S3Builder {
3435
pub fn new() -> Self {
35-
AmazonS3Builder {
36+
S3Builder {
3637
builder: S3::default(),
3738
}
3839
}
@@ -87,6 +88,7 @@ impl AmazonS3Builder {
8788
}
8889
self
8990
}
91+
9092
pub fn build(self) -> object_store::Result<OpendalStore> {
9193
let op = Operator::new(self.builder)
9294
.map_err(|err| format_object_store_error(err, ""))?
@@ -95,3 +97,52 @@ impl AmazonS3Builder {
9597
Ok(OpendalStore::new(op))
9698
}
9799
}
100+
impl OpendalStore {
101+
pub fn new_from_aws_s3_builder(
102+
builder: object_store::aws::AmazonS3Builder,
103+
) -> object_store::Result<OpendalStore> {
104+
let mut s3 = S3Builder::new();
105+
if let Some(endpoint) = builder.get_config_value(&AmazonS3ConfigKey::Endpoint) {
106+
s3 = s3.with_endpoint(endpoint.as_str());
107+
}
108+
if let Some(region) = builder.get_config_value(&AmazonS3ConfigKey::Region) {
109+
s3 = s3.with_region(region.as_str());
110+
}
111+
if let Some(bucket_name) = builder.get_config_value(&AmazonS3ConfigKey::Bucket) {
112+
s3 = s3.with_bucket_name(bucket_name.as_str());
113+
}
114+
if let Some(access_key_id) = builder.get_config_value(&AmazonS3ConfigKey::AccessKeyId) {
115+
s3 = s3.with_access_key_id(access_key_id.as_str());
116+
}
117+
if let Some(secret_access_key) =
118+
builder.get_config_value(&AmazonS3ConfigKey::SecretAccessKey)
119+
{
120+
s3 = s3.with_secret_access_key(secret_access_key.as_str());
121+
}
122+
if let Some(token) = builder.get_config_value(&AmazonS3ConfigKey::Token) {
123+
s3 = s3.with_token(token.as_str());
124+
}
125+
if let Some(virtual_hosted_style_request) =
126+
builder.get_config_value(&AmazonS3ConfigKey::VirtualHostedStyleRequest)
127+
{
128+
let r = virtual_hosted_style_request
129+
.parse::<bool>()
130+
.map_err(|err| object_store::Error::Generic {
131+
store: "s3",
132+
source: Box::new(err),
133+
})?;
134+
s3 = s3.with_virtual_hosted_style_request(r);
135+
}
136+
if let Some(skip_signature) = builder.get_config_value(&AmazonS3ConfigKey::SkipSignature) {
137+
let r = skip_signature
138+
.parse::<bool>()
139+
.map_err(|err| object_store::Error::Generic {
140+
store: "s3",
141+
source: Box::new(err),
142+
})?;
143+
s3 = s3.with_skip_signature(r);
144+
}
145+
146+
s3.build()
147+
}
148+
}

0 commit comments

Comments
 (0)