2023-03-15 16:00:52 +00:00
// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0
2017-08-03 17:24:27 +00:00
package s3
2015-05-20 14:54:26 +00:00
import (
2023-01-17 19:15:40 +00:00
"context"
2015-05-20 14:54:26 +00:00
"fmt"
"math/rand"
"os"
"testing"
"time"
2023-01-17 19:15:40 +00:00
"github.com/aws/aws-sdk-go-v2/config"
2020-01-09 22:58:33 +00:00
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/s3"
2018-04-03 00:46:59 +00:00
log "github.com/hashicorp/go-hclog"
2021-07-21 00:42:00 +00:00
"github.com/hashicorp/go-secure-stdlib/awsutil"
2019-04-12 21:54:35 +00:00
"github.com/hashicorp/vault/sdk/helper/logging"
"github.com/hashicorp/vault/sdk/physical"
2015-05-20 14:54:26 +00:00
)
2019-01-26 21:48:08 +00:00
func TestDefaultS3Backend ( t * testing . T ) {
DoS3BackendTest ( t , "" )
}
func TestS3BackendSseKms ( t * testing . T ) {
DoS3BackendTest ( t , "alias/aws/s3" )
}
func DoS3BackendTest ( t * testing . T , kmsKeyId string ) {
2019-04-22 16:26:10 +00:00
if enabled := os . Getenv ( "VAULT_ACC" ) ; enabled == "" {
t . Skip ( )
}
2023-01-17 19:15:40 +00:00
if ! hasAWSCredentials ( ) {
t . Skip ( "Skipping because AWS credentials could not be resolved. See https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html#specifying-credentials for information on how to set up AWS credentials." )
}
2020-09-28 21:06:49 +00:00
logger := logging . NewVaultLogger ( log . Debug )
credsConfig := & awsutil . CredentialsConfig { Logger : logger }
2017-06-16 15:09:15 +00:00
credsChain , err := credsConfig . GenerateCredentialChain ( )
if err != nil {
2019-12-04 14:18:45 +00:00
t . Fatal ( err )
2015-05-21 00:42:41 +00:00
}
2015-05-20 14:54:26 +00:00
2017-06-16 15:09:15 +00:00
_ , err = credsChain . Get ( )
2015-05-20 14:54:26 +00:00
if err != nil {
2019-12-04 14:18:45 +00:00
t . Fatal ( err )
2015-05-20 14:54:26 +00:00
}
2015-11-04 12:34:40 +00:00
// If the variable is empty or doesn't exist, the default
// AWS endpoints will be used
endpoint := os . Getenv ( "AWS_S3_ENDPOINT" )
2015-05-20 14:54:26 +00:00
region := os . Getenv ( "AWS_DEFAULT_REGION" )
if region == "" {
region = "us-east-1"
}
2020-01-09 22:58:33 +00:00
sess , err := session . NewSession ( & aws . Config {
2017-06-16 15:09:15 +00:00
Credentials : credsChain ,
2015-11-04 12:34:40 +00:00
Endpoint : aws . String ( endpoint ) ,
2015-08-06 16:37:08 +00:00
Region : aws . String ( region ) ,
2020-01-09 22:58:33 +00:00
} )
if err != nil {
t . Fatal ( err )
}
s3conn := s3 . New ( sess )
2015-05-20 14:54:26 +00:00
2021-04-08 16:43:39 +00:00
randInt := rand . New ( rand . NewSource ( time . Now ( ) . UnixNano ( ) ) ) . Int ( )
2015-05-20 14:54:26 +00:00
bucket := fmt . Sprintf ( "vault-s3-testacc-%d" , randInt )
_ , err = s3conn . CreateBucket ( & s3 . CreateBucketInput {
Bucket : aws . String ( bucket ) ,
} )
if err != nil {
t . Fatalf ( "unable to create test bucket: %s" , err )
}
defer func ( ) {
// Gotta list all the objects and delete them
// before being able to delete the bucket
listResp , _ := s3conn . ListObjects ( & s3 . ListObjectsInput {
Bucket : aws . String ( bucket ) ,
} )
objects := & s3 . Delete { }
for _ , key := range listResp . Contents {
oi := & s3 . ObjectIdentifier { Key : key . Key }
objects . Objects = append ( objects . Objects , oi )
}
s3conn . DeleteObjects ( & s3 . DeleteObjectsInput {
Bucket : aws . String ( bucket ) ,
Delete : objects ,
} )
_ , err := s3conn . DeleteBucket ( & s3 . DeleteBucketInput { Bucket : aws . String ( bucket ) } )
if err != nil {
t . Fatalf ( "err: %s" , err )
}
} ( )
2017-06-16 15:09:15 +00:00
// This uses the same logic to find the AWS credentials as we did at the beginning of the test
2017-08-03 17:24:27 +00:00
b , err := NewS3Backend ( map [ string ] string {
2019-01-26 21:48:08 +00:00
"bucket" : bucket ,
"kmsKeyId" : kmsKeyId ,
2019-07-24 16:48:26 +00:00
"path" : "test/vault" ,
2017-08-03 17:24:27 +00:00
} , logger )
2015-05-20 14:54:26 +00:00
if err != nil {
t . Fatalf ( "err: %s" , err )
}
2017-08-03 17:24:27 +00:00
physical . ExerciseBackend ( t , b )
physical . ExerciseBackend_ListPrefix ( t , b )
2015-05-20 14:54:26 +00:00
}
2023-01-17 19:15:40 +00:00
func hasAWSCredentials ( ) bool {
ctx , cancel := context . WithTimeout ( context . Background ( ) , 5 * time . Second )
defer cancel ( )
cfg , err := config . LoadDefaultConfig ( ctx )
if err != nil {
return false
}
creds , err := cfg . Credentials . Retrieve ( ctx )
if err != nil {
return false
}
return creds . HasKeys ( )
}