diff --git a/Makefile b/Makefile index 864b91eb9..2a358f256 100644 --- a/Makefile +++ b/Makefile @@ -33,6 +33,10 @@ lint: @GO111MODULE=on ${GOPATH}/bin/golangci-lint cache clean @GO111MODULE=on ${GOPATH}/bin/golangci-lint run --timeout=5m --config ./.golangci.yml +lint-fix: getdeps ## runs golangci-lint suite of linters with automatic fixes + @echo "Running $@ check" + @GO111MODULE=on ${GOPATH}/bin/golangci-lint run --timeout=5m --config ./.golangci.yml --fix + install: console @echo "Installing console binary to '$(GOPATH)/bin/console'" @mkdir -p $(GOPATH)/bin && cp -f $(PWD)/console $(GOPATH)/bin/console diff --git a/api/embedded_spec.go b/api/embedded_spec.go index 1b210ef8d..bb43237f5 100644 --- a/api/embedded_spec.go +++ b/api/embedded_spec.go @@ -5373,6 +5373,10 @@ func init() { "description": "Non required, toggle to disable or enable rule", "type": "boolean" }, + "expired_object_delete_all": { + "description": "Non required, toggle to disable or enable rule", + "type": "boolean" + }, "expired_object_delete_marker": { "description": "Non required, toggle to disable or enable rule", "type": "boolean" @@ -5475,6 +5479,10 @@ func init() { "type": "string" } }, + "expired_object_delete_all": { + "description": "Non required, toggle to disable or enable rule", + "type": "boolean" + }, "expired_object_delete_marker": { "description": "Non required, toggle to disable or enable rule", "type": "boolean" @@ -6180,6 +6188,9 @@ func init() { "type": "integer", "format": "int64" }, + "delete_all": { + "type": "boolean" + }, "delete_marker": { "type": "boolean" }, @@ -8838,6 +8849,10 @@ func init() { "description": "Non required, toggle to disable or enable rule", "type": "boolean" }, + "expired_object_delete_all": { + "description": "Non required, toggle to disable or enable rule", + "type": "boolean" + }, "expired_object_delete_marker": { "description": "Non required, toggle to disable or enable rule", "type": "boolean" @@ -14729,6 +14744,10 @@ func init() { "description": "Non required, toggle to disable or enable rule", "type": "boolean" }, + "expired_object_delete_all": { + "description": "Non required, toggle to disable or enable rule", + "type": "boolean" + }, "expired_object_delete_marker": { "description": "Non required, toggle to disable or enable rule", "type": "boolean" @@ -14831,6 +14850,10 @@ func init() { "type": "string" } }, + "expired_object_delete_all": { + "description": "Non required, toggle to disable or enable rule", + "type": "boolean" + }, "expired_object_delete_marker": { "description": "Non required, toggle to disable or enable rule", "type": "boolean" @@ -15531,6 +15554,9 @@ func init() { "type": "integer", "format": "int64" }, + "delete_all": { + "type": "boolean" + }, "delete_marker": { "type": "boolean" }, @@ -18172,6 +18198,10 @@ func init() { "description": "Non required, toggle to disable or enable rule", "type": "boolean" }, + "expired_object_delete_all": { + "description": "Non required, toggle to disable or enable rule", + "type": "boolean" + }, "expired_object_delete_marker": { "description": "Non required, toggle to disable or enable rule", "type": "boolean" diff --git a/api/user_buckets_lifecycle.go b/api/user_buckets_lifecycle.go index 87ee48fec..4ec38ba16 100644 --- a/api/user_buckets_lifecycle.go +++ b/api/user_buckets_lifecycle.go @@ -117,6 +117,7 @@ func getBucketLifecycle(ctx context.Context, client MinioClient, bucketName stri Date: rule.Expiration.Date.Format(time.RFC3339), Days: int64(rule.Expiration.Days), DeleteMarker: rule.Expiration.DeleteMarker.IsEnabled(), + DeleteAll: bool(rule.Expiration.DeleteAll), NoncurrentExpirationDays: int64(rule.NoncurrentVersionExpiration.NoncurrentDays), NewerNoncurrentExpirationVersions: int64(rule.NoncurrentVersionExpiration.NewerNoncurrentVersions), }, @@ -188,6 +189,7 @@ func addBucketLifecycle(ctx context.Context, client MinioClient, params bucketAp Status: &status, Tags: ¶ms.Body.Tags, ExpiredObjectDeleteMarker: ¶ms.Body.ExpiredObjectDeleteMarker, + ExpiredObjectAllversions: ¶ms.Body.ExpiredObjectDeleteAll, } if params.Body.NoncurrentversionTransitionDays > 0 { @@ -219,6 +221,7 @@ func addBucketLifecycle(ctx context.Context, client MinioClient, params bucketAp Status: &status, Tags: ¶ms.Body.Tags, ExpiredObjectDeleteMarker: ¶ms.Body.ExpiredObjectDeleteMarker, + ExpiredObjectAllversions: ¶ms.Body.ExpiredObjectDeleteAll, } if params.Body.NewerNoncurrentversionExpirationVersions > 0 { @@ -298,6 +301,7 @@ func editBucketLifecycle(ctx context.Context, client MinioClient, params bucketA Status: &status, Tags: ¶ms.Body.Tags, ExpiredObjectDeleteMarker: ¶ms.Body.ExpiredObjectDeleteMarker, + ExpiredObjectAllversions: ¶ms.Body.ExpiredObjectDeleteAll, } if params.Body.NoncurrentversionTransitionDays > 0 { @@ -328,6 +332,7 @@ func editBucketLifecycle(ctx context.Context, client MinioClient, params bucketA Status: &status, Tags: ¶ms.Body.Tags, ExpiredObjectDeleteMarker: ¶ms.Body.ExpiredObjectDeleteMarker, + ExpiredObjectAllversions: ¶ms.Body.ExpiredObjectDeleteAll, } if params.Body.NoncurrentversionExpirationDays > 0 { @@ -456,6 +461,7 @@ func addMultiBucketLifecycle(ctx context.Context, client MinioClient, params buc ExpiryDays: params.Body.ExpiryDays, Disable: false, ExpiredObjectDeleteMarker: params.Body.ExpiredObjectDeleteMarker, + ExpiredObjectDeleteAll: params.Body.ExpiredObjectDeleteMarker, } go func() { diff --git a/go.mod b/go.mod index 4c0c2e721..e3a4b397b 100644 --- a/go.mod +++ b/go.mod @@ -22,7 +22,7 @@ require ( github.com/minio/highwayhash v1.0.2 github.com/minio/kes v0.23.0 github.com/minio/madmin-go/v3 v3.0.46 - github.com/minio/mc v0.0.0-20240209221824-669cb0a9a475 + github.com/minio/mc v0.0.0-20240224013320-f17313e7ab89 github.com/minio/minio-go/v7 v7.0.67 github.com/minio/selfupdate v0.6.0 github.com/minio/websocket v1.6.0 diff --git a/go.sum b/go.sum index 035e03308..c1c9138a6 100644 --- a/go.sum +++ b/go.sum @@ -189,8 +189,8 @@ github.com/minio/kes-go v0.2.1 h1:KnqS+p6xoSFJZbQhmJaz/PbxeA6nQyRqT/ywrn5lU2o= github.com/minio/kes-go v0.2.1/go.mod h1:76xf7l41Wrh+IifisABXK2S8uZWYgWV1IGBKC3GdOJk= github.com/minio/madmin-go/v3 v3.0.46 h1:DabFt+aUph5Vu/SOat2RWN/xVagPBU7qzxhAQ03hH/k= github.com/minio/madmin-go/v3 v3.0.46/go.mod h1:ZDF7kf5fhmxLhbGTqyq5efs4ao0v4eWf7nOuef/ljJs= -github.com/minio/mc v0.0.0-20240209221824-669cb0a9a475 h1:yfLzMougcV2xkVlWgwYwVRoT8pnXrcCV4oOQW+pI2EQ= -github.com/minio/mc v0.0.0-20240209221824-669cb0a9a475/go.mod h1:MmDLdb7NWd/OYhcKcXKvwErq2GNa/Zq6xtTWuhdC4II= +github.com/minio/mc v0.0.0-20240224013320-f17313e7ab89 h1:XM7YTVWU46a1P+8h7+xMCQXJEIdU+MEFp9BZM7ImeVI= +github.com/minio/mc v0.0.0-20240224013320-f17313e7ab89/go.mod h1:RBhdjMeCia7yxC9jQ2onV7kPvruzWBgtSa/h2zm1egc= github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34= github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= github.com/minio/minio-go/v7 v7.0.67 h1:BeBvZWAS+kRJm1vGTMJYVjKUNoo0FoEt/wUWdUtfmh8= diff --git a/models/add_bucket_lifecycle.go b/models/add_bucket_lifecycle.go index 6af45297d..6aacadd79 100644 --- a/models/add_bucket_lifecycle.go +++ b/models/add_bucket_lifecycle.go @@ -40,6 +40,9 @@ type AddBucketLifecycle struct { // Non required, toggle to disable or enable rule Disable bool `json:"disable,omitempty"` + // Non required, toggle to disable or enable rule + ExpiredObjectDeleteAll bool `json:"expired_object_delete_all,omitempty"` + // Non required, toggle to disable or enable rule ExpiredObjectDeleteMarker bool `json:"expired_object_delete_marker,omitempty"` diff --git a/models/add_multi_bucket_lifecycle.go b/models/add_multi_bucket_lifecycle.go index 4b3c738df..a51ff48cb 100644 --- a/models/add_multi_bucket_lifecycle.go +++ b/models/add_multi_bucket_lifecycle.go @@ -41,6 +41,9 @@ type AddMultiBucketLifecycle struct { // Required: true Buckets []string `json:"buckets"` + // Non required, toggle to disable or enable rule + ExpiredObjectDeleteAll bool `json:"expired_object_delete_all,omitempty"` + // Non required, toggle to disable or enable rule ExpiredObjectDeleteMarker bool `json:"expired_object_delete_marker,omitempty"` diff --git a/models/expiration_response.go b/models/expiration_response.go index 961ad3def..ce371c2a8 100644 --- a/models/expiration_response.go +++ b/models/expiration_response.go @@ -40,6 +40,9 @@ type ExpirationResponse struct { // days Days int64 `json:"days,omitempty"` + // delete all + DeleteAll bool `json:"delete_all,omitempty"` + // delete marker DeleteMarker bool `json:"delete_marker,omitempty"` diff --git a/models/update_bucket_lifecycle.go b/models/update_bucket_lifecycle.go index cf186510d..0e862998a 100644 --- a/models/update_bucket_lifecycle.go +++ b/models/update_bucket_lifecycle.go @@ -40,6 +40,9 @@ type UpdateBucketLifecycle struct { // Non required, toggle to disable or enable rule Disable bool `json:"disable,omitempty"` + // Non required, toggle to disable or enable rule + ExpiredObjectDeleteAll bool `json:"expired_object_delete_all,omitempty"` + // Non required, toggle to disable or enable rule ExpiredObjectDeleteMarker bool `json:"expired_object_delete_marker,omitempty"` diff --git a/swagger.yml b/swagger.yml index a538105dc..495d6a772 100644 --- a/swagger.yml +++ b/swagger.yml @@ -5109,6 +5109,8 @@ definitions: format: int64 delete_marker: type: boolean + delete_all: + type: boolean noncurrent_expiration_days: type: integer format: int64 @@ -5192,6 +5194,9 @@ definitions: expired_object_delete_marker: description: Non required, toggle to disable or enable rule type: boolean + expired_object_delete_all: + description: Non required, toggle to disable or enable rule + type: boolean noncurrentversion_expiration_days: description: Non required, can be set in case of expiration is enabled type: integer @@ -5247,6 +5252,9 @@ definitions: expired_object_delete_marker: description: Non required, toggle to disable or enable rule type: boolean + expired_object_delete_all: + description: Non required, toggle to disable or enable rule + type: boolean noncurrentversion_expiration_days: description: Non required, can be set in case of expiration is enabled type: integer @@ -5299,6 +5307,9 @@ definitions: expired_object_delete_marker: description: Non required, toggle to disable or enable rule type: boolean + expired_object_delete_all: + description: Non required, toggle to disable or enable rule + type: boolean noncurrentversion_expiration_days: description: Non required, can be set in case of expiration is enabled type: integer diff --git a/web-app/src/api/consoleApi.ts b/web-app/src/api/consoleApi.ts index 9680623cc..8946cf064 100644 --- a/web-app/src/api/consoleApi.ts +++ b/web-app/src/api/consoleApi.ts @@ -903,6 +903,7 @@ export interface ExpirationResponse { /** @format int64 */ days?: number; delete_marker?: boolean; + delete_all?: boolean; /** @format int64 */ noncurrent_expiration_days?: number; /** @format int64 */ @@ -958,6 +959,8 @@ export interface AddBucketLifecycle { disable?: boolean; /** Non required, toggle to disable or enable rule */ expired_object_delete_marker?: boolean; + /** Non required, toggle to disable or enable rule */ + expired_object_delete_all?: boolean; /** * Non required, can be set in case of expiration is enabled * @format int32 @@ -1005,6 +1008,8 @@ export interface UpdateBucketLifecycle { disable?: boolean; /** Non required, toggle to disable or enable rule */ expired_object_delete_marker?: boolean; + /** Non required, toggle to disable or enable rule */ + expired_object_delete_all?: boolean; /** * Non required, can be set in case of expiration is enabled * @format int32 @@ -1045,6 +1050,8 @@ export interface AddMultiBucketLifecycle { storage_class?: string; /** Non required, toggle to disable or enable rule */ expired_object_delete_marker?: boolean; + /** Non required, toggle to disable or enable rule */ + expired_object_delete_all?: boolean; /** * Non required, can be set in case of expiration is enabled * @format int32 diff --git a/web-app/src/screens/Console/Buckets/BucketDetails/AddLifecycleModal.tsx b/web-app/src/screens/Console/Buckets/BucketDetails/AddLifecycleModal.tsx index 79b85e17b..83955f684 100644 --- a/web-app/src/screens/Console/Buckets/BucketDetails/AddLifecycleModal.tsx +++ b/web-app/src/screens/Console/Buckets/BucketDetails/AddLifecycleModal.tsx @@ -73,6 +73,8 @@ const AddLifecycleModal = ({ const [lifecycleDays, setLifecycleDays] = useState(""); const [isFormValid, setIsFormValid] = useState(false); const [expiredObjectDM, setExpiredObjectDM] = useState(false); + const [expiredAllVersionsDM, setExpiredAllVersionsDM] = + useState(false); const [loadingVersioning, setLoadingVersioning] = useState(true); const [expandedAdv, setExpandedAdv] = useState(false); const [expanded, setExpanded] = useState(false); @@ -183,6 +185,7 @@ const AddLifecycleModal = ({ prefix, tags, expired_object_delete_marker: expiredObjectDM, + expired_object_delete_all: expiredAllVersionsDM, ...rules, }; @@ -437,6 +440,21 @@ const AddLifecycleModal = ({ "Remove the reference to the object if no versions are left" } /> + , + ) => { + setExpiredAllVersionsDM(event.target.checked); + }} + label={"Expire All Versions"} + description={ + "Removes all the versions of the object already expired" + } + /> diff --git a/web-app/src/screens/Console/Buckets/BucketDetails/EditLifecycleConfiguration.tsx b/web-app/src/screens/Console/Buckets/BucketDetails/EditLifecycleConfiguration.tsx index 175765acc..7ba0f15f4 100644 --- a/web-app/src/screens/Console/Buckets/BucketDetails/EditLifecycleConfiguration.tsx +++ b/web-app/src/screens/Console/Buckets/BucketDetails/EditLifecycleConfiguration.tsx @@ -62,6 +62,8 @@ const EditLifecycleConfiguration = ({ const [storageClass, setStorageClass] = useState(""); const [NCTransitionSC, setNCTransitionSC] = useState(""); const [expiredObjectDM, setExpiredObjectDM] = useState(false); + const [expiredAllVersionsDM, setExpiredAllVersionsDM] = + useState(false); const [NCExpirationDays, setNCExpirationDays] = useState("0"); const [NCTransitionDays, setNCTransitionDays] = useState("0"); const [ilmType, setIlmType] = useState<"transition" | "expiry">("expiry"); @@ -199,6 +201,7 @@ const EditLifecycleConfiguration = ({ } setExpiredObjectDM(!!lifecycleRule.expiration?.delete_marker); + setExpiredAllVersionsDM(!!lifecycleRule.expiration?.delete_all); setPrefix(lifecycleRule.prefix || ""); if (lifecycleRule.tags) { @@ -270,6 +273,7 @@ const EditLifecycleConfiguration = ({ prefix, tags, expired_object_delete_marker: expiredObjectDM, + expired_object_delete_all: expiredAllVersionsDM, ...rules, }; @@ -498,6 +502,18 @@ const EditLifecycleConfiguration = ({ }} label={"Expired Object Delete Marker"} /> + , + ) => { + setExpiredAllVersionsDM(event.target.checked); + }} + label={"Expired All Versions"} + /> )} diff --git a/web-app/src/screens/Console/Buckets/ListBuckets/BulkLifecycleModal.tsx b/web-app/src/screens/Console/Buckets/ListBuckets/BulkLifecycleModal.tsx index f291cae32..f7c739185 100644 --- a/web-app/src/screens/Console/Buckets/ListBuckets/BulkLifecycleModal.tsx +++ b/web-app/src/screens/Console/Buckets/ListBuckets/BulkLifecycleModal.tsx @@ -59,6 +59,8 @@ const AddBulkReplicationModal = ({ const [storageClass, setStorageClass] = useState(""); const [NCTransitionSC, setNCTransitionSC] = useState(""); const [expiredObjectDM, setExpiredObjectDM] = useState(false); + const [expiredAllVersionsDM, setExpiredAllVersionsDM] = + useState(false); const [NCExpirationDays, setNCExpirationDays] = useState("0"); const [NCTransitionDays, setNCTransitionDays] = useState("0"); const [ilmType, setIlmType] = useState<"expiry" | "transition">("expiry"); @@ -172,6 +174,7 @@ const AddBulkReplicationModal = ({ prefix, tags, expired_object_delete_marker: expiredObjectDM, + expired_object_delete_all: expiredAllVersionsDM, ...rules, }; @@ -344,6 +347,18 @@ const AddBulkReplicationModal = ({ }} label={"Expired Object Delete Marker"} /> + , + ) => { + setExpiredAllVersionsDM(event.target.checked); + }} + label={"Expired All Versions"} + /> diff --git a/web-app/src/screens/Console/Buckets/types.tsx b/web-app/src/screens/Console/Buckets/types.tsx index 0a2584602..b8f1ab8b1 100644 --- a/web-app/src/screens/Console/Buckets/types.tsx +++ b/web-app/src/screens/Console/Buckets/types.tsx @@ -41,6 +41,7 @@ interface IExpirationLifecycle { days: number; date: string; delete_marker?: boolean; + delete_all?: boolean; noncurrent_expiration_days?: number; newer_noncurrent_expiration_versions?: number; }