Skip to content

Commit c97bc96

Browse files
committed
cloud: add fault injection test for gcs and azure
This adds fault injection tests for the Google and Azure blobstorage clients. The logging injection hook was moved to a call path to ensure it covers the GCP client. Release note: none Epic: CRDB-53946
1 parent 3693763 commit c97bc96

File tree

5 files changed

+92
-1
lines changed

5 files changed

+92
-1
lines changed

pkg/cloud/azure/BUILD.bazel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ go_test(
6666
"//pkg/testutils/skip",
6767
"//pkg/util/envutil",
6868
"//pkg/util/leaktest",
69+
"//pkg/util/log",
6970
"@com_github_azure_azure_sdk_for_go_sdk_azcore//:azcore",
7071
"@com_github_azure_azure_sdk_for_go_sdk_azidentity//:azidentity",
7172
"@com_github_azure_azure_sdk_for_go_sdk_storage_azblob//service",

pkg/cloud/azure/azure_storage_test.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,10 @@ import (
1313
"os"
1414
"path"
1515
"testing"
16+
"time"
1617

1718
"github.com/Azure/go-autorest/autorest/azure"
19+
"github.com/cockroachdb/cockroach/pkg/base"
1820
"github.com/cockroachdb/cockroach/pkg/cloud"
1921
"github.com/cockroachdb/cockroach/pkg/cloud/cloudpb"
2022
"github.com/cockroachdb/cockroach/pkg/cloud/cloudtestutils"
@@ -24,6 +26,7 @@ import (
2426
"github.com/cockroachdb/cockroach/pkg/testutils/skip"
2527
"github.com/cockroachdb/cockroach/pkg/util/envutil"
2628
"github.com/cockroachdb/cockroach/pkg/util/leaktest"
29+
"github.com/cockroachdb/cockroach/pkg/util/log"
2730
"github.com/cockroachdb/errors"
2831
"github.com/stretchr/testify/require"
2932
)
@@ -151,6 +154,46 @@ func TestAzureSchemes(t *testing.T) {
151154
}
152155
}
153156

157+
func TestAzureFaultInjection(t *testing.T) {
158+
defer leaktest.AfterTest(t)()
159+
160+
cfg, err := getAzureConfig()
161+
if err != nil {
162+
skip.IgnoreLint(t, "Test not configured for Azure")
163+
return
164+
}
165+
166+
// Enable cloud transport logging.
167+
defer log.Scope(t).Close(t)
168+
prevVModule := log.GetVModule()
169+
defer func() { _ = log.SetVModule(prevVModule) }()
170+
require.NoError(t, log.SetVModule("cloud_logging_transport=1"))
171+
172+
testID := cloudtestutils.NewTestID()
173+
uri := cfg.filePathImplicitAuth(fmt.Sprintf("%d-fault-injection-test", testID))
174+
175+
// Inject faults for 15-45 seconds after the storage is opened.
176+
middleware := cloudtestutils.BrownoutMiddleware(time.Second*15, time.Second*45)
177+
178+
conf, err := cloud.ExternalStorageConfFromURI(uri, username.RootUserName())
179+
require.NoError(t, err)
180+
181+
args := cloud.EarlyBootExternalStorageContext{
182+
IOConf: base.ExternalIODirConfig{},
183+
Settings: cluster.MakeTestingClusterSettings(),
184+
Options: nil,
185+
Limiters: nil,
186+
MetricsRecorder: cloud.NilMetrics,
187+
HttpMiddleware: middleware,
188+
}
189+
190+
storage, err := makeAzureStorage(context.Background(), args, conf)
191+
require.NoError(t, err)
192+
defer storage.Close()
193+
194+
cloudtestutils.RunCloudNemesisTest(t, storage)
195+
}
196+
154197
func TestAntagonisticAzureRead(t *testing.T) {
155198
defer leaktest.AfterTest(t)()
156199

pkg/cloud/cloud_io.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ func MakeHTTPClient(
100100
if err != nil {
101101
return nil, err
102102
}
103-
return MakeHTTPClientForTransport(maybeAddLogging(t))
103+
return MakeHTTPClientForTransport(t)
104104
}
105105

106106
// MakeHTTPClientForTransport creates a new http.Client with the given
@@ -146,6 +146,7 @@ func MakeTransport(
146146
if config.HttpMiddleware != nil {
147147
roundTripper = config.HttpMiddleware(roundTripper)
148148
}
149+
roundTripper = maybeAddLogging(roundTripper)
149150
return roundTripper, nil
150151
}
151152

pkg/cloud/gcp/BUILD.bazel

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ go_test(
6060
"//pkg/testutils/skip",
6161
"//pkg/util/ioctx",
6262
"//pkg/util/leaktest",
63+
"//pkg/util/log",
6364
"//pkg/util/uuid",
6465
"@com_github_cockroachdb_errors//:errors",
6566
"@com_github_googleapis_gax_go_v2//apierror",

pkg/cloud/gcp/gcs_storage_test.go

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"os"
1515
"strings"
1616
"testing"
17+
"time"
1718

1819
gcs "cloud.google.com/go/storage"
1920
"github.com/cockroachdb/cockroach/pkg/base"
@@ -25,6 +26,7 @@ import (
2526
"github.com/cockroachdb/cockroach/pkg/testutils/skip"
2627
"github.com/cockroachdb/cockroach/pkg/util/ioctx"
2728
"github.com/cockroachdb/cockroach/pkg/util/leaktest"
29+
"github.com/cockroachdb/cockroach/pkg/util/log"
2830
"github.com/cockroachdb/cockroach/pkg/util/uuid"
2931
"github.com/stretchr/testify/require"
3032
"golang.org/x/oauth2/google"
@@ -297,6 +299,49 @@ func TestGCSAssumeRole(t *testing.T) {
297299
})
298300
}
299301

302+
func TestGCSFaultInjection(t *testing.T) {
303+
defer leaktest.AfterTest(t)()
304+
305+
if !cloudtestutils.IsImplicitAuthConfigured() {
306+
skip.IgnoreLint(t, "implicit auth is not configured")
307+
}
308+
309+
bucket := os.Getenv("GOOGLE_BUCKET")
310+
if bucket == "" {
311+
skip.IgnoreLint(t, "GOOGLE_BUCKET env var must be set")
312+
}
313+
314+
// Enable cloud transport logging.
315+
defer log.Scope(t).Close(t)
316+
prevVModule := log.GetVModule()
317+
defer func() { _ = log.SetVModule(prevVModule) }()
318+
require.NoError(t, log.SetVModule("cloud_logging_transport=1"))
319+
320+
testID := cloudtestutils.NewTestID()
321+
uri := fmt.Sprintf("gs://%s/%d-fault-injection-test?AUTH=implicit", bucket, testID)
322+
323+
// Inject faults for 15-45 seconds after the storage is opened.
324+
middleware := cloudtestutils.BrownoutMiddleware(time.Second*15, time.Second*45)
325+
326+
conf, err := cloud.ExternalStorageConfFromURI(uri, username.RootUserName())
327+
require.NoError(t, err)
328+
329+
args := cloud.EarlyBootExternalStorageContext{
330+
IOConf: base.ExternalIODirConfig{},
331+
Settings: cluster.MakeTestingClusterSettings(),
332+
Options: nil,
333+
Limiters: nil,
334+
MetricsRecorder: cloud.NilMetrics,
335+
HttpMiddleware: middleware,
336+
}
337+
338+
storage, err := makeGCSStorage(context.Background(), args, conf)
339+
require.NoError(t, err)
340+
defer storage.Close()
341+
342+
cloudtestutils.RunCloudNemesisTest(t, storage)
343+
}
344+
300345
func TestAntagonisticGCSRead(t *testing.T) {
301346
defer leaktest.AfterTest(t)()
302347

0 commit comments

Comments
 (0)