@@ -6,12 +6,14 @@ package storage
66import (
77 "context"
88 "net/http"
9+ "net/http/httptest"
910 "os"
1011 "testing"
1112
1213 "code.gitea.io/gitea/modules/setting"
1314
1415 "github.com/minio/minio-go/v7"
16+ "github.com/minio/minio-go/v7/pkg/credentials"
1517 "github.com/stretchr/testify/assert"
1618)
1719
@@ -92,3 +94,103 @@ func TestS3StorageBadRequest(t *testing.T) {
9294 _ , err := NewStorage (setting .MinioStorageType , cfg )
9395 assert .ErrorContains (t , err , message )
9496}
97+
98+ func TestMinioCredentials (t * testing.T ) {
99+ const (
100+ ExpectedAccessKey = "ExampleAccessKeyID"
101+ ExpectedSecretAccessKey = "ExampleSecretAccessKeyID"
102+ )
103+
104+ t .Run ("Static Credentials" , func (t * testing.T ) {
105+ cfg := setting.MinioStorageConfig {
106+ AccessKeyID : ExpectedAccessKey ,
107+ SecretAccessKey : ExpectedSecretAccessKey ,
108+ }
109+ creds := buildMinioCredentials (cfg , credentials .DefaultIAMRoleEndpoint )
110+ v , err := creds .Get ()
111+
112+ assert .NoError (t , err )
113+ assert .Equal (t , ExpectedAccessKey , v .AccessKeyID )
114+ assert .Equal (t , ExpectedSecretAccessKey , v .SecretAccessKey )
115+ })
116+
117+ t .Run ("Chain" , func (t * testing.T ) {
118+ cfg := setting.MinioStorageConfig {}
119+
120+ t .Run ("EnvMinio" , func (t * testing.T ) {
121+ t .Setenv ("MINIO_ACCESS_KEY" , ExpectedAccessKey + "Minio" )
122+ t .Setenv ("MINIO_SECRET_KEY" , ExpectedSecretAccessKey + "Minio" )
123+
124+ creds := buildMinioCredentials (cfg , credentials .DefaultIAMRoleEndpoint )
125+ v , err := creds .Get ()
126+
127+ assert .NoError (t , err )
128+ assert .Equal (t , ExpectedAccessKey + "Minio" , v .AccessKeyID )
129+ assert .Equal (t , ExpectedSecretAccessKey + "Minio" , v .SecretAccessKey )
130+ })
131+
132+ t .Run ("EnvAWS" , func (t * testing.T ) {
133+ t .Setenv ("AWS_ACCESS_KEY" , ExpectedAccessKey + "AWS" )
134+ t .Setenv ("AWS_SECRET_KEY" , ExpectedSecretAccessKey + "AWS" )
135+
136+ creds := buildMinioCredentials (cfg , credentials .DefaultIAMRoleEndpoint )
137+ v , err := creds .Get ()
138+
139+ assert .NoError (t , err )
140+ assert .Equal (t , ExpectedAccessKey + "AWS" , v .AccessKeyID )
141+ assert .Equal (t , ExpectedSecretAccessKey + "AWS" , v .SecretAccessKey )
142+ })
143+
144+ t .Run ("FileMinio" , func (t * testing.T ) {
145+ t .Setenv ("MINIO_SHARED_CREDENTIALS_FILE" , "testdata/minio.json" )
146+ // prevent loading any actual credentials files from the user
147+ t .Setenv ("AWS_SHARED_CREDENTIALS_FILE" , "testdata/fake" )
148+
149+ creds := buildMinioCredentials (cfg , credentials .DefaultIAMRoleEndpoint )
150+ v , err := creds .Get ()
151+
152+ assert .NoError (t , err )
153+ assert .Equal (t , ExpectedAccessKey + "MinioFile" , v .AccessKeyID )
154+ assert .Equal (t , ExpectedSecretAccessKey + "MinioFile" , v .SecretAccessKey )
155+ })
156+
157+ t .Run ("FileAWS" , func (t * testing.T ) {
158+ // prevent loading any actual credentials files from the user
159+ t .Setenv ("MINIO_SHARED_CREDENTIALS_FILE" , "testdata/fake.json" )
160+ t .Setenv ("AWS_SHARED_CREDENTIALS_FILE" , "testdata/aws_credentials" )
161+
162+ creds := buildMinioCredentials (cfg , credentials .DefaultIAMRoleEndpoint )
163+ v , err := creds .Get ()
164+
165+ assert .NoError (t , err )
166+ assert .Equal (t , ExpectedAccessKey + "AWSFile" , v .AccessKeyID )
167+ assert .Equal (t , ExpectedSecretAccessKey + "AWSFile" , v .SecretAccessKey )
168+ })
169+
170+ t .Run ("IAM" , func (t * testing.T ) {
171+ // prevent loading any actual credentials files from the user
172+ t .Setenv ("MINIO_SHARED_CREDENTIALS_FILE" , "testdata/fake.json" )
173+ t .Setenv ("AWS_SHARED_CREDENTIALS_FILE" , "testdata/fake" )
174+
175+ // Spawn a server to emulate the EC2 Instance Metadata
176+ server := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
177+ // The client will actually make 3 requests here,
178+ // first will be to get the IMDSv2 token, second to
179+ // get the role, and third for the actual
180+ // credentials. However, we can return credentials
181+ // every request since we're not emulating a full
182+ // IMDSv2 flow.
183+ w .Write ([]byte (`{"Code":"Success","AccessKeyId":"ExampleAccessKeyIDIAM","SecretAccessKey":"ExampleSecretAccessKeyIDIAM"}` ))
184+ }))
185+ defer server .Close ()
186+
187+ // Use the provided EC2 Instance Metadata server
188+ creds := buildMinioCredentials (cfg , server .URL )
189+ v , err := creds .Get ()
190+
191+ assert .NoError (t , err )
192+ assert .Equal (t , ExpectedAccessKey + "IAM" , v .AccessKeyID )
193+ assert .Equal (t , ExpectedSecretAccessKey + "IAM" , v .SecretAccessKey )
194+ })
195+ })
196+ }
0 commit comments