@@ -14,6 +14,7 @@ import (
14
14
"os"
15
15
"strings"
16
16
"testing"
17
+ "time"
17
18
18
19
"github.com/aws/aws-sdk-go-v2/config"
19
20
"github.com/aws/aws-sdk-go-v2/service/s3/types"
@@ -30,32 +31,34 @@ import (
30
31
"github.com/cockroachdb/cockroach/pkg/testutils"
31
32
"github.com/cockroachdb/cockroach/pkg/testutils/skip"
32
33
"github.com/cockroachdb/cockroach/pkg/util/leaktest"
34
+ "github.com/cockroachdb/cockroach/pkg/util/log"
33
35
"github.com/cockroachdb/cockroach/pkg/util/uuid"
34
36
"github.com/cockroachdb/errors"
35
37
"github.com/stretchr/testify/require"
36
38
)
37
39
38
40
func makeS3Storage (
39
- ctx context.Context , uri string , user username.SQLUsername ,
41
+ ctx context.Context , uri string , user username.SQLUsername , middleware cloud. HttpMiddleware ,
40
42
) (cloud.ExternalStorage , error ) {
41
43
conf , err := cloud .ExternalStorageConfFromURI (uri , user )
42
44
if err != nil {
43
45
return nil , err
44
46
}
45
47
testSettings := cluster .MakeTestingClusterSettings ()
46
48
47
- // Setup a sink for the given args.
48
- s , err := cloud .MakeExternalStorage (ctx , conf , base.ExternalIODirConfig {}, testSettings ,
49
- blobs .TestEmptyBlobClientFactory ,
50
- nil , /* db */
51
- nil , /* limiters */
52
- cloud .NilMetrics ,
53
- )
54
- if err != nil {
55
- return nil , err
49
+ // TODO(jeffswenson): remove this once we change the default to false.
50
+ enableClientRetryTokenBucket .Override (ctx , & testSettings .SV , false )
51
+
52
+ args := cloud.EarlyBootExternalStorageContext {
53
+ IOConf : base.ExternalIODirConfig {},
54
+ Settings : testSettings ,
55
+ Options : nil ,
56
+ Limiters : nil ,
57
+ MetricsRecorder : cloud .NilMetrics ,
58
+ HttpMiddleware : middleware ,
56
59
}
57
60
58
- return s , nil
61
+ return MakeS3Storage ( ctx , args , conf )
59
62
}
60
63
61
64
// You can create an IAM that can access S3 in the AWS console, then
@@ -70,6 +73,7 @@ func skipIfNoDefaultConfig(t *testing.T, ctx context.Context) {
70
73
require .NoError (t , err )
71
74
_ , err = cfg .Credentials .Retrieve (ctx )
72
75
if err != nil {
76
+ t .Logf ("config: %+v" , cfg )
73
77
skip .IgnoreLintf (t , "%s: %s" , helpMsg , err )
74
78
}
75
79
}
@@ -192,7 +196,7 @@ func TestPutS3(t *testing.T) {
192
196
cloud .AuthParam , cloud .AuthParamImplicit , AWSServerSideEncryptionMode ,
193
197
"unsupported-algorithm" )
194
198
195
- _ , err = makeS3Storage (ctx , invalidSSEModeURI , user )
199
+ _ , err = makeS3Storage (ctx , invalidSSEModeURI , user , nil )
196
200
require .True (t , testutils .IsError (err , "unsupported server encryption mode unsupported-algorithm. Supported values are `aws:kms` and `AES256" ))
197
201
198
202
// Specify aws:kms encryption mode but don't specify kms ID.
@@ -201,13 +205,44 @@ func TestPutS3(t *testing.T) {
201
205
bucket , "backup-test-sse-256" ,
202
206
cloud .AuthParam , cloud .AuthParamImplicit , AWSServerSideEncryptionMode ,
203
207
"aws:kms" )
204
- _ , err = makeS3Storage (ctx , invalidKMSURI , user )
208
+ _ , err = makeS3Storage (ctx , invalidKMSURI , user , nil )
205
209
require .True (t , testutils .IsError (err , "AWS_SERVER_KMS_ID param must be set when using aws:kms server side encryption mode." ))
206
210
})
207
211
})
208
212
}
209
213
}
210
214
215
+ func TestS3FaultInjection (t * testing.T ) {
216
+ defer leaktest .AfterTest (t )()
217
+
218
+ ctx := context .Background ()
219
+ skipIfNoDefaultConfig (t , ctx )
220
+
221
+ baseBucket := os .Getenv ("AWS_S3_BUCKET" )
222
+ if baseBucket == "" {
223
+ skip .IgnoreLint (t , "AWS_S3_BUCKET env var must be set" )
224
+ }
225
+
226
+ // Enable cloud transport logging.
227
+ defer log .Scope (t ).Close (t )
228
+ prevVModule := log .GetVModule ()
229
+ defer func () { _ = log .SetVModule (prevVModule ) }()
230
+ require .NoError (t , log .SetVModule ("cloud_logging_transport=1" ))
231
+
232
+ uri := fmt .Sprintf (
233
+ "s3://%s/%d-fault-injection-test?AUTH=implicit" ,
234
+ baseBucket , cloudtestutils .NewTestID (),
235
+ )
236
+
237
+ // Inject faults for 15-45 seconds after the storage is opened.
238
+ middleware := cloudtestutils .BrownoutMiddleware (time .Second * 15 , time .Second * 45 )
239
+ storage , err := makeS3Storage (ctx , uri , username .RootUserName (), middleware )
240
+ require .NoError (t , err )
241
+ defer storage .Close ()
242
+
243
+ cloudtestutils .RunCloudNemesisTest (t , storage )
244
+ }
245
+
211
246
func TestPutS3AssumeRole (t * testing.T ) {
212
247
defer leaktest .AfterTest (t )()
213
248
0 commit comments