github.com/terramate-io/tf@v0.0.0-20230830114523-fce866b4dfcd/backend/remote-state/s3/mocks_test.go (about) 1 package s3 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "log" 7 "net/http" 8 "net/http/httptest" 9 "os" 10 "strings" 11 "time" 12 13 servicemocks "github.com/hashicorp/aws-sdk-go-base" 14 ) 15 16 // TODO: replace with `aws-sdk-go-base/v2/servicemocks.InitSessionTestEnv` 17 func initSessionTestEnv() (oldEnv []string) { 18 oldEnv = stashEnv() 19 os.Setenv("AWS_CONFIG_FILE", "file_not_exists") 20 os.Setenv("AWS_SHARED_CREDENTIALS_FILE", "file_not_exists") 21 22 return oldEnv 23 } 24 25 // TODO: replace with `aws-sdk-go-base/v2/servicemocks.StashEnv` 26 func stashEnv() []string { 27 env := os.Environ() 28 os.Clearenv() 29 return env 30 } 31 32 // TODO: replace with `aws-sdk-go-base/v2/servicemocks.PopEnv` 33 func popEnv(env []string) { 34 os.Clearenv() 35 36 for _, e := range env { 37 p := strings.SplitN(e, "=", 2) 38 k, v := p[0], "" 39 if len(p) > 1 { 40 v = p[1] 41 } 42 os.Setenv(k, v) 43 } 44 } 45 46 // TODO: replace with `aws-sdk-go-base/v2/servicemocks.AwsMetadataApiMock` 47 // awsMetadataApiMock establishes a httptest server to mock out the internal AWS Metadata 48 // service. IAM Credentials are retrieved by the EC2RoleProvider, which makes 49 // API calls to this internal URL. By replacing the server with a test server, 50 // we can simulate an AWS environment 51 func awsMetadataApiMock(responses []*servicemocks.MetadataResponse) func() { 52 ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 53 w.Header().Set("Content-Type", "text/plain") 54 w.Header().Add("Server", "MockEC2") 55 log.Printf("[DEBUG] Mock EC2 metadata server received request: %s", r.RequestURI) 56 for _, e := range responses { 57 if r.RequestURI == e.Uri { 58 fmt.Fprintln(w, e.Body) 59 return 60 } 61 } 62 w.WriteHeader(http.StatusBadRequest) 63 })) 64 65 os.Setenv("AWS_METADATA_URL", ts.URL+"/latest") 66 return ts.Close 67 } 68 69 // TODO: replace with `aws-sdk-go-base/v2/servicemocks.Ec2metadata_securityCredentialsEndpoints` 70 var ec2metadata_securityCredentialsEndpoints = []*servicemocks.MetadataResponse{ 71 { 72 Uri: "/latest/api/token", 73 Body: "Ec2MetadataApiToken", 74 }, 75 { 76 Uri: "/latest/meta-data/iam/security-credentials/", 77 Body: "test_role", 78 }, 79 { 80 Uri: "/latest/meta-data/iam/security-credentials/test_role", 81 Body: "{\"Code\":\"Success\",\"LastUpdated\":\"2015-12-11T17:17:25Z\",\"Type\":\"AWS-HMAC\",\"AccessKeyId\":\"Ec2MetadataAccessKey\",\"SecretAccessKey\":\"Ec2MetadataSecretKey\",\"Token\":\"Ec2MetadataSessionToken\"}", 82 }, 83 } 84 85 // TODO: replace with `aws-sdk-go-base/v2/servicemocks.Ec2metadata_iamInfoEndpoint` 86 var ec2metadata_instanceIdEndpoint = &servicemocks.MetadataResponse{ 87 Uri: "/latest/meta-data/instance-id", 88 Body: "mock-instance-id", 89 } 90 91 var ec2metadata_iamInfoEndpoint = &servicemocks.MetadataResponse{ 92 Uri: "/latest/meta-data/iam/info", 93 Body: "{\"Code\": \"Success\",\"LastUpdated\": \"2016-03-17T12:27:32Z\",\"InstanceProfileArn\": \"arn:aws:iam::000000000000:instance-profile/my-instance-profile\",\"InstanceProfileId\": \"AIPAABCDEFGHIJKLMN123\"}", 94 } 95 96 // TODO: replace with `aws-sdk-go-base/v2/servicemocks.EcsCredentialsApiMock` 97 func ecsCredentialsApiMock() func() { 98 ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 99 w.Header().Set("Content-Type", "application/json") 100 w.Header().Add("Server", "MockECS") 101 log.Printf("[DEBUG] Mock ECS credentials server received request: %s", r.RequestURI) 102 if r.RequestURI == "/creds" { 103 _ = json.NewEncoder(w).Encode(map[string]string{ 104 "AccessKeyId": servicemocks.MockEcsCredentialsAccessKey, 105 "Expiration": time.Now().UTC().Format(time.RFC3339), 106 "RoleArn": "arn:aws:iam::000000000000:role/EcsCredentials", 107 "SecretAccessKey": servicemocks.MockEcsCredentialsSecretKey, 108 "Token": servicemocks.MockEcsCredentialsSessionToken, 109 }) 110 return 111 } 112 w.WriteHeader(http.StatusBadRequest) 113 })) 114 115 os.Setenv("AWS_CONTAINER_CREDENTIALS_FULL_URI", ts.URL+"/creds") 116 return ts.Close 117 } 118 119 // TODO: replace with `aws-sdk-go-base/v2/servicemocks.Ec2metadata_instanceIdentityEndpoint` 120 func ec2metadata_instanceIdentityEndpoint(region string) *servicemocks.MetadataResponse { 121 return &servicemocks.MetadataResponse{ 122 Uri: "/latest/dynamic/instance-identity/document", 123 Body: fmt.Sprintf(`{ 124 "version": "2017-09-30", 125 "instanceId": "mock-instance-id", 126 "region": %q 127 }`, region), 128 } 129 }