From ccf9e39df2a8d979adfb51786db8d2a3c5888a61 Mon Sep 17 00:00:00 2001 From: nanhe Date: Mon, 10 Mar 2025 11:50:07 +0800 Subject: [PATCH] feat: support profileFile in cli_profile provider --- credentials/internal/http/http_test.go | 4 ++-- credentials/providers/cli_profile.go | 15 ++++++++++++++- credentials/providers/cli_profile_test.go | 11 +++++++++++ 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/credentials/internal/http/http_test.go b/credentials/internal/http/http_test.go index e4e71d0..38e1426 100644 --- a/credentials/internal/http/http_test.go +++ b/credentials/internal/http/http_test.go @@ -51,7 +51,7 @@ func TestDoGet(t *testing.T) { assert.Nil(t, err) assert.NotNil(t, res) assert.Equal(t, 200, res.StatusCode) - assert.Equal(t, "text/html; charset=utf-8", res.Headers["Content-Type"]) + assert.Equal(t, "text/html;charset=UTF-8", res.Headers["Content-Type"]) req = &Request{ Method: "GET", @@ -61,7 +61,7 @@ func TestDoGet(t *testing.T) { assert.Nil(t, err) assert.NotNil(t, res) assert.Equal(t, 200, res.StatusCode) - assert.Equal(t, "text/html; charset=utf-8", res.Headers["Content-Type"]) + assert.Equal(t, "text/html;charset=UTF-8", res.Headers["Content-Type"]) } func TestDoPost(t *testing.T) { diff --git a/credentials/providers/cli_profile.go b/credentials/providers/cli_profile.go index c58f6a9..459c761 100644 --- a/credentials/providers/cli_profile.go +++ b/credentials/providers/cli_profile.go @@ -13,6 +13,7 @@ import ( ) type CLIProfileCredentialsProvider struct { + profileFile string profileName string innerProvider CredentialsProvider } @@ -21,12 +22,24 @@ type CLIProfileCredentialsProviderBuilder struct { provider *CLIProfileCredentialsProvider } +func (b *CLIProfileCredentialsProviderBuilder) WithProfileFile(profileFile string) *CLIProfileCredentialsProviderBuilder { + b.provider.profileFile = profileFile + return b +} + func (b *CLIProfileCredentialsProviderBuilder) WithProfileName(profileName string) *CLIProfileCredentialsProviderBuilder { b.provider.profileName = profileName return b } func (b *CLIProfileCredentialsProviderBuilder) Build() (provider *CLIProfileCredentialsProvider, err error) { + // 优先级: + // 1. 使用显示指定的 profileFile + // 2. 使用环境变量(ALIBABA_CLOUD_CONFIG_FILE)指定的 profileFile + // 3. 兜底使用 path.Join(homeDir, ".aliyun/config") 作为 profileFile + if b.provider.profileFile == "" { + b.provider.profileFile = os.Getenv("ALIBABA_CLOUD_CONFIG_FILE") + } // 优先级: // 1. 使用显示指定的 profileName // 2. 使用环境变量(ALIBABA_CLOUD_PROFILE)制定的 profileName @@ -181,7 +194,7 @@ var getHomePath = utils.GetHomePath func (provider *CLIProfileCredentialsProvider) GetCredentials() (cc *Credentials, err error) { if provider.innerProvider == nil { - cfgPath := os.Getenv("ALIBABA_CLOUD_CONFIG_FILE") + cfgPath := provider.profileFile if cfgPath == "" { homeDir := getHomePath() if homeDir == "" { diff --git a/credentials/providers/cli_profile_test.go b/credentials/providers/cli_profile_test.go index 40fc8df..422c8e0 100644 --- a/credentials/providers/cli_profile_test.go +++ b/credentials/providers/cli_profile_test.go @@ -213,12 +213,23 @@ func TestCLIProfileCredentialsProvider_GetCredentials(t *testing.T) { _, err = provider.GetCredentials() assert.EqualError(t, err, "reading aliyun cli config from '/path/invalid/home/dir/.aliyun/config.json' failed open /path/invalid/home/dir/.aliyun/config.json: no such file or directory") + // testcase: specify credentials file + provider, err = NewCLIProfileCredentialsProviderBuilder().WithProfileFile("/path/to/config.invalid").Build() + assert.Nil(t, err) + _, err = provider.GetCredentials() + assert.EqualError(t, err, "reading aliyun cli config from '/path/to/config.invalid' failed open /path/to/config.invalid: no such file or directory") + // testcase: specify credentials file with env os.Setenv("ALIBABA_CLOUD_CONFIG_FILE", "/path/to/config.invalid") provider, err = NewCLIProfileCredentialsProviderBuilder().Build() assert.Nil(t, err) _, err = provider.GetCredentials() assert.EqualError(t, err, "reading aliyun cli config from '/path/to/config.invalid' failed open /path/to/config.invalid: no such file or directory") + + provider, err = NewCLIProfileCredentialsProviderBuilder().WithProfileFile("/path/to/config1.invalid").Build() + assert.Nil(t, err) + _, err = provider.GetCredentials() + assert.EqualError(t, err, "reading aliyun cli config from '/path/to/config1.invalid' failed open /path/to/config1.invalid: no such file or directory") os.Unsetenv("ALIBABA_CLOUD_CONFIG_FILE") getHomePath = func() string {