Merge branch 'master' into resiliency-test

This commit is contained in:
Shubhendu 2024-10-28 16:17:22 +05:30 committed by GitHub
commit f18128ab2e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
40 changed files with 713 additions and 233 deletions

View File

@ -24,7 +24,7 @@ help: ## print this help
getdeps: ## fetch necessary dependencies getdeps: ## fetch necessary dependencies
@mkdir -p ${GOPATH}/bin @mkdir -p ${GOPATH}/bin
@echo "Installing golangci-lint" && curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(GOLANGCI_DIR) @echo "Installing golangci-lint" && curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(GOLANGCI_DIR)
@echo "Installing msgp" && go install -v github.com/tinylib/msgp@v1.1.10-0.20240227114326-6d6f813fff1b @echo "Installing msgp" && go install -v github.com/tinylib/msgp@v1.2.3-0.20241022140105-4558fbf3a223
@echo "Installing stringer" && go install -v golang.org/x/tools/cmd/stringer@latest @echo "Installing stringer" && go install -v golang.org/x/tools/cmd/stringer@latest
crosscompile: ## cross compile minio crosscompile: ## cross compile minio

View File

@ -93,7 +93,6 @@ The following table lists supported architectures. Replace the `wget` URL with t
| 64-bit Intel/AMD | <https://dl.min.io/server/minio/release/linux-amd64/minio> | | 64-bit Intel/AMD | <https://dl.min.io/server/minio/release/linux-amd64/minio> |
| 64-bit ARM | <https://dl.min.io/server/minio/release/linux-arm64/minio> | | 64-bit ARM | <https://dl.min.io/server/minio/release/linux-arm64/minio> |
| 64-bit PowerPC LE (ppc64le) | <https://dl.min.io/server/minio/release/linux-ppc64le/minio> | | 64-bit PowerPC LE (ppc64le) | <https://dl.min.io/server/minio/release/linux-ppc64le/minio> |
| IBM Z-Series (S390X) | <https://dl.min.io/server/minio/release/linux-s390x/minio> |
The MinIO deployment starts using default root credentials `minioadmin:minioadmin`. You can test the deployment using the MinIO Console, an embedded web-based object browser built into MinIO Server. Point a web browser running on the host machine to <http://127.0.0.1:9000> and log in with the root credentials. You can use the Browser to create buckets, upload objects, and browse the contents of the MinIO server. The MinIO deployment starts using default root credentials `minioadmin:minioadmin`. You can test the deployment using the MinIO Console, an embedded web-based object browser built into MinIO Server. Point a web browser running on the host machine to <http://127.0.0.1:9000> and log in with the root credentials. You can use the Browser to create buckets, upload objects, and browse the contents of the MinIO server.

View File

@ -806,18 +806,20 @@ func (h *healSequence) healDiskMeta(objAPI ObjectLayer) error {
return h.healMinioSysMeta(objAPI, minioConfigPrefix)() return h.healMinioSysMeta(objAPI, minioConfigPrefix)()
} }
func (h *healSequence) healItems(objAPI ObjectLayer, bucketsOnly bool) error { func (h *healSequence) healItems(objAPI ObjectLayer) error {
if h.clientToken == bgHealingUUID { if h.clientToken == bgHealingUUID {
// For background heal do nothing. // For background heal do nothing.
return nil return nil
} }
if err := h.healDiskMeta(objAPI); err != nil { if h.bucket == "" { // heal internal meta only during a site-wide heal
return err if err := h.healDiskMeta(objAPI); err != nil {
return err
}
} }
// Heal buckets and objects // Heal buckets and objects
return h.healBuckets(objAPI, bucketsOnly) return h.healBuckets(objAPI)
} }
// traverseAndHeal - traverses on-disk data and performs healing // traverseAndHeal - traverses on-disk data and performs healing
@ -828,8 +830,7 @@ func (h *healSequence) healItems(objAPI ObjectLayer, bucketsOnly bool) error {
// has to wait until a safe point is reached, such as between scanning // has to wait until a safe point is reached, such as between scanning
// two objects. // two objects.
func (h *healSequence) traverseAndHeal(objAPI ObjectLayer) { func (h *healSequence) traverseAndHeal(objAPI ObjectLayer) {
bucketsOnly := false // Heals buckets and objects also. h.traverseAndHealDoneCh <- h.healItems(objAPI)
h.traverseAndHealDoneCh <- h.healItems(objAPI, bucketsOnly)
xioutil.SafeClose(h.traverseAndHealDoneCh) xioutil.SafeClose(h.traverseAndHealDoneCh)
} }
@ -856,14 +857,14 @@ func (h *healSequence) healMinioSysMeta(objAPI ObjectLayer, metaPrefix string) f
} }
// healBuckets - check for all buckets heal or just particular bucket. // healBuckets - check for all buckets heal or just particular bucket.
func (h *healSequence) healBuckets(objAPI ObjectLayer, bucketsOnly bool) error { func (h *healSequence) healBuckets(objAPI ObjectLayer) error {
if h.isQuitting() { if h.isQuitting() {
return errHealStopSignalled return errHealStopSignalled
} }
// 1. If a bucket was specified, heal only the bucket. // 1. If a bucket was specified, heal only the bucket.
if h.bucket != "" { if h.bucket != "" {
return h.healBucket(objAPI, h.bucket, bucketsOnly) return h.healBucket(objAPI, h.bucket, false)
} }
buckets, err := objAPI.ListBuckets(h.ctx, BucketOptions{}) buckets, err := objAPI.ListBuckets(h.ctx, BucketOptions{})
@ -877,7 +878,7 @@ func (h *healSequence) healBuckets(objAPI ObjectLayer, bucketsOnly bool) error {
}) })
for _, bucket := range buckets { for _, bucket := range buckets {
if err = h.healBucket(objAPI, bucket.Name, bucketsOnly); err != nil { if err = h.healBucket(objAPI, bucket.Name, false); err != nil {
return err return err
} }
} }

View File

@ -593,8 +593,9 @@ func generateListVersionsResponse(ctx context.Context, bucket, prefix, marker, v
for k, v := range cleanReservedKeys(object.UserDefined) { for k, v := range cleanReservedKeys(object.UserDefined) {
content.UserMetadata.Set(k, v) content.UserMetadata.Set(k, v)
} }
if !object.Expires.IsZero() {
content.UserMetadata.Set("expires", object.Expires.Format(http.TimeFormat)) content.UserMetadata.Set("expires", object.Expires.Format(http.TimeFormat))
}
content.Internal = &ObjectInternalInfo{ content.Internal = &ObjectInternalInfo{
K: object.DataBlocks, K: object.DataBlocks,
M: object.ParityBlocks, M: object.ParityBlocks,
@ -729,7 +730,9 @@ func generateListObjectsV2Response(ctx context.Context, bucket, prefix, token, n
for k, v := range cleanReservedKeys(object.UserDefined) { for k, v := range cleanReservedKeys(object.UserDefined) {
content.UserMetadata.Set(k, v) content.UserMetadata.Set(k, v)
} }
content.UserMetadata.Set("expires", object.Expires.Format(http.TimeFormat)) if !object.Expires.IsZero() {
content.UserMetadata.Set("expires", object.Expires.Format(http.TimeFormat))
}
content.Internal = &ObjectInternalInfo{ content.Internal = &ObjectInternalInfo{
K: object.DataBlocks, K: object.DataBlocks,
M: object.ParityBlocks, M: object.ParityBlocks,

View File

@ -223,9 +223,6 @@ func (h *healingTracker) updateProgress(success, skipped bool, bytes uint64) {
// update will update the tracker on the disk. // update will update the tracker on the disk.
// If the tracker has been deleted an error is returned. // If the tracker has been deleted an error is returned.
func (h *healingTracker) update(ctx context.Context) error { func (h *healingTracker) update(ctx context.Context) error {
if h.disk.Healing() == nil {
return fmt.Errorf("healingTracker: drive %q is not marked as healing", h.ID)
}
h.mu.Lock() h.mu.Lock()
if h.ID == "" || h.PoolIndex < 0 || h.SetIndex < 0 || h.DiskIndex < 0 { if h.ID == "" || h.PoolIndex < 0 || h.SetIndex < 0 || h.DiskIndex < 0 {
h.ID, _ = h.disk.GetDiskID() h.ID, _ = h.disk.GetDiskID()

View File

@ -301,12 +301,12 @@ func (r *BatchJobReplicateV1) StartFromSource(ctx context.Context, api ObjectLay
return true return true
} }
if !r.Flags.Filter.CreatedAfter.IsZero() && r.Flags.Filter.CreatedAfter.Before(oi.ModTime) { if !r.Flags.Filter.CreatedAfter.IsZero() && r.Flags.Filter.CreatedAfter.After(oi.ModTime) {
// skip all objects that are created before the specified time. // skip all objects that are created before the specified time.
return true return true
} }
if !r.Flags.Filter.CreatedBefore.IsZero() && r.Flags.Filter.CreatedBefore.After(oi.ModTime) { if !r.Flags.Filter.CreatedBefore.IsZero() && r.Flags.Filter.CreatedBefore.Before(oi.ModTime) {
// skip all objects that are created after the specified time. // skip all objects that are created after the specified time.
return true return true
} }
@ -1047,12 +1047,12 @@ func (r *BatchJobReplicateV1) Start(ctx context.Context, api ObjectLayer, job Ba
return false return false
} }
if !r.Flags.Filter.CreatedAfter.IsZero() && r.Flags.Filter.CreatedAfter.Before(info.ModTime) { if !r.Flags.Filter.CreatedAfter.IsZero() && r.Flags.Filter.CreatedAfter.After(info.ModTime) {
// skip all objects that are created before the specified time. // skip all objects that are created before the specified time.
return false return false
} }
if !r.Flags.Filter.CreatedBefore.IsZero() && r.Flags.Filter.CreatedBefore.After(info.ModTime) { if !r.Flags.Filter.CreatedBefore.IsZero() && r.Flags.Filter.CreatedBefore.Before(info.ModTime) {
// skip all objects that are created after the specified time. // skip all objects that are created after the specified time.
return false return false
} }

View File

@ -71,7 +71,7 @@ func NewLifecycleSys() *LifecycleSys {
return &LifecycleSys{} return &LifecycleSys{}
} }
func ilmTrace(startTime time.Time, duration time.Duration, oi ObjectInfo, event string, metadata map[string]string) madmin.TraceInfo { func ilmTrace(startTime time.Time, duration time.Duration, oi ObjectInfo, event string, metadata map[string]string, err string) madmin.TraceInfo {
sz, _ := oi.GetActualSize() sz, _ := oi.GetActualSize()
return madmin.TraceInfo{ return madmin.TraceInfo{
TraceType: madmin.TraceILM, TraceType: madmin.TraceILM,
@ -81,18 +81,22 @@ func ilmTrace(startTime time.Time, duration time.Duration, oi ObjectInfo, event
Duration: duration, Duration: duration,
Path: pathJoin(oi.Bucket, oi.Name), Path: pathJoin(oi.Bucket, oi.Name),
Bytes: sz, Bytes: sz,
Error: "", Error: err,
Message: getSource(4), Message: getSource(4),
Custom: metadata, Custom: metadata,
} }
} }
func (sys *LifecycleSys) trace(oi ObjectInfo) func(event string, metadata map[string]string) { func (sys *LifecycleSys) trace(oi ObjectInfo) func(event string, metadata map[string]string, err error) {
startTime := time.Now() startTime := time.Now()
return func(event string, metadata map[string]string) { return func(event string, metadata map[string]string, err error) {
duration := time.Since(startTime) duration := time.Since(startTime)
if globalTrace.NumSubscribers(madmin.TraceILM) > 0 { if globalTrace.NumSubscribers(madmin.TraceILM) > 0 {
globalTrace.Publish(ilmTrace(startTime, duration, oi, event, metadata)) e := ""
if err != nil {
e = err.Error()
}
globalTrace.Publish(ilmTrace(startTime, duration, oi, event, metadata, e))
} }
} }
} }
@ -348,7 +352,7 @@ func (es *expiryState) Worker(input <-chan expiryOp) {
traceFn := globalLifecycleSys.trace(oi) traceFn := globalLifecycleSys.trace(oi)
if !oi.TransitionedObject.FreeVersion { if !oi.TransitionedObject.FreeVersion {
// nothing to be done // nothing to be done
return continue
} }
ignoreNotFoundErr := func(err error) error { ignoreNotFoundErr := func(err error) error {
@ -362,7 +366,8 @@ func (es *expiryState) Worker(input <-chan expiryOp) {
err := deleteObjectFromRemoteTier(es.ctx, oi.TransitionedObject.Name, oi.TransitionedObject.VersionID, oi.TransitionedObject.Tier) err := deleteObjectFromRemoteTier(es.ctx, oi.TransitionedObject.Name, oi.TransitionedObject.VersionID, oi.TransitionedObject.Tier)
if ignoreNotFoundErr(err) != nil { if ignoreNotFoundErr(err) != nil {
transitionLogIf(es.ctx, err) transitionLogIf(es.ctx, err)
return traceFn(ILMFreeVersionDelete, nil, err)
continue
} }
// Remove this free version // Remove this free version

View File

@ -889,6 +889,14 @@ func putReplicationOpts(ctx context.Context, sc string, objInfo ObjectInfo, part
if crypto.S3.IsEncrypted(objInfo.UserDefined) { if crypto.S3.IsEncrypted(objInfo.UserDefined) {
putOpts.ServerSideEncryption = encrypt.NewSSE() putOpts.ServerSideEncryption = encrypt.NewSSE()
} }
if crypto.S3KMS.IsEncrypted(objInfo.UserDefined) {
sseEnc, err := encrypt.NewSSEKMS(objInfo.KMSKeyID(), nil)
if err != nil {
return putOpts, err
}
putOpts.ServerSideEncryption = sseEnc
}
return return
} }

View File

@ -1325,10 +1325,13 @@ func applyExpiryOnNonTransitionedObjects(ctx context.Context, objLayer ObjectLay
dobj, err = objLayer.DeleteObject(ctx, obj.Bucket, encodeDirObject(obj.Name), opts) dobj, err = objLayer.DeleteObject(ctx, obj.Bucket, encodeDirObject(obj.Name), opts)
if err != nil { if err != nil {
if isErrObjectNotFound(err) || isErrVersionNotFound(err) { if isErrObjectNotFound(err) || isErrVersionNotFound(err) {
traceFn(ILMExpiry, nil, nil)
return false return false
} }
// Assume it is still there. // Assume it is still there.
ilmLogOnceIf(ctx, fmt.Errorf("DeleteObject(%s, %s): %w", obj.Bucket, obj.Name, err), "non-transition-expiry"+obj.Name) err := fmt.Errorf("DeleteObject(%s, %s): %w", obj.Bucket, obj.Name, err)
ilmLogOnceIf(ctx, err, "non-transition-expiry"+obj.Name)
traceFn(ILMExpiry, nil, err)
return false return false
} }
if dobj.Name == "" { if dobj.Name == "" {
@ -1549,7 +1552,7 @@ const (
ILMTransition = " ilm:transition" ILMTransition = " ilm:transition"
) )
func auditLogLifecycle(ctx context.Context, oi ObjectInfo, event string, tags map[string]string, traceFn func(event string, metadata map[string]string)) { func auditLogLifecycle(ctx context.Context, oi ObjectInfo, event string, tags map[string]string, traceFn func(event string, metadata map[string]string, err error)) {
var apiName string var apiName string
switch event { switch event {
case ILMExpiry: case ILMExpiry:
@ -1567,5 +1570,5 @@ func auditLogLifecycle(ctx context.Context, oi ObjectInfo, event string, tags ma
VersionID: oi.VersionID, VersionID: oi.VersionID,
Tags: tags, Tags: tags,
}) })
traceFn(event, tags) traceFn(event, tags, nil)
} }

View File

@ -39,6 +39,8 @@ import (
"github.com/valyala/bytebufferpool" "github.com/valyala/bytebufferpool"
) )
//msgp:clearomitted
//go:generate msgp -file $GOFILE -unexported //go:generate msgp -file $GOFILE -unexported
// dataUsageHash is the hash type used. // dataUsageHash is the hash type used.

View File

@ -1633,6 +1633,8 @@ func (z *dataUsageEntry) DecodeMsg(dc *msgp.Reader) (err error) {
err = msgp.WrapError(err) err = msgp.WrapError(err)
return return
} }
var zb0001Mask uint8 /* 1 bits */
_ = zb0001Mask
for zb0001 > 0 { for zb0001 > 0 {
zb0001-- zb0001--
field, err = dc.ReadMapKeyPtr() field, err = dc.ReadMapKeyPtr()
@ -1725,6 +1727,7 @@ func (z *dataUsageEntry) DecodeMsg(dc *msgp.Reader) (err error) {
return return
} }
} }
zb0001Mask |= 0x1
case "c": case "c":
z.Compacted, err = dc.ReadBool() z.Compacted, err = dc.ReadBool()
if err != nil { if err != nil {
@ -1739,6 +1742,12 @@ func (z *dataUsageEntry) DecodeMsg(dc *msgp.Reader) (err error) {
} }
} }
} }
// Clear omitted fields.
if zb0001Mask != 0x1 {
if (zb0001Mask & 0x1) == 0 {
z.AllTierStats = nil
}
}
return return
} }
@ -1952,6 +1961,8 @@ func (z *dataUsageEntry) UnmarshalMsg(bts []byte) (o []byte, err error) {
err = msgp.WrapError(err) err = msgp.WrapError(err)
return return
} }
var zb0001Mask uint8 /* 1 bits */
_ = zb0001Mask
for zb0001 > 0 { for zb0001 > 0 {
zb0001-- zb0001--
field, bts, err = msgp.ReadMapKeyZC(bts) field, bts, err = msgp.ReadMapKeyZC(bts)
@ -2043,6 +2054,7 @@ func (z *dataUsageEntry) UnmarshalMsg(bts []byte) (o []byte, err error) {
return return
} }
} }
zb0001Mask |= 0x1
case "c": case "c":
z.Compacted, bts, err = msgp.ReadBoolBytes(bts) z.Compacted, bts, err = msgp.ReadBoolBytes(bts)
if err != nil { if err != nil {
@ -2057,6 +2069,12 @@ func (z *dataUsageEntry) UnmarshalMsg(bts []byte) (o []byte, err error) {
} }
} }
} }
// Clear omitted fields.
if zb0001Mask != 0x1 {
if (zb0001Mask & 0x1) == 0 {
z.AllTierStats = nil
}
}
o = bts o = bts
return return
} }
@ -2628,6 +2646,8 @@ func (z *dataUsageEntryV7) DecodeMsg(dc *msgp.Reader) (err error) {
err = msgp.WrapError(err) err = msgp.WrapError(err)
return return
} }
var zb0001Mask uint8 /* 1 bits */
_ = zb0001Mask
for zb0001 > 0 { for zb0001 > 0 {
zb0001-- zb0001--
field, err = dc.ReadMapKeyPtr() field, err = dc.ReadMapKeyPtr()
@ -2720,6 +2740,7 @@ func (z *dataUsageEntryV7) DecodeMsg(dc *msgp.Reader) (err error) {
return return
} }
} }
zb0001Mask |= 0x1
case "c": case "c":
z.Compacted, err = dc.ReadBool() z.Compacted, err = dc.ReadBool()
if err != nil { if err != nil {
@ -2734,6 +2755,12 @@ func (z *dataUsageEntryV7) DecodeMsg(dc *msgp.Reader) (err error) {
} }
} }
} }
// Clear omitted fields.
if zb0001Mask != 0x1 {
if (zb0001Mask & 0x1) == 0 {
z.AllTierStats = nil
}
}
return return
} }
@ -2747,6 +2774,8 @@ func (z *dataUsageEntryV7) UnmarshalMsg(bts []byte) (o []byte, err error) {
err = msgp.WrapError(err) err = msgp.WrapError(err)
return return
} }
var zb0001Mask uint8 /* 1 bits */
_ = zb0001Mask
for zb0001 > 0 { for zb0001 > 0 {
zb0001-- zb0001--
field, bts, err = msgp.ReadMapKeyZC(bts) field, bts, err = msgp.ReadMapKeyZC(bts)
@ -2838,6 +2867,7 @@ func (z *dataUsageEntryV7) UnmarshalMsg(bts []byte) (o []byte, err error) {
return return
} }
} }
zb0001Mask |= 0x1
case "c": case "c":
z.Compacted, bts, err = msgp.ReadBoolBytes(bts) z.Compacted, bts, err = msgp.ReadBoolBytes(bts)
if err != nil { if err != nil {
@ -2852,6 +2882,12 @@ func (z *dataUsageEntryV7) UnmarshalMsg(bts []byte) (o []byte, err error) {
} }
} }
} }
// Clear omitted fields.
if zb0001Mask != 0x1 {
if (zb0001Mask & 0x1) == 0 {
z.AllTierStats = nil
}
}
o = bts o = bts
return return
} }

