Skip to content

Commit e74df01

Browse files
authored
Merge pull request #840 from hashicorp/f-configurable-endpoints
Enables configurable API endpoints
2 parents cb254af + 92e7c3f commit e74df01

File tree

1 file changed

+334
-0
lines changed

1 file changed

+334
-0
lines changed

aws_config_test.go

Lines changed: 334 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3075,6 +3075,322 @@ web_identity_token_file = no-such-file
30753075
}
30763076
}
30773077

3078+
func TestStsEndpoint(t *testing.T) {
3079+
type settype int
3080+
const (
3081+
setNone settype = iota
3082+
setValid
3083+
setInvalid
3084+
)
3085+
testcases := map[string]struct {
3086+
Config Config
3087+
SetServiceEndpoint settype
3088+
SetEnv string
3089+
SetInvalidEnv string
3090+
// Use string at index 1 for valid endpoint url and index 2 for invalid endpoint url
3091+
ConfigFile string
3092+
ExpectedCredentials aws.Credentials
3093+
}{
3094+
"service config": {
3095+
Config: Config{
3096+
AccessKey: servicemocks.MockStaticAccessKey,
3097+
Region: "us-east-1",
3098+
SecretKey: servicemocks.MockStaticSecretKey,
3099+
},
3100+
SetServiceEndpoint: setValid,
3101+
ExpectedCredentials: mockdata.MockStaticCredentials,
3102+
},
3103+
3104+
"service config overrides service envvar": {
3105+
Config: Config{
3106+
AccessKey: servicemocks.MockStaticAccessKey,
3107+
Region: "us-east-1",
3108+
SecretKey: servicemocks.MockStaticSecretKey,
3109+
},
3110+
SetServiceEndpoint: setValid,
3111+
SetInvalidEnv: "AWS_ENDPOINT_URL_STS",
3112+
ExpectedCredentials: mockdata.MockStaticCredentials,
3113+
},
3114+
3115+
"service config overrides base envvar": {
3116+
Config: Config{
3117+
AccessKey: servicemocks.MockStaticAccessKey,
3118+
Region: "us-east-1",
3119+
SecretKey: servicemocks.MockStaticSecretKey,
3120+
},
3121+
SetServiceEndpoint: setValid,
3122+
SetInvalidEnv: "AWS_ENDPOINT_URL",
3123+
ExpectedCredentials: mockdata.MockStaticCredentials,
3124+
},
3125+
3126+
"service config overrides service config_file": {
3127+
Config: Config{
3128+
Profile: "default",
3129+
},
3130+
ConfigFile: `
3131+
[default]
3132+
aws_access_key_id = DefaultSharedCredentialsAccessKey
3133+
aws_secret_access_key = DefaultSharedCredentialsSecretKey
3134+
services = sts-test
3135+
3136+
[services sts-test]
3137+
sts =
3138+
endpoint_url = %[2]s
3139+
`,
3140+
SetServiceEndpoint: setValid,
3141+
ExpectedCredentials: aws.Credentials{
3142+
AccessKeyID: "DefaultSharedCredentialsAccessKey",
3143+
SecretAccessKey: "DefaultSharedCredentialsSecretKey",
3144+
Source: sharedConfigCredentialsProvider,
3145+
},
3146+
},
3147+
3148+
"service config overrides base config_file": {
3149+
Config: Config{
3150+
Profile: "default",
3151+
},
3152+
ConfigFile: `
3153+
[default]
3154+
aws_access_key_id = DefaultSharedCredentialsAccessKey
3155+
aws_secret_access_key = DefaultSharedCredentialsSecretKey
3156+
endpoint_url = %[2]s
3157+
`,
3158+
SetServiceEndpoint: setValid,
3159+
ExpectedCredentials: aws.Credentials{
3160+
AccessKeyID: "DefaultSharedCredentialsAccessKey",
3161+
SecretAccessKey: "DefaultSharedCredentialsSecretKey",
3162+
Source: sharedConfigCredentialsProvider,
3163+
},
3164+
},
3165+
3166+
"service envvar": {
3167+
Config: Config{
3168+
AccessKey: servicemocks.MockStaticAccessKey,
3169+
Region: "us-east-1",
3170+
SecretKey: servicemocks.MockStaticSecretKey,
3171+
},
3172+
SetEnv: "AWS_ENDPOINT_URL_STS",
3173+
ExpectedCredentials: mockdata.MockStaticCredentials,
3174+
},
3175+
3176+
"base envvar": {
3177+
Config: Config{
3178+
AccessKey: servicemocks.MockStaticAccessKey,
3179+
Region: "us-east-1",
3180+
SecretKey: servicemocks.MockStaticSecretKey,
3181+
},
3182+
SetEnv: "AWS_ENDPOINT_URL",
3183+
ExpectedCredentials: mockdata.MockStaticCredentials,
3184+
},
3185+
3186+
"service envvar overrides base envvar": {
3187+
Config: Config{
3188+
AccessKey: servicemocks.MockStaticAccessKey,
3189+
Region: "us-east-1",
3190+
SecretKey: servicemocks.MockStaticSecretKey,
3191+
},
3192+
SetEnv: "AWS_ENDPOINT_URL_STS",
3193+
SetInvalidEnv: "AWS_ENDPOINT_URL",
3194+
ExpectedCredentials: mockdata.MockStaticCredentials,
3195+
},
3196+
3197+
"service config_file": {
3198+
Config: Config{
3199+
Profile: "default",
3200+
},
3201+
ConfigFile: `
3202+
[default]
3203+
aws_access_key_id = DefaultSharedCredentialsAccessKey
3204+
aws_secret_access_key = DefaultSharedCredentialsSecretKey
3205+
services = sts-test
3206+
3207+
[services sts-test]
3208+
sts =
3209+
endpoint_url = %[1]s
3210+
`,
3211+
ExpectedCredentials: aws.Credentials{
3212+
AccessKeyID: "DefaultSharedCredentialsAccessKey",
3213+
SecretAccessKey: "DefaultSharedCredentialsSecretKey",
3214+
Source: sharedConfigCredentialsProvider,
3215+
},
3216+
},
3217+
3218+
"service config_file overrides base config_file": {
3219+
Config: Config{
3220+
Profile: "default",
3221+
},
3222+
ConfigFile: `
3223+
[default]
3224+
aws_access_key_id = DefaultSharedCredentialsAccessKey
3225+
aws_secret_access_key = DefaultSharedCredentialsSecretKey
3226+
services = sts-test
3227+
endpoint_url = %[2]s
3228+
3229+
[services sts-test]
3230+
sts =
3231+
endpoint_url = %[1]s
3232+
`,
3233+
ExpectedCredentials: aws.Credentials{
3234+
AccessKeyID: "DefaultSharedCredentialsAccessKey",
3235+
SecretAccessKey: "DefaultSharedCredentialsSecretKey",
3236+
Source: sharedConfigCredentialsProvider,
3237+
},
3238+
},
3239+
3240+
"service envvar overrides service config_file": {
3241+
Config: Config{
3242+
Profile: "default",
3243+
},
3244+
SetEnv: "AWS_ENDPOINT_URL_STS",
3245+
ConfigFile: `
3246+
[default]
3247+
aws_access_key_id = DefaultSharedCredentialsAccessKey
3248+
aws_secret_access_key = DefaultSharedCredentialsSecretKey
3249+
services = sts-test
3250+
3251+
[services sts-test]
3252+
sts =
3253+
endpoint_url = %[2]s
3254+
`,
3255+
ExpectedCredentials: aws.Credentials{
3256+
AccessKeyID: "DefaultSharedCredentialsAccessKey",
3257+
SecretAccessKey: "DefaultSharedCredentialsSecretKey",
3258+
Source: sharedConfigCredentialsProvider,
3259+
},
3260+
},
3261+
3262+
"base envvar overrides service config_file": {
3263+
Config: Config{
3264+
Profile: "default",
3265+
},
3266+
SetEnv: "AWS_ENDPOINT_URL",
3267+
ConfigFile: `
3268+
[default]
3269+
aws_access_key_id = DefaultSharedCredentialsAccessKey
3270+
aws_secret_access_key = DefaultSharedCredentialsSecretKey
3271+
services = sts-test
3272+
3273+
[services sts-test]
3274+
sts =
3275+
endpoint_url = %[2]s
3276+
`,
3277+
ExpectedCredentials: aws.Credentials{
3278+
AccessKeyID: "DefaultSharedCredentialsAccessKey",
3279+
SecretAccessKey: "DefaultSharedCredentialsSecretKey",
3280+
Source: sharedConfigCredentialsProvider,
3281+
},
3282+
},
3283+
3284+
"base config_file": {
3285+
Config: Config{
3286+
Profile: "default",
3287+
},
3288+
ConfigFile: `
3289+
[default]
3290+
aws_access_key_id = DefaultSharedCredentialsAccessKey
3291+
aws_secret_access_key = DefaultSharedCredentialsSecretKey
3292+
endpoint_url = %[1]s
3293+
`,
3294+
ExpectedCredentials: aws.Credentials{
3295+
AccessKeyID: "DefaultSharedCredentialsAccessKey",
3296+
SecretAccessKey: "DefaultSharedCredentialsSecretKey",
3297+
Source: sharedConfigCredentialsProvider,
3298+
},
3299+
},
3300+
3301+
"base envvar overrides base config_file": {
3302+
Config: Config{
3303+
Profile: "default",
3304+
},
3305+
SetEnv: "AWS_ENDPOINT_URL",
3306+
ConfigFile: `
3307+
[default]
3308+
aws_access_key_id = DefaultSharedCredentialsAccessKey
3309+
aws_secret_access_key = DefaultSharedCredentialsSecretKey
3310+
endpoint_url = %[2]s
3311+
`,
3312+
ExpectedCredentials: aws.Credentials{
3313+
AccessKeyID: "DefaultSharedCredentialsAccessKey",
3314+
SecretAccessKey: "DefaultSharedCredentialsSecretKey",
3315+
Source: sharedConfigCredentialsProvider,
3316+
},
3317+
},
3318+
3319+
"service envvar overrides base config_file": {
3320+
Config: Config{
3321+
Profile: "default",
3322+
},
3323+
SetEnv: "AWS_ENDPOINT_URL_STS",
3324+
ConfigFile: `
3325+
[default]
3326+
aws_access_key_id = DefaultSharedCredentialsAccessKey
3327+
aws_secret_access_key = DefaultSharedCredentialsSecretKey
3328+
endpoint_url = %[2]s
3329+
`,
3330+
ExpectedCredentials: aws.Credentials{
3331+
AccessKeyID: "DefaultSharedCredentialsAccessKey",
3332+
SecretAccessKey: "DefaultSharedCredentialsSecretKey",
3333+
Source: sharedConfigCredentialsProvider,
3334+
},
3335+
},
3336+
}
3337+
3338+
for name, testcase := range testcases {
3339+
testcase := testcase
3340+
3341+
t.Run(name, func(t *testing.T) {
3342+
servicemocks.InitSessionTestEnv(t)
3343+
3344+
ctx := context.Background()
3345+
3346+
ts := servicemocks.MockAwsApiServer("STS", []*servicemocks.MockEndpoint{
3347+
servicemocks.MockStsGetCallerIdentityValidEndpoint,
3348+
})
3349+
defer ts.Close()
3350+
stsEndpoint := ts.URL
3351+
3352+
invalidTS := servicemocks.MockAwsApiServer("STS", []*servicemocks.MockEndpoint{
3353+
servicemocks.MockStsGetCallerIdentityInvalidEndpointAccessDenied,
3354+
})
3355+
defer invalidTS.Close()
3356+
stsInvalidEndpoint := invalidTS.URL
3357+
3358+
if testcase.SetServiceEndpoint == setValid {
3359+
testcase.Config.StsEndpoint = stsEndpoint
3360+
}
3361+
if testcase.SetEnv != "" {
3362+
t.Setenv(testcase.SetEnv, stsEndpoint)
3363+
}
3364+
if testcase.SetInvalidEnv != "" {
3365+
t.Setenv(testcase.SetInvalidEnv, stsInvalidEndpoint)
3366+
}
3367+
if testcase.ConfigFile != "" {
3368+
tempDir := t.TempDir()
3369+
filename := writeSharedConfigFile(t, &testcase.Config, tempDir, fmt.Sprintf(testcase.ConfigFile, stsEndpoint, stsInvalidEndpoint))
3370+
testcase.ExpectedCredentials.Source = sharedConfigCredentialsSource(filename)
3371+
}
3372+
3373+
ctx, awsConfig, diags := GetAwsConfig(ctx, &testcase.Config)
3374+
3375+
if diff := cmp.Diff(diags, diag.Diagnostics{}); diff != "" {
3376+
t.Errorf("Unexpected response (+wanted, -got): %s", diff)
3377+
}
3378+
if diags.HasError() {
3379+
return
3380+
}
3381+
3382+
credentialsValue, err := awsConfig.Credentials.Retrieve(ctx)
3383+
if err != nil {
3384+
t.Fatalf("unexpected credentials Retrieve() error: %s", err)
3385+
}
3386+
3387+
if diff := cmp.Diff(credentialsValue, testcase.ExpectedCredentials, cmpopts.IgnoreFields(aws.Credentials{}, "Expires")); diff != "" {
3388+
t.Fatalf("unexpected credentials: (- got, + expected)\n%s", diff)
3389+
}
3390+
})
3391+
}
3392+
}
3393+
30783394
var _ configtesting.TestDriver = &testDriver{}
30793395

30803396
type testDriver struct {
@@ -4006,3 +4322,21 @@ func configureHcLogger(name string, output io.Writer) hclog.Logger {
40064322

40074323
return logger
40084324
}
4325+
4326+
func writeSharedConfigFile(t *testing.T, config *Config, tempDir, content string) string {
4327+
t.Helper()
4328+
4329+
file, err := os.Create(filepath.Join(tempDir, "aws-sdk-go-base-shared-configuration-file"))
4330+
if err != nil {
4331+
t.Fatalf("creating shared configuration file: %s", err)
4332+
}
4333+
4334+
_, err = file.WriteString(content)
4335+
if err != nil {
4336+
t.Fatalf(" writing shared configuration file: %s", err)
4337+
}
4338+
4339+
config.SharedConfigFiles = append(config.SharedConfigFiles, file.Name())
4340+
4341+
return file.Name()
4342+
}

0 commit comments

Comments
 (0)