From 6a7f042d6c6afcfc3d67f18bab07a1aef1cc43c4 Mon Sep 17 00:00:00 2001 From: Alex <33497058+bexsoft@users.noreply.github.com> Date: Thu, 10 Feb 2022 17:50:27 -0700 Subject: [PATCH] Fixed logic for add lifecycle rules (#1553) - Removed support to fixed date lifecycle rules according resolution of https://github.com/minio/console/issues/1527 Signed-off-by: Benjamin Perez Co-authored-by: Benjamin Perez Co-authored-by: Daniel Valdivia <18384552+dvaldivia@users.noreply.github.com> --- models/add_bucket_lifecycle.go | 58 ++++++++++ .../BucketDetails/AddLifecycleModal.tsx | 1 + restapi/embedded_spec.go | 16 +++ restapi/user_buckets_lifecycle.go | 100 +++++------------- restapi/user_buckets_lifecycle_test.go | 3 + swagger-console.yml | 6 ++ 6 files changed, 113 insertions(+), 71 deletions(-) diff --git a/models/add_bucket_lifecycle.go b/models/add_bucket_lifecycle.go index 2ba78b6b4..41fd06083 100644 --- a/models/add_bucket_lifecycle.go +++ b/models/add_bucket_lifecycle.go @@ -24,9 +24,12 @@ package models import ( "context" + "encoding/json" + "github.com/go-openapi/errors" "github.com/go-openapi/strfmt" "github.com/go-openapi/swag" + "github.com/go-openapi/validate" ) // AddBucketLifecycle add bucket lifecycle @@ -69,10 +72,65 @@ type AddBucketLifecycle struct { // Required in case of transition_date or expiry fields are not set. it defines a transition days for ILM TransitionDays int32 `json:"transition_days,omitempty"` + + // ILM Rule type (Expiry or transition) + // Enum: [expiry transition] + Type string `json:"type,omitempty"` } // Validate validates this add bucket lifecycle func (m *AddBucketLifecycle) Validate(formats strfmt.Registry) error { + var res []error + + if err := m.validateType(formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +var addBucketLifecycleTypeTypePropEnum []interface{} + +func init() { + var res []string + if err := json.Unmarshal([]byte(`["expiry","transition"]`), &res); err != nil { + panic(err) + } + for _, v := range res { + addBucketLifecycleTypeTypePropEnum = append(addBucketLifecycleTypeTypePropEnum, v) + } +} + +const ( + + // AddBucketLifecycleTypeExpiry captures enum value "expiry" + AddBucketLifecycleTypeExpiry string = "expiry" + + // AddBucketLifecycleTypeTransition captures enum value "transition" + AddBucketLifecycleTypeTransition string = "transition" +) + +// prop value enum +func (m *AddBucketLifecycle) validateTypeEnum(path, location string, value string) error { + if err := validate.EnumCase(path, location, value, addBucketLifecycleTypeTypePropEnum, true); err != nil { + return err + } + return nil +} + +func (m *AddBucketLifecycle) validateType(formats strfmt.Registry) error { + if swag.IsZero(m.Type) { // not required + return nil + } + + // value enum + if err := m.validateTypeEnum("type", "body", m.Type); err != nil { + return err + } + return nil } diff --git a/portal-ui/src/screens/Console/Buckets/BucketDetails/AddLifecycleModal.tsx b/portal-ui/src/screens/Console/Buckets/BucketDetails/AddLifecycleModal.tsx index 1b3916286..4cde9de96 100644 --- a/portal-ui/src/screens/Console/Buckets/BucketDetails/AddLifecycleModal.tsx +++ b/portal-ui/src/screens/Console/Buckets/BucketDetails/AddLifecycleModal.tsx @@ -166,6 +166,7 @@ const AddLifecycleModal = ({ } const lifecycleInsert = { + type: ilmType, prefix, tags, expired_object_delete_marker: expiredObjectDM, diff --git a/restapi/embedded_spec.go b/restapi/embedded_spec.go index d605d691e..84e225549 100644 --- a/restapi/embedded_spec.go +++ b/restapi/embedded_spec.go @@ -3863,6 +3863,14 @@ func init() { "type": "integer", "format": "int32", "default": 0 + }, + "type": { + "description": "ILM Rule type (Expiry or transition)", + "type": "string", + "enum": [ + "expiry", + "transition" + ] } } }, @@ -10186,6 +10194,14 @@ func init() { "type": "integer", "format": "int32", "default": 0 + }, + "type": { + "description": "ILM Rule type (Expiry or transition)", + "type": "string", + "enum": [ + "expiry", + "transition" + ] } } }, diff --git a/restapi/user_buckets_lifecycle.go b/restapi/user_buckets_lifecycle.go index 465bbd58f..e480c6016 100644 --- a/restapi/user_buckets_lifecycle.go +++ b/restapi/user_buckets_lifecycle.go @@ -161,57 +161,28 @@ func addBucketLifecycle(ctx context.Context, client MinioClient, params user_api opts := ilm.LifecycleOptions{} - // Verify if transition items are set - if params.Body.ExpiryDate == "" && params.Body.ExpiryDays == 0 { - if params.Body.TransitionDate != "" && params.Body.TransitionDays != 0 { - return errors.New("only one transition configuration can be set (days or date)") - } - - if params.Body.ExpiryDate != "" || params.Body.ExpiryDays != 0 { - return errors.New("expiry cannot be set when transition is being configured") - } - - if params.Body.NoncurrentversionExpirationDays != 0 { - return errors.New("non current version Expiration Days cannot be set when transition is being configured") - } - - if params.Body.TransitionDate != "" { - opts = ilm.LifecycleOptions{ - ID: id, - Prefix: params.Body.Prefix, - Status: !params.Body.Disable, - IsTagsSet: params.Body.Tags != "", - Tags: params.Body.Tags, - TransitionDate: params.Body.TransitionDate, - StorageClass: strings.ToUpper(params.Body.StorageClass), - ExpiredObjectDeleteMarker: params.Body.ExpiredObjectDeleteMarker, - NoncurrentVersionTransitionDays: int(params.Body.NoncurrentversionTransitionDays), - NoncurrentVersionTransitionStorageClass: strings.ToUpper(params.Body.NoncurrentversionTransitionStorageClass), - } - } else if params.Body.TransitionDays != 0 { - opts = ilm.LifecycleOptions{ - ID: id, - Prefix: params.Body.Prefix, - Status: !params.Body.Disable, - IsTagsSet: params.Body.Tags != "", - Tags: params.Body.Tags, - TransitionDays: strconv.Itoa(int(params.Body.TransitionDays)), - StorageClass: strings.ToUpper(params.Body.StorageClass), - ExpiredObjectDeleteMarker: params.Body.ExpiredObjectDeleteMarker, - NoncurrentVersionTransitionDays: int(params.Body.NoncurrentversionTransitionDays), - NoncurrentVersionTransitionStorageClass: strings.ToUpper(params.Body.NoncurrentversionTransitionStorageClass), - } - } - } else if params.Body.TransitionDate == "" && params.Body.TransitionDays == 0 { - // Verify if expiry items are set - if params.Body.ExpiryDate != "" && params.Body.ExpiryDays != 0 { + // Verify if transition rule is requested + if params.Body.Type == models.AddBucketLifecycleTypeTransition { + if params.Body.TransitionDays == 0 && params.Body.NoncurrentversionTransitionDays == 0 { return errors.New("only one expiry configuration can be set (days or date)") } - if params.Body.TransitionDate != "" || params.Body.TransitionDays != 0 { - return errors.New("transition cannot be set when expiry is being configured") + opts = ilm.LifecycleOptions{ + ID: id, + Prefix: params.Body.Prefix, + Status: !params.Body.Disable, + IsTagsSet: params.Body.Tags != "", + Tags: params.Body.Tags, + TransitionDays: strconv.Itoa(int(params.Body.TransitionDays)), + StorageClass: strings.ToUpper(params.Body.StorageClass), + ExpiredObjectDeleteMarker: params.Body.ExpiredObjectDeleteMarker, + NoncurrentVersionTransitionDays: int(params.Body.NoncurrentversionTransitionDays), + NoncurrentVersionTransitionStorageClass: strings.ToUpper(params.Body.NoncurrentversionTransitionStorageClass), + IsTransitionDaysSet: params.Body.TransitionDays != 0, + IsNoncurrentVersionTransitionDaysSet: params.Body.NoncurrentversionTransitionDays != 0, } - + } else if params.Body.Type == models.AddBucketLifecycleTypeExpiry { + // Verify if expiry items are set if params.Body.NoncurrentversionTransitionDays != 0 { return errors.New("non current version Transition Days cannot be set when expiry is being configured") } @@ -220,33 +191,20 @@ func addBucketLifecycle(ctx context.Context, client MinioClient, params user_api return errors.New("non current version Transition Storage Class cannot be set when expiry is being configured") } - if params.Body.ExpiryDate != "" { - opts = ilm.LifecycleOptions{ - ID: id, - Prefix: params.Body.Prefix, - Status: !params.Body.Disable, - IsTagsSet: params.Body.Tags != "", - Tags: params.Body.Tags, - ExpiryDate: params.Body.ExpiryDate, - ExpiredObjectDeleteMarker: params.Body.ExpiredObjectDeleteMarker, - NoncurrentVersionExpirationDays: int(params.Body.NoncurrentversionExpirationDays), - } - } else if params.Body.ExpiryDays != 0 { - opts = ilm.LifecycleOptions{ - ID: id, - Prefix: params.Body.Prefix, - Status: !params.Body.Disable, - IsTagsSet: params.Body.Tags != "", - Tags: params.Body.Tags, - ExpiryDays: strconv.Itoa(int(params.Body.ExpiryDays)), - ExpiredObjectDeleteMarker: params.Body.ExpiredObjectDeleteMarker, - NoncurrentVersionExpirationDays: int(params.Body.NoncurrentversionExpirationDays), - } + opts = ilm.LifecycleOptions{ + ID: id, + Prefix: params.Body.Prefix, + Status: !params.Body.Disable, + IsTagsSet: params.Body.Tags != "", + Tags: params.Body.Tags, + ExpiryDays: strconv.Itoa(int(params.Body.ExpiryDays)), + ExpiredObjectDeleteMarker: params.Body.ExpiredObjectDeleteMarker, + NoncurrentVersionExpirationDays: int(params.Body.NoncurrentversionExpirationDays), } } else { // Non set, we return error - return errors.New("no valid configuration is set") + return errors.New("no valid configuration requested") } var err2 *probe.Error @@ -335,7 +293,7 @@ func editBucketLifecycle(ctx context.Context, client MinioClient, params user_ap } else { // Non set, we return error - return errors.New("transition and expiry cannot be set for the same rule") + return errors.New("no valid configuration requested") } var err2 *probe.Error diff --git a/restapi/user_buckets_lifecycle_test.go b/restapi/user_buckets_lifecycle_test.go index 429b96558..6326c8305 100644 --- a/restapi/user_buckets_lifecycle_test.go +++ b/restapi/user_buckets_lifecycle_test.go @@ -163,9 +163,12 @@ func TestSetLifecycleRule(t *testing.T) { return &mockLifecycle, nil } + expiryRule := "expiry" + insertMock := user_api.AddBucketLifecycleParams{ BucketName: "testBucket", Body: &models.AddBucketLifecycle{ + Type: expiryRule, Disable: false, ExpiredObjectDeleteMarker: false, ExpiryDays: int32(16), diff --git a/swagger-console.yml b/swagger-console.yml index 61db47cb0..da3b4866d 100644 --- a/swagger-console.yml +++ b/swagger-console.yml @@ -3888,6 +3888,12 @@ definitions: addBucketLifecycle: type: object properties: + type: + description: ILM Rule type (Expiry or transition) + type: string + enum: + - expiry + - transition prefix: description: Non required field, it matches a prefix to perform ILM operations on it type: string