View File

@ -1099,7 +1099,9 @@ func (o *ObjectInfo) decryptPartsChecksums(h http.Header) {
if _, encrypted := crypto.IsEncrypted(o.UserDefined); encrypted { if _, encrypted := crypto.IsEncrypted(o.UserDefined); encrypted {
decrypted, err := o.metadataDecrypter(h)("object-checksum", data) decrypted, err := o.metadataDecrypter(h)("object-checksum", data)
if err != nil { if err != nil {
encLogIf(GlobalContext, err) if !errors.Is(err, crypto.ErrSecretKeyMismatch) {
encLogIf(GlobalContext, err)
}
return return
} }
data = decrypted data = decrypted

View File

@ -2365,6 +2365,7 @@ func (er erasureObjects) TransitionObject(ctx context.Context, bucket, object st
destObj, err := genTransitionObjName(bucket) destObj, err := genTransitionObjName(bucket)
if err != nil { if err != nil {
traceFn(ILMTransition, nil, err)
return err return err
} }
@ -2378,6 +2379,7 @@ func (er erasureObjects) TransitionObject(ctx context.Context, bucket, object st
rv, err = tgtClient.Put(ctx, destObj, pr, fi.Size) rv, err = tgtClient.Put(ctx, destObj, pr, fi.Size)
pr.CloseWithError(err) pr.CloseWithError(err)
if err != nil { if err != nil {
traceFn(ILMTransition, nil, err)
return err return err
} }
fi.TransitionStatus = lifecycle.TransitionComplete fi.TransitionStatus = lifecycle.TransitionComplete

View File

@ -459,8 +459,6 @@ func (er *erasureObjects) healErasureSet(ctx context.Context, buckets []string,
continue continue
} }
var versionHealed bool
res, err := er.HealObject(ctx, bucket, encodedEntryName, res, err := er.HealObject(ctx, bucket, encodedEntryName,
version.VersionID, madmin.HealOpts{ version.VersionID, madmin.HealOpts{
ScanMode: scanMode, ScanMode: scanMode,
@ -475,21 +473,23 @@ func (er *erasureObjects) healErasureSet(ctx context.Context, buckets []string,
} }
} else { } else {
// Look for the healing results // Look for the healing results
if res.After.Drives[tracker.DiskIndex].State == madmin.DriveStateOk { if res.After.Drives[tracker.DiskIndex].State != madmin.DriveStateOk {
versionHealed = true err = fmt.Errorf("unexpected after heal state: %s", res.After.Drives[tracker.DiskIndex].State)
} }
} }
if versionHealed { if err == nil {
bgSeq.countHealed(madmin.HealItemObject) bgSeq.countHealed(madmin.HealItemObject)
result = healEntrySuccess(uint64(version.Size)) result = healEntrySuccess(uint64(version.Size))
} else { } else {
bgSeq.countFailed(madmin.HealItemObject) bgSeq.countFailed(madmin.HealItemObject)
result = healEntryFailure(uint64(version.Size)) result = healEntryFailure(uint64(version.Size))
if version.VersionID != "" { if version.VersionID != "" {
healingLogIf(ctx, fmt.Errorf("unable to heal object %s/%s-v(%s): %w", bucket, version.Name, version.VersionID, err)) healingLogIf(ctx, fmt.Errorf("unable to heal object %s/%s (version-id=%s): %w",
bucket, version.Name, version.VersionID, err))
} else { } else {
healingLogIf(ctx, fmt.Errorf("unable to heal object %s/%s: %w", bucket, version.Name, err)) healingLogIf(ctx, fmt.Errorf("unable to heal object %s/%s: %w",
bucket, version.Name, err))
} }
} }

View File

@ -481,12 +481,24 @@ var (
policyDBGroupsListKey = "policydb/groups/" policyDBGroupsListKey = "policydb/groups/"
) )
func findSecondIndex(s string, substr string) int {
first := strings.Index(s, substr)
if first == -1 {
return -1
}
second := strings.Index(s[first+1:], substr)
if second == -1 {
return -1
}
return first + second + 1
}
// splitPath splits a path into a top-level directory and a child item. The // splitPath splits a path into a top-level directory and a child item. The
// parent directory retains the trailing slash. // parent directory retains the trailing slash.
func splitPath(s string, lastIndex bool) (string, string) { func splitPath(s string, secondIndex bool) (string, string) {
var i int var i int
if lastIndex { if secondIndex {
i = strings.LastIndex(s, "/") i = findSecondIndex(s, "/")
} else { } else {
i = strings.Index(s, "/") i = strings.Index(s, "/")
} }
@ -506,8 +518,8 @@ func (iamOS *IAMObjectStore) listAllIAMConfigItems(ctx context.Context) (res map
return nil, item.Err return nil, item.Err
} }
lastIndex := strings.HasPrefix(item.Item, policyDBPrefix) secondIndex := strings.HasPrefix(item.Item, policyDBPrefix)
listKey, trimmedItem := splitPath(item.Item, lastIndex) listKey, trimmedItem := splitPath(item.Item, secondIndex)
if listKey == iamFormatFile { if listKey == iamFormatFile {
continue continue
} }

View File

@ -0,0 +1,53 @@
// Copyright (c) 2015-2024 MinIO, Inc.
//
// This file is part of MinIO Object Storage stack
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
package cmd
import (
"testing"
)
func TestSplitPath(t *testing.T) {
cases := []struct {
path string
secondIndex bool
expectedListKey, expectedItem string
}{
{"format.json", false, "format.json", ""},
{"users/tester.json", false, "users/", "tester.json"},
{"groups/test/group.json", false, "groups/", "test/group.json"},
{"policydb/groups/testgroup.json", true, "policydb/groups/", "testgroup.json"},
{
"policydb/sts-users/uid=slash/user,ou=people,ou=swengg,dc=min,dc=io.json", true,
"policydb/sts-users/", "uid=slash/user,ou=people,ou=swengg,dc=min,dc=io.json",
},
{
"policydb/sts-users/uid=slash/user/twice,ou=people,ou=swengg,dc=min,dc=io.json", true,
"policydb/sts-users/", "uid=slash/user/twice,ou=people,ou=swengg,dc=min,dc=io.json",
},
{
"policydb/groups/cn=project/d,ou=groups,ou=swengg,dc=min,dc=io.json", true,
"policydb/groups/", "cn=project/d,ou=groups,ou=swengg,dc=min,dc=io.json",
},
}
for i, test := range cases {
listKey, item := splitPath(test.path, test.secondIndex)
if listKey != test.expectedListKey || item != test.expectedItem {
t.Errorf("unexpected result on test[%v]: expected[%s, %s] but got [%s, %s]", i, test.expectedListKey, test.expectedItem, listKey, item)
}
}
}

View File

@ -2009,7 +2009,8 @@ type ParentUserInfo struct {
// GetAllParentUsers - returns all distinct "parent-users" associated with STS // GetAllParentUsers - returns all distinct "parent-users" associated with STS
// or service credentials, mapped to all distinct roleARNs associated with the // or service credentials, mapped to all distinct roleARNs associated with the
// parent user. The dummy role ARN is associated with parent users from // parent user. The dummy role ARN is associated with parent users from
// policy-claim based OpenID providers. // policy-claim based OpenID providers. The root credential as a parent
// user is not included in the result.
func (store *IAMStoreSys) GetAllParentUsers() map[string]ParentUserInfo { func (store *IAMStoreSys) GetAllParentUsers() map[string]ParentUserInfo {
cache := store.rlock() cache := store.rlock()
defer store.runlock() defer store.runlock()
@ -2048,7 +2049,7 @@ func (store *IAMStoreSys) getParentUsers(cache *iamCache) map[string]ParentUserI
if err != nil { if err != nil {
continue continue
} }
if cred.ParentUser == "" { if cred.ParentUser == "" || cred.ParentUser == globalActiveCred.AccessKey {
continue continue
} }

View File

@ -25,6 +25,8 @@ import (
xioutil "github.com/minio/minio/internal/ioutil" xioutil "github.com/minio/minio/internal/ioutil"
) )
//msgp:clearomitted
//go:generate msgp -file=$GOFILE //go:generate msgp -file=$GOFILE
// DeleteOptions represents the disk level delete options available for the APIs // DeleteOptions represents the disk level delete options available for the APIs

View File

@ -746,6 +746,8 @@ func (z *DeleteOptions) DecodeMsg(dc *msgp.Reader) (err error) {
err = msgp.WrapError(err) err = msgp.WrapError(err)
return return
} }
var zb0001Mask uint8 /* 1 bits */
_ = zb0001Mask
for zb0001 > 0 { for zb0001 > 0 {
zb0001-- zb0001--
field, err = dc.ReadMapKeyPtr() field, err = dc.ReadMapKeyPtr()
@ -801,6 +803,7 @@ func (z *DeleteOptions) DecodeMsg(dc *msgp.Reader) (err error) {
err = msgp.WrapError(err, "OldDataDir") err = msgp.WrapError(err, "OldDataDir")
return return
} }
zb0001Mask |= 0x1
default: default:
err = dc.Skip() err = dc.Skip()
if err != nil { if err != nil {
@ -809,6 +812,12 @@ func (z *DeleteOptions) DecodeMsg(dc *msgp.Reader) (err error) {
} }
} }
} }
// Clear omitted fields.
if zb0001Mask != 0x1 {
if (zb0001Mask & 0x1) == 0 {
z.OldDataDir = ""
}
}
return return
} }
@ -934,6 +943,8 @@ func (z *DeleteOptions) UnmarshalMsg(bts []byte) (o []byte, err error) {
err = msgp.WrapError(err) err = msgp.WrapError(err)
return return
} }
var zb0001Mask uint8 /* 1 bits */
_ = zb0001Mask
for zb0001 > 0 { for zb0001 > 0 {
zb0001-- zb0001--
field, bts, err = msgp.ReadMapKeyZC(bts) field, bts, err = msgp.ReadMapKeyZC(bts)
@ -989,6 +1000,7 @@ func (z *DeleteOptions) UnmarshalMsg(bts []byte) (o []byte, err error) {
err = msgp.WrapError(err, "OldDataDir") err = msgp.WrapError(err, "OldDataDir")
return return
} }
zb0001Mask |= 0x1
default: default:
bts, err = msgp.Skip(bts) bts, err = msgp.Skip(bts)
if err != nil { if err != nil {
@ -997,6 +1009,12 @@ func (z *DeleteOptions) UnmarshalMsg(bts []byte) (o []byte, err error) {
} }
} }
} }
// Clear omitted fields.
if zb0001Mask != 0x1 {
if (zb0001Mask & 0x1) == 0 {
z.OldDataDir = ""
}
}
o = bts o = bts
return return
} }
@ -2453,6 +2471,9 @@ func (z *FileInfo) DecodeMsg(dc *msgp.Reader) (err error) {
err = msgp.WrapError(err, "Data") err = msgp.WrapError(err, "Data")
return return
} }
if z.Data == nil {
z.Data = make([]byte, 0)
}
} }
z.NumVersions, err = dc.ReadInt() z.NumVersions, err = dc.ReadInt()
if err != nil { if err != nil {
@ -2487,6 +2508,9 @@ func (z *FileInfo) DecodeMsg(dc *msgp.Reader) (err error) {
err = msgp.WrapError(err, "Checksum") err = msgp.WrapError(err, "Checksum")
return return
} }
if z.Checksum == nil {
z.Checksum = make([]byte, 0)
}
} }
z.Versioned, err = dc.ReadBool() z.Versioned, err = dc.ReadBool()
if err != nil { if err != nil {
@ -2907,6 +2931,9 @@ func (z *FileInfo) UnmarshalMsg(bts []byte) (o []byte, err error) {
err = msgp.WrapError(err, "Data") err = msgp.WrapError(err, "Data")
return return
} }
if z.Data == nil {
z.Data = make([]byte, 0)
}
} }
z.NumVersions, bts, err = msgp.ReadIntBytes(bts) z.NumVersions, bts, err = msgp.ReadIntBytes(bts)
if err != nil { if err != nil {
@ -2937,6 +2964,9 @@ func (z *FileInfo) UnmarshalMsg(bts []byte) (o []byte, err error) {
err = msgp.WrapError(err, "Checksum") err = msgp.WrapError(err, "Checksum")
return return
} }
if z.Checksum == nil {
z.Checksum = make([]byte, 0)
}
} }
z.Versioned, bts, err = msgp.ReadBoolBytes(bts) z.Versioned, bts, err = msgp.ReadBoolBytes(bts)
if err != nil { if err != nil {
@ -3961,6 +3991,9 @@ func (z *RawFileInfo) DecodeMsg(dc *msgp.Reader) (err error) {
err = msgp.WrapError(err, "Buf") err = msgp.WrapError(err, "Buf")
return return
} }
if z.Buf == nil {
z.Buf = make([]byte, 0)
}
} }
default: default:
err = dc.Skip() err = dc.Skip()
@ -4038,6 +4071,9 @@ func (z *RawFileInfo) UnmarshalMsg(bts []byte) (o []byte, err error) {
err = msgp.WrapError(err, "Buf") err = msgp.WrapError(err, "Buf")
return return
} }
if z.Buf == nil {
z.Buf = make([]byte, 0)
}
} }
default: default:
bts, err = msgp.Skip(bts) bts, err = msgp.Skip(bts)
@ -4220,6 +4256,8 @@ func (z *ReadMultipleReq) DecodeMsg(dc *msgp.Reader) (err error) {
err = msgp.WrapError(err) err = msgp.WrapError(err)
return return
} }
var zb0001Mask uint8 /* 1 bits */
_ = zb0001Mask
for zb0001 > 0 { for zb0001 > 0 {
zb0001-- zb0001--
field, err = dc.ReadMapKeyPtr() field, err = dc.ReadMapKeyPtr()
@ -4240,6 +4278,7 @@ func (z *ReadMultipleReq) DecodeMsg(dc *msgp.Reader) (err error) {
err = msgp.WrapError(err, "Prefix") err = msgp.WrapError(err, "Prefix")
return return
} }
zb0001Mask |= 0x1
case "fl": case "fl":
var zb0002 uint32 var zb0002 uint32
zb0002, err = dc.ReadArrayHeader() zb0002, err = dc.ReadArrayHeader()
@ -4291,6 +4330,12 @@ func (z *ReadMultipleReq) DecodeMsg(dc *msgp.Reader) (err error) {
} }
} }
} }
// Clear omitted fields.
if zb0001Mask != 0x1 {
if (zb0001Mask & 0x1) == 0 {
z.Prefix = ""
}
}
return return
} }
@ -4449,6 +4494,8 @@ func (z *ReadMultipleReq) UnmarshalMsg(bts []byte) (o []byte, err error) {
err = msgp.WrapError(err) err = msgp.WrapError(err)
return return
} }
var zb0001Mask uint8 /* 1 bits */
_ = zb0001Mask
for zb0001 > 0 { for zb0001 > 0 {
zb0001-- zb0001--
field, bts, err = msgp.ReadMapKeyZC(bts) field, bts, err = msgp.ReadMapKeyZC(bts)
@ -4469,6 +4516,7 @@ func (z *ReadMultipleReq) UnmarshalMsg(bts []byte) (o []byte, err error) {
err = msgp.WrapError(err, "Prefix") err = msgp.WrapError(err, "Prefix")
return return
} }
zb0001Mask |= 0x1
case "fl": case "fl":
var zb0002 uint32 var zb0002 uint32
zb0002, bts, err = msgp.ReadArrayHeaderBytes(bts) zb0002, bts, err = msgp.ReadArrayHeaderBytes(bts)
@ -4520,6 +4568,12 @@ func (z *ReadMultipleReq) UnmarshalMsg(bts []byte) (o []byte, err error) {
} }
} }
} }
// Clear omitted fields.
if zb0001Mask != 0x1 {
if (zb0001Mask & 0x1) == 0 {
z.Prefix = ""
}
}
o = bts o = bts
return return
} }
@ -4544,6 +4598,8 @@ func (z *ReadMultipleResp) DecodeMsg(dc *msgp.Reader) (err error) {
err = msgp.WrapError(err) err = msgp.WrapError(err)
return return
} }
var zb0001Mask uint8 /* 2 bits */
_ = zb0001Mask
for zb0001 > 0 { for zb0001 > 0 {
zb0001-- zb0001--
field, err = dc.ReadMapKeyPtr() field, err = dc.ReadMapKeyPtr()
@ -4564,6 +4620,7 @@ func (z *ReadMultipleResp) DecodeMsg(dc *msgp.Reader) (err error) {
err = msgp.WrapError(err, "Prefix") err = msgp.WrapError(err, "Prefix")
return return
} }
zb0001Mask |= 0x1
case "fl": case "fl":
z.File, err = dc.ReadString() z.File, err = dc.ReadString()
if err != nil { if err != nil {
@ -4582,6 +4639,7 @@ func (z *ReadMultipleResp) DecodeMsg(dc *msgp.Reader) (err error) {
err = msgp.WrapError(err, "Error") err = msgp.WrapError(err, "Error")
return return
} }
zb0001Mask |= 0x2
case "d": case "d":
z.Data, err = dc.ReadBytes(z.Data) z.Data, err = dc.ReadBytes(z.Data)
if err != nil { if err != nil {
@ -4602,6 +4660,15 @@ func (z *ReadMultipleResp) DecodeMsg(dc *msgp.Reader) (err error) {
} }
} }
} }
// Clear omitted fields.
if zb0001Mask != 0x3 {
if (zb0001Mask & 0x1) == 0 {
z.Prefix = ""
}
if (zb0001Mask & 0x2) == 0 {
z.Error = ""
}
}
return return
} }
@ -4762,6 +4829,8 @@ func (z *ReadMultipleResp) UnmarshalMsg(bts []byte) (o []byte, err error) {
err = msgp.WrapError(err) err = msgp.WrapError(err)
return return
} }
var zb0001Mask uint8 /* 2 bits */
_ = zb0001Mask
for zb0001 > 0 { for zb0001 > 0 {
zb0001-- zb0001--
field, bts, err = msgp.ReadMapKeyZC(bts) field, bts, err = msgp.ReadMapKeyZC(bts)
@ -4782,6 +4851,7 @@ func (z *ReadMultipleResp) UnmarshalMsg(bts []byte) (o []byte, err error) {
err = msgp.WrapError(err, "Prefix") err = msgp.WrapError(err, "Prefix")
return return
} }
zb0001Mask |= 0x1
case "fl": case "fl":
z.File, bts, err = msgp.ReadStringBytes(bts) z.File, bts, err = msgp.ReadStringBytes(bts)
if err != nil { if err != nil {
@ -4800,6 +4870,7 @@ func (z *ReadMultipleResp) UnmarshalMsg(bts []byte) (o []byte, err error) {
err = msgp.WrapError(err, "Error") err = msgp.WrapError(err, "Error")
return return
} }
zb0001Mask |= 0x2
case "d": case "d":
z.Data, bts, err = msgp.ReadBytesBytes(bts, z.Data) z.Data, bts, err = msgp.ReadBytesBytes(bts, z.Data)
if err != nil { if err != nil {
@ -4820,6 +4891,15 @@ func (z *ReadMultipleResp) UnmarshalMsg(bts []byte) (o []byte, err error) {
} }
} }
} }
// Clear omitted fields.
if zb0001Mask != 0x3 {
if (zb0001Mask & 0x1) == 0 {
z.Prefix = ""
}
if (zb0001Mask & 0x2) == 0 {
z.Error = ""
}
}
o = bts o = bts
return return
} }

