You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@opendal.apache.org by xu...@apache.org on 2026/03/18 11:06:09 UTC

(opendal-reqsign) branch main updated: feat(volcengine-tos): migrate default credential builder api (#712)

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/opendal-reqsign.git


The following commit(s) were added to refs/heads/main by this push:
     new 4b8be5e  feat(volcengine-tos): migrate default credential builder api (#712)
4b8be5e is described below

commit 4b8be5ec348d29a40c9de77b74b78e8cd053a82c
Author: Xuanwo <gi...@xuanwo.io>
AuthorDate: Wed Mar 18 19:06:04 2026 +0800

    feat(volcengine-tos): migrate default credential builder api (#712)
    
    Migrate the Volcengine TOS default credential provider to the slot-based
    builder API from the default credential provider design. This removes
    the legacy configure/disable env API, keeps env as the only public slot,
    and adds coverage that `no_env()` actually removes the provider from the
    chain.
    
    This PR is part of the service-by-service migration toward the new
    `DefaultCredentialProvider` API documented in
    `docs/default-credential-provider-api.md`.
---
 .../src/provide_credential/default.rs              | 53 ++++++++++++++--------
 1 file changed, 34 insertions(+), 19 deletions(-)

diff --git a/services/volcengine-tos/src/provide_credential/default.rs b/services/volcengine-tos/src/provide_credential/default.rs
index 63cca8e..4c3a2a4 100644
--- a/services/volcengine-tos/src/provide_credential/default.rs
+++ b/services/volcengine-tos/src/provide_credential/default.rs
@@ -77,36 +77,34 @@ impl DefaultCredentialProvider {
 
 /// Builder for `DefaultCredentialProvider`.
 ///
-/// Use `configure_env` to customize environment loading and
-/// `disable_env(bool)` to control participation, then `build()` to create the provider.
-#[derive(Default)]
+/// Use `env(...)` to set the environment provider slot or `no_env()` to remove it.
 pub struct DefaultCredentialProviderBuilder {
     env: Option<EnvCredentialProvider>,
 }
 
+impl Default for DefaultCredentialProviderBuilder {
+    fn default() -> Self {
+        Self {
+            env: Some(EnvCredentialProvider),
+        }
+    }
+}
+
 impl DefaultCredentialProviderBuilder {
     /// Create a new builder with default state.
     pub fn new() -> Self {
         Self::default()
     }
 
-    /// Configure the environment credential provider.
-    pub fn configure_env<F>(mut self, f: F) -> Self
-    where
-        F: FnOnce(EnvCredentialProvider) -> EnvCredentialProvider,
-    {
-        let p = self.env.take().unwrap_or_default();
-        self.env = Some(f(p));
+    /// Set the environment credential provider slot.
+    pub fn env(mut self, provider: EnvCredentialProvider) -> Self {
+        self.env = Some(provider);
         self
     }
 
-    /// Disable (true) or ensure enabled (false) the environment provider.
-    pub fn disable_env(mut self, disable: bool) -> Self {
-        if disable {
-            self.env = None;
-        } else if self.env.is_none() {
-            self.env = Some(EnvCredentialProvider::new());
-        }
+    /// Remove the environment credential provider slot.
+    pub fn no_env(mut self) -> Self {
+        self.env = None;
         self
     }
 
@@ -115,8 +113,6 @@ impl DefaultCredentialProviderBuilder {
         let mut chain = ProvideCredentialChain::new();
         if let Some(p) = self.env {
             chain = chain.push(p);
-        } else {
-            chain = chain.push(EnvCredentialProvider::new());
         }
         DefaultCredentialProvider::with_chain(chain)
     }
@@ -190,4 +186,23 @@ mod tests {
         assert_eq!("secret_access_key", credential.secret_access_key);
         assert_eq!("security_token", credential.session_token.unwrap());
     }
+
+    #[tokio::test]
+    async fn test_default_loader_with_no_env() {
+        let ctx = Context::new().with_env(StaticEnv {
+            home_dir: None,
+            envs: HashMap::from_iter([
+                (ENV_ACCESS_KEY_ID.to_string(), "access_key_id".to_string()),
+                (
+                    ENV_SECRET_ACCESS_KEY.to_string(),
+                    "secret_access_key".to_string(),
+                ),
+            ]),
+        });
+
+        let loader = DefaultCredentialProvider::builder().no_env().build();
+        let credential = loader.provide_credential(&ctx).await.unwrap();
+
+        assert!(credential.is_none());
+    }
 }