Skip to content

Commit 64db1a7

Browse files
authored
{configure} Add --endpoint-type profile configuration (#1278)
* add endpoint profile * tests * add tests * fix tests * refine * refine
1 parent 43ceb85 commit 64db1a7

File tree

12 files changed

+368
-27
lines changed

12 files changed

+368
-27
lines changed

config/configure_get.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,8 @@ func doConfigureGet(c *cli.Context, args []string) error {
9999
cli.Printf(c.Stdout(), "cloud-sso-account-id=%s\n", profile.CloudSSOAccountId)
100100
case OAuthSiteTypeName:
101101
cli.Printf(c.Stdout(), "oauth-site-type=%s\n", profile.OAuthSiteType)
102+
case EndpointTypeFlagName:
103+
cli.Printf(c.Stdout(), "endpoint-type=%s\n", profile.EndpointType)
102104
}
103105
}
104106

config/configure_get_test.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,3 +163,54 @@ func TestDoConfigureGetCloudSSO(t *testing.T) {
163163
"cloud-sso-account-id=account-123456\n\n"
164164
assert.Equal(t, expected, stdout.String())
165165
}
166+
167+
func TestDoConfigureGetEndpointType(t *testing.T) {
168+
// 设置测试环境
169+
stdout := new(bytes.Buffer)
170+
stderr := new(bytes.Buffer)
171+
ctx := cli.NewCommandContext(stdout, stderr)
172+
AddFlags(ctx.Flags())
173+
originhook := hookLoadConfigurationWithContext
174+
defer func() {
175+
hookLoadConfigurationWithContext = originhook
176+
}()
177+
178+
hookLoadConfigurationWithContext = func(fn func(ctx *cli.Context) (*Configuration, error)) func(ctx *cli.Context) (*Configuration, error) {
179+
return func(ctx *cli.Context) (*Configuration, error) {
180+
return &Configuration{
181+
CurrentProfile: "default",
182+
Profiles: []Profile{
183+
{
184+
Name: "default",
185+
Mode: AK,
186+
EndpointType: "vpc",
187+
},
188+
},
189+
}, nil
190+
}
191+
}
192+
193+
stdout.Reset()
194+
stderr.Reset()
195+
doConfigureGet(ctx, []string{EndpointTypeFlagName})
196+
assert.Equal(t, "endpoint-type=vpc\n\n", stdout.String())
197+
198+
hookLoadConfigurationWithContext = func(fn func(ctx *cli.Context) (*Configuration, error)) func(ctx *cli.Context) (*Configuration, error) {
199+
return func(ctx *cli.Context) (*Configuration, error) {
200+
return &Configuration{
201+
CurrentProfile: "default",
202+
Profiles: []Profile{
203+
{
204+
Name: "default",
205+
Mode: AK,
206+
EndpointType: "",
207+
},
208+
},
209+
}, nil
210+
}
211+
}
212+
stdout.Reset()
213+
stderr.Reset()
214+
doConfigureGet(ctx, []string{EndpointTypeFlagName})
215+
assert.Equal(t, "endpoint-type=\n\n", stdout.String())
216+
}