View File

@ -20,7 +20,6 @@ package cmd
import ( import (
"bytes" "bytes"
"context" "context"
"encoding/gob"
"encoding/hex" "encoding/hex"
"errors" "errors"
"fmt" "fmt"
@ -842,12 +841,16 @@ func (client *storageRESTClient) VerifyFile(ctx context.Context, volume, path st
return nil, toStorageErr(err) return nil, toStorageErr(err)
} }
verifyResp := &CheckPartsResp{} dec := msgpNewReader(respReader)
if err = gob.NewDecoder(respReader).Decode(verifyResp); err != nil { defer readMsgpReaderPoolPut(dec)
verifyResp := CheckPartsResp{}
err = verifyResp.DecodeMsg(dec)
if err != nil {
return nil, toStorageErr(err) return nil, toStorageErr(err)
} }
return verifyResp, nil return &verifyResp, nil
} }
func (client *storageRESTClient) DeleteBulk(ctx context.Context, volume string, paths ...string) (err error) { func (client *storageRESTClient) DeleteBulk(ctx context.Context, volume string, paths ...string) (err error) {

View File

@ -740,6 +740,7 @@ func TestIAMWithLDAPServerSuite(t *testing.T) {
suite.TestLDAPSTSServiceAccountsWithGroups(c) suite.TestLDAPSTSServiceAccountsWithGroups(c)
suite.TestLDAPAttributesLookup(c) suite.TestLDAPAttributesLookup(c)
suite.TestLDAPCyrillicUser(c) suite.TestLDAPCyrillicUser(c)
suite.TestLDAPSlashDN(c)
suite.TearDownSuite(c) suite.TearDownSuite(c)
}, },
) )
@ -770,6 +771,7 @@ func TestIAMWithLDAPNonNormalizedBaseDNConfigServerSuite(t *testing.T) {
suite.TestLDAPSTSServiceAccounts(c) suite.TestLDAPSTSServiceAccounts(c)
suite.TestLDAPSTSServiceAccountsWithUsername(c) suite.TestLDAPSTSServiceAccountsWithUsername(c)
suite.TestLDAPSTSServiceAccountsWithGroups(c) suite.TestLDAPSTSServiceAccountsWithGroups(c)
suite.TestLDAPSlashDN(c)
suite.TearDownSuite(c) suite.TearDownSuite(c)
}, },
) )
@ -2008,6 +2010,93 @@ func (s *TestSuiteIAM) TestLDAPCyrillicUser(c *check) {
} }
} }
func (s *TestSuiteIAM) TestLDAPSlashDN(c *check) {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
policyReq := madmin.PolicyAssociationReq{
Policies: []string{"readwrite"},
}
cases := []struct {
username string
dn string
group string
}{
{
username: "slashuser",
dn: "uid=slash/user,ou=people,ou=swengg,dc=min,dc=io",
},
{
username: "dillon",
dn: "uid=dillon,ou=people,ou=swengg,dc=min,dc=io",
group: "cn=project/d,ou=groups,ou=swengg,dc=min,dc=io",
},
}
conn, err := globalIAMSys.LDAPConfig.LDAP.Connect()
if err != nil {
c.Fatalf("LDAP connect failed: %v", err)
}
defer conn.Close()
for i, testCase := range cases {
if testCase.group != "" {
policyReq.Group = testCase.group
policyReq.User = ""
} else {
policyReq.User = testCase.dn
policyReq.Group = ""
}
if _, err := s.adm.AttachPolicyLDAP(ctx, policyReq); err != nil {
c.Fatalf("Unable to attach policy: %v", err)
}
ldapID := cr.LDAPIdentity{
Client: s.TestSuiteCommon.client,
STSEndpoint: s.endPoint,
LDAPUsername: testCase.username,
LDAPPassword: testCase.username,
}
value, err := ldapID.Retrieve()
if err != nil {
c.Fatalf("Expected to generate STS creds, got err: %#v", err)
}
// Retrieve the STS account's credential object.
u, ok := globalIAMSys.GetUser(ctx, value.AccessKeyID)
if !ok {
c.Fatalf("Expected to find user %s", value.AccessKeyID)
}
if u.Credentials.AccessKey != value.AccessKeyID {
c.Fatalf("Expected access key %s, got %s", value.AccessKeyID, u.Credentials.AccessKey)
}
// Retrieve the credential's claims.
secret, err := getTokenSigningKey()
if err != nil {
c.Fatalf("Error getting token signing key: %v", err)
}
claims, err := getClaimsFromTokenWithSecret(value.SessionToken, secret)
if err != nil {
c.Fatalf("Error getting claims from token: %v", err)
}
// Validate claims.
dnClaim := claims.MapClaims[ldapActualUser].(string)
if dnClaim != testCase.dn {
c.Fatalf("Test %d: unexpected dn claim: %s", i+1, dnClaim)
}
if _, err = s.adm.DetachPolicyLDAP(ctx, policyReq); err != nil {
c.Fatalf("Unable to detach user policy: %v", err)
}
}
}
func (s *TestSuiteIAM) TestLDAPAttributesLookup(c *check) { func (s *TestSuiteIAM) TestLDAPAttributesLookup(c *check) {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel() defer cancel()

View File

@ -509,9 +509,7 @@ func (p *xlStorageDiskIDCheck) CheckParts(ctx context.Context, volume string, pa
} }
defer done(0, &err) defer done(0, &err)
return xioutil.WithDeadline[*CheckPartsResp](ctx, globalDriveConfig.GetMaxTimeout(), func(ctx context.Context) (res *CheckPartsResp, err error) { return p.storage.CheckParts(ctx, volume, path, fi)
return p.storage.CheckParts(ctx, volume, path, fi)
})
} }
func (p *xlStorageDiskIDCheck) DeleteBulk(ctx context.Context, volume string, paths ...string) (err error) { func (p *xlStorageDiskIDCheck) DeleteBulk(ctx context.Context, volume string, paths ...string) (err error) {

View File

@ -55,6 +55,8 @@ func isXLMetaErasureInfoValid(data, parity int) bool {
return ((data >= parity) && (data > 0) && (parity >= 0)) return ((data >= parity) && (data > 0) && (parity >= 0))
} }
//msgp:clearomitted
//go:generate msgp -file=$GOFILE -unexported //go:generate msgp -file=$GOFILE -unexported
// A xlMetaV1Object represents `xl.meta` metadata header. // A xlMetaV1Object represents `xl.meta` metadata header.

View File

@ -561,6 +561,8 @@ func (z *ObjectPartInfo) DecodeMsg(dc *msgp.Reader) (err error) {
err = msgp.WrapError(err) err = msgp.WrapError(err)
return return
} }
var zb0001Mask uint8 /* 3 bits */
_ = zb0001Mask
for zb0001 > 0 { for zb0001 > 0 {
zb0001-- zb0001--
field, err = dc.ReadMapKeyPtr() field, err = dc.ReadMapKeyPtr()
@ -605,6 +607,7 @@ func (z *ObjectPartInfo) DecodeMsg(dc *msgp.Reader) (err error) {
err = msgp.WrapError(err, "Index") err = msgp.WrapError(err, "Index")
return return
} }
zb0001Mask |= 0x1
case "crc": case "crc":
var zb0002 uint32 var zb0002 uint32
zb0002, err = dc.ReadMapHeader() zb0002, err = dc.ReadMapHeader()
@ -635,12 +638,14 @@ func (z *ObjectPartInfo) DecodeMsg(dc *msgp.Reader) (err error) {
} }
z.Checksums[za0001] = za0002 z.Checksums[za0001] = za0002
} }
zb0001Mask |= 0x2
case "err": case "err":
z.Error, err = dc.ReadString() z.Error, err = dc.ReadString()
if err != nil { if err != nil {
err = msgp.WrapError(err, "Error") err = msgp.WrapError(err, "Error")
return return
} }
zb0001Mask |= 0x4
default: default:
err = dc.Skip() err = dc.Skip()
if err != nil { if err != nil {
@ -649,6 +654,18 @@ func (z *ObjectPartInfo) DecodeMsg(dc *msgp.Reader) (err error) {
} }
} }
} }
// Clear omitted fields.
if zb0001Mask != 0x7 {
if (zb0001Mask & 0x1) == 0 {
z.Index = nil
}
if (zb0001Mask & 0x2) == 0 {
z.Checksums = nil
}
if (zb0001Mask & 0x4) == 0 {
z.Error = ""
}
}
return return
} }
@ -850,6 +867,8 @@ func (z *ObjectPartInfo) UnmarshalMsg(bts []byte) (o []byte, err error) {
err = msgp.WrapError(err) err = msgp.WrapError(err)
return return
} }
var zb0001Mask uint8 /* 3 bits */
_ = zb0001Mask
for zb0001 > 0 { for zb0001 > 0 {
zb0001-- zb0001--
field, bts, err = msgp.ReadMapKeyZC(bts) field, bts, err = msgp.ReadMapKeyZC(bts)
@ -894,6 +913,7 @@ func (z *ObjectPartInfo) UnmarshalMsg(bts []byte) (o []byte, err error) {
err = msgp.WrapError(err, "Index") err = msgp.WrapError(err, "Index")
return return
} }
zb0001Mask |= 0x1
case "crc": case "crc":
var zb0002 uint32 var zb0002 uint32
zb0002, bts, err = msgp.ReadMapHeaderBytes(bts) zb0002, bts, err = msgp.ReadMapHeaderBytes(bts)
@ -924,12 +944,14 @@ func (z *ObjectPartInfo) UnmarshalMsg(bts []byte) (o []byte, err error) {
} }
z.Checksums[za0001] = za0002 z.Checksums[za0001] = za0002
} }
zb0001Mask |= 0x2
case "err": case "err":
z.Error, bts, err = msgp.ReadStringBytes(bts) z.Error, bts, err = msgp.ReadStringBytes(bts)
if err != nil { if err != nil {
err = msgp.WrapError(err, "Error") err = msgp.WrapError(err, "Error")
return return
} }
zb0001Mask |= 0x4
default: default:
bts, err = msgp.Skip(bts) bts, err = msgp.Skip(bts)
if err != nil { if err != nil {
@ -938,6 +960,18 @@ func (z *ObjectPartInfo) UnmarshalMsg(bts []byte) (o []byte, err error) {
} }
} }
} }
// Clear omitted fields.
if zb0001Mask != 0x7 {
if (zb0001Mask & 0x1) == 0 {
z.Index = nil
}
if (zb0001Mask & 0x2) == 0 {
z.Checksums = nil
}
if (zb0001Mask & 0x4) == 0 {
z.Error = ""
}
}
o = bts o = bts
return return
} }

View File

@ -47,6 +47,8 @@ var (
xlVersionCurrent [4]byte xlVersionCurrent [4]byte
) )
//msgp:clearomitted
//go:generate msgp -file=$GOFILE -unexported //go:generate msgp -file=$GOFILE -unexported
//go:generate stringer -type VersionType,ErasureAlgo -output=xl-storage-format-v2_string.go $GOFILE //go:generate stringer -type VersionType,ErasureAlgo -output=xl-storage-format-v2_string.go $GOFILE

View File

