From 0666c26c607f6a925a4641d78ef32115f331248e Mon Sep 17 00:00:00 2001 From: Seena Fallah Date: Mon, 3 Feb 2025 17:59:58 +0100 Subject: [PATCH] rgw/admin: add test for versioning and object lock Signed-off-by: Seena Fallah --- internal/util/util.go | 6 ++++ rgw/admin/bucket_test.go | 71 ++++++++++++++++++++++++++++++++++++++-- 2 files changed, 74 insertions(+), 3 deletions(-) diff --git a/internal/util/util.go b/internal/util/util.go index c1ad963b7..f5e5147d2 100644 --- a/internal/util/util.go +++ b/internal/util/util.go @@ -11,6 +11,8 @@ const ( CephOctopus CephPacific CephQuincy + CephReef + CephSquid CephUnknown ) @@ -31,6 +33,10 @@ func CephVersionOfString(vname string) CephVersion { return CephPacific case "quincy": return CephQuincy + case "reef": + return CephReef + case "squid": + return CephSquid default: return CephUnknown } diff --git a/rgw/admin/bucket_test.go b/rgw/admin/bucket_test.go index 15b39baa4..7ee1a025d 100644 --- a/rgw/admin/bucket_test.go +++ b/rgw/admin/bucket_test.go @@ -7,6 +7,9 @@ import ( "testing" "time" + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/service/s3" + "github.com/aws/aws-sdk-go-v2/service/s3/types" "github.com/ceph/go-ceph/internal/util" "github.com/stretchr/testify/assert" ) @@ -16,11 +19,11 @@ func (suite *RadosGWTestSuite) TestBucket() { co, err := New(suite.endpoint, suite.accessKey, suite.secretKey, newDebugHTTPClient(http.DefaultClient)) assert.NoError(suite.T(), err) - s3, err := newS3Agent(suite.accessKey, suite.secretKey, suite.endpoint, true) + s3Agent, err := newS3Agent(suite.accessKey, suite.secretKey, suite.endpoint, true) assert.NoError(suite.T(), err) beforeCreate := time.Now() - err = s3.createBucket(suite.bucketTestName) + err = s3Agent.createBucket(suite.bucketTestName) assert.NoError(suite.T(), err) suite.T().Run("list buckets", func(_ *testing.T) { @@ -36,7 +39,69 @@ func (suite *RadosGWTestSuite) TestBucket() { }) suite.T().Run("info existing bucket", func(_ *testing.T) { - _, err := co.GetBucketInfo(context.Background(), Bucket{Bucket: suite.bucketTestName}) + bucketInfo, err := co.GetBucketInfo(context.Background(), Bucket{Bucket: suite.bucketTestName}) + assert.NoError(suite.T(), err) + + // check if versioning is disabled + switch { + case util.CurrentCephVersion() < util.CephQuincy: + // No action needed for versions below CephQuincy + case util.CurrentCephVersion() == util.CephReef: + assert.False(suite.T(), *bucketInfo.VersioningEnabled) + assert.False(suite.T(), *bucketInfo.Versioned) + default: + assert.Equal(suite.T(), "off", *bucketInfo.Versioning) + } + + // check if object lock is disabled + if util.CurrentCephVersion() >= util.CephQuincy { + assert.False(suite.T(), bucketInfo.ObjectLockEnabled) + } + }) + + suite.T().Run("enable versioning", func(t *testing.T) { + if util.CurrentCephVersion() < util.CephQuincy { + t.Skip("versioning is not reported in bucket stats") + } + + _, err := s3Agent.Client.PutBucketVersioning(context.Background(), &s3.PutBucketVersioningInput{ + Bucket: &suite.bucketTestName, + VersioningConfiguration: &types.VersioningConfiguration{Status: types.BucketVersioningStatusEnabled}, + }) + assert.NoError(suite.T(), err) + + // check if versioning is enabled + bucketInfo, err := co.GetBucketInfo(context.Background(), Bucket{Bucket: suite.bucketTestName}) + assert.NoError(suite.T(), err) + if util.CurrentCephVersion() == util.CephReef { + assert.True(suite.T(), *bucketInfo.VersioningEnabled) + assert.True(suite.T(), *bucketInfo.Versioned) + } else { + assert.Equal(suite.T(), "enabled", *bucketInfo.Versioning) + } + }) + + suite.T().Run("enable bucket object lock", func(t *testing.T) { + if util.CurrentCephVersion() < util.CephQuincy { + t.Skip("bucket object lock is not reported in bucket stats") + } + + const bucketName = "bucket-object-lock" + + // create bucket with object lock enabled + _, err := s3Agent.Client.CreateBucket(context.Background(), &s3.CreateBucketInput{ + Bucket: aws.String(bucketName), + ObjectLockEnabledForBucket: aws.Bool(true), + }) + assert.NoError(suite.T(), err) + + // check if object lock is enabled + bucketInfo, err := co.GetBucketInfo(context.Background(), Bucket{Bucket: bucketName}) + assert.NoError(suite.T(), err) + assert.True(suite.T(), bucketInfo.ObjectLockEnabled) + + // remove bucket + err = co.RemoveBucket(context.Background(), Bucket{Bucket: bucketName}) assert.NoError(suite.T(), err) })