@@ -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+
30783394var _ configtesting.TestDriver = & testDriver {}
30793395
30803396type 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