@ -276,6 +276,8 @@ func (z *xlMetaDataDirDecoder) DecodeMsg(dc *msgp.Reader) (err error) {
err = msgp.WrapError(err) err = msgp.WrapError(err)
return return
} }
var zb0001Mask uint8 /* 1 bits */
_ = zb0001Mask
for zb0001 > 0 { for zb0001 > 0 {
zb0001-- zb0001--
field, err = dc.ReadMapKeyPtr() field, err = dc.ReadMapKeyPtr()
@ -327,6 +329,7 @@ func (z *xlMetaDataDirDecoder) DecodeMsg(dc *msgp.Reader) (err error) {
} }
} }
} }
zb0001Mask |= 0x1
default: default:
err = dc.Skip() err = dc.Skip()
if err != nil { if err != nil {
@ -335,6 +338,12 @@ func (z *xlMetaDataDirDecoder) DecodeMsg(dc *msgp.Reader) (err error) {
} }
} }
} }
// Clear omitted fields.
if zb0001Mask != 0x1 {
if (zb0001Mask & 0x1) == 0 {
z.ObjectV2 = nil
}
}
return return
} }
@ -425,6 +434,8 @@ func (z *xlMetaDataDirDecoder) UnmarshalMsg(bts []byte) (o []byte, err error) {
err = msgp.WrapError(err) err = msgp.WrapError(err)
return return
} }
var zb0001Mask uint8 /* 1 bits */
_ = zb0001Mask
for zb0001 > 0 { for zb0001 > 0 {
zb0001-- zb0001--
field, bts, err = msgp.ReadMapKeyZC(bts) field, bts, err = msgp.ReadMapKeyZC(bts)
@ -475,6 +486,7 @@ func (z *xlMetaDataDirDecoder) UnmarshalMsg(bts []byte) (o []byte, err error) {
} }
} }
} }
zb0001Mask |= 0x1
default: default:
bts, err = msgp.Skip(bts) bts, err = msgp.Skip(bts)
if err != nil { if err != nil {
@ -483,6 +495,12 @@ func (z *xlMetaDataDirDecoder) UnmarshalMsg(bts []byte) (o []byte, err error) {
} }
} }
} }
// Clear omitted fields.
if zb0001Mask != 0x1 {
if (zb0001Mask & 0x1) == 0 {
z.ObjectV2 = nil
}
}
o = bts o = bts
return return
} }
@ -508,6 +526,8 @@ func (z *xlMetaV2DeleteMarker) DecodeMsg(dc *msgp.Reader) (err error) {
err = msgp.WrapError(err) err = msgp.WrapError(err)
return return
} }
var zb0001Mask uint8 /* 1 bits */
_ = zb0001Mask
for zb0001 > 0 { for zb0001 > 0 {
zb0001-- zb0001--
field, err = dc.ReadMapKeyPtr() field, err = dc.ReadMapKeyPtr()
@ -558,6 +578,7 @@ func (z *xlMetaV2DeleteMarker) DecodeMsg(dc *msgp.Reader) (err error) {
} }
z.MetaSys[za0002] = za0003 z.MetaSys[za0002] = za0003
} }
zb0001Mask |= 0x1
default: default:
err = dc.Skip() err = dc.Skip()
if err != nil { if err != nil {
@ -566,6 +587,12 @@ func (z *xlMetaV2DeleteMarker) DecodeMsg(dc *msgp.Reader) (err error) {
} }
} }
} }
// Clear omitted fields.
if zb0001Mask != 0x1 {
if (zb0001Mask & 0x1) == 0 {
z.MetaSys = nil
}
}
return return
} }
@ -678,6 +705,8 @@ func (z *xlMetaV2DeleteMarker) UnmarshalMsg(bts []byte) (o []byte, err error) {
err = msgp.WrapError(err) err = msgp.WrapError(err)
return return
} }
var zb0001Mask uint8 /* 1 bits */
_ = zb0001Mask
for zb0001 > 0 { for zb0001 > 0 {
zb0001-- zb0001--
field, bts, err = msgp.ReadMapKeyZC(bts) field, bts, err = msgp.ReadMapKeyZC(bts)
@ -728,6 +757,7 @@ func (z *xlMetaV2DeleteMarker) UnmarshalMsg(bts []byte) (o []byte, err error) {
} }
z.MetaSys[za0002] = za0003 z.MetaSys[za0002] = za0003
} }
zb0001Mask |= 0x1
default: default:
bts, err = msgp.Skip(bts) bts, err = msgp.Skip(bts)
if err != nil { if err != nil {
@ -736,6 +766,12 @@ func (z *xlMetaV2DeleteMarker) UnmarshalMsg(bts []byte) (o []byte, err error) {
} }
} }
} }
// Clear omitted fields.
if zb0001Mask != 0x1 {
if (zb0001Mask & 0x1) == 0 {
z.MetaSys = nil
}
}
o = bts o = bts
return return
} }
@ -762,6 +798,8 @@ func (z *xlMetaV2Object) DecodeMsg(dc *msgp.Reader) (err error) {
err = msgp.WrapError(err) err = msgp.WrapError(err)
return return
} }
var zb0001Mask uint8 /* 1 bits */
_ = zb0001Mask
for zb0001 > 0 { for zb0001 > 0 {
zb0001-- zb0001--
field, err = dc.ReadMapKeyPtr() field, err = dc.ReadMapKeyPtr()
@ -958,6 +996,7 @@ func (z *xlMetaV2Object) DecodeMsg(dc *msgp.Reader) (err error) {
return return
} }
} }
zb0001Mask |= 0x1
case "Size": case "Size":
z.Size, err = dc.ReadInt64() z.Size, err = dc.ReadInt64()
if err != nil { if err != nil {
@ -1056,6 +1095,12 @@ func (z *xlMetaV2Object) DecodeMsg(dc *msgp.Reader) (err error) {
} }
} }
} }
// Clear omitted fields.
if zb0001Mask != 0x1 {
if (zb0001Mask & 0x1) == 0 {
z.PartIndices = nil
}
}
return return
} }
@ -1483,6 +1528,8 @@ func (z *xlMetaV2Object) UnmarshalMsg(bts []byte) (o []byte, err error) {
err = msgp.WrapError(err) err = msgp.WrapError(err)
return return
} }
var zb0001Mask uint8 /* 1 bits */
_ = zb0001Mask
for zb0001 > 0 { for zb0001 > 0 {
zb0001-- zb0001--
field, bts, err = msgp.ReadMapKeyZC(bts) field, bts, err = msgp.ReadMapKeyZC(bts)
@ -1671,6 +1718,7 @@ func (z *xlMetaV2Object) UnmarshalMsg(bts []byte) (o []byte, err error) {
return return
} }
} }
zb0001Mask |= 0x1
case "Size": case "Size":
z.Size, bts, err = msgp.ReadInt64Bytes(bts) z.Size, bts, err = msgp.ReadInt64Bytes(bts)
if err != nil { if err != nil {
@ -1761,6 +1809,12 @@ func (z *xlMetaV2Object) UnmarshalMsg(bts []byte) (o []byte, err error) {
} }
} }
} }
// Clear omitted fields.
if zb0001Mask != 0x1 {
if (zb0001Mask & 0x1) == 0 {
z.PartIndices = nil
}
}
o = bts o = bts
return return
} }
@ -1802,6 +1856,8 @@ func (z *xlMetaV2Version) DecodeMsg(dc *msgp.Reader) (err error) {
err = msgp.WrapError(err) err = msgp.WrapError(err)
return return
} }
var zb0001Mask uint8 /* 3 bits */
_ = zb0001Mask
for zb0001 > 0 { for zb0001 > 0 {
zb0001-- zb0001--
field, err = dc.ReadMapKeyPtr() field, err = dc.ReadMapKeyPtr()
@ -1838,6 +1894,7 @@ func (z *xlMetaV2Version) DecodeMsg(dc *msgp.Reader) (err error) {
return return
} }
} }
zb0001Mask |= 0x1
case "V2Obj": case "V2Obj":
if dc.IsNil() { if dc.IsNil() {
err = dc.ReadNil() err = dc.ReadNil()
@ -1856,6 +1913,7 @@ func (z *xlMetaV2Version) DecodeMsg(dc *msgp.Reader) (err error) {
return return
} }
} }
zb0001Mask |= 0x2
case "DelObj": case "DelObj":
if dc.IsNil() { if dc.IsNil() {
err = dc.ReadNil() err = dc.ReadNil()
@ -1874,6 +1932,7 @@ func (z *xlMetaV2Version) DecodeMsg(dc *msgp.Reader) (err error) {
return return
} }
} }
zb0001Mask |= 0x4
case "v": case "v":
z.WrittenByVersion, err = dc.ReadUint64() z.WrittenByVersion, err = dc.ReadUint64()
if err != nil { if err != nil {
@ -1888,6 +1947,18 @@ func (z *xlMetaV2Version) DecodeMsg(dc *msgp.Reader) (err error) {
} }
} }
} }
// Clear omitted fields.
if zb0001Mask != 0x7 {
if (zb0001Mask & 0x1) == 0 {
z.ObjectV1 = nil
}
if (zb0001Mask & 0x2) == 0 {
z.ObjectV2 = nil
}
if (zb0001Mask & 0x4) == 0 {
z.DeleteMarker = nil
}
}
return return
} }
@ -2079,6 +2150,8 @@ func (z *xlMetaV2Version) UnmarshalMsg(bts []byte) (o []byte, err error) {
err = msgp.WrapError(err) err = msgp.WrapError(err)
return return
} }
var zb0001Mask uint8 /* 3 bits */
_ = zb0001Mask
for zb0001 > 0 { for zb0001 > 0 {
zb0001-- zb0001--
field, bts, err = msgp.ReadMapKeyZC(bts) field, bts, err = msgp.ReadMapKeyZC(bts)
@ -2114,6 +2187,7 @@ func (z *xlMetaV2Version) UnmarshalMsg(bts []byte) (o []byte, err error) {
return return
} }
} }
zb0001Mask |= 0x1
case "V2Obj": case "V2Obj":
if msgp.IsNil(bts) { if msgp.IsNil(bts) {
bts, err = msgp.ReadNilBytes(bts) bts, err = msgp.ReadNilBytes(bts)
@ -2131,6 +2205,7 @@ func (z *xlMetaV2Version) UnmarshalMsg(bts []byte) (o []byte, err error) {
return return
} }
} }
zb0001Mask |= 0x2
case "DelObj": case "DelObj":
if msgp.IsNil(bts) { if msgp.IsNil(bts) {
bts, err = msgp.ReadNilBytes(bts) bts, err = msgp.ReadNilBytes(bts)
@ -2148,6 +2223,7 @@ func (z *xlMetaV2Version) UnmarshalMsg(bts []byte) (o []byte, err error) {
return return
} }
} }
zb0001Mask |= 0x4
case "v": case "v":
z.WrittenByVersion, bts, err = msgp.ReadUint64Bytes(bts) z.WrittenByVersion, bts, err = msgp.ReadUint64Bytes(bts)
if err != nil { if err != nil {
@ -2162,6 +2238,18 @@ func (z *xlMetaV2Version) UnmarshalMsg(bts []byte) (o []byte, err error) {
} }
} }
} }
// Clear omitted fields.
if zb0001Mask != 0x7 {
if (zb0001Mask & 0x1) == 0 {
z.ObjectV1 = nil
}
if (zb0001Mask & 0x2) == 0 {
z.ObjectV2 = nil
}
if (zb0001Mask & 0x4) == 0 {
z.DeleteMarker = nil
}
}
o = bts o = bts
return return
} }

View File

@ -432,15 +432,19 @@ func (s *xlStorage) Healing() *healingTracker {
bucketMetaPrefix, healingTrackerFilename) bucketMetaPrefix, healingTrackerFilename)
b, err := os.ReadFile(healingFile) b, err := os.ReadFile(healingFile)
if err != nil { if err != nil {
if !errors.Is(err, os.ErrNotExist) {
internalLogIf(GlobalContext, fmt.Errorf("unable to read %s: %w", healingFile, err))
}
return nil return nil
} }
if len(b) == 0 { if len(b) == 0 {
internalLogIf(GlobalContext, fmt.Errorf("%s is empty", healingFile))
// 'healing.bin' might be truncated // 'healing.bin' might be truncated
return nil return nil
} }
h := newHealingTracker() h := newHealingTracker()
_, err = h.UnmarshalMsg(b) _, err = h.UnmarshalMsg(b)
bugLogIf(GlobalContext, err) internalLogIf(GlobalContext, err)
return h return h
} }
@ -2246,6 +2250,7 @@ func (s *xlStorage) writeAllMeta(ctx context.Context, volume string, path string
return renameAll(tmpFilePath, filePath, volumeDir) return renameAll(tmpFilePath, filePath, volumeDir)
} }
// Create or truncate an existing file before writing
func (s *xlStorage) writeAllInternal(ctx context.Context, filePath string, b []byte, sync bool, skipParent string) (err error) { func (s *xlStorage) writeAllInternal(ctx context.Context, filePath string, b []byte, sync bool, skipParent string) (err error) {
flags := os.O_CREATE | os.O_WRONLY | os.O_TRUNC flags := os.O_CREATE | os.O_WRONLY | os.O_TRUNC
@ -2268,16 +2273,11 @@ func (s *xlStorage) writeAllInternal(ctx context.Context, filePath string, b []b
return err return err
} }
n, err := w.Write(b) _, err = w.Write(b)
if err != nil { if err != nil {
w.Close()
return err
}
if n != len(b) {
w.Truncate(0) // to indicate that we did partial write. w.Truncate(0) // to indicate that we did partial write.
w.Close() w.Close()
return io.ErrShortWrite return err
} }
// Dealing with error returns from close() - 'man 2 close' // Dealing with error returns from close() - 'man 2 close'
@ -2367,6 +2367,41 @@ func (s *xlStorage) AppendFile(ctx context.Context, volume string, path string,
return nil return nil
} }
// checkPart is a light check of an existing and size of a part, without doing a bitrot operation
// For any unexpected error, return checkPartUnknown (zero)
func (s *xlStorage) checkPart(volumeDir, path, dataDir string, partNum int, expectedSize int64, skipAccessCheck bool) (resp int) {
partPath := pathJoin(path, dataDir, fmt.Sprintf("part.%d", partNum))
filePath := pathJoin(volumeDir, partPath)
st, err := Lstat(filePath)
if err != nil {
if osIsNotExist(err) {
if !skipAccessCheck {
// Stat a volume entry.
if verr := Access(volumeDir); verr != nil {
if osIsNotExist(verr) {
resp = checkPartVolumeNotFound
}
return
}
}
}
if osErrToFileErr(err) == errFileNotFound {
resp = checkPartFileNotFound
}
return
}
if st.Mode().IsDir() {
resp = checkPartFileNotFound
return
}
// Check if shard is truncated.
if st.Size() < expectedSize {
resp = checkPartFileCorrupt
return
}
return checkPartSuccess
}
// CheckParts check if path has necessary parts available. // CheckParts check if path has necessary parts available.
func (s *xlStorage) CheckParts(ctx context.Context, volume string, path string, fi FileInfo) (*CheckPartsResp, error) { func (s *xlStorage) CheckParts(ctx context.Context, volume string, path string, fi FileInfo) (*CheckPartsResp, error) {
volumeDir, err := s.getVolDir(volume) volumeDir, err := s.getVolDir(volume)
@ -2385,36 +2420,12 @@ func (s *xlStorage) CheckParts(ctx context.Context, volume string, path string,
} }
for i, part := range fi.Parts { for i, part := range fi.Parts {
partPath := pathJoin(path, fi.DataDir, fmt.Sprintf("part.%d", part.Number)) resp.Results[i], err = xioutil.WithDeadline[int](ctx, globalDriveConfig.GetMaxTimeout(), func(ctx context.Context) (int, error) {
filePath := pathJoin(volumeDir, partPath) return s.checkPart(volumeDir, path, fi.DataDir, part.Number, fi.Erasure.ShardFileSize(part.Size), skipAccessChecks(volume)), nil
st, err := Lstat(filePath) })
if err != nil { if err != nil {
if osIsNotExist(err) { return nil, err
if !skipAccessChecks(volume) {
// Stat a volume entry.
if verr := Access(volumeDir); verr != nil {
if osIsNotExist(verr) {
resp.Results[i] = checkPartVolumeNotFound
}
continue
}
}
}
if osErrToFileErr(err) == errFileNotFound {
resp.Results[i] = checkPartFileNotFound
}
continue
} }
if st.Mode().IsDir() {
resp.Results[i] = checkPartFileNotFound
continue
}
// Check if shard is truncated.
if st.Size() < fi.Erasure.ShardFileSize(part.Size) {
resp.Results[i] = checkPartFileCorrupt
continue
}
resp.Results[i] = checkPartSuccess
} }
return &resp, nil return &resp, nil
@ -2546,17 +2557,7 @@ func (s *xlStorage) Delete(ctx context.Context, volume string, path string, dele
} }
func skipAccessChecks(volume string) (ok bool) { func skipAccessChecks(volume string) (ok bool) {
for _, prefix := range []string{ return strings.HasPrefix(volume, minioMetaBucket)
minioMetaTmpDeletedBucket,
minioMetaTmpBucket,
minioMetaMultipartBucket,
minioMetaBucket,
} {
if strings.HasPrefix(volume, prefix) {
return true
}
}
return ok
} }
// RenameData - rename source path to destination path atomically, metadata and data directory. // RenameData - rename source path to destination path atomically, metadata and data directory.

View File

@ -18,7 +18,7 @@ docker buildx build --push --no-cache \
-t "quay.io/minio/minio:latest" \ -t "quay.io/minio/minio:latest" \
-t "minio/minio:${release}" \ -t "minio/minio:${release}" \
-t "quay.io/minio/minio:${release}" \ -t "quay.io/minio/minio:${release}" \
--platform=linux/arm64,linux/amd64,linux/ppc64le,linux/s390x \ --platform=linux/arm64,linux/amd64,linux/ppc64le \
-f Dockerfile.release . -f Dockerfile.release .
docker buildx prune -f docker buildx prune -f
@ -27,7 +27,7 @@ docker buildx build --push --no-cache \
--build-arg RELEASE="${release}" \ --build-arg RELEASE="${release}" \
-t "minio/minio:${release}-cpuv1" \ -t "minio/minio:${release}-cpuv1" \
-t "quay.io/minio/minio:${release}-cpuv1" \ -t "quay.io/minio/minio:${release}-cpuv1" \
--platform=linux/arm64,linux/amd64,linux/ppc64le,linux/s390x \ --platform=linux/arm64,linux/amd64,linux/ppc64le \
-f Dockerfile.release.old_cpu . -f Dockerfile.release.old_cpu .
docker buildx prune -f docker buildx prune -f

View File

@ -2,7 +2,7 @@ version: '3.7'
# Settings and configurations that are common for all containers # Settings and configurations that are common for all containers
x-minio-common: &minio-common x-minio-common: &minio-common
image: quay.io/minio/minio:RELEASE.2024-10-02T17-50-41Z image: quay.io/minio/minio:RELEASE.2024-10-13T13-34-11Z
command: server --console-address ":9001" http://minio{1...4}/data{1...2} command: server --console-address ":9001" http://minio{1...4}/data{1...2}
expose: expose:
- "9000" - "9000"

View File

