Skip to content

Commit 38f086c

Browse files
author
Rui Hu
committed
cloudccl: allow external connection tests to be run in parallel
Currently external connection tests read and write to the same path in cloud storage. Add a random uint64 as part of the path so that test runs have unique paths and can be run in parallel. Fixes: cockroachdb#107407 Release note: None
1 parent 602bc79 commit 38f086c

File tree

5 files changed

+43
-24
lines changed

5 files changed

+43
-24
lines changed

pkg/ccl/cloudccl/amazon/BUILD.bazel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ go_test(
1414
"//pkg/cloud",
1515
"//pkg/cloud/amazon",
1616
"//pkg/cloud/cloudpb",
17+
"//pkg/cloud/cloudtestutils",
1718
"//pkg/cloud/externalconn/providers",
1819
"//pkg/security/securityassets",
1920
"//pkg/security/securitytest",

pkg/ccl/cloudccl/amazon/s3_connection_test.go

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222
"github.com/cockroachdb/cockroach/pkg/cloud"
2323
"github.com/cockroachdb/cockroach/pkg/cloud/amazon"
2424
"github.com/cockroachdb/cockroach/pkg/cloud/cloudpb"
25+
"github.com/cockroachdb/cockroach/pkg/cloud/cloudtestutils"
2526
_ "github.com/cockroachdb/cockroach/pkg/cloud/externalconn/providers" // import External Connection providers.
2627
"github.com/cockroachdb/cockroach/pkg/testutils"
2728
"github.com/cockroachdb/cockroach/pkg/testutils/skip"
@@ -77,6 +78,8 @@ func TestS3ExternalConnection(t *testing.T) {
7778
skip.IgnoreLint(t, "AWS_S3_BUCKET env var must be set")
7879
}
7980

81+
testID := cloudtestutils.NewTestID()
82+
8083
t.Run("auth-implicit", func(t *testing.T) {
8184
// You can create an IAM that can access S3
8285
// in the AWS console, then set it up locally.
@@ -93,14 +96,14 @@ func TestS3ExternalConnection(t *testing.T) {
9396
params := make(url.Values)
9497
params.Add(cloud.AuthParam, cloud.AuthParamImplicit)
9598

96-
s3URI := fmt.Sprintf("s3://%s/backup-ec-test-default?%s", bucket, params.Encode())
99+
s3URI := fmt.Sprintf("s3://%s/backup-ec-test-default-%d?%s", bucket, testID, params.Encode())
97100
ecName := "auth-implicit-s3"
98101
createExternalConnection(ecName, s3URI)
99102
backupAndRestoreFromExternalConnection(ecName)
100103
})
101104

102105
t.Run("auth-specified", func(t *testing.T) {
103-
s3URI := amazon.S3URI(bucket, "backup-ec-test-default",
106+
s3URI := amazon.S3URI(bucket, fmt.Sprintf("backup-ec-test-default-%d", testID),
104107
&cloudpb.ExternalStorage_S3{
105108
AccessKey: creds.AccessKeyID,
106109
Secret: creds.SecretAccessKey,
@@ -126,7 +129,7 @@ func TestS3ExternalConnection(t *testing.T) {
126129
"refer to https://docs.aws.com/cli/latest/userguide/cli-configure-role.html: %s", err)
127130
}
128131

129-
s3URI := amazon.S3URI(bucket, "backup-ec-test-sse-256", &cloudpb.ExternalStorage_S3{
132+
s3URI := amazon.S3URI(bucket, fmt.Sprintf("backup-ec-test-sse-256-%d", testID), &cloudpb.ExternalStorage_S3{
130133
Region: "us-east-1",
131134
Auth: cloud.AuthParamImplicit,
132135
ServerEncMode: "AES256",
@@ -139,7 +142,7 @@ func TestS3ExternalConnection(t *testing.T) {
139142
if v == "" {
140143
skip.IgnoreLint(t, "AWS_KMS_KEY_ARN env var must be set")
141144
}
142-
s3KMSURI := amazon.S3URI(bucket, "backup-ec-test-sse-kms", &cloudpb.ExternalStorage_S3{
145+
s3KMSURI := amazon.S3URI(bucket, fmt.Sprintf("backup-ec-test-sse-kms-%d", testID), &cloudpb.ExternalStorage_S3{
143146
Region: "us-east-1",
144147
Auth: cloud.AuthParamImplicit,
145148
ServerEncMode: "aws:kms",
@@ -163,7 +166,7 @@ func TestS3ExternalConnection(t *testing.T) {
163166
}
164167

165168
// Unsupported server side encryption option.
166-
invalidS3URI := amazon.S3URI(bucket, "backup-ec-test-sse-256", &cloudpb.ExternalStorage_S3{
169+
invalidS3URI := amazon.S3URI(bucket, fmt.Sprintf("backup-ec-test-sse-256-%d", testID), &cloudpb.ExternalStorage_S3{
167170
Region: "us-east-1",
168171
Auth: cloud.AuthParamImplicit,
169172
ServerEncMode: "unsupported-algorithm",
@@ -172,7 +175,7 @@ func TestS3ExternalConnection(t *testing.T) {
172175
"unsupported server encryption mode unsupported-algorithm. Supported values are `aws:kms` and `AES256",
173176
fmt.Sprintf(`BACKUP DATABASE foo INTO '%s'`, invalidS3URI))
174177

175-
invalidS3URI = amazon.S3URI(bucket, "backup-ec-test-sse-256", &cloudpb.ExternalStorage_S3{
178+
invalidS3URI = amazon.S3URI(bucket, fmt.Sprintf("backup-ec-test-sse-256-%d", testID), &cloudpb.ExternalStorage_S3{
176179
Region: "us-east-1",
177180
Auth: cloud.AuthParamImplicit,
178181
ServerEncMode: "aws:kms",
@@ -257,8 +260,9 @@ func TestAWSKMSExternalConnection(t *testing.T) {
257260
skip.IgnoreLint(t, "AWS_S3_BUCKET env var must be set")
258261
}
259262

263+
testID := cloudtestutils.NewTestID()
260264
// Create an external connection where we will write the backup.
261-
backupURI := fmt.Sprintf("s3://%s/backup?%s=%s", bucket,
265+
backupURI := fmt.Sprintf("s3://%s/backup-%d?%s=%s", bucket, testID,
262266
cloud.AuthParam, cloud.AuthParamImplicit)
263267
backupExternalConnectionName := "backup"
264268
createExternalConnection(backupExternalConnectionName, backupURI)
@@ -372,8 +376,9 @@ func TestAWSKMSExternalConnectionAssumeRole(t *testing.T) {
372376
skip.IgnoreLint(t, "AWS_S3_BUCKET env var must be set")
373377
}
374378

379+
testID := cloudtestutils.NewTestID()
375380
// Create an external connection where we will write the backup.
376-
backupURI := fmt.Sprintf("s3://%s/backup?%s=%s", bucket,
381+
backupURI := fmt.Sprintf("s3://%s/backup-%d?%s=%s", bucket, testID,
377382
cloud.AuthParam, cloud.AuthParamImplicit)
378383
backupExternalConnectionName := "backup"
379384
createExternalConnection(backupExternalConnectionName, backupURI)

pkg/ccl/cloudccl/azure/BUILD.bazel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ go_test(
1313
"//pkg/ccl",
1414
"//pkg/ccl/kvccl/kvtenantccl",
1515
"//pkg/cloud/azure",
16+
"//pkg/cloud/cloudtestutils",
1617
"//pkg/cloud/externalconn/providers",
1718
"//pkg/security/securityassets",
1819
"//pkg/security/securitytest",

pkg/ccl/cloudccl/azure/azure_connection_test.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"github.com/cockroachdb/cockroach/pkg/base"
2121
_ "github.com/cockroachdb/cockroach/pkg/ccl"
2222
"github.com/cockroachdb/cockroach/pkg/cloud/azure"
23+
"github.com/cockroachdb/cockroach/pkg/cloud/cloudtestutils"
2324
_ "github.com/cockroachdb/cockroach/pkg/cloud/externalconn/providers" // import External Connection providers.
2425
"github.com/cockroachdb/cockroach/pkg/testutils"
2526
"github.com/cockroachdb/cockroach/pkg/testutils/skip"
@@ -29,9 +30,9 @@ import (
2930
"github.com/cockroachdb/cockroach/pkg/util/log"
3031
)
3132

32-
func (a azureConfig) URI(file string) string {
33-
return fmt.Sprintf("azure-storage://%s/%s?%s=%s&%s=%s&%s=%s",
34-
a.bucket, file,
33+
func (a azureConfig) URI(file string, testID uint64) string {
34+
return fmt.Sprintf("azure-storage://%s/%s-%d?%s=%s&%s=%s&%s=%s",
35+
a.bucket, file, testID,
3536
azure.AzureAccountKeyParam, url.QueryEscape(a.key),
3637
azure.AzureAccountNameParam, url.QueryEscape(a.account),
3738
azure.AzureEnvironmentKeyParam, url.QueryEscape(a.environment))
@@ -97,7 +98,8 @@ func TestExternalConnections(t *testing.T) {
9798
return
9899
}
99100

101+
testID := cloudtestutils.NewTestID()
100102
ecName := "azure-ec"
101-
createExternalConnection(ecName, cfg.URI("backup-ec"))
103+
createExternalConnection(ecName, cfg.URI("backup-ec", testID))
102104
backupAndRestoreFromExternalConnection(ecName)
103105
}

pkg/ccl/cloudccl/gcp/gcp_connection_test.go

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,9 @@ func TestGCPKMSExternalConnection(t *testing.T) {
8989
skip.IgnoreLint(t, "implicit auth is not configured")
9090
}
9191

92+
testID := cloudtestutils.NewTestID()
9293
// Create an external connection where we will write the backup.
93-
backupURI := fmt.Sprintf("gs://%s/backup?%s=%s", bucket,
94+
backupURI := fmt.Sprintf("gs://%s/backup-%d?%s=%s", bucket, testID,
9495
cloud.AuthParam, cloud.AuthParamImplicit)
9596
backupExternalConnectionName := "backup"
9697
createExternalConnection(backupExternalConnectionName, backupURI)
@@ -229,8 +230,10 @@ func TestGCPKMSExternalConnectionAssumeRole(t *testing.T) {
229230
skip.IgnoreLint(t, "implicit auth is not configured")
230231
}
231232

233+
testID := cloudtestutils.NewTestID()
234+
232235
// Create an external connection where we will write the backup.
233-
backupURI := fmt.Sprintf("gs://%s/backup?%s=%s", bucket,
236+
backupURI := fmt.Sprintf("gs://%s/backup-%d?%s=%s", bucket, testID,
234237
cloud.AuthParam, cloud.AuthParamImplicit)
235238
backupExternalConnectionName := "backup"
236239
createExternalConnection(backupExternalConnectionName, backupURI)
@@ -339,6 +342,7 @@ func TestGCPAssumeRoleExternalConnection(t *testing.T) {
339342
skip.IgnoreLint(t, "ASSUME_SERVICE_ACCOUNT env var must be set")
340343
}
341344

345+
testID := cloudtestutils.NewTestID()
342346
t.Run("ec-assume-role-specified", func(t *testing.T) {
343347
ecName := "ec-assume-role-specified"
344348
disallowedECName := "ec-assume-role-specified-disallowed"
@@ -347,13 +351,14 @@ func TestGCPAssumeRoleExternalConnection(t *testing.T) {
347351
skip.IgnoreLint(t, "GOOGLE_CREDENTIALS_JSON env var must be set")
348352
}
349353
encoded := base64.StdEncoding.EncodeToString([]byte(credentials))
350-
disallowedURI := fmt.Sprintf("gs://%s/%s?%s=%s", limitedBucket, disallowedECName,
354+
disallowedURI := fmt.Sprintf("gs://%s/%s-%d?%s=%s", limitedBucket, disallowedECName, testID,
351355
gcp.CredentialsParam, url.QueryEscape(encoded))
352356
disallowedCreateExternalConnection(t, disallowedECName, disallowedURI)
353357

354-
uri := fmt.Sprintf("gs://%s/%s?%s=%s&%s=%s&%s=%s",
358+
uri := fmt.Sprintf("gs://%s/%s-%d?%s=%s&%s=%s&%s=%s",
355359
limitedBucket,
356360
ecName,
361+
testID,
357362
cloud.AuthParam,
358363
cloud.AuthParamSpecified,
359364
gcp.AssumeRoleParam,
@@ -370,13 +375,14 @@ func TestGCPAssumeRoleExternalConnection(t *testing.T) {
370375
}
371376
ecName := "ec-assume-role-implicit"
372377
disallowedECName := "ec-assume-role-implicit-disallowed"
373-
disallowedURI := fmt.Sprintf("gs://%s/%s?%s=%s", limitedBucket, disallowedECName,
378+
disallowedURI := fmt.Sprintf("gs://%s/%s-%d?%s=%s", limitedBucket, disallowedECName, testID,
374379
cloud.AuthParam, cloud.AuthParamImplicit)
375380
disallowedCreateExternalConnection(t, disallowedECName, disallowedURI)
376381

377-
uri := fmt.Sprintf("gs://%s/%s?%s=%s&%s=%s",
382+
uri := fmt.Sprintf("gs://%s/%s-%d?%s=%s&%s=%s",
378383
limitedBucket,
379384
ecName,
385+
testID,
380386
cloud.AuthParam,
381387
cloud.AuthParamImplicit,
382388
gcp.AssumeRoleParam,
@@ -418,17 +424,18 @@ func TestGCPAssumeRoleExternalConnection(t *testing.T) {
418424
i := i
419425
q.Set(gcp.AssumeRoleParam, role)
420426
disallowedECName := fmt.Sprintf("ec-assume-role-checking-%d", i)
421-
disallowedBackupURI := fmt.Sprintf("gs://%s/%s?%s", limitedBucket,
422-
disallowedECName, q.Encode())
427+
disallowedBackupURI := fmt.Sprintf("gs://%s/%s-%d?%s", limitedBucket,
428+
disallowedECName, testID, q.Encode())
423429
disallowedCreateExternalConnection(t, disallowedECName, disallowedBackupURI)
424430
}
425431

426432
// Finally, check that the chain of roles can be used to access the storage.
427433
q.Set(gcp.AssumeRoleParam, roleChainStr)
428434
ecName := fmt.Sprintf("ec-assume-role-checking-%s", tc.auth)
429-
uri := fmt.Sprintf("gs://%s/%s?%s",
435+
uri := fmt.Sprintf("gs://%s/%s-%d?%s",
430436
limitedBucket,
431437
ecName,
438+
testID,
432439
q.Encode(),
433440
)
434441
createExternalConnection(t, ecName, uri)
@@ -477,13 +484,14 @@ func TestGCPExternalConnection(t *testing.T) {
477484
skip.IgnoreLint(t, "GOOGLE_BUCKET env var must be set")
478485
}
479486

487+
testID := cloudtestutils.NewTestID()
480488
t.Run("ec-auth-implicit", func(t *testing.T) {
481489
if !cloudtestutils.IsImplicitAuthConfigured() {
482490
skip.IgnoreLint(t, "implicit auth is not configured")
483491
}
484492

485493
ecName := "ec-auth-implicit"
486-
backupURI := fmt.Sprintf("gs://%s/%s?%s=%s", bucket, ecName, cloud.AuthParam,
494+
backupURI := fmt.Sprintf("gs://%s/%s-%d?%s=%s", bucket, ecName, testID, cloud.AuthParam,
487495
cloud.AuthParamImplicit)
488496
createExternalConnection(ecName, backupURI)
489497
backupAndRestoreFromExternalConnection(ecName)
@@ -496,9 +504,10 @@ func TestGCPExternalConnection(t *testing.T) {
496504
}
497505
encoded := base64.StdEncoding.EncodeToString([]byte(credentials))
498506
ecName := "ec-auth-specified"
499-
backupURI := fmt.Sprintf("gs://%s/%s?%s=%s",
507+
backupURI := fmt.Sprintf("gs://%s/%s-%d?%s=%s",
500508
bucket,
501509
ecName,
510+
testID,
502511
gcp.CredentialsParam,
503512
url.QueryEscape(encoded),
504513
)
@@ -520,9 +529,10 @@ func TestGCPExternalConnection(t *testing.T) {
520529
token, err := ts.Token()
521530
require.NoError(t, err, "getting token")
522531
ecName := "ec-auth-specified-bearer-token"
523-
backupURI := fmt.Sprintf("gs://%s/%s?%s=%s",
532+
backupURI := fmt.Sprintf("gs://%s/%s-%d?%s=%s",
524533
bucket,
525534
ecName,
535+
testID,
526536
gcp.BearerTokenParam,
527537
token.AccessToken,
528538
)

0 commit comments

Comments
 (0)