config/configure_set.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ func doConfigureSet(ctx *cli.Context) error {
126126
profile.ConnectTimeout = ConnectTimeoutFlag(flags).GetIntegerOrDefault(profile.ConnectTimeout)
127127
profile.RetryCount = RetryCountFlag(flags).GetIntegerOrDefault(profile.RetryCount)
128128
profile.StsRegion = StsRegionFlag(flags).GetStringOrDefault(profile.StsRegion)
129+
profile.EndpointType = EndpointTypeFlag(flags).GetStringOrDefault(profile.EndpointType)
129130

130131
err = profile.Validate()
131132
if err != nil {

config/configure_set_test.go

Lines changed: 64 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -29,24 +29,24 @@ func TestDoConfigureSet(t *testing.T) {
2929
ctx := cli.NewCommandContext(stdout, stderr)
3030
AddFlags(ctx.Flags())
3131

32-
originhook := hookLoadConfigurationWithContext
32+
originhook := hookLoadOrCreateConfiguration
3333
originhookSave := hookSaveConfigurationWithContext
3434
defer func() {
35-
hookLoadConfigurationWithContext = originhook
35+
hookLoadOrCreateConfiguration = originhook
3636
hookSaveConfigurationWithContext = originhookSave
3737
}()
38-
hookLoadConfigurationWithContext = func(fn func(ctx *cli.Context) (*Configuration, error)) func(ctx *cli.Context) (*Configuration, error) {
39-
return func(ctx *cli.Context) (*Configuration, error) {
38+
hookLoadOrCreateConfiguration = func(fn func(path string) (*Configuration, error)) func(path string) (*Configuration, error) {
39+
return func(path string) (*Configuration, error) {
4040
return &Configuration{}, errors.New("error")
4141
}
4242
}
4343
err := doConfigureSet(ctx)
4444
assert.NotNil(t, err)
45-
assert.Equal(t, "fail to set configuration: region can't be empty", err.Error())
45+
assert.Equal(t, "load configuration failed error", err.Error())
4646

4747
//testcase2
48-
hookLoadConfigurationWithContext = func(fn func(ctx *cli.Context) (*Configuration, error)) func(ctx *cli.Context) (*Configuration, error) {
49-
return func(ctx *cli.Context) (*Configuration, error) {
48+
hookLoadOrCreateConfiguration = func(fn func(path string) (*Configuration, error)) func(path string) (*Configuration, error) {
49+
return func(path string) (*Configuration, error) {
5050
return &Configuration{CurrentProfile: "default", Profiles: []Profile{
5151
{Name: "default", Mode: AK, AccessKeyId: "default_aliyun_access_key_id", AccessKeySecret: "default_aliyun_access_key_secret", OutputFormat: "json"},
5252
{Name: "aaa", Mode: AK, AccessKeyId: "sdf", AccessKeySecret: "ddf", OutputFormat: "json"}}}, nil
@@ -67,8 +67,8 @@ func TestDoConfigureSet(t *testing.T) {
6767
assert.Equal(t, "fail to set configuration: region can't be empty", err.Error())
6868

6969
//AK
70-
hookLoadConfigurationWithContext = func(fn func(ctx *cli.Context) (*Configuration, error)) func(ctx *cli.Context) (*Configuration, error) {
71-
return func(ctx *cli.Context) (*Configuration, error) {
70+
hookLoadOrCreateConfiguration = func(fn func(path string) (*Configuration, error)) func(path string) (*Configuration, error) {
71+
return func(path string) (*Configuration, error) {
7272
return &Configuration{
7373
CurrentProfile: "default",
7474
Profiles: []Profile{
@@ -84,8 +84,8 @@ func TestDoConfigureSet(t *testing.T) {
8484
assert.Empty(t, stdout.String())
8585

8686
//StsToken
87-
hookLoadConfigurationWithContext = func(fn func(ctx *cli.Context) (*Configuration, error)) func(ctx *cli.Context) (*Configuration, error) {
88-
return func(ctx *cli.Context) (*Configuration, error) {
87+
hookLoadOrCreateConfiguration = func(fn func(path string) (*Configuration, error)) func(path string) (*Configuration, error) {
88+
return func(path string) (*Configuration, error) {
8989
return &Configuration{
9090
CurrentProfile: "default",
9191
Profiles: []Profile{
@@ -99,8 +99,8 @@ func TestDoConfigureSet(t *testing.T) {
9999
assert.Empty(t, stdout.String())
100100

101101
//RamRoleArn
102-
hookLoadConfigurationWithContext = func(fn func(ctx *cli.Context) (*Configuration, error)) func(ctx *cli.Context) (*Configuration, error) {
103-
return func(ctx *cli.Context) (*Configuration, error) {
102+
hookLoadOrCreateConfiguration = func(fn func(path string) (*Configuration, error)) func(path string) (*Configuration, error) {
103+
return func(path string) (*Configuration, error) {
104104
return &Configuration{
105105
CurrentProfile: "default",
106106
Profiles: []Profile{
@@ -114,8 +114,8 @@ func TestDoConfigureSet(t *testing.T) {
114114
assert.Empty(t, stdout.String())
115115

116116
//EcsRamRole
117-
hookLoadConfigurationWithContext = func(fn func(ctx *cli.Context) (*Configuration, error)) func(ctx *cli.Context) (*Configuration, error) {
118-
return func(ctx *cli.Context) (*Configuration, error) {
117+
hookLoadOrCreateConfiguration = func(fn func(path string) (*Configuration, error)) func(path string) (*Configuration, error) {
118+
return func(path string) (*Configuration, error) {
119119
return &Configuration{CurrentProfile: "default", Profiles: []Profile{{Name: "default", Mode: EcsRamRole, RamRoleName: "RamRoleName", AccessKeyId: "default_aliyun_access_key_id", AccessKeySecret: "default_aliyun_access_key_secret", OutputFormat: "json", RegionId: "cn-hangzhou"}, {Name: "aaa", Mode: AK, AccessKeyId: "sdf", AccessKeySecret: "ddf", OutputFormat: "json"}}}, nil
120120
}
121121
}
@@ -125,8 +125,8 @@ func TestDoConfigureSet(t *testing.T) {
125125
assert.Empty(t, stdout.String())
126126

127127
// RamRoleArnWithEcs
128-
hookLoadConfigurationWithContext = func(fn func(ctx *cli.Context) (*Configuration, error)) func(ctx *cli.Context) (*Configuration, error) {
129-
return func(ctx *cli.Context) (*Configuration, error) {
128+
hookLoadOrCreateConfiguration = func(fn func(path string) (*Configuration, error)) func(path string) (*Configuration, error) {
129+
return func(path string) (*Configuration, error) {
130130
return &Configuration{
131131
CurrentProfile: "default",
132132
Profiles: []Profile{
@@ -140,8 +140,8 @@ func TestDoConfigureSet(t *testing.T) {
140140
assert.Empty(t, stdout.String())
141141

142142
// RsaKeyPair
143-
hookLoadConfigurationWithContext = func(fn func(ctx *cli.Context) (*Configuration, error)) func(ctx *cli.Context) (*Configuration, error) {
144-
return func(ctx *cli.Context) (*Configuration, error) {
143+
hookLoadOrCreateConfiguration = func(fn func(path string) (*Configuration, error)) func(path string) (*Configuration, error) {
144+
return func(path string) (*Configuration, error) {
145145
return &Configuration{
146146
CurrentProfile: "default", Profiles: []Profile{
147147
{Name: "default", Mode: RsaKeyPair, KeyPairName: "KeyPairName", PrivateKey: "PrivateKey", AccessKeyId: "default_aliyun_access_key_id", AccessKeySecret: "default_aliyun_access_key_secret", OutputFormat: "json", RegionId: "cn-hangzhou"},
@@ -154,8 +154,8 @@ func TestDoConfigureSet(t *testing.T) {
154154
assert.Empty(t, stdout.String())
155155

156156
// External
157-
hookLoadConfigurationWithContext = func(fn func(ctx *cli.Context) (*Configuration, error)) func(ctx *cli.Context) (*Configuration, error) {
158-
return func(ctx *cli.Context) (*Configuration, error) {
157+
hookLoadOrCreateConfiguration = func(fn func(path string) (*Configuration, error)) func(path string) (*Configuration, error) {
158+
return func(path string) (*Configuration, error) {
159159
return &Configuration{
160160
CurrentProfile: "default",
161161
Profiles: []Profile{
@@ -168,8 +168,8 @@ func TestDoConfigureSet(t *testing.T) {
168168
doConfigureSet(ctx)
169169
assert.Empty(t, stdout.String())
170170
// OIDC
171-
hookLoadConfigurationWithContext = func(fn func(ctx *cli.Context) (*Configuration, error)) func(ctx *cli.Context) (*Configuration, error) {
172-
return func(ctx *cli.Context) (*Configuration, error) {
171+
hookLoadOrCreateConfiguration = func(fn func(path string) (*Configuration, error)) func(path string) (*Configuration, error) {
172+
return func(path string) (*Configuration, error) {
173173
return &Configuration{
174174
CurrentProfile: "default",
175175
Profiles: []Profile{
@@ -185,8 +185,8 @@ func TestDoConfigureSet(t *testing.T) {
185185
assert.Empty(t, stdout.String())
186186

187187
// CloudSSO
188-
hookLoadConfigurationWithContext = func(fn func(ctx *cli.Context) (*Configuration, error)) func(ctx *cli.Context) (*Configuration, error) {
189-
return func(ctx *cli.Context) (*Configuration, error) {
188+
hookLoadOrCreateConfiguration = func(fn func(path string) (*Configuration, error)) func(path string) (*Configuration, error) {
189+
return func(path string) (*Configuration, error) {
190190
return &Configuration{
191191
CurrentProfile: "default",
192192
Profiles: []Profile{
@@ -203,3 +203,42 @@ func TestDoConfigureSet(t *testing.T) {
203203
doConfigureSet(ctx)
204204
assert.Empty(t, stdout.String())
205205
}
206+
207+
func TestDoConfigureSetWithMock(t *testing.T) {
208+
stdout := new(bytes.Buffer)
209+
stderr := new(bytes.Buffer)
210+
ctx := cli.NewCommandContext(stdout, stderr)
211+
AddFlags(ctx.Flags())
212+
213+
originhook := hookLoadOrCreateConfiguration
214+
originhookSave := hookSaveConfigurationWithContext
215+
defer func() {
216+
hookLoadOrCreateConfiguration = originhook
217+
hookSaveConfigurationWithContext = originhookSave
218+
}()
219+
220+
// EndpointType
221+
hookLoadOrCreateConfiguration = func(fn func(path string) (*Configuration, error)) func(path string) (*Configuration, error) {
222+
return func(path string) (*Configuration, error) {
223+
return &Configuration{
224+
CurrentProfile: "default",
225+
Profiles: []Profile{
226+
{Name: "default", Mode: AK, EndpointType: "vpc", AccessKeyId: "default_aliyun_access_key_id", AccessKeySecret: "default_aliyun_access_key_secret", OutputFormat: "json", RegionId: "cn-hangzhou"},
227+
{Name: "aaa", Mode: AK, AccessKeyId: "sdf", AccessKeySecret: "ddf", OutputFormat: "json"}}}, nil
228+
}
229+
}
230+
hookSaveConfigurationWithContext = func(fn func(ctx *cli.Context, config *Configuration) error) func(ctx *cli.Context, config *Configuration) error {
231+
return func(ctx *cli.Context, config *Configuration) error {
232+
return nil
233+
}
234+
}
235+
endpointTypeFlag := EndpointTypeFlag(ctx.Flags())
236+
if endpointTypeFlag != nil {
237+
endpointTypeFlag.SetAssigned(true)
238+
endpointTypeFlag.SetValue("testabc")
239+
}
240+
stdout.Reset()
241+
stderr.Reset()
242+
doConfigureSet(ctx)
243+
assert.Empty(t, stdout.String())
244+
}

config/configure_test.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,11 @@ func TestNewConfigureCommand(t *testing.T) {
7777
ctx := cli.NewCommandContext(w, stderr)
7878
AddFlags(ctx.Flags())
7979

80+
hookLoadConfigurationWithContext = func(fn func(ctx *cli.Context) (*Configuration, error)) func(ctx *cli.Context) (*Configuration, error) {
81+
return func(ctx *cli.Context) (*Configuration, error) {
82+
return nil, fmt.Errorf("load configuration failed")
83+
}
84+
}
8085
// testcase
8186
err := configureGet.Run(ctx, []string{"get"})
8287
assert.NotNil(t, err)

config/flags.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ const (
4949
CloudSSOAccessConfigFlagName = "cloud-sso-access-config"
5050
CloudSSOAccountIdFlagName = "cloud-sso-account-id"
5151
OAuthSiteTypeName = "oauth-site-type"
52+
EndpointTypeFlagName = "endpoint-type"
5253
)
5354

5455
func AddFlags(fs *cli.FlagSet) {
@@ -81,6 +82,7 @@ func AddFlags(fs *cli.FlagSet) {
8182
fs.Add(NewCloudSSOAccessConfigFlag())
8283
fs.Add(NewCloudSSOAccountIdFlag())
8384
fs.Add(NewOAuthSiteTypeFlag())
85+
fs.Add(NewEndpointTypeFlag())
8486
}
8587

8688
func ConnectTimeoutFlag(fs *cli.FlagSet) *cli.Flag {
@@ -529,3 +531,19 @@ func NewOAuthSiteTypeFlag() *cli.Flag {
529531
"使用 `--oauth-site-type` 指定 OAuth 站点类型, 支持 CN|INTL"),
530532
}
531533
}
534+
535+
func EndpointTypeFlag(fs *cli.FlagSet) *cli.Flag {
536+
return fs.Get(EndpointTypeFlagName)
537+
}
538+
539+
func NewEndpointTypeFlag() *cli.Flag {
540+
return &cli.Flag{
541+
Category: "config",
542+
Name: EndpointTypeFlagName,
543+
AssignedMode: cli.AssignedOnce,
544+
Persistent: true,
545+
Short: i18n.T(
546+
"use `--endpoint-type` to specify the endpoint type, support vpc or empty (default public)",
547+
"使用 `--endpoint-type` 指定 endpoint 类型, 支持 vpc 或空值(默认公网)"),
548+
}
549+
}

config/flags_test.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -460,4 +460,22 @@ func TestAddFlags(t *testing.T) {
460460
AddFlags(flagSet)
461461
// 结果包含OAuthSiteTypeName
462462
assert.NotNil(t, flagSet.Get(OAuthSiteTypeName))
463+
// 结果包含EndpointTypeFlagName
464+
assert.NotNil(t, flagSet.Get(EndpointTypeFlagName))
465+
}
466+
467+
func TestNewEndpointTypeFlag(t *testing.T) {
468+
var a = NewEndpointTypeFlag()
469+
assert.Equal(t, EndpointTypeFlagName, a.Name)
470+
assert.Equal(t, "config", a.Category)
471+
assert.True(t, a.Persistent)
472+
assert.Equal(t, cli.AssignedOnce, a.AssignedMode)
473+
}
474+
475+
func TestEndpointTypeFlag(t *testing.T) {
476+
flagSet := cli.NewFlagSet()
477+
AddFlags(flagSet)
478+
flag := EndpointTypeFlag(flagSet)
479+
assert.NotNil(t, flag)
480+
assert.Equal(t, EndpointTypeFlagName, flag.Name)
463481
}

config/profile.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ type Profile struct {
9696
OAuthAccessTokenExpire int64 `json:"oauth_access_token_expire,omitempty"`
9797
OAuthRefreshTokenExpire int64 `json:"oauth_refresh_token_expire,omitempty"`
9898
OAuthSiteType string `json:"oauth_site_type,omitempty"` // CN or INTL
99+
EndpointType string `json:"endpoint_type,omitempty"` // vpc or empty (default public)
99100
parent *Configuration //`json:"-"`
100101
}
101102

@@ -224,6 +225,7 @@ func (cp *Profile) OverwriteWithFlags(ctx *cli.Context) {
224225
cp.CloudSSOSignInUrl = CloudSSOSignInUrlFlag(ctx.Flags()).GetStringOrDefault(cp.CloudSSOSignInUrl)
225226
cp.CloudSSOAccessConfig = CloudSSOAccessConfigFlag(ctx.Flags()).GetStringOrDefault(cp.CloudSSOAccessConfig)
226227
cp.CloudSSOAccountId = CloudSSOAccountIdFlag(ctx.Flags()).GetStringOrDefault(cp.CloudSSOAccountId)
228+
cp.EndpointType = EndpointTypeFlag(ctx.Flags()).GetStringOrDefault(cp.EndpointType)
227229

228230
if cp.AccessKeyId == "" {
229231
cp.AccessKeyId = util.GetFromEnv("ALIBABA_CLOUD_ACCESS_KEY_ID", "ALIBABACLOUD_ACCESS_KEY_ID", "ALICLOUD_ACCESS_KEY_ID", "ACCESS_KEY_ID")
@@ -241,6 +243,10 @@ func (cp *Profile) OverwriteWithFlags(ctx *cli.Context) {
241243
cp.RegionId = util.GetFromEnv("ALIBABA_CLOUD_REGION_ID", "ALIBABACLOUD_REGION_ID", "ALICLOUD_REGION_ID", "REGION_ID", "REGION")
242244
}
243245

246+
if cp.EndpointType == "" {
247+
cp.EndpointType = util.GetFromEnv("ALIBABA_CLOUD_ENDPOINT_TYPE", "ALIBABACLOUD_ENDPOINT_TYPE", "ALICLOUD_ENDPOINT_TYPE", "ENDPOINT_TYPE")
248+
}
249+
244250
if cp.CredentialsURI == "" {
245251
cp.CredentialsURI = os.Getenv("ALIBABA_CLOUD_CREDENTIALS_URI")
246252
}

0 commit comments

Comments
 (0)