@ -8,7 +8,10 @@ exit_1() {
cat /tmp/minio1_1.log cat /tmp/minio1_1.log
echo "minio2 ============" echo "minio2 ============"
cat /tmp/minio2_1.log cat /tmp/minio2_1.log
echo "minio3 ============"
cat /tmp/minio3_1.log
echo "minio4 ============"
cat /tmp/minio4_1.log
exit 1 exit 1
} }
@ -17,7 +20,7 @@ cleanup() {
pkill -9 minio || sudo pkill -9 minio pkill -9 minio || sudo pkill -9 minio
pkill -9 kes || sudo pkill -9 kes pkill -9 kes || sudo pkill -9 kes
rm -rf ${PWD}/keys rm -rf ${PWD}/keys
rm -rf /tmp/minio{1,2} rm -rf /tmp/minio{1,2,3,4}
echo "done" echo "done"
} }
@ -229,4 +232,25 @@ fi
./mc cat minio2/test-bucket/defpartsize --insecure >/dev/null || exit_1 ./mc cat minio2/test-bucket/defpartsize --insecure >/dev/null || exit_1
./mc cat minio2/test-bucket/custpartsize --insecure >/dev/null || exit_1 ./mc cat minio2/test-bucket/custpartsize --insecure >/dev/null || exit_1
echo -n "Starting MinIO instances with different kms key ..."
CI=on MINIO_KMS_SECRET_KEY=minio3-default-key:IyqsU3kMFloCNup4BsZtf/rmfHVcTgznO2F25CkEH1g= MINIO_ROOT_USER=minio MINIO_ROOT_PASSWORD=minio123 minio server --certs-dir /tmp/certs --address ":9003" --console-address ":10000" /tmp/minio3/disk{1...4} >/tmp/minio3_1.log 2>&1 &
CI=on MINIO_KMS_SECRET_KEY=minio4-default-key:IyqsU3kMFloCNup4BsZtf/rmfHVcTgznO2F25CkEH1g= MINIO_ROOT_USER=minio MINIO_ROOT_PASSWORD=minio123 minio server --certs-dir /tmp/certs --address ":9004" --console-address ":11000" /tmp/minio4/disk{1...4} >/tmp/minio4_1.log 2>&1 &
echo "done"
export MC_HOST_minio3=https://minio:minio123@localhost:9003
export MC_HOST_minio4=https://minio:minio123@localhost:9004
./mc ready minio3 --insecure
./mc ready minio4 --insecure
./mc admin replicate add minio3 minio4 --insecure
./mc mb minio3/bucket --insecure
./mc cp --insecure --enc-kms minio3/bucket=minio3-default-key /tmp/data/encrypted minio3/bucket/x
sleep 10
st=$(./mc stat --json --no-list --insecure minio3/bucket/x | jq -r .replicationStatus)
if [ "${st}" != "FAILED" ]; then
echo "BUG: Replication succeeded when kms key is different"
exit_1
fi
cleanup cleanup

2
go.mod
View File

