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  }