This is an automated email from the ASF dual-hosted git repository.
xuanwo pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-opendal.git
The following commit(s) were added to refs/heads/main by this push:
new dcafa534 feat(services/gcs): Allow setting PredefinedAcl (#1989)
dcafa534 is described below
commit dcafa534f7f9349bec9b47eb320ce67c5d318ce6
Author: silver-ymz <[email protected]>
AuthorDate: Fri Apr 14 15:54:42 2023 +0800
feat(services/gcs): Allow setting PredefinedAcl (#1989)
---
core/src/services/gcs/backend.rs | 25 +++++++++++++++++++++++++
core/src/services/gcs/core.rs | 8 +++++++-
2 files changed, 32 insertions(+), 1 deletion(-)
diff --git a/core/src/services/gcs/backend.rs b/core/src/services/gcs/backend.rs
index 00159ac0..619d3c34 100644
--- a/core/src/services/gcs/backend.rs
+++ b/core/src/services/gcs/backend.rs
@@ -61,6 +61,7 @@ const DEFAULT_GCS_SCOPE: &str =
"https://www.googleapis.com/auth/devstorage.read
/// - `bucket`: Set the container name for backend
/// - `endpoint`: Customizable endpoint setting
/// - `credentials`: Credential string for GCS OAuth2
+/// - `predefined_acl`: Predefined ACL for GCS
///
/// You can refer to [`GcsBuilder`]'s docs for more information
///
@@ -85,6 +86,8 @@ const DEFAULT_GCS_SCOPE: &str =
"https://www.googleapis.com/auth/devstorage.read
/// builder.root("/path/to/dir");
/// // set the credentials for GCS OAUTH2 authentication
/// builder.credential("authentication token");
+/// // set the predefined ACL for GCS
+/// builder.predefined_acl("publicRead");
///
/// let op: Operator = Operator::new(builder)?.finish();
/// Ok(())
@@ -111,6 +114,7 @@ pub struct GcsBuilder {
http_client: Option<HttpClient>,
customed_token_loader: Option<Box<dyn GoogleTokenLoad>>,
+ predefined_acl: Option<String>,
}
impl GcsBuilder {
@@ -198,6 +202,22 @@ impl GcsBuilder {
self.customed_token_loader = Some(token_load);
self
}
+
+ /// Set the predefined acl for GCS.
+ ///
+ /// Available values are:
+ /// - `authenticatedRead`
+ /// - `bucketOwnerFullControl`
+ /// - `bucketOwnerRead`
+ /// - `private`
+ /// - `projectPrivate`
+ /// - `publicRead`
+ pub fn predefined_acl(&mut self, acl: &str) -> &mut Self {
+ if !acl.is_empty() {
+ self.predefined_acl = Some(acl.to_string())
+ };
+ self
+ }
}
impl Debug for GcsBuilder {
@@ -210,6 +230,9 @@ impl Debug for GcsBuilder {
if self.credential.is_some() {
ds.field("credentials", &"<redacted>");
}
+ if self.predefined_acl.is_some() {
+ ds.field("predefined_acl", &self.predefined_acl);
+ }
ds.finish()
}
}
@@ -226,6 +249,7 @@ impl Builder for GcsBuilder {
map.get("endpoint").map(|v| builder.endpoint(v));
map.get("credential").map(|v| builder.credential(v));
map.get("scope").map(|v| builder.scope(v));
+ map.get("predefined_acl").map(|v| builder.predefined_acl(v));
builder
}
@@ -299,6 +323,7 @@ impl Builder for GcsBuilder {
signer,
token_loader,
credential_loader: cred_loader,
+ predefined_acl: self.predefined_acl.clone(),
}),
};
diff --git a/core/src/services/gcs/core.rs b/core/src/services/gcs/core.rs
index b65db445..780999d5 100644
--- a/core/src/services/gcs/core.rs
+++ b/core/src/services/gcs/core.rs
@@ -44,6 +44,8 @@ pub struct GcsCore {
pub signer: GoogleSigner,
pub token_loader: GoogleTokenLoader,
pub credential_loader: GoogleCredentialLoader,
+
+ pub predefined_acl: Option<String>,
}
impl Debug for GcsCore {
@@ -136,13 +138,17 @@ impl GcsCore {
) -> Result<Request<AsyncBody>> {
let p = build_abs_path(&self.root, path);
- let url = format!(
+ let mut url = format!(
"{}/upload/storage/v1/b/{}/o?uploadType=media&name={}",
self.endpoint,
self.bucket,
percent_encode_path(&p)
);
+ if let Some(acl) = &self.predefined_acl {
+ write!(&mut url, "&predefinedAcl={}", acl).unwrap();
+ }
+
let mut req = Request::post(&url);
if let Some(size) = size {