@ -79,7 +79,7 @@ require (
github.com/rs/cors v1.11.1 github.com/rs/cors v1.11.1
github.com/secure-io/sio-go v0.3.1 github.com/secure-io/sio-go v0.3.1
github.com/shirou/gopsutil/v3 v3.24.5 github.com/shirou/gopsutil/v3 v3.24.5
github.com/tinylib/msgp v1.2.2 github.com/tinylib/msgp v1.2.3-0.20241022140105-4558fbf3a223
github.com/valyala/bytebufferpool v1.0.0 github.com/valyala/bytebufferpool v1.0.0
github.com/xdg/scram v1.0.5 github.com/xdg/scram v1.0.5
github.com/zeebo/xxh3 v1.0.2 github.com/zeebo/xxh3 v1.0.2

4
go.sum
View File

@ -597,8 +597,8 @@ github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JT
github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=
github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
github.com/tinylib/msgp v1.2.2 h1:iHiBE1tJQwFI740SPEPkGE8cfhNfrqOYRlH450BnC/4= github.com/tinylib/msgp v1.2.3-0.20241022140105-4558fbf3a223 h1:3k5ahk009QcaghR2H5bO4iaRHMs5P56x6g5wXB/OKcQ=
github.com/tinylib/msgp v1.2.2/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= github.com/tinylib/msgp v1.2.3-0.20241022140105-4558fbf3a223/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0=
github.com/tklauser/go-sysconf v0.3.14 h1:g5vzr9iPFFz24v2KZXs/pvpvh8/V9Fw6vQK5ZZb78yU= github.com/tklauser/go-sysconf v0.3.14 h1:g5vzr9iPFFz24v2KZXs/pvpvh8/V9Fw6vQK5ZZb78yU=
github.com/tklauser/go-sysconf v0.3.14/go.mod h1:1ym4lWMLUOhuBOPGtRcJm7tEGX4SCYNEEEtghGG/8uY= github.com/tklauser/go-sysconf v0.3.14/go.mod h1:1ym4lWMLUOhuBOPGtRcJm7tEGX4SCYNEEEtghGG/8uY=
github.com/tklauser/numcpus v0.8.0 h1:Mx4Wwe/FjZLeQsK/6kt2EOepwwSl7SmJrK5bV/dXYgY= github.com/tklauser/numcpus v0.8.0 h1:Mx4Wwe/FjZLeQsK/6kt2EOepwwSl7SmJrK5bV/dXYgY=

Binary file not shown.

View File

@ -1,7 +1,7 @@
apiVersion: v1 apiVersion: v1
description: High Performance Object Storage description: High Performance Object Storage
name: minio name: minio
version: 5.2.0 version: 5.3.0
appVersion: RELEASE.2024-04-18T19-09-19Z appVersion: RELEASE.2024-04-18T19-09-19Z
keywords: keywords:
- minio - minio

View File

@ -1,6 +1,6 @@
{{- if eq .Values.service.type "ClusterIP" "NodePort" }} {{- if eq .Values.service.type "ClusterIP" "NodePort" }}
MinIO can be accessed via port {{ .Values.service.port }} on the following DNS name from within your cluster: MinIO can be accessed via port {{ .Values.service.port }} on the following DNS name from within your cluster:
{{ template "minio.fullname" . }}.{{ .Release.Namespace }}.svc.cluster.local {{ template "minio.fullname" . }}.{{ .Release.Namespace }}.{{ .Values.clusterDomain }}
To access MinIO from localhost, run the below commands: To access MinIO from localhost, run the below commands:

View File

@ -55,12 +55,7 @@ spec:
{{- end }} {{- end }}
{{- if and .Values.securityContext.enabled .Values.persistence.enabled }} {{- if and .Values.securityContext.enabled .Values.persistence.enabled }}
securityContext: securityContext:
runAsUser: {{ .Values.securityContext.runAsUser }} {{ omit .Values.securityContext "enabled" | toYaml | nindent 8 }}
runAsGroup: {{ .Values.securityContext.runAsGroup }}
fsGroup: {{ .Values.securityContext.fsGroup }}
{{- if and (ge .Capabilities.KubeVersion.Major "1") (ge .Capabilities.KubeVersion.Minor "20") }}
fsGroupChangePolicy: {{ .Values.securityContext.fsGroupChangePolicy }}
{{- end }}
{{- end }} {{- end }}
{{ if .Values.serviceAccount.create }} {{ if .Values.serviceAccount.create }}
serviceAccountName: {{ .Values.serviceAccount.name }} serviceAccountName: {{ .Values.serviceAccount.name }}
@ -173,6 +168,11 @@ spec:
value: {{ tpl $val $ | quote }} value: {{ tpl $val $ | quote }}
{{- end }} {{- end }}
resources: {{- toYaml .Values.resources | nindent 12 }} resources: {{- toYaml .Values.resources | nindent 12 }}
{{- if and .Values.securityContext.enabled .Values.persistence.enabled }}
{{- with .Values.containerSecurityContext }}
securityContext: {{ toYaml . | nindent 12}}
{{- end }}
{{- end }}
{{- with .Values.extraContainers }} {{- with .Values.extraContainers }}
{{- if eq (typeOf .) "string" }} {{- if eq (typeOf .) "string" }}
{{- tpl . $ | nindent 8 }} {{- tpl . $ | nindent 8 }}

View File

@ -39,10 +39,7 @@ spec:
tolerations: {{- toYaml . | nindent 8 }} tolerations: {{- toYaml . | nindent 8 }}
{{- end }} {{- end }}
{{- if .Values.postJob.securityContext.enabled }} {{- if .Values.postJob.securityContext.enabled }}
securityContext: securityContext: {{ omit .Values.postJob.securityContext "enabled" | toYaml | nindent 12 }}
runAsUser: {{ .Values.postJob.securityContext.runAsUser }}
runAsGroup: {{ .Values.postJob.securityContext.runAsGroup }}
fsGroup: {{ .Values.postJob.securityContext.fsGroup }}
{{- end }} {{- end }}
volumes: volumes:
- name: etc-path - name: etc-path
@ -82,6 +79,9 @@ spec:
- key: {{ .Values.tls.publicCrt }} - key: {{ .Values.tls.publicCrt }}
path: CAs/public.crt path: CAs/public.crt
{{- end }} {{- end }}
{{- if .Values.customCommandJob.extraVolumes }}
{{- toYaml .Values.customCommandJob.extraVolumes | nindent 8 }}
{{- end }}
{{- if .Values.serviceAccount.create }} {{- if .Values.serviceAccount.create }}
serviceAccountName: {{ .Values.serviceAccount.name }} serviceAccountName: {{ .Values.serviceAccount.name }}
{{- end }} {{- end }}
@ -90,9 +90,9 @@ spec:
- name: minio-make-policy - name: minio-make-policy
image: "{{ .Values.mcImage.repository }}:{{ .Values.mcImage.tag }}" image: "{{ .Values.mcImage.repository }}:{{ .Values.mcImage.tag }}"
{{- if .Values.makePolicyJob.securityContext.enabled }} {{- if .Values.makePolicyJob.securityContext.enabled }}
securityContext: {{- with .Values.makePolicyJob.containerSecurityContext }}
runAsUser: {{ .Values.makePolicyJob.securityContext.runAsUser }} securityContext: {{ toYaml . | nindent 12 }}
runAsGroup: {{ .Values.makePolicyJob.securityContext.runAsGroup }} {{- end }}
{{- end }} {{- end }}
imagePullPolicy: {{ .Values.mcImage.pullPolicy }} imagePullPolicy: {{ .Values.mcImage.pullPolicy }}
{{- if .Values.makePolicyJob.exitCommand }} {{- if .Values.makePolicyJob.exitCommand }}
@ -124,9 +124,9 @@ spec:
- name: minio-make-bucket - name: minio-make-bucket
image: "{{ .Values.mcImage.repository }}:{{ .Values.mcImage.tag }}" image: "{{ .Values.mcImage.repository }}:{{ .Values.mcImage.tag }}"
{{- if .Values.makeBucketJob.securityContext.enabled }} {{- if .Values.makeBucketJob.securityContext.enabled }}
securityContext: {{- with .Values.makeBucketJob.containerSecurityContext }}
runAsUser: {{ .Values.makeBucketJob.securityContext.runAsUser }} securityContext: {{ toYaml . | nindent 12 }}
runAsGroup: {{ .Values.makeBucketJob.securityContext.runAsGroup }} {{- end }}
{{- end }} {{- end }}
imagePullPolicy: {{ .Values.mcImage.pullPolicy }} imagePullPolicy: {{ .Values.mcImage.pullPolicy }}
{{- if .Values.makeBucketJob.exitCommand }} {{- if .Values.makeBucketJob.exitCommand }}
@ -157,9 +157,9 @@ spec:
- name: minio-make-user - name: minio-make-user
image: "{{ .Values.mcImage.repository }}:{{ .Values.mcImage.tag }}" image: "{{ .Values.mcImage.repository }}:{{ .Values.mcImage.tag }}"
{{- if .Values.makeUserJob.securityContext.enabled }} {{- if .Values.makeUserJob.securityContext.enabled }}
securityContext: {{- with .Values.makeUserJob.containerSecurityContext }}
runAsUser: {{ .Values.makeUserJob.securityContext.runAsUser }} securityContext: {{ toYaml . | nindent 12 }}
runAsGroup: {{ .Values.makeUserJob.securityContext.runAsGroup }} {{- end }}
{{- end }} {{- end }}
imagePullPolicy: {{ .Values.mcImage.pullPolicy }} imagePullPolicy: {{ .Values.mcImage.pullPolicy }}
{{- if .Values.makeUserJob.exitCommand }} {{- if .Values.makeUserJob.exitCommand }}
@ -190,9 +190,9 @@ spec:
- name: minio-custom-command - name: minio-custom-command
image: "{{ .Values.mcImage.repository }}:{{ .Values.mcImage.tag }}" image: "{{ .Values.mcImage.repository }}:{{ .Values.mcImage.tag }}"
{{- if .Values.customCommandJob.securityContext.enabled }} {{- if .Values.customCommandJob.securityContext.enabled }}
securityContext: {{- with .Values.customCommandJob.containerSecurityContext }}
runAsUser: {{ .Values.customCommandJob.securityContext.runAsUser }} securityContext: {{ toYaml . | nindent 12 }}
runAsGroup: {{ .Values.customCommandJob.securityContext.runAsGroup }} {{- end }}
{{- end }} {{- end }}
imagePullPolicy: {{ .Values.mcImage.pullPolicy }} imagePullPolicy: {{ .Values.mcImage.pullPolicy }}
{{- if .Values.customCommandJob.exitCommand }} {{- if .Values.customCommandJob.exitCommand }}
@ -217,15 +217,18 @@ spec:
- name: cert-secret-volume-mc - name: cert-secret-volume-mc
mountPath: {{ .Values.configPathmc }}certs mountPath: {{ .Values.configPathmc }}certs
{{- end }} {{- end }}
{{- if .Values.customCommandJob.extraVolumeMounts }}
{{- toYaml .Values.customCommandJob.extraVolumeMounts | nindent 12 }}
{{- end }}
resources: {{- toYaml .Values.customCommandJob.resources | nindent 12 }} resources: {{- toYaml .Values.customCommandJob.resources | nindent 12 }}
{{- end }} {{- end }}
{{- if .Values.svcaccts }} {{- if .Values.svcaccts }}
- name: minio-make-svcacct - name: minio-make-svcacct
image: "{{ .Values.mcImage.repository }}:{{ .Values.mcImage.tag }}" image: "{{ .Values.mcImage.repository }}:{{ .Values.mcImage.tag }}"
{{- if .Values.makeServiceAccountJob.securityContext.enabled }} {{- if .Values.makeServiceAccountJob.securityContext.enabled }}
securityContext: {{- with .Values.makeServiceAccountJob.containerSecurityContext }}
runAsUser: {{ .Values.makeServiceAccountJob.securityContext.runAsUser }} securityContext: {{ toYaml . | nindent 12 }}
runAsGroup: {{ .Values.makeServiceAccountJob.securityContext.runAsGroup }} {{- end }}
{{- end }} {{- end }}
imagePullPolicy: {{ .Values.mcImage.pullPolicy }} imagePullPolicy: {{ .Values.mcImage.pullPolicy }}
{{- if .Values.makeServiceAccountJob.exitCommand }} {{- if .Values.makeServiceAccountJob.exitCommand }}

View File

@ -83,12 +83,7 @@ spec:
{{- end }} {{- end }}
{{- if and .Values.securityContext.enabled .Values.persistence.enabled }} {{- if and .Values.securityContext.enabled .Values.persistence.enabled }}
securityContext: securityContext:
runAsUser: {{ .Values.securityContext.runAsUser }} {{- omit .Values.securityContext "enabled" | toYaml | nindent 8 }}
runAsGroup: {{ .Values.securityContext.runAsGroup }}
fsGroup: {{ .Values.securityContext.fsGroup }}
{{- if and (ge .Capabilities.KubeVersion.Major "1") (ge .Capabilities.KubeVersion.Minor "20") }}
fsGroupChangePolicy: {{ .Values.securityContext.fsGroupChangePolicy }}
{{- end }}
{{- end }} {{- end }}
{{- if .Values.serviceAccount.create }} {{- if .Values.serviceAccount.create }}
serviceAccountName: {{ .Values.serviceAccount.name }} serviceAccountName: {{ .Values.serviceAccount.name }}
@ -100,7 +95,7 @@ spec:
command: [ command: [
"/bin/sh", "/bin/sh",
"-ce", "-ce",
"/usr/bin/docker-entrypoint.sh minio server {{- range $i := until $poolCount }}{{ $factor := mul $i $nodeCount }}{{ $endIndex := add $factor $nodeCount }}{{ $beginIndex := mul $i $nodeCount }} {{ $scheme }}://{{ template `minio.fullname` $ }}-{{ `{` }}{{ $beginIndex }}...{{ sub $endIndex 1 }}{{ `}`}}.{{ template `minio.fullname` $ }}-svc.{{ $.Release.Namespace }}.svc.{{ $.Values.clusterDomain }}{{if (gt $drivesPerNode 1)}}{{ $bucketRoot }}-{{ `{` }}0...{{ sub $drivesPerNode 1 }}{{ `}` }}{{ else }}{{ $bucketRoot }}{{end }}{{- end }} -S {{ .Values.certsPath }} --address :{{ .Values.minioAPIPort }} --console-address :{{ .Values.minioConsolePort }} {{- template `minio.extraArgs` . }}" "/usr/bin/docker-entrypoint.sh minio server {{- range $i := until $poolCount }}{{ $factor := mul $i $nodeCount }}{{ $endIndex := add $factor $nodeCount }}{{ $beginIndex := mul $i $nodeCount }} {{ $scheme }}://{{ template `minio.fullname` $ }}-{{ `{` }}{{ $beginIndex }}...{{ sub $endIndex 1 }}{{ `}`}}.{{ template `minio.fullname` $ }}-svc.{{ $.Release.Namespace }}.svc{{if (gt $drivesPerNode 1)}}{{ $bucketRoot }}-{{ `{` }}0...{{ sub $drivesPerNode 1 }}{{ `}` }}{{ else }}{{ $bucketRoot }}{{end }}{{- end }} -S {{ .Values.certsPath }} --address :{{ .Values.minioAPIPort }} --console-address :{{ .Values.minioConsolePort }} {{- template `minio.extraArgs` . }}"
] ]
volumeMounts: volumeMounts:
{{- if $penabled }} {{- if $penabled }}
@ -192,8 +187,9 @@ spec:
{{- end }} {{- end }}
resources: {{- toYaml .Values.resources | nindent 12 }} resources: {{- toYaml .Values.resources | nindent 12 }}
{{- if and .Values.securityContext.enabled .Values.persistence.enabled }} {{- if and .Values.securityContext.enabled .Values.persistence.enabled }}
securityContext: {{- with .Values.containerSecurityContext }}
readOnlyRootFilesystem: {{ .Values.securityContext.readOnlyRootFilesystem | default false }} securityContext: {{ toYaml . | nindent 12}}
{{- end }}
{{- end }} {{- end }}
{{- with .Values.extraContainers }} {{- with .Values.extraContainers }}
{{- if eq (typeOf .) "string" }} {{- if eq (typeOf .) "string" }}

View File

@ -275,6 +275,8 @@ securityContext:
runAsGroup: 1000 runAsGroup: 1000
fsGroup: 1000 fsGroup: 1000
fsGroupChangePolicy: "OnRootMismatch" fsGroupChangePolicy: "OnRootMismatch"
containerSecurityContext:
readOnlyRootFilesystem: false readOnlyRootFilesystem: false
# Additational pod annotations # Additational pod annotations
@ -476,6 +478,16 @@ customCommandJob:
resources: resources:
requests: requests:
memory: 128Mi memory: 128Mi
## Additional volumes to add to the post-job.
extraVolumes: []
# - name: extra-policies
# configMap:
# name: my-extra-policies-cm
## Additional volumeMounts to add to the custom commands container when
## running the post-job.
extraVolumeMounts: []
# - name: extra-policies
# mountPath: /mnt/extras/
# Command to run after the main command on exit # Command to run after the main command on exit
exitCommand: "" exitCommand: ""

View File

@ -3,7 +3,29 @@ entries:
minio: minio:
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2024-04-18T19-09-19Z appVersion: RELEASE.2024-04-18T19-09-19Z
created: "2024-04-28T03:14:12.227568814-07:00" created: "2024-10-11T14:15:09.790426575+02:00"
description: High Performance Object Storage
digest: 5f927286767c285b925a3395e75b4f372367f83d2124395185e21dc7fd4ca177
home: https://min.io
icon: https://min.io/resources/img/logo/MINIO_wordmark.png
keywords:
- minio
- storage
- object-storage
- s3
- cluster
maintainers:
- email: dev@minio.io
name: MinIO, Inc
name: minio
sources:
- https://github.com/minio/minio
urls:
- https://charts.min.io/helm-releases/minio-5.3.0.tgz
version: 5.3.0
- apiVersion: v1
appVersion: RELEASE.2024-04-18T19-09-19Z
created: "2024-10-11T14:15:09.7894529+02:00"
description: High Performance Object Storage description: High Performance Object Storage
digest: 8ef4212d7d51be6c8192b3e91138a9ca918ca56142c42500028cfd3b80e0b2dd digest: 8ef4212d7d51be6c8192b3e91138a9ca918ca56142c42500028cfd3b80e0b2dd
home: https://min.io home: https://min.io
@ -25,7 +47,7 @@ entries:
version: 5.2.0 version: 5.2.0
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2024-03-03T17-50-39Z appVersion: RELEASE.2024-03-03T17-50-39Z
created: "2024-04-28T03:14:12.226017252-07:00" created: "2024-10-11T14:15:09.788422318+02:00"
description: High Performance Object Storage description: High Performance Object Storage
digest: 742d658c029616f0a977f255a27e806f2e3ef31f0d30467353a0882b5607001e digest: 742d658c029616f0a977f255a27e806f2e3ef31f0d30467353a0882b5607001e
home: https://min.io home: https://min.io
@ -47,7 +69,7 @@ entries:
version: 5.1.0 version: 5.1.0
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2024-01-11T07-46-16Z appVersion: RELEASE.2024-01-11T07-46-16Z
created: "2024-04-28T03:14:12.214689532-07:00" created: "2024-10-11T14:15:09.778465912+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: 3a2d8e03ffdd98501026aa7561633c91d9871647f4b01d77b75a2ad9b72ee618 digest: 3a2d8e03ffdd98501026aa7561633c91d9871647f4b01d77b75a2ad9b72ee618
home: https://min.io home: https://min.io
@ -69,7 +91,7 @@ entries:
version: 5.0.15 version: 5.0.15
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2023-09-30T07-02-29Z appVersion: RELEASE.2023-09-30T07-02-29Z
created: "2024-04-28T03:14:12.213442517-07:00" created: "2024-10-11T14:15:09.776145943+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: 6c3656924fbad2cb17f810cd78f352f9b60626aaec64b837c96829095b215ad3 digest: 6c3656924fbad2cb17f810cd78f352f9b60626aaec64b837c96829095b215ad3
home: https://min.io home: https://min.io
@ -91,7 +113,7 @@ entries:
version: 5.0.14 version: 5.0.14
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2023-07-07T07-13-57Z appVersion: RELEASE.2023-07-07T07-13-57Z
created: "2024-04-28T03:14:12.212262087-07:00" created: "2024-10-11T14:15:09.775105412+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: 3c18f7381efe6d86497f952e6d5f59003ee5a009c54778ddea1ee8d3c7bed9c8 digest: 3c18f7381efe6d86497f952e6d5f59003ee5a009c54778ddea1ee8d3c7bed9c8
home: https://min.io home: https://min.io
@ -113,7 +135,7 @@ entries:
version: 5.0.13 version: 5.0.13
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2023-07-07T07-13-57Z appVersion: RELEASE.2023-07-07T07-13-57Z
created: "2024-04-28T03:14:12.211119558-07:00" created: "2024-10-11T14:15:09.773936501+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: 5318bc56c73a8f4539c3dd178f4d55c7f41bee4a25d7dc02ac6a5843eeee7976 digest: 5318bc56c73a8f4539c3dd178f4d55c7f41bee4a25d7dc02ac6a5843eeee7976
home: https://min.io home: https://min.io
@ -135,7 +157,7 @@ entries:
version: 5.0.12 version: 5.0.12
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2023-06-19T19-52-50Z appVersion: RELEASE.2023-06-19T19-52-50Z
created: "2024-04-28T03:14:12.209424793-07:00" created: "2024-10-11T14:15:09.772941806+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: cba44c8cddcda1fb5c082dce82004a39f53cc20677ab9698a6998f01efefd8db digest: cba44c8cddcda1fb5c082dce82004a39f53cc20677ab9698a6998f01efefd8db
home: https://min.io home: https://min.io
@ -157,7 +179,7 @@ entries:
version: 5.0.11 version: 5.0.11
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2023-05-18T00-05-36Z appVersion: RELEASE.2023-05-18T00-05-36Z
created: "2024-04-28T03:14:12.208365359-07:00" created: "2024-10-11T14:15:09.771825924+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: a3d55b12f38a2049ddf3efe35b38b6dc4e59777452b72d18d5a82f3378deb9cd digest: a3d55b12f38a2049ddf3efe35b38b6dc4e59777452b72d18d5a82f3378deb9cd
home: https://min.io home: https://min.io
@ -179,7 +201,7 @@ entries:
version: 5.0.10 version: 5.0.10
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2023-04-28T18-11-17Z appVersion: RELEASE.2023-04-28T18-11-17Z
created: "2024-04-28T03:14:12.224861993-07:00" created: "2024-10-11T14:15:09.787408638+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: cf98985e32675e4ce327304ea9ac61046a788b3d5190d6b501330f7803d41a11 digest: cf98985e32675e4ce327304ea9ac61046a788b3d5190d6b501330f7803d41a11
home: https://min.io home: https://min.io
@ -201,7 +223,7 @@ entries:
version: 5.0.9 version: 5.0.9
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2023-04-13T03-08-07Z appVersion: RELEASE.2023-04-13T03-08-07Z
created: "2024-04-28T03:14:12.223818261-07:00" created: "2024-10-11T14:15:09.786301402+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: 034d68f85799f6693836975797f85a91842cf2d003a6c4ff401bd4ea4c946af6 digest: 034d68f85799f6693836975797f85a91842cf2d003a6c4ff401bd4ea4c946af6
home: https://min.io home: https://min.io
@ -223,7 +245,7 @@ entries:
version: 5.0.8 version: 5.0.8
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2023-02-10T18-48-39Z appVersion: RELEASE.2023-02-10T18-48-39Z
created: "2024-04-28T03:14:12.222596802-07:00" created: "2024-10-11T14:15:09.784737349+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: 3f935a310e1b5b873052629b66005c160356ca7b2bd394cb07b34dbaf9905e3f digest: 3f935a310e1b5b873052629b66005c160356ca7b2bd394cb07b34dbaf9905e3f
home: https://min.io home: https://min.io
@ -245,7 +267,7 @@ entries:
version: 5.0.7 version: 5.0.7
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2023-02-10T18-48-39Z appVersion: RELEASE.2023-02-10T18-48-39Z
created: "2024-04-28T03:14:12.22138425-07:00" created: "2024-10-11T14:15:09.783771258+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: 82ef858ce483c2d736444792986cb36bd0fb4fc90a80b97fe30d7b2f2034d24a digest: 82ef858ce483c2d736444792986cb36bd0fb4fc90a80b97fe30d7b2f2034d24a
home: https://min.io home: https://min.io
@ -267,7 +289,7 @@ entries:
version: 5.0.6 version: 5.0.6
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2023-01-31T02-24-19Z appVersion: RELEASE.2023-01-31T02-24-19Z
created: "2024-04-28T03:14:12.220104992-07:00" created: "2024-10-11T14:15:09.782797823+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: fefeea10e4e525e45f82fb80a03900d34605ec432dd92f56d94eaf4fb1b98c41 digest: fefeea10e4e525e45f82fb80a03900d34605ec432dd92f56d94eaf4fb1b98c41
home: https://min.io home: https://min.io
@ -289,7 +311,7 @@ entries:
version: 5.0.5 version: 5.0.5
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2022-12-12T19-27-27Z appVersion: RELEASE.2022-12-12T19-27-27Z
created: "2024-04-28T03:14:12.218842798-07:00" created: "2024-10-11T14:15:09.781820772+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: 6b305783c98b0b97ffab079ff4430094fd0ca6e98e82bb8153cb93033a1bf40f digest: 6b305783c98b0b97ffab079ff4430094fd0ca6e98e82bb8153cb93033a1bf40f
home: https://min.io home: https://min.io
@ -311,7 +333,7 @@ entries:
version: 5.0.4 version: 5.0.4
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2022-12-12T19-27-27Z appVersion: RELEASE.2022-12-12T19-27-27Z
created: "2024-04-28T03:14:12.217087367-07:00" created: "2024-10-11T14:15:09.780588331+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: bac89157c53b324aece263c294aa49f5c9b64f426b4b06c9bca3d72e77e244f2 digest: bac89157c53b324aece263c294aa49f5c9b64f426b4b06c9bca3d72e77e244f2
home: https://min.io home: https://min.io
@ -333,7 +355,7 @@ entries:
version: 5.0.3 version: 5.0.3
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2022-12-12T19-27-27Z appVersion: RELEASE.2022-12-12T19-27-27Z
created: "2024-04-28T03:14:12.216041974-07:00" created: "2024-10-11T14:15:09.779616018+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: 935ce4f09366231b11d414d626f887fa6fa6024dd30a42e81e810ca1438d5904 digest: 935ce4f09366231b11d414d626f887fa6fa6024dd30a42e81e810ca1438d5904
home: https://min.io home: https://min.io
@ -355,7 +377,7 @@ entries:
version: 5.0.2 version: 5.0.2
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2022-11-11T03-44-20Z appVersion: RELEASE.2022-11-11T03-44-20Z
created: "2024-04-28T03:14:12.207125495-07:00" created: "2024-10-11T14:15:09.770797526+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: 3e952c5d737980b8ccdfb819021eafb4b4e8da226f764a1dc3de1ba63ceb1ffa digest: 3e952c5d737980b8ccdfb819021eafb4b4e8da226f764a1dc3de1ba63ceb1ffa
home: https://min.io home: https://min.io
@ -377,7 +399,7 @@ entries:
version: 5.0.1 version: 5.0.1
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2022-10-24T18-35-07Z appVersion: RELEASE.2022-10-24T18-35-07Z
created: "2024-04-28T03:14:12.206022027-07:00" created: "2024-10-11T14:15:09.769714376+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: 6215c800d84fd4c40e4fb4142645fc1c6a039c251776a3cc8c11a24b9e3b59c7 digest: 6215c800d84fd4c40e4fb4142645fc1c6a039c251776a3cc8c11a24b9e3b59c7
home: https://min.io home: https://min.io
@ -399,7 +421,7 @@ entries:
version: 5.0.0 version: 5.0.0
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2022-10-24T18-35-07Z appVersion: RELEASE.2022-10-24T18-35-07Z
created: "2024-04-28T03:14:12.204849263-07:00" created: "2024-10-11T14:15:09.76829238+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: 2d3d884490ea1127742f938bc9382844bae713caae08b3308f766f3c9000659a digest: 2d3d884490ea1127742f938bc9382844bae713caae08b3308f766f3c9000659a
home: https://min.io home: https://min.io
@ -421,7 +443,7 @@ entries:
version: 4.1.0 version: 4.1.0
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2022-09-17T00-09-45Z appVersion: RELEASE.2022-09-17T00-09-45Z
created: "2024-04-28T03:14:12.194409193-07:00" created: "2024-10-11T14:15:09.759450283+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: 6f16f2dbfed91ab81a7fae60b6ea32f554365bd27bf5fda55b64a0fa264f4252 digest: 6f16f2dbfed91ab81a7fae60b6ea32f554365bd27bf5fda55b64a0fa264f4252
home: https://min.io home: https://min.io
@ -443,7 +465,7 @@ entries:
version: 4.0.15 version: 4.0.15
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2022-09-01T23-53-36Z appVersion: RELEASE.2022-09-01T23-53-36Z
created: "2024-04-28T03:14:12.192692641-07:00" created: "2024-10-11T14:15:09.758263418+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: 35d89d8f49d53ea929466fb88ee26123431326033f1387e6b2d536a629c0a398 digest: 35d89d8f49d53ea929466fb88ee26123431326033f1387e6b2d536a629c0a398
home: https://min.io home: https://min.io
@ -465,7 +487,7 @@ entries:
version: 4.0.14 version: 4.0.14
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2022-08-22T23-53-06Z appVersion: RELEASE.2022-08-22T23-53-06Z
created: "2024-04-28T03:14:12.191686274-07:00" created: "2024-10-11T14:15:09.757071904+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: 5b86937ca88d9f6046141fdc2b1cc54760435ed92d289cd0a115fa7148781d4e digest: 5b86937ca88d9f6046141fdc2b1cc54760435ed92d289cd0a115fa7148781d4e
home: https://min.io home: https://min.io
@ -487,7 +509,7 @@ entries:
version: 4.0.13 version: 4.0.13
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2022-08-13T21-54-44Z appVersion: RELEASE.2022-08-13T21-54-44Z
created: "2024-04-28T03:14:12.190616737-07:00" created: "2024-10-11T14:15:09.756100744+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: 2d9c227c0f46ea8bdef4d760c212156fd4c6623ddc5406779c569fe925527787 digest: 2d9c227c0f46ea8bdef4d760c212156fd4c6623ddc5406779c569fe925527787
home: https://min.io home: https://min.io
@ -509,7 +531,7 @@ entries:
version: 4.0.12 version: 4.0.12
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2022-08-05T23-27-09Z appVersion: RELEASE.2022-08-05T23-27-09Z
created: "2024-04-28T03:14:12.189146545-07:00" created: "2024-10-11T14:15:09.755162505+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: 6caaffcb636e040cd7e8bc4883a1674a673757f4781c32d53b5ec0f41fea3944 digest: 6caaffcb636e040cd7e8bc4883a1674a673757f4781c32d53b5ec0f41fea3944
home: https://min.io home: https://min.io
@ -531,7 +553,7 @@ entries:
version: 4.0.11 version: 4.0.11
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2022-08-02T23-59-16Z appVersion: RELEASE.2022-08-02T23-59-16Z
created: "2024-04-28T03:14:12.187986401-07:00" created: "2024-10-11T14:15:09.75422142+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: 841d87788fb094d6a7d8a91e91821fe1e847bc952e054c781fc93742d112e18a digest: 841d87788fb094d6a7d8a91e91821fe1e847bc952e054c781fc93742d112e18a
home: https://min.io home: https://min.io
@ -553,7 +575,7 @@ entries:
version: 4.0.10 version: 4.0.10
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2022-08-02T23-59-16Z appVersion: RELEASE.2022-08-02T23-59-16Z
created: "2024-04-28T03:14:12.203561972-07:00" created: "2024-10-11T14:15:09.767307553+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: 6f1a78382df3215deac07495a5e7de7009a1153b4cf6cb565630652a69aec4cf digest: 6f1a78382df3215deac07495a5e7de7009a1153b4cf6cb565630652a69aec4cf
home: https://min.io home: https://min.io
@ -575,7 +597,7 @@ entries:
version: 4.0.9 version: 4.0.9
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2022-07-29T19-40-48Z appVersion: RELEASE.2022-07-29T19-40-48Z
created: "2024-04-28T03:14:12.20241634-07:00" created: "2024-10-11T14:15:09.766415742+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: d11db37963636922cb778b6bc0ad2ca4724cb391ea7b785995ada52467d7dd83 digest: d11db37963636922cb778b6bc0ad2ca4724cb391ea7b785995ada52467d7dd83
home: https://min.io home: https://min.io
@ -597,7 +619,7 @@ entries:
version: 4.0.8 version: 4.0.8
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2022-07-26T00-53-03Z appVersion: RELEASE.2022-07-26T00-53-03Z
created: "2024-04-28T03:14:12.200828324-07:00" created: "2024-10-11T14:15:09.765514151+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: ca775e08c84331bb5029d4d29867d30c16e2c62e897788eb432212a756e91e4e digest: ca775e08c84331bb5029d4d29867d30c16e2c62e897788eb432212a756e91e4e
home: https://min.io home: https://min.io
@ -619,7 +641,7 @@ entries:
version: 4.0.7 version: 4.0.7
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2022-05-08T23-50-31Z appVersion: RELEASE.2022-05-08T23-50-31Z
created: "2024-04-28T03:14:12.199850859-07:00" created: "2024-10-11T14:15:09.764562257+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: 06542b8f3d149d5908b15de9a8d6f8cf304af0213830be56dc315785d14f9ccd digest: 06542b8f3d149d5908b15de9a8d6f8cf304af0213830be56dc315785d14f9ccd
home: https://min.io home: https://min.io
@ -641,7 +663,7 @@ entries:
version: 4.0.6 version: 4.0.6
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2022-05-08T23-50-31Z appVersion: RELEASE.2022-05-08T23-50-31Z
created: "2024-04-28T03:14:12.198946065-07:00" created: "2024-10-11T14:15:09.763510175+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: dd2676362f067454a496cdd293609d0c904b08f521625af49f95402a024ba1f5 digest: dd2676362f067454a496cdd293609d0c904b08f521625af49f95402a024ba1f5
home: https://min.io home: https://min.io
@ -663,7 +685,7 @@ entries:
version: 4.0.5 version: 4.0.5
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2022-05-08T23-50-31Z appVersion: RELEASE.2022-05-08T23-50-31Z
created: "2024-04-28T03:14:12.197851884-07:00" created: "2024-10-11T14:15:09.762614956+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: bab9ef192d4eda4c572ad0ce0cf551736c847f582d1837d6833ee10543c23167 digest: bab9ef192d4eda4c572ad0ce0cf551736c847f582d1837d6833ee10543c23167
home: https://min.io home: https://min.io
@ -685,7 +707,7 @@ entries:
version: 4.0.4 version: 4.0.4
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2022-05-08T23-50-31Z appVersion: RELEASE.2022-05-08T23-50-31Z
created: "2024-04-28T03:14:12.196628751-07:00" created: "2024-10-11T14:15:09.761669704+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: c770bb9841c76576e4e8573f78b0ec33e0d729504c9667e67ad62d48df5ed64c digest: c770bb9841c76576e4e8573f78b0ec33e0d729504c9667e67ad62d48df5ed64c
home: https://min.io home: https://min.io
@ -707,7 +729,7 @@ entries:
version: 4.0.3 version: 4.0.3
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2022-05-08T23-50-31Z appVersion: RELEASE.2022-05-08T23-50-31Z
created: "2024-04-28T03:14:12.195461706-07:00" created: "2024-10-11T14:15:09.760342676+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: 95835f4199d963e2a23a2493610b348e6f2ff8b71c1a648c4a3b84af9b7a83eb digest: 95835f4199d963e2a23a2493610b348e6f2ff8b71c1a648c4a3b84af9b7a83eb
home: https://min.io home: https://min.io
@ -729,7 +751,7 @@ entries:
version: 4.0.2 version: 4.0.2
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2022-04-30T22-23-53Z appVersion: RELEASE.2022-04-30T22-23-53Z
created: "2024-04-28T03:14:12.186864752-07:00" created: "2024-10-11T14:15:09.753070923+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: 55a088c403b056e1f055a97426aa11759c3d6cbad38face170fe6cbbec7d568f digest: 55a088c403b056e1f055a97426aa11759c3d6cbad38face170fe6cbbec7d568f
home: https://min.io home: https://min.io
@ -751,7 +773,7 @@ entries:
version: 4.0.1 version: 4.0.1
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2022-04-26T01-20-24Z appVersion: RELEASE.2022-04-26T01-20-24Z
created: "2024-04-28T03:14:12.185311208-07:00" created: "2024-10-11T14:15:09.7518155+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: f541237e24336ec3f7f45ae0d523fef694e3a2f9ef648c5b11c15734db6ba2b2 digest: f541237e24336ec3f7f45ae0d523fef694e3a2f9ef648c5b11c15734db6ba2b2
home: https://min.io home: https://min.io
@ -773,7 +795,7 @@ entries:
version: 4.0.0 version: 4.0.0
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2022-04-16T04-26-02Z appVersion: RELEASE.2022-04-16T04-26-02Z
created: "2024-04-28T03:14:12.184368971-07:00" created: "2024-10-11T14:15:09.750922426+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: edc0c3dd6d5246a06b74ba16bb4aff80a6d7225dc9aecf064fd89a8af371b9c1 digest: edc0c3dd6d5246a06b74ba16bb4aff80a6d7225dc9aecf064fd89a8af371b9c1
home: https://min.io home: https://min.io
@ -795,7 +817,7 @@ entries:
version: 3.6.6 version: 3.6.6
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2022-04-12T06-55-35Z appVersion: RELEASE.2022-04-12T06-55-35Z
created: "2024-04-28T03:14:12.183437532-07:00" created: "2024-10-11T14:15:09.7500018+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: 211e89f6b9eb0b9a3583abaa127be60e1f9717a098e6b2858cb9dc1cc50c1650 digest: 211e89f6b9eb0b9a3583abaa127be60e1f9717a098e6b2858cb9dc1cc50c1650
home: https://min.io home: https://min.io
@ -817,7 +839,7 @@ entries:
version: 3.6.5 version: 3.6.5
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2022-04-09T15-09-52Z appVersion: RELEASE.2022-04-09T15-09-52Z
created: "2024-04-28T03:14:12.182494939-07:00" created: "2024-10-11T14:15:09.74894055+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: 534a879d73b370a18b554b93d0930e1c115419619c4ce4ec7dbaae632acacf06 digest: 534a879d73b370a18b554b93d0930e1c115419619c4ce4ec7dbaae632acacf06
home: https://min.io home: https://min.io
@ -839,7 +861,7 @@ entries:
version: 3.6.4 version: 3.6.4
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2022-03-24T00-43-44Z appVersion: RELEASE.2022-03-24T00-43-44Z
created: "2024-04-28T03:14:12.181479711-07:00" created: "2024-10-11T14:15:09.748068996+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: 99508b20eb0083a567dcccaf9a6c237e09575ed1d70cd2e8333f89c472d13d75 digest: 99508b20eb0083a567dcccaf9a6c237e09575ed1d70cd2e8333f89c472d13d75
home: https://min.io home: https://min.io
@ -861,7 +883,7 @@ entries:
version: 3.6.3 version: 3.6.3
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2022-03-17T06-34-49Z appVersion: RELEASE.2022-03-17T06-34-49Z
created: "2024-04-28T03:14:12.180514325-07:00" created: "2024-10-11T14:15:09.747184688+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: b4cd25611ca322b1d23d23112fdfa6b068fd91eefe0b0663b88ff87ea4282495 digest: b4cd25611ca322b1d23d23112fdfa6b068fd91eefe0b0663b88ff87ea4282495
home: https://min.io home: https://min.io
@ -883,7 +905,7 @@ entries:
version: 3.6.2 version: 3.6.2
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2022-03-14T18-25-24Z appVersion: RELEASE.2022-03-14T18-25-24Z
created: "2024-04-28T03:14:12.179495821-07:00" created: "2024-10-11T14:15:09.746295832+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: d75b88162bfe54740a233bcecf87328bba2ae23d170bec3a35c828bc6fdc224c digest: d75b88162bfe54740a233bcecf87328bba2ae23d170bec3a35c828bc6fdc224c
home: https://min.io home: https://min.io
@ -905,7 +927,7 @@ entries:
version: 3.6.1 version: 3.6.1
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2022-03-11T23-57-45Z appVersion: RELEASE.2022-03-11T23-57-45Z
created: "2024-04-28T03:14:12.177941019-07:00" created: "2024-10-11T14:15:09.745269969+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: 22e53a1184a21a679bc7d8b94e955777f3506340fc29da5ab0cb6d729bdbde8d digest: 22e53a1184a21a679bc7d8b94e955777f3506340fc29da5ab0cb6d729bdbde8d
home: https://min.io home: https://min.io
@ -927,7 +949,7 @@ entries:
version: 3.6.0 version: 3.6.0
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2022-03-03T21-21-16Z appVersion: RELEASE.2022-03-03T21-21-16Z
created: "2024-04-28T03:14:12.177003172-07:00" created: "2024-10-11T14:15:09.743922583+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: 6fda968d3fdfd60470c0055a4e1a3bd8e5aee9ad0af5ba2fb7b7b926fdc9e4a0 digest: 6fda968d3fdfd60470c0055a4e1a3bd8e5aee9ad0af5ba2fb7b7b926fdc9e4a0
home: https://min.io home: https://min.io
@ -949,7 +971,7 @@ entries:
version: 3.5.9 version: 3.5.9
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2022-02-26T02-54-46Z appVersion: RELEASE.2022-02-26T02-54-46Z
created: "2024-04-28T03:14:12.175993618-07:00" created: "2024-10-11T14:15:09.74304611+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: 8e015369048a3a82bbd53ad36696786f18561c6b25d14eee9e2c93a7336cef46 digest: 8e015369048a3a82bbd53ad36696786f18561c6b25d14eee9e2c93a7336cef46
home: https://min.io home: https://min.io
@ -971,7 +993,7 @@ entries:
version: 3.5.8 version: 3.5.8
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2022-02-18T01-50-10Z appVersion: RELEASE.2022-02-18T01-50-10Z
created: "2024-04-28T03:14:12.174860329-07:00" created: "2024-10-11T14:15:09.74217139+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: cb3543fe748e5f0d59b3ccf4ab9af8e10b731405ae445d1f5715e30013632373 digest: cb3543fe748e5f0d59b3ccf4ab9af8e10b731405ae445d1f5715e30013632373
home: https://min.io home: https://min.io
@ -993,7 +1015,7 @@ entries:
version: 3.5.7 version: 3.5.7
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2022-02-18T01-50-10Z appVersion: RELEASE.2022-02-18T01-50-10Z
created: "2024-04-28T03:14:12.173879214-07:00" created: "2024-10-11T14:15:09.741299155+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: f2e359fa5eefffc59abb3d14a8fa94b11ddeaa99f6cd8dd5f40f4e04121000d6 digest: f2e359fa5eefffc59abb3d14a8fa94b11ddeaa99f6cd8dd5f40f4e04121000d6
home: https://min.io home: https://min.io
@ -1015,7 +1037,7 @@ entries:
version: 3.5.6 version: 3.5.6
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2022-02-16T00-35-27Z appVersion: RELEASE.2022-02-16T00-35-27Z
created: "2024-04-28T03:14:12.17267354-07:00" created: "2024-10-11T14:15:09.740307165+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: 529d56cca9d83a3d0e5672e63b6e87b5bcbe10a6b45f7a55ba998cceb32f9c81 digest: 529d56cca9d83a3d0e5672e63b6e87b5bcbe10a6b45f7a55ba998cceb32f9c81
home: https://min.io home: https://min.io
@ -1037,7 +1059,7 @@ entries:
version: 3.5.5 version: 3.5.5
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2022-02-12T00-51-25Z appVersion: RELEASE.2022-02-12T00-51-25Z
created: "2024-04-28T03:14:12.171139215-07:00" created: "2024-10-11T14:15:09.739421344+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: 3d530598f8ece67bec5b7f990d206584893987c713502f9228e4ee24b5535414 digest: 3d530598f8ece67bec5b7f990d206584893987c713502f9228e4ee24b5535414
home: https://min.io home: https://min.io
@ -1059,7 +1081,7 @@ entries:
version: 3.5.4 version: 3.5.4
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2022-02-12T00-51-25Z appVersion: RELEASE.2022-02-12T00-51-25Z
created: "2024-04-28T03:14:12.169893652-07:00" created: "2024-10-11T14:15:09.738558427+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: 53937031348b29615f07fc4869b2d668391d8ba9084630a497abd7a7dea9dfb0 digest: 53937031348b29615f07fc4869b2d668391d8ba9084630a497abd7a7dea9dfb0
home: https://min.io home: https://min.io
@ -1081,7 +1103,7 @@ entries:
version: 3.5.3 version: 3.5.3
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2022-02-07T08-17-33Z appVersion: RELEASE.2022-02-07T08-17-33Z
created: "2024-04-28T03:14:12.168817583-07:00" created: "2024-10-11T14:15:09.737783093+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: 68d643414ff0d565716c5715034fcbf1af262e041915a5c02eb51ec1a65c1ea0 digest: 68d643414ff0d565716c5715034fcbf1af262e041915a5c02eb51ec1a65c1ea0
home: https://min.io home: https://min.io
@ -1103,7 +1125,7 @@ entries:
version: 3.5.2 version: 3.5.2
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2022-02-01T18-00-14Z appVersion: RELEASE.2022-02-01T18-00-14Z
created: "2024-04-28T03:14:12.167970265-07:00" created: "2024-10-11T14:15:09.736592341+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: a3e855ed0f31233b989fffd775a29d6fbfa0590089010ff16783fd7f142ef6e7 digest: a3e855ed0f31233b989fffd775a29d6fbfa0590089010ff16783fd7f142ef6e7
home: https://min.io home: https://min.io
@ -1125,7 +1147,7 @@ entries:
version: 3.5.1 version: 3.5.1
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2022-02-01T18-00-14Z appVersion: RELEASE.2022-02-01T18-00-14Z
created: "2024-04-28T03:14:12.167135679-07:00" created: "2024-10-11T14:15:09.735823109+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: b1b0ae3c54b4260a698753e11d7781bb8ddc67b7e3fbf0af82796e4cd4ef92a3 digest: b1b0ae3c54b4260a698753e11d7781bb8ddc67b7e3fbf0af82796e4cd4ef92a3
home: https://min.io home: https://min.io
@ -1147,7 +1169,7 @@ entries:
version: 3.5.0 version: 3.5.0
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2022-01-28T02-28-16Z appVersion: RELEASE.2022-01-28T02-28-16Z
created: "2024-04-28T03:14:12.166201082-07:00" created: "2024-10-11T14:15:09.735071179+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: fecf25d2d3fb208c6f894fed642a60780a570b7f6d0adddde846af7236dc80aa digest: fecf25d2d3fb208c6f894fed642a60780a570b7f6d0adddde846af7236dc80aa
home: https://min.io home: https://min.io
@ -1169,7 +1191,7 @@ entries:
version: 3.4.8 version: 3.4.8
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2022-01-25T19-56-04Z appVersion: RELEASE.2022-01-25T19-56-04Z
created: "2024-04-28T03:14:12.165127195-07:00" created: "2024-10-11T14:15:09.734306505+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: c78008caa5ce98f64c887630f59d0cbd481cb3f19a7d4e9d3e81bf4e1e45cadc digest: c78008caa5ce98f64c887630f59d0cbd481cb3f19a7d4e9d3e81bf4e1e45cadc
home: https://min.io home: https://min.io
@ -1191,7 +1213,7 @@ entries:
version: 3.4.7 version: 3.4.7
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2022-01-08T03-11-54Z appVersion: RELEASE.2022-01-08T03-11-54Z
created: "2024-04-28T03:14:12.164303251-07:00" created: "2024-10-11T14:15:09.733551811+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: 8f2e2691bf897f74ff094dd370ec56ba9d417e5e8926710c14c2ba346330238d digest: 8f2e2691bf897f74ff094dd370ec56ba9d417e5e8926710c14c2ba346330238d
home: https://min.io home: https://min.io
@ -1213,7 +1235,7 @@ entries:
version: 3.4.6 version: 3.4.6
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2022-01-04T07-41-07Z appVersion: RELEASE.2022-01-04T07-41-07Z
created: "2024-04-28T03:14:12.162795646-07:00" created: "2024-10-11T14:15:09.732798308+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: bacd140f0016fab35f516bde787da6449b3a960c071fad9e4b6563118033ac84 digest: bacd140f0016fab35f516bde787da6449b3a960c071fad9e4b6563118033ac84
home: https://min.io home: https://min.io
@ -1235,7 +1257,7 @@ entries:
version: 3.4.5 version: 3.4.5
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2021-12-29T06-49-06Z appVersion: RELEASE.2021-12-29T06-49-06Z
created: "2024-04-28T03:14:12.161989805-07:00" created: "2024-10-11T14:15:09.732050255+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: 48a453ea5ffeef25933904caefd9470bfb26224dfc2d1096bd0031467ba53007 digest: 48a453ea5ffeef25933904caefd9470bfb26224dfc2d1096bd0031467ba53007
home: https://min.io home: https://min.io
@ -1257,7 +1279,7 @@ entries:
version: 3.4.4 version: 3.4.4
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2021-12-20T22-07-16Z appVersion: RELEASE.2021-12-20T22-07-16Z
created: "2024-04-28T03:14:12.161055608-07:00" created: "2024-10-11T14:15:09.731302203+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: 47ef4a930713b98f9438ceca913c6e700f85bb25dba5624b056486254b5f0c60 digest: 47ef4a930713b98f9438ceca913c6e700f85bb25dba5624b056486254b5f0c60
home: https://min.io home: https://min.io
@ -1279,7 +1301,7 @@ entries:
version: 3.4.3 version: 3.4.3
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2021-12-20T22-07-16Z appVersion: RELEASE.2021-12-20T22-07-16Z
created: "2024-04-28T03:14:12.160184101-07:00" created: "2024-10-11T14:15:09.730407716+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: d6763f7e2ea66810bd55eb225579a9c3b968f9ae1256f45fd469362e55d846ff digest: d6763f7e2ea66810bd55eb225579a9c3b968f9ae1256f45fd469362e55d846ff
home: https://min.io home: https://min.io
@ -1301,7 +1323,7 @@ entries:
version: 3.4.2 version: 3.4.2
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2021-12-10T23-03-39Z appVersion: RELEASE.2021-12-10T23-03-39Z
created: "2024-04-28T03:14:12.159364533-07:00" created: "2024-10-11T14:15:09.729184733+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: 2fb822c87216ba3fc2ae51a54a0a3e239aa560d86542991504a841cc2a2b9a37 digest: 2fb822c87216ba3fc2ae51a54a0a3e239aa560d86542991504a841cc2a2b9a37
home: https://min.io home: https://min.io
@ -1323,7 +1345,7 @@ entries:
version: 3.4.1 version: 3.4.1
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2021-12-18T04-42-33Z appVersion: RELEASE.2021-12-18T04-42-33Z
created: "2024-04-28T03:14:12.158387622-07:00" created: "2024-10-11T14:15:09.728422645+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: fa8ba1aeb1a15316c6be8403416a5e6b5e6139b7166592087e7bddc9e6db5453 digest: fa8ba1aeb1a15316c6be8403416a5e6b5e6139b7166592087e7bddc9e6db5453
home: https://min.io home: https://min.io
@ -1345,7 +1367,7 @@ entries:
version: 3.4.0 version: 3.4.0
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2021-12-10T23-03-39Z appVersion: RELEASE.2021-12-10T23-03-39Z
created: "2024-04-28T03:14:12.157269673-07:00" created: "2024-10-11T14:15:09.727674863+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: b9b0af9ca50b8d00868e1f1b989dca275829d9110af6de91bb9b3a398341e894 digest: b9b0af9ca50b8d00868e1f1b989dca275829d9110af6de91bb9b3a398341e894
home: https://min.io home: https://min.io
@ -1367,7 +1389,7 @@ entries:
version: 3.3.4 version: 3.3.4
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2021-12-10T23-03-39Z appVersion: RELEASE.2021-12-10T23-03-39Z
created: "2024-04-28T03:14:12.155877559-07:00" created: "2024-10-11T14:15:09.726945596+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: f8b22a5b8fe95a7ddf61b825e17d11c9345fb10e4c126b0d78381608aa300a08 digest: f8b22a5b8fe95a7ddf61b825e17d11c9345fb10e4c126b0d78381608aa300a08
home: https://min.io home: https://min.io
@ -1389,7 +1411,7 @@ entries:
version: 3.3.3 version: 3.3.3
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2021-12-10T23-03-39Z appVersion: RELEASE.2021-12-10T23-03-39Z
created: "2024-04-28T03:14:12.154988565-07:00" created: "2024-10-11T14:15:09.726222289+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: c48d474f269427abe5ab446f00687d0625b3d1adfc5c73bdb4b21ca9e42853fb digest: c48d474f269427abe5ab446f00687d0625b3d1adfc5c73bdb4b21ca9e42853fb
home: https://min.io home: https://min.io
@ -1411,7 +1433,7 @@ entries:
version: 3.3.2 version: 3.3.2
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2021-11-24T23-19-33Z appVersion: RELEASE.2021-11-24T23-19-33Z
created: "2024-04-28T03:14:12.15419958-07:00" created: "2024-10-11T14:15:09.72549703+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: 7c3da39d9b0090cbf5efedf0cc163a1e2df05becc5152c3add8e837384690bc4 digest: 7c3da39d9b0090cbf5efedf0cc163a1e2df05becc5152c3add8e837384690bc4
home: https://min.io home: https://min.io
@ -1433,7 +1455,7 @@ entries:
version: 3.3.1 version: 3.3.1
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2021-11-24T23-19-33Z appVersion: RELEASE.2021-11-24T23-19-33Z
created: "2024-04-28T03:14:12.15338227-07:00" created: "2024-10-11T14:15:09.724758515+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: 50d6590b4cc779c40f81cc13b1586fbe508aa7f3230036c760bfc5f4154fbce4 digest: 50d6590b4cc779c40f81cc13b1586fbe508aa7f3230036c760bfc5f4154fbce4
home: https://min.io home: https://min.io
@ -1455,7 +1477,7 @@ entries:
version: 3.3.0 version: 3.3.0
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2021-10-13T00-23-17Z appVersion: RELEASE.2021-10-13T00-23-17Z
created: "2024-04-28T03:14:12.152588893-07:00" created: "2024-10-11T14:15:09.723866813+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: 5b797b7208cd904c11a76cd72938c8652160cb5fcd7f09fa41e4e703e6d64054 digest: 5b797b7208cd904c11a76cd72938c8652160cb5fcd7f09fa41e4e703e6d64054
home: https://min.io home: https://min.io
@ -1477,7 +1499,7 @@ entries:
version: 3.2.0 version: 3.2.0
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2021-10-10T16-53-30Z appVersion: RELEASE.2021-10-10T16-53-30Z
created: "2024-04-28T03:14:12.151796925-07:00" created: "2024-10-11T14:15:09.722962678+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: e084ac4bb095f071e59f8f08bd092e4ab2404c1ddadacfdce7dbe248f1bafff8 digest: e084ac4bb095f071e59f8f08bd092e4ab2404c1ddadacfdce7dbe248f1bafff8
home: https://min.io home: https://min.io
@ -1499,7 +1521,7 @@ entries:
version: 3.1.9 version: 3.1.9
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2021-10-06T23-36-31Z appVersion: RELEASE.2021-10-06T23-36-31Z
created: "2024-04-28T03:14:12.150997767-07:00" created: "2024-10-11T14:15:09.722115921+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: 2890430a8d9487d1fa5508c26776e4881d0086b2c052aa6bdc65c0e4423b9159 digest: 2890430a8d9487d1fa5508c26776e4881d0086b2c052aa6bdc65c0e4423b9159
home: https://min.io home: https://min.io
@ -1521,7 +1543,7 @@ entries:
version: 3.1.8 version: 3.1.8
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2021-10-02T16-31-05Z appVersion: RELEASE.2021-10-02T16-31-05Z
created: "2024-04-28T03:14:12.14943246-07:00" created: "2024-10-11T14:15:09.720994118+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: 01a92196af6c47e3a01e1c68d7cf693a8bc487cba810c2cecff155071e4d6a11 digest: 01a92196af6c47e3a01e1c68d7cf693a8bc487cba810c2cecff155071e4d6a11
home: https://min.io home: https://min.io
@ -1543,7 +1565,7 @@ entries:
version: 3.1.7 version: 3.1.7
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2021-09-18T18-09-59Z appVersion: RELEASE.2021-09-18T18-09-59Z
created: "2024-04-28T03:14:12.148384204-07:00" created: "2024-10-11T14:15:09.720249161+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: e779d73f80b75f33b9c9d995ab10fa455c9c57ee575ebc54e06725a64cd04310 digest: e779d73f80b75f33b9c9d995ab10fa455c9c57ee575ebc54e06725a64cd04310
home: https://min.io home: https://min.io
@ -1565,7 +1587,7 @@ entries:
version: 3.1.6 version: 3.1.6
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2021-09-18T18-09-59Z appVersion: RELEASE.2021-09-18T18-09-59Z
created: "2024-04-28T03:14:12.147633369-07:00" created: "2024-10-11T14:15:09.719444092+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: 19de4bbc8a400f0c2a94c5e85fc25c9bfc666e773fb3e368dd621d5a57dd1c2a digest: 19de4bbc8a400f0c2a94c5e85fc25c9bfc666e773fb3e368dd621d5a57dd1c2a
home: https://min.io home: https://min.io
@ -1587,7 +1609,7 @@ entries:
version: 3.1.5 version: 3.1.5
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2021-09-18T18-09-59Z appVersion: RELEASE.2021-09-18T18-09-59Z
created: "2024-04-28T03:14:12.146776763-07:00" created: "2024-10-11T14:15:09.718710817+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: f789d93a171296dd01af0105a5ce067c663597afbb2432faeda293b752b355c0 digest: f789d93a171296dd01af0105a5ce067c663597afbb2432faeda293b752b355c0
home: https://min.io home: https://min.io
@ -1609,7 +1631,7 @@ entries:
version: 3.1.4 version: 3.1.4
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2021-09-09T21-37-07Z appVersion: RELEASE.2021-09-09T21-37-07Z
created: "2024-04-28T03:14:12.145989493-07:00" created: "2024-10-11T14:15:09.717806021+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: e2eb34d31560b012ef6581f0ff6004ea4376c968cbe0daed2d8f3a614a892afb digest: e2eb34d31560b012ef6581f0ff6004ea4376c968cbe0daed2d8f3a614a892afb
home: https://min.io home: https://min.io
@ -1631,7 +1653,7 @@ entries:
version: 3.1.3 version: 3.1.3
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2021-09-09T21-37-07Z appVersion: RELEASE.2021-09-09T21-37-07Z
created: "2024-04-28T03:14:12.145197459-07:00" created: "2024-10-11T14:15:09.716991684+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: 8d7e0cc46b3583abd71b97dc0c071f98321101f90eca17348f1e9e0831be64cd digest: 8d7e0cc46b3583abd71b97dc0c071f98321101f90eca17348f1e9e0831be64cd
home: https://min.io home: https://min.io
@ -1653,7 +1675,7 @@ entries:
version: 3.1.2 version: 3.1.2
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2021-09-09T21-37-07Z appVersion: RELEASE.2021-09-09T21-37-07Z
created: "2024-04-28T03:14:12.144268398-07:00" created: "2024-10-11T14:15:09.716256185+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: 50dcbf366b1b21f4a6fc429d0b884c0c7ff481d0fb95c5e9b3ae157c348dd124 digest: 50dcbf366b1b21f4a6fc429d0b884c0c7ff481d0fb95c5e9b3ae157c348dd124
home: https://min.io home: https://min.io
@ -1675,7 +1697,7 @@ entries:
version: 3.1.1 version: 3.1.1
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2021-09-09T21-37-07Z appVersion: RELEASE.2021-09-09T21-37-07Z
created: "2024-04-28T03:14:12.142743108-07:00" created: "2024-10-11T14:15:09.715531216+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: 6c01af55d2e2e5f716eabf6fef3a92a8464d0674529e9bacab292e5478a73b7a digest: 6c01af55d2e2e5f716eabf6fef3a92a8464d0674529e9bacab292e5478a73b7a
home: https://min.io home: https://min.io
@ -1697,7 +1719,7 @@ entries:
version: 3.1.0 version: 3.1.0
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2021-09-03T03-56-13Z appVersion: RELEASE.2021-09-03T03-56-13Z
created: "2024-04-28T03:14:12.14186767-07:00" created: "2024-10-11T14:15:09.714758688+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: 18e10be4d0458bc590ca9abf753227e0c70f60511495387b8d4fb15a4daf932e digest: 18e10be4d0458bc590ca9abf753227e0c70f60511495387b8d4fb15a4daf932e
home: https://min.io home: https://min.io
@ -1719,7 +1741,7 @@ entries:
version: 3.0.2 version: 3.0.2
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2021-08-31T05-46-54Z appVersion: RELEASE.2021-08-31T05-46-54Z
created: "2024-04-28T03:14:12.141031327-07:00" created: "2024-10-11T14:15:09.713569158+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: f5b6e7f6272a9e71aef3b75555f6f756a39eef65cb78873f26451dba79b19906 digest: f5b6e7f6272a9e71aef3b75555f6f756a39eef65cb78873f26451dba79b19906
home: https://min.io home: https://min.io
@ -1741,7 +1763,7 @@ entries:
version: 3.0.1 version: 3.0.1
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2021-08-31T05-46-54Z appVersion: RELEASE.2021-08-31T05-46-54Z
created: "2024-04-28T03:14:12.140296924-07:00" created: "2024-10-11T14:15:09.712883463+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: 6d2ee1336c412affaaf209fdb80215be2a6ebb23ab2443adbaffef9e7df13fab digest: 6d2ee1336c412affaaf209fdb80215be2a6ebb23ab2443adbaffef9e7df13fab
home: https://min.io home: https://min.io
@ -1763,7 +1785,7 @@ entries:
version: 3.0.0 version: 3.0.0
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2021-08-31T05-46-54Z appVersion: RELEASE.2021-08-31T05-46-54Z
created: "2024-04-28T03:14:12.139381654-07:00" created: "2024-10-11T14:15:09.712171228+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: 0a004aaf5bb61deed6a5c88256d1695ebe2f9ff1553874a93e4acfd75e8d339b digest: 0a004aaf5bb61deed6a5c88256d1695ebe2f9ff1553874a93e4acfd75e8d339b
home: https://min.io home: https://min.io
@ -1783,7 +1805,7 @@ entries:
version: 2.0.1 version: 2.0.1
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2021-08-25T00-41-18Z appVersion: RELEASE.2021-08-25T00-41-18Z
created: "2024-04-28T03:14:12.138368869-07:00" created: "2024-10-11T14:15:09.711484069+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: fcd944e837ee481307de6aa3d387ea18c234f995a84c15abb211aab4a4054afc digest: fcd944e837ee481307de6aa3d387ea18c234f995a84c15abb211aab4a4054afc
home: https://min.io home: https://min.io
@ -1803,7 +1825,7 @@ entries:
version: 2.0.0 version: 2.0.0
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2021-08-25T00-41-18Z appVersion: RELEASE.2021-08-25T00-41-18Z
created: "2024-04-28T03:14:12.137464427-07:00" created: "2024-10-11T14:15:09.710776233+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: 7b6c033d43a856479eb493ab8ca05b230f77c3e42e209e8f298fac6af1a9796f digest: 7b6c033d43a856479eb493ab8ca05b230f77c3e42e209e8f298fac6af1a9796f
home: https://min.io home: https://min.io
@ -1823,7 +1845,7 @@ entries:
version: 1.0.5 version: 1.0.5
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2021-08-25T00-41-18Z appVersion: RELEASE.2021-08-25T00-41-18Z
created: "2024-04-28T03:14:12.136429435-07:00" created: "2024-10-11T14:15:09.710075719+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: abd221245ace16c8e0c6c851cf262d1474a5219dcbf25c4b2e7b77142f9c59ed digest: abd221245ace16c8e0c6c851cf262d1474a5219dcbf25c4b2e7b77142f9c59ed
home: https://min.io home: https://min.io
@ -1843,7 +1865,7 @@ entries:
version: 1.0.4 version: 1.0.4
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2021-08-20T18-32-01Z appVersion: RELEASE.2021-08-20T18-32-01Z
created: "2024-04-28T03:14:12.135413085-07:00" created: "2024-10-11T14:15:09.709396045+02:00"
description: Multi-Cloud Object Storage description: Multi-Cloud Object Storage
digest: 922a333f5413d1042f7aa81929f43767f6ffca9b260c46713f04ce1dda86d57d digest: 922a333f5413d1042f7aa81929f43767f6ffca9b260c46713f04ce1dda86d57d
home: https://min.io home: https://min.io
@ -1863,7 +1885,7 @@ entries:
version: 1.0.3 version: 1.0.3
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2021-08-20T18-32-01Z appVersion: RELEASE.2021-08-20T18-32-01Z
created: "2024-04-28T03:14:12.134699423-07:00" created: "2024-10-11T14:15:09.708712073+02:00"
description: High Performance, Kubernetes Native Object Storage description: High Performance, Kubernetes Native Object Storage
digest: 10e22773506bbfb1c66442937956534cf4057b94f06a977db78b8cd223588388 digest: 10e22773506bbfb1c66442937956534cf4057b94f06a977db78b8cd223588388
home: https://min.io home: https://min.io
@ -1883,7 +1905,7 @@ entries:
version: 1.0.2 version: 1.0.2
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2021-08-20T18-32-01Z appVersion: RELEASE.2021-08-20T18-32-01Z
created: "2024-04-28T03:14:12.133946699-07:00" created: "2024-10-11T14:15:09.707725252+02:00"
description: High Performance, Kubernetes Native Object Storage description: High Performance, Kubernetes Native Object Storage
digest: ef86ab6df23d6942705da9ef70991b649638c51bc310587d37a425268ba4a06c digest: ef86ab6df23d6942705da9ef70991b649638c51bc310587d37a425268ba4a06c
home: https://min.io home: https://min.io
@ -1903,7 +1925,7 @@ entries:
version: 1.0.1 version: 1.0.1
- apiVersion: v1 - apiVersion: v1
appVersion: RELEASE.2021-08-17T20-53-08Z appVersion: RELEASE.2021-08-17T20-53-08Z
created: "2024-04-28T03:14:12.133025049-07:00" created: "2024-10-11T14:15:09.706527016+02:00"
description: High Performance, Kubernetes Native Object Storage description: High Performance, Kubernetes Native Object Storage
digest: 1add7608692cbf39aaf9b1252530e566f7b2f306a14e390b0f49b97a20f2b188 digest: 1add7608692cbf39aaf9b1252530e566f7b2f306a14e390b0f49b97a20f2b188
home: https://min.io home: https://min.io
@ -1921,4 +1943,4 @@ entries:
urls: urls:
- https://charts.min.io/helm-releases/minio-1.0.0.tgz - https://charts.min.io/helm-releases/minio-1.0.0.tgz
version: 1.0.0 version: 1.0.0
generated: "2024-04-28T03:14:12.132043277-07:00" generated: "2024-10-11T14:15:09.704468507+02:00"