Add Bucket Locking option and fix versioning configuration. (#661)

* Add Bucket Locking option and fix versioning configuration.

* Addres comments

* Rework the View Bucket options

* Remove extra padding
This commit is contained in:
Daniel Valdivia
2021-03-22 16:28:07 -07:00
committed by GitHub
parent 19195e0cd0
commit 744ccea842
34 changed files with 987 additions and 414 deletions

View File

@@ -150,6 +150,14 @@ func registerBucketsHandlers(api *operations.ConsoleAPI) {
}
return user_api.NewGetBucketRetentionConfigOK().WithPayload(response)
})
// get bucket object locking status
api.UserAPIGetBucketObjectLockingStatusHandler = user_api.GetBucketObjectLockingStatusHandlerFunc(func(params user_api.GetBucketObjectLockingStatusParams, session *models.Principal) middleware.Responder {
getBucketObjectLockingStatus, err := getBucketObLockingResponse(session, params.BucketName)
if err != nil {
return user_api.NewGetBucketObjectLockingStatusDefault(500).WithPayload(&models.Error{Code: 500, Message: swag.String(err.Error())})
}
return user_api.NewGetBucketObjectLockingStatusOK().WithPayload(getBucketObjectLockingStatus)
})
}
func getAddBucketReplicationdResponse(session *models.Principal, bucketName string, params *user_api.AddBucketReplicationParams) error {
@@ -240,10 +248,8 @@ func setBucketVersioningResponse(session *models.Principal, bucketName string, p
versioningState = VersionEnable
}
err2 := doSetVersioning(amcClient, versioningState)
if err2 != nil {
return prepareError(err2)
if err := doSetVersioning(amcClient, versioningState); err != nil {
return prepareError(err)
}
return nil
}
@@ -376,7 +382,12 @@ func getMakeBucketResponse(session *models.Principal, br *models.MakeBucketReque
// defining the client to be used
minioClient := minioClient{client: mClient}
if err := makeBucket(ctx, minioClient, *br.Name, br.Versioning); err != nil {
// if we need retention, then object locking needs to be enabled
if br.Retention != nil {
br.Locking = true
}
if err := makeBucket(ctx, minioClient, *br.Name, br.Locking); err != nil {
return prepareError(err)
}
@@ -390,6 +401,21 @@ func getMakeBucketResponse(session *models.Principal, br *models.MakeBucketReque
}
}()
// enable versioning if indicated or retention enabled
if br.Versioning || br.Retention != nil {
s3Client, err := newS3BucketClient(session, *br.Name, "")
if err != nil {
return prepareError(err)
}
// create a mc S3Client interface implementation
// defining the client to be used
amcClient := mcClient{client: s3Client}
if err = doSetVersioning(amcClient, VersionEnable); err != nil {
return prepareError(err)
}
}
// if it has support for
if br.Quota != nil && br.Quota.Enabled != nil && *br.Quota.Enabled {
mAdmin, err := newMAdminClient(session)
@@ -748,3 +774,34 @@ func getBucketRetentionConfigResponse(session *models.Principal, bucketName stri
}
return config, nil
}
func getBucketObLockingResponse(session *models.Principal, bucketName string) (*models.BucketObLockingResponse, error) {
ctx, cancel := context.WithTimeout(context.Background(), time.Second*20)
defer cancel()
mClient, err := newMinioClient(session)
if err != nil {
log.Println("error creating MinIO Client:", err)
return nil, err
}
// create a minioClient interface implementation
// defining the client to be used
minioClient := minioClient{client: mClient}
// we will tolerate this call failing
_, _, _, _, err = minioClient.getObjectLockConfig(ctx, bucketName)
if err != nil {
if err.Error() == "Object Lock configuration does not exist for this bucket" {
return &models.BucketObLockingResponse{
ObjectLockingEnabled: false,
}, nil
}
log.Println("error object locking bucket:", err)
}
// serialize output
listBucketsResponse := &models.BucketObLockingResponse{
ObjectLockingEnabled: true,
}
return listBucketsResponse, nil
}