diff --git a/models/make_bucket_request.go b/models/make_bucket_request.go index 796bca8381..bc114e4381 100644 --- a/models/make_bucket_request.go +++ b/models/make_bucket_request.go @@ -41,6 +41,9 @@ type MakeBucketRequest struct { // quota Quota *SetBucketQuota `json:"quota,omitempty"` + // retention + Retention *PutBucketRetentionRequest `json:"retention,omitempty"` + // versioning Versioning bool `json:"versioning,omitempty"` } @@ -57,6 +60,10 @@ func (m *MakeBucketRequest) Validate(formats strfmt.Registry) error { res = append(res, err) } + if err := m.validateRetention(formats); err != nil { + res = append(res, err) + } + if len(res) > 0 { return errors.CompositeValidationError(res...) } @@ -90,6 +97,24 @@ func (m *MakeBucketRequest) validateQuota(formats strfmt.Registry) error { return nil } +func (m *MakeBucketRequest) validateRetention(formats strfmt.Registry) error { + + if swag.IsZero(m.Retention) { // not required + return nil + } + + if m.Retention != nil { + if err := m.Retention.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("retention") + } + return err + } + } + + return nil +} + // MarshalBinary interface implementation func (m *MakeBucketRequest) MarshalBinary() ([]byte, error) { if m == nil { diff --git a/restapi/embedded_spec.go b/restapi/embedded_spec.go index 59182dd2c3..d154ca02b4 100644 --- a/restapi/embedded_spec.go +++ b/restapi/embedded_spec.go @@ -3902,6 +3902,9 @@ func init() { "quota": { "$ref": "#/definitions/setBucketQuota" }, + "retention": { + "$ref": "#/definitions/putBucketRetentionRequest" + }, "versioning": { "type": "boolean" } @@ -9502,6 +9505,9 @@ func init() { "quota": { "$ref": "#/definitions/setBucketQuota" }, + "retention": { + "$ref": "#/definitions/putBucketRetentionRequest" + }, "versioning": { "type": "boolean" } diff --git a/restapi/user_buckets.go b/restapi/user_buckets.go index 9289825645..ec47f474e4 100644 --- a/restapi/user_buckets.go +++ b/restapi/user_buckets.go @@ -323,6 +323,16 @@ func getMakeBucketResponse(session *models.Principal, br *models.MakeBucketReque return prepareError(err) } + // make sure to delete bucket if an error occurs after bucket was created + defer func() { + if err != nil { + log.Println("error creating bucket:", err) + if err := removeBucket(minioClient, *br.Name); err != nil { + log.Println("error removing bucket:", err) + } + } + }() + // if it has support for if br.Quota != nil && br.Quota.Enabled != nil && *br.Quota.Enabled { mAdmin, err := newMAdminClient(session) @@ -337,6 +347,14 @@ func getMakeBucketResponse(session *models.Principal, br *models.MakeBucketReque log.Println("error versioning bucket:", err) } } + + // Set Bucket Retention Configuration if defined + if br.Retention != nil { + err = setBucketRetentionConfig(ctx, minioClient, *br.Name, br.Retention.Mode, br.Retention.Unit, br.Retention.Validity) + if err != nil { + return prepareError(err) + } + } return nil } diff --git a/swagger.yml b/swagger.yml index def523d3ea..b2ea52ab7e 100644 --- a/swagger.yml +++ b/swagger.yml @@ -2083,6 +2083,9 @@ definitions: type: boolean quota: $ref: "#/definitions/setBucketQuota" + retention: + $ref: "#/definitions/putBucketRetentionRequest" + error: type: object required: