| 
									
										
										
										
											2015-06-26 17:10:47 +08:00
										 |  |  | /* | 
					
						
							| 
									
										
										
										
											2019-04-10 02:39:42 +08:00
										 |  |  |  * MinIO Cloud Storage, (C) 2016, 2017 MinIO, Inc. | 
					
						
							| 
									
										
										
										
											2015-06-26 17:10:47 +08:00
										 |  |  |  * | 
					
						
							|  |  |  |  * Licensed under the Apache License, Version 2.0 (the "License"); | 
					
						
							|  |  |  |  * you may not use this file except in compliance with the License. | 
					
						
							|  |  |  |  * You may obtain a copy of the License at | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *     http://www.apache.org/licenses/LICENSE-2.0
 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Unless required by applicable law or agreed to in writing, software | 
					
						
							|  |  |  |  * distributed under the License is distributed on an "AS IS" BASIS, | 
					
						
							|  |  |  |  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
					
						
							|  |  |  |  * See the License for the specific language governing permissions and | 
					
						
							|  |  |  |  * limitations under the License. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-19 07:23:42 +08:00
										 |  |  | package cmd | 
					
						
							| 
									
										
										
										
											2015-06-26 17:10:47 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-16 09:45:57 +08:00
										 |  |  | import ( | 
					
						
							| 
									
										
										
										
											2018-02-24 07:07:21 +08:00
										 |  |  | 	"io" | 
					
						
							| 
									
										
										
										
											2020-03-19 07:19:29 +08:00
										 |  |  | 	"math" | 
					
						
							| 
									
										
										
										
											2018-02-16 09:45:57 +08:00
										 |  |  | 	"time" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-27 21:45:43 +08:00
										 |  |  | 	humanize "github.com/dustin/go-humanize" | 
					
						
							| 
									
										
										
										
											2020-07-22 08:49:56 +08:00
										 |  |  | 	"github.com/minio/minio/pkg/bucket/replication" | 
					
						
							| 
									
										
										
										
											2018-02-24 07:07:21 +08:00
										 |  |  | 	"github.com/minio/minio/pkg/hash" | 
					
						
							| 
									
										
										
										
											2018-02-16 09:45:57 +08:00
										 |  |  | 	"github.com/minio/minio/pkg/madmin" | 
					
						
							|  |  |  | ) | 
					
						
							| 
									
										
										
										
											2015-07-04 12:02:31 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-06 03:48:07 +08:00
										 |  |  | // BackendType - represents different backend types.
 | 
					
						
							|  |  |  | type BackendType int | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Enum for different backend types.
 | 
					
						
							|  |  |  | const ( | 
					
						
							|  |  |  | 	Unknown BackendType = iota | 
					
						
							|  |  |  | 	// Filesystem backend.
 | 
					
						
							| 
									
										
										
										
											2018-08-24 14:35:37 +08:00
										 |  |  | 	BackendFS | 
					
						
							|  |  |  | 	// Multi disk BackendErasure (single, distributed) backend.
 | 
					
						
							|  |  |  | 	BackendErasure | 
					
						
							| 
									
										
										
										
											2019-11-02 07:58:11 +08:00
										 |  |  | 	// Gateway backend.
 | 
					
						
							|  |  |  | 	BackendGateway | 
					
						
							| 
									
										
										
										
											2016-10-06 03:48:07 +08:00
										 |  |  | 	// Add your own backend.
 | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-27 05:13:10 +08:00
										 |  |  | // StorageInfo - represents total capacity of underlying storage.
 | 
					
						
							|  |  |  | type StorageInfo struct { | 
					
						
							| 
									
										
										
										
											2020-07-14 00:51:07 +08:00
										 |  |  | 	Disks []madmin.Disk | 
					
						
							| 
									
										
										
										
											2019-04-05 12:21:50 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-06 03:48:07 +08:00
										 |  |  | 	// Backend type.
 | 
					
						
							|  |  |  | 	Backend struct { | 
					
						
							| 
									
										
										
										
											2019-11-02 07:58:11 +08:00
										 |  |  | 		// Represents various backend types, currently on FS, Erasure and Gateway
 | 
					
						
							| 
									
										
										
										
											2016-10-06 03:48:07 +08:00
										 |  |  | 		Type BackendType | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-02 07:58:11 +08:00
										 |  |  | 		// Following fields are only meaningful if BackendType is Gateway.
 | 
					
						
							|  |  |  | 		GatewayOnline bool | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-10 15:26:44 +08:00
										 |  |  | 		// Following fields are only meaningful if BackendType is Erasure.
 | 
					
						
							| 
									
										
										
										
											2019-10-23 12:01:14 +08:00
										 |  |  | 		OnlineDisks      madmin.BackendDisks // Online disks during server startup.
 | 
					
						
							|  |  |  | 		OfflineDisks     madmin.BackendDisks // Offline disks during server startup.
 | 
					
						
							|  |  |  | 		StandardSCData   int                 // Data disks for currently configured Standard storage class.
 | 
					
						
							|  |  |  | 		StandardSCParity int                 // Parity disks for currently configured Standard storage class.
 | 
					
						
							|  |  |  | 		RRSCData         int                 // Data disks for currently configured Reduced Redundancy storage class.
 | 
					
						
							|  |  |  | 		RRSCParity       int                 // Parity disks for currently configured Reduced Redundancy storage class.
 | 
					
						
							| 
									
										
										
										
											2016-10-06 03:48:07 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-05-27 05:13:10 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-12 22:02:37 +08:00
										 |  |  | // objectHistogramInterval is an interval that will be
 | 
					
						
							|  |  |  | // used to report the histogram of objects data sizes
 | 
					
						
							|  |  |  | type objectHistogramInterval struct { | 
					
						
							|  |  |  | 	name       string | 
					
						
							|  |  |  | 	start, end int64 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-19 07:19:29 +08:00
										 |  |  | const ( | 
					
						
							|  |  |  | 	// dataUsageBucketLen must be length of ObjectsHistogramIntervals
 | 
					
						
							|  |  |  | 	dataUsageBucketLen = 7 | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-12 22:02:37 +08:00
										 |  |  | // ObjectsHistogramIntervals is the list of all intervals
 | 
					
						
							|  |  |  | // of object sizes to be included in objects histogram.
 | 
					
						
							|  |  |  | var ObjectsHistogramIntervals = []objectHistogramInterval{ | 
					
						
							| 
									
										
										
										
											2020-05-27 21:45:43 +08:00
										 |  |  | 	{"LESS_THAN_1024_B", 0, humanize.KiByte - 1}, | 
					
						
							|  |  |  | 	{"BETWEEN_1024_B_AND_1_MB", humanize.KiByte, humanize.MiByte - 1}, | 
					
						
							|  |  |  | 	{"BETWEEN_1_MB_AND_10_MB", humanize.MiByte, humanize.MiByte*10 - 1}, | 
					
						
							|  |  |  | 	{"BETWEEN_10_MB_AND_64_MB", humanize.MiByte * 10, humanize.MiByte*64 - 1}, | 
					
						
							|  |  |  | 	{"BETWEEN_64_MB_AND_128_MB", humanize.MiByte * 64, humanize.MiByte*128 - 1}, | 
					
						
							|  |  |  | 	{"BETWEEN_128_MB_AND_512_MB", humanize.MiByte * 128, humanize.MiByte*512 - 1}, | 
					
						
							|  |  |  | 	{"GREATER_THAN_512_MB", humanize.MiByte * 512, math.MaxInt64}, | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // BucketUsageInfo - bucket usage info provides
 | 
					
						
							|  |  |  | // - total size of the bucket
 | 
					
						
							|  |  |  | // - total objects in a bucket
 | 
					
						
							|  |  |  | // - object size histogram per bucket
 | 
					
						
							|  |  |  | type BucketUsageInfo struct { | 
					
						
							|  |  |  | 	Size                 uint64            `json:"size"` | 
					
						
							|  |  |  | 	ObjectsCount         uint64            `json:"objectsCount"` | 
					
						
							|  |  |  | 	ObjectSizesHistogram map[string]uint64 `json:"objectsSizesHistogram"` | 
					
						
							| 
									
										
										
										
											2019-12-12 22:02:37 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // DataUsageInfo represents data usage stats of the underlying Object API
 | 
					
						
							|  |  |  | type DataUsageInfo struct { | 
					
						
							| 
									
										
										
										
											2020-03-19 07:19:29 +08:00
										 |  |  | 	// LastUpdate is the timestamp of when the data usage info was last updated.
 | 
					
						
							|  |  |  | 	// This does not indicate a full scan.
 | 
					
						
							| 
									
										
										
										
											2019-12-12 22:02:37 +08:00
										 |  |  | 	LastUpdate time.Time `json:"lastUpdate"` | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-27 21:45:43 +08:00
										 |  |  | 	// Objects total count across all buckets
 | 
					
						
							|  |  |  | 	ObjectsTotalCount uint64 `json:"objectsCount"` | 
					
						
							| 
									
										
										
										
											2020-03-19 07:19:29 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-27 21:45:43 +08:00
										 |  |  | 	// Objects total size across all buckets
 | 
					
						
							|  |  |  | 	ObjectsTotalSize uint64 `json:"objectsTotalSize"` | 
					
						
							| 
									
										
										
										
											2019-12-12 22:02:37 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-27 21:45:43 +08:00
										 |  |  | 	// Total number of buckets in this cluster
 | 
					
						
							| 
									
										
										
										
											2020-03-19 07:19:29 +08:00
										 |  |  | 	BucketsCount uint64 `json:"bucketsCount"` | 
					
						
							| 
									
										
										
										
											2020-05-27 21:45:43 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Buckets usage info provides following information across all buckets
 | 
					
						
							|  |  |  | 	// - total size of the bucket
 | 
					
						
							|  |  |  | 	// - total objects in a bucket
 | 
					
						
							|  |  |  | 	// - object size histogram per bucket
 | 
					
						
							|  |  |  | 	BucketsUsage map[string]BucketUsageInfo `json:"bucketsUsageInfo"` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Deprecated kept here for backward compatibility reasons.
 | 
					
						
							|  |  |  | 	BucketSizes map[string]uint64 `json:"bucketsSizes"` | 
					
						
							| 
									
										
										
										
											2019-12-12 22:02:37 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-09 21:24:11 +08:00
										 |  |  | // BucketInfo - represents bucket metadata.
 | 
					
						
							| 
									
										
										
											
												objectAPI: Fix object API interface, remove unnecessary structs.
ObjectAPI changes.
```
ListObjects(bucket, prefix, marker, delimiter string, maxKeys int) (ListObjectsInfo, *probe.Error)
ListMultipartUploads(bucket, objectPrefix, keyMarker, uploadIDMarker, delimiter string, maxUploads int) (ListMultipartsInfo, *probe.Error)
ListObjectParts(bucket, object, uploadID string, partNumberMarker, maxParts int) (ListPartsInfo, *probe.Error)
CompleteMultipartUpload(bucket string, object string, uploadID string, parts []completePart) (ObjectInfo, *probe.Error)
```
											
										 
											2016-04-03 16:34:20 +08:00
										 |  |  | type BucketInfo struct { | 
					
						
							| 
									
										
										
										
											2016-06-09 21:24:11 +08:00
										 |  |  | 	// Name of the bucket.
 | 
					
						
							|  |  |  | 	Name string | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Date and time when the bucket was created.
 | 
					
						
							| 
									
										
										
											
												objectAPI: Fix object API interface, remove unnecessary structs.
ObjectAPI changes.
```
ListObjects(bucket, prefix, marker, delimiter string, maxKeys int) (ListObjectsInfo, *probe.Error)
ListMultipartUploads(bucket, objectPrefix, keyMarker, uploadIDMarker, delimiter string, maxUploads int) (ListMultipartsInfo, *probe.Error)
ListObjectParts(bucket, object, uploadID string, partNumberMarker, maxParts int) (ListPartsInfo, *probe.Error)
CompleteMultipartUpload(bucket string, object string, uploadID string, parts []completePart) (ObjectInfo, *probe.Error)
```
											
										 
											2016-04-03 16:34:20 +08:00
										 |  |  | 	Created time.Time | 
					
						
							| 
									
										
										
										
											2017-01-18 02:02:58 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-09 21:24:11 +08:00
										 |  |  | // ObjectInfo - represents object metadata.
 | 
					
						
							| 
									
										
										
											
												objectAPI: Fix object API interface, remove unnecessary structs.
ObjectAPI changes.
```
ListObjects(bucket, prefix, marker, delimiter string, maxKeys int) (ListObjectsInfo, *probe.Error)
ListMultipartUploads(bucket, objectPrefix, keyMarker, uploadIDMarker, delimiter string, maxUploads int) (ListMultipartsInfo, *probe.Error)
ListObjectParts(bucket, object, uploadID string, partNumberMarker, maxParts int) (ListPartsInfo, *probe.Error)
CompleteMultipartUpload(bucket string, object string, uploadID string, parts []completePart) (ObjectInfo, *probe.Error)
```
											
										 
											2016-04-03 16:34:20 +08:00
										 |  |  | type ObjectInfo struct { | 
					
						
							| 
									
										
										
										
											2016-06-09 21:24:11 +08:00
										 |  |  | 	// Name of the bucket.
 | 
					
						
							|  |  |  | 	Bucket string | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Name of the object.
 | 
					
						
							|  |  |  | 	Name string | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Date and time when the object was last modified.
 | 
					
						
							|  |  |  | 	ModTime time.Time | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Total object size.
 | 
					
						
							|  |  |  | 	Size int64 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// IsDir indicates if the object is prefix.
 | 
					
						
							|  |  |  | 	IsDir bool | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-15 03:05:51 +08:00
										 |  |  | 	// Hex encoded unique entity tag of the object.
 | 
					
						
							|  |  |  | 	ETag string | 
					
						
							| 
									
										
										
										
											2016-06-09 21:24:11 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-13 11:04:01 +08:00
										 |  |  | 	// Version ID of this object.
 | 
					
						
							|  |  |  | 	VersionID string | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// IsLatest indicates if this is the latest current version
 | 
					
						
							|  |  |  | 	// latest can be true for delete marker or a version.
 | 
					
						
							|  |  |  | 	IsLatest bool | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// DeleteMarker indicates if the versionId corresponds
 | 
					
						
							|  |  |  | 	// to a delete marker on an object.
 | 
					
						
							|  |  |  | 	DeleteMarker bool | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-09 21:24:11 +08:00
										 |  |  | 	// A standard MIME type describing the format of the object.
 | 
					
						
							|  |  |  | 	ContentType string | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Specifies what content encodings have been applied to the object and thus
 | 
					
						
							|  |  |  | 	// what decoding mechanisms must be applied to obtain the object referenced
 | 
					
						
							|  |  |  | 	// by the Content-Type header field.
 | 
					
						
							| 
									
										
										
										
											2016-05-20 08:10:08 +08:00
										 |  |  | 	ContentEncoding string | 
					
						
							| 
									
										
										
										
											2016-07-13 03:45:17 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-01 03:01:25 +08:00
										 |  |  | 	// Date and time at which the object is no longer able to be cached
 | 
					
						
							|  |  |  | 	Expires time.Time | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-11 12:21:13 +08:00
										 |  |  | 	// CacheStatus sets status of whether this is a cache hit/miss
 | 
					
						
							|  |  |  | 	CacheStatus CacheStatusType | 
					
						
							|  |  |  | 	// CacheLookupStatus sets whether a cacheable response is present in the cache
 | 
					
						
							|  |  |  | 	CacheLookupStatus CacheStatusType | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-06 01:56:28 +08:00
										 |  |  | 	// Specify object storage class
 | 
					
						
							|  |  |  | 	StorageClass string | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-22 08:49:56 +08:00
										 |  |  | 	ReplicationStatus replication.StatusType | 
					
						
							| 
									
										
										
										
											2016-07-13 03:45:17 +08:00
										 |  |  | 	// User-Defined metadata
 | 
					
						
							| 
									
										
										
										
											2018-01-23 06:54:55 +08:00
										 |  |  | 	UserDefined map[string]string | 
					
						
							| 
									
										
										
										
											2018-02-24 07:07:21 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-21 00:45:59 +08:00
										 |  |  | 	// User-Defined object tags
 | 
					
						
							|  |  |  | 	UserTags string | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-02 03:37:57 +08:00
										 |  |  | 	// List of individual parts, maximum size of upto 10,000
 | 
					
						
							| 
									
										
										
										
											2019-01-06 06:16:43 +08:00
										 |  |  | 	Parts []ObjectPartInfo `json:"-"` | 
					
						
							| 
									
										
										
										
											2018-03-02 03:37:57 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-24 07:07:21 +08:00
										 |  |  | 	// Implements writer and reader used by CopyObject API
 | 
					
						
							|  |  |  | 	Writer       io.WriteCloser `json:"-"` | 
					
						
							|  |  |  | 	Reader       *hash.Reader   `json:"-"` | 
					
						
							| 
									
										
										
										
											2018-11-15 09:36:41 +08:00
										 |  |  | 	PutObjReader *PutObjReader  `json:"-"` | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-24 07:07:21 +08:00
										 |  |  | 	metadataOnly bool | 
					
						
							| 
									
										
										
										
											2020-08-04 07:21:10 +08:00
										 |  |  | 	versionOnly  bool // adds a new version, only used by CopyObject
 | 
					
						
							| 
									
										
										
										
											2020-05-29 03:36:20 +08:00
										 |  |  | 	keyRotation  bool | 
					
						
							| 
									
										
										
										
											2018-10-16 02:07:36 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-29 05:14:06 +08:00
										 |  |  | 	// Date and time when the object was last accessed.
 | 
					
						
							|  |  |  | 	AccTime time.Time | 
					
						
							| 
									
										
										
										
											2018-10-16 02:07:36 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-04 07:21:10 +08:00
										 |  |  | 	Legacy bool // indicates object on disk is in legacy data format
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-16 02:07:36 +08:00
										 |  |  | 	// backendType indicates which backend filled this structure
 | 
					
						
							|  |  |  | 	backendType BackendType | 
					
						
							| 
									
										
										
										
											2015-07-04 12:02:31 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-29 03:36:20 +08:00
										 |  |  | // MultipartInfo captures metadata information about the uploadId
 | 
					
						
							|  |  |  | // this data structure is used primarily for some internal purposes
 | 
					
						
							|  |  |  | // for verifying upload type such as was the upload
 | 
					
						
							|  |  |  | // - encrypted
 | 
					
						
							|  |  |  | // - compressed
 | 
					
						
							|  |  |  | type MultipartInfo struct { | 
					
						
							|  |  |  | 	// Name of the bucket.
 | 
					
						
							|  |  |  | 	Bucket string | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Name of the object.
 | 
					
						
							|  |  |  | 	Object string | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Upload ID identifying the multipart upload whose parts are being listed.
 | 
					
						
							|  |  |  | 	UploadID string | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Date and time at which the multipart upload was initiated.
 | 
					
						
							|  |  |  | 	Initiated time.Time | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Any metadata set during InitMultipartUpload, including encryption headers.
 | 
					
						
							|  |  |  | 	UserDefined map[string]string | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-09 21:24:11 +08:00
										 |  |  | // ListPartsInfo - represents list of all parts.
 | 
					
						
							| 
									
										
										
											
												objectAPI: Fix object API interface, remove unnecessary structs.
ObjectAPI changes.
```
ListObjects(bucket, prefix, marker, delimiter string, maxKeys int) (ListObjectsInfo, *probe.Error)
ListMultipartUploads(bucket, objectPrefix, keyMarker, uploadIDMarker, delimiter string, maxUploads int) (ListMultipartsInfo, *probe.Error)
ListObjectParts(bucket, object, uploadID string, partNumberMarker, maxParts int) (ListPartsInfo, *probe.Error)
CompleteMultipartUpload(bucket string, object string, uploadID string, parts []completePart) (ObjectInfo, *probe.Error)
```
											
										 
											2016-04-03 16:34:20 +08:00
										 |  |  | type ListPartsInfo struct { | 
					
						
							| 
									
										
										
										
											2016-06-09 21:24:11 +08:00
										 |  |  | 	// Name of the bucket.
 | 
					
						
							|  |  |  | 	Bucket string | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Name of the object.
 | 
					
						
							|  |  |  | 	Object string | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Upload ID identifying the multipart upload whose parts are being listed.
 | 
					
						
							|  |  |  | 	UploadID string | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// The class of storage used to store the object.
 | 
					
						
							|  |  |  | 	StorageClass string | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Part number after which listing begins.
 | 
					
						
							|  |  |  | 	PartNumberMarker int | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// When a list is truncated, this element specifies the last part in the list,
 | 
					
						
							|  |  |  | 	// as well as the value to use for the part-number-marker request parameter
 | 
					
						
							|  |  |  | 	// in a subsequent request.
 | 
					
						
							| 
									
										
										
										
											2015-07-04 12:02:31 +08:00
										 |  |  | 	NextPartNumberMarker int | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-09 21:24:11 +08:00
										 |  |  | 	// Maximum number of parts that were allowed in the response.
 | 
					
						
							|  |  |  | 	MaxParts int | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Indicates whether the returned list of parts is truncated.
 | 
					
						
							|  |  |  | 	IsTruncated bool | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// List of all parts.
 | 
					
						
							| 
									
										
										
										
											2017-02-01 01:38:34 +08:00
										 |  |  | 	Parts []PartInfo | 
					
						
							| 
									
										
										
										
											2016-06-09 21:24:11 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-02 03:37:57 +08:00
										 |  |  | 	// Any metadata set during InitMultipartUpload, including encryption headers.
 | 
					
						
							|  |  |  | 	UserDefined map[string]string | 
					
						
							| 
									
										
										
										
											2015-07-04 12:02:31 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-20 09:42:27 +08:00
										 |  |  | // Lookup - returns if uploadID is valid
 | 
					
						
							|  |  |  | func (lm ListMultipartsInfo) Lookup(uploadID string) bool { | 
					
						
							|  |  |  | 	for _, upload := range lm.Uploads { | 
					
						
							|  |  |  | 		if upload.UploadID == uploadID { | 
					
						
							|  |  |  | 			return true | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return false | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-09 21:24:11 +08:00
										 |  |  | // ListMultipartsInfo - represnets bucket resources for incomplete multipart uploads.
 | 
					
						
							| 
									
										
										
											
												objectAPI: Fix object API interface, remove unnecessary structs.
ObjectAPI changes.
```
ListObjects(bucket, prefix, marker, delimiter string, maxKeys int) (ListObjectsInfo, *probe.Error)
ListMultipartUploads(bucket, objectPrefix, keyMarker, uploadIDMarker, delimiter string, maxUploads int) (ListMultipartsInfo, *probe.Error)
ListObjectParts(bucket, object, uploadID string, partNumberMarker, maxParts int) (ListPartsInfo, *probe.Error)
CompleteMultipartUpload(bucket string, object string, uploadID string, parts []completePart) (ObjectInfo, *probe.Error)
```
											
										 
											2016-04-03 16:34:20 +08:00
										 |  |  | type ListMultipartsInfo struct { | 
					
						
							| 
									
										
										
										
											2016-06-09 21:24:11 +08:00
										 |  |  | 	// Together with upload-id-marker, this parameter specifies the multipart upload
 | 
					
						
							|  |  |  | 	// after which listing should begin.
 | 
					
						
							|  |  |  | 	KeyMarker string | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Together with key-marker, specifies the multipart upload after which listing
 | 
					
						
							|  |  |  | 	// should begin. If key-marker is not specified, the upload-id-marker parameter
 | 
					
						
							|  |  |  | 	// is ignored.
 | 
					
						
							|  |  |  | 	UploadIDMarker string | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// When a list is truncated, this element specifies the value that should be
 | 
					
						
							|  |  |  | 	// used for the key-marker request parameter in a subsequent request.
 | 
					
						
							|  |  |  | 	NextKeyMarker string | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// When a list is truncated, this element specifies the value that should be
 | 
					
						
							|  |  |  | 	// used for the upload-id-marker request parameter in a subsequent request.
 | 
					
						
							| 
									
										
										
										
											2015-07-04 12:02:31 +08:00
										 |  |  | 	NextUploadIDMarker string | 
					
						
							| 
									
										
										
										
											2016-06-09 21:24:11 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Maximum number of multipart uploads that could have been included in the
 | 
					
						
							|  |  |  | 	// response.
 | 
					
						
							|  |  |  | 	MaxUploads int | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Indicates whether the returned list of multipart uploads is truncated. A
 | 
					
						
							|  |  |  | 	// value of true indicates that the list was truncated. The list can be truncated
 | 
					
						
							|  |  |  | 	// if the number of multipart uploads exceeds the limit allowed or specified
 | 
					
						
							|  |  |  | 	// by max uploads.
 | 
					
						
							|  |  |  | 	IsTruncated bool | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// List of all pending uploads.
 | 
					
						
							| 
									
										
										
										
											2017-11-14 16:25:10 +08:00
										 |  |  | 	Uploads []MultipartInfo | 
					
						
							| 
									
										
										
										
											2016-06-09 21:24:11 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// When a prefix is provided in the request, The result contains only keys
 | 
					
						
							|  |  |  | 	// starting with the specified prefix.
 | 
					
						
							|  |  |  | 	Prefix string | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// A character used to truncate the object prefixes.
 | 
					
						
							|  |  |  | 	// NOTE: only supported delimiter is '/'.
 | 
					
						
							|  |  |  | 	Delimiter string | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// CommonPrefixes contains all (if there are any) keys between Prefix and the
 | 
					
						
							|  |  |  | 	// next occurrence of the string specified by delimiter.
 | 
					
						
							|  |  |  | 	CommonPrefixes []string | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	EncodingType string // Not supported yet.
 | 
					
						
							| 
									
										
										
										
											2015-07-04 12:02:31 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-13 11:04:01 +08:00
										 |  |  | // DeletedObjectInfo - container for list objects versions deleted objects.
 | 
					
						
							|  |  |  | type DeletedObjectInfo struct { | 
					
						
							|  |  |  | 	// Name of the bucket.
 | 
					
						
							|  |  |  | 	Bucket string | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Name of the object.
 | 
					
						
							|  |  |  | 	Name string | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Date and time when the object was last modified.
 | 
					
						
							|  |  |  | 	ModTime time.Time | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Version ID of this object.
 | 
					
						
							|  |  |  | 	VersionID string | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Indicates the deleted marker is latest
 | 
					
						
							|  |  |  | 	IsLatest bool | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // ListObjectVersionsInfo - container for list objects versions.
 | 
					
						
							|  |  |  | type ListObjectVersionsInfo struct { | 
					
						
							|  |  |  | 	// Indicates whether the returned list objects response is truncated. A
 | 
					
						
							|  |  |  | 	// value of true indicates that the list was truncated. The list can be truncated
 | 
					
						
							|  |  |  | 	// if the number of objects exceeds the limit allowed or specified
 | 
					
						
							|  |  |  | 	// by max keys.
 | 
					
						
							|  |  |  | 	IsTruncated bool | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// When response is truncated (the IsTruncated element value in the response is true),
 | 
					
						
							|  |  |  | 	// you can use the key name in this field as marker in the subsequent
 | 
					
						
							|  |  |  | 	// request to get next set of objects.
 | 
					
						
							|  |  |  | 	//
 | 
					
						
							|  |  |  | 	// NOTE: AWS S3 returns NextMarker only if you have delimiter request parameter specified,
 | 
					
						
							|  |  |  | 	//       MinIO always returns NextMarker.
 | 
					
						
							|  |  |  | 	NextMarker string | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// NextVersionIDMarker may be set of IsTruncated is true
 | 
					
						
							|  |  |  | 	NextVersionIDMarker string | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// List of objects info for this request.
 | 
					
						
							|  |  |  | 	Objects []ObjectInfo | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// List of prefixes for this request.
 | 
					
						
							|  |  |  | 	Prefixes []string | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
											
												objectAPI: Fix object API interface, remove unnecessary structs.
ObjectAPI changes.
```
ListObjects(bucket, prefix, marker, delimiter string, maxKeys int) (ListObjectsInfo, *probe.Error)
ListMultipartUploads(bucket, objectPrefix, keyMarker, uploadIDMarker, delimiter string, maxUploads int) (ListMultipartsInfo, *probe.Error)
ListObjectParts(bucket, object, uploadID string, partNumberMarker, maxParts int) (ListPartsInfo, *probe.Error)
CompleteMultipartUpload(bucket string, object string, uploadID string, parts []completePart) (ObjectInfo, *probe.Error)
```
											
										 
											2016-04-03 16:34:20 +08:00
										 |  |  | // ListObjectsInfo - container for list objects.
 | 
					
						
							|  |  |  | type ListObjectsInfo struct { | 
					
						
							| 
									
										
										
										
											2016-06-09 21:24:11 +08:00
										 |  |  | 	// Indicates whether the returned list objects response is truncated. A
 | 
					
						
							|  |  |  | 	// value of true indicates that the list was truncated. The list can be truncated
 | 
					
						
							|  |  |  | 	// if the number of objects exceeds the limit allowed or specified
 | 
					
						
							|  |  |  | 	// by max keys.
 | 
					
						
							| 
									
										
										
										
											2016-01-20 09:49:48 +08:00
										 |  |  | 	IsTruncated bool | 
					
						
							| 
									
										
										
										
											2016-06-09 21:24:11 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-29 04:18:12 +08:00
										 |  |  | 	// When response is truncated (the IsTruncated element value in the response is true),
 | 
					
						
							|  |  |  | 	// you can use the key name in this field as marker in the subsequent
 | 
					
						
							| 
									
										
										
										
											2016-06-09 21:24:11 +08:00
										 |  |  | 	// request to get next set of objects.
 | 
					
						
							|  |  |  | 	//
 | 
					
						
							| 
									
										
										
										
											2019-10-29 04:18:12 +08:00
										 |  |  | 	// NOTE: AWS S3 returns NextMarker only if you have delimiter request parameter specified,
 | 
					
						
							|  |  |  | 	//       MinIO always returns NextMarker.
 | 
					
						
							| 
									
										
										
										
											2016-06-09 21:24:11 +08:00
										 |  |  | 	NextMarker string | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// List of objects info for this request.
 | 
					
						
							|  |  |  | 	Objects []ObjectInfo | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// List of prefixes for this request.
 | 
					
						
							|  |  |  | 	Prefixes []string | 
					
						
							| 
									
										
										
										
											2016-01-20 09:49:48 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-28 02:26:00 +08:00
										 |  |  | // ListObjectsV2Info - container for list objects version 2.
 | 
					
						
							|  |  |  | type ListObjectsV2Info struct { | 
					
						
							|  |  |  | 	// Indicates whether the returned list objects response is truncated. A
 | 
					
						
							|  |  |  | 	// value of true indicates that the list was truncated. The list can be truncated
 | 
					
						
							|  |  |  | 	// if the number of objects exceeds the limit allowed or specified
 | 
					
						
							|  |  |  | 	// by max keys.
 | 
					
						
							|  |  |  | 	IsTruncated bool | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// When response is truncated (the IsTruncated element value in the response
 | 
					
						
							|  |  |  | 	// is true), you can use the key name in this field as marker in the subsequent
 | 
					
						
							|  |  |  | 	// request to get next set of objects.
 | 
					
						
							|  |  |  | 	//
 | 
					
						
							|  |  |  | 	// NOTE: This element is returned only if you have delimiter request parameter
 | 
					
						
							|  |  |  | 	// specified.
 | 
					
						
							|  |  |  | 	ContinuationToken     string | 
					
						
							|  |  |  | 	NextContinuationToken string | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// List of objects info for this request.
 | 
					
						
							|  |  |  | 	Objects []ObjectInfo | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// List of prefixes for this request.
 | 
					
						
							|  |  |  | 	Prefixes []string | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-01 01:38:34 +08:00
										 |  |  | // PartInfo - represents individual part metadata.
 | 
					
						
							|  |  |  | type PartInfo struct { | 
					
						
							| 
									
										
										
										
											2016-06-09 21:24:11 +08:00
										 |  |  | 	// Part number that identifies the part. This is a positive integer between
 | 
					
						
							|  |  |  | 	// 1 and 10,000.
 | 
					
						
							|  |  |  | 	PartNumber int | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Date and time at which the part was uploaded.
 | 
					
						
							| 
									
										
										
											
												objectAPI: Fix object API interface, remove unnecessary structs.
ObjectAPI changes.
```
ListObjects(bucket, prefix, marker, delimiter string, maxKeys int) (ListObjectsInfo, *probe.Error)
ListMultipartUploads(bucket, objectPrefix, keyMarker, uploadIDMarker, delimiter string, maxUploads int) (ListMultipartsInfo, *probe.Error)
ListObjectParts(bucket, object, uploadID string, partNumberMarker, maxParts int) (ListPartsInfo, *probe.Error)
CompleteMultipartUpload(bucket string, object string, uploadID string, parts []completePart) (ObjectInfo, *probe.Error)
```
											
										 
											2016-04-03 16:34:20 +08:00
										 |  |  | 	LastModified time.Time | 
					
						
							| 
									
										
										
										
											2016-06-09 21:24:11 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Entity tag returned when the part was initially uploaded.
 | 
					
						
							|  |  |  | 	ETag string | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Size in bytes of the part.
 | 
					
						
							|  |  |  | 	Size int64 | 
					
						
							| 
									
										
										
										
											2018-09-28 11:36:17 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Decompressed Size.
 | 
					
						
							|  |  |  | 	ActualSize int64 | 
					
						
							| 
									
										
										
											
												objectAPI: Fix object API interface, remove unnecessary structs.
ObjectAPI changes.
```
ListObjects(bucket, prefix, marker, delimiter string, maxKeys int) (ListObjectsInfo, *probe.Error)
ListMultipartUploads(bucket, objectPrefix, keyMarker, uploadIDMarker, delimiter string, maxUploads int) (ListMultipartsInfo, *probe.Error)
ListObjectParts(bucket, object, uploadID string, partNumberMarker, maxParts int) (ListPartsInfo, *probe.Error)
CompleteMultipartUpload(bucket string, object string, uploadID string, parts []completePart) (ObjectInfo, *probe.Error)
```
											
										 
											2016-04-03 16:34:20 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-14 16:25:10 +08:00
										 |  |  | // CompletePart - represents the part that was completed, this is sent by the client
 | 
					
						
							|  |  |  | // during CompleteMultipartUpload request.
 | 
					
						
							|  |  |  | type CompletePart struct { | 
					
						
							| 
									
										
										
										
											2016-06-09 21:24:11 +08:00
										 |  |  | 	// Part number identifying the part. This is a positive integer between 1 and
 | 
					
						
							|  |  |  | 	// 10,000
 | 
					
						
							| 
									
										
										
										
											2015-10-17 02:26:01 +08:00
										 |  |  | 	PartNumber int | 
					
						
							| 
									
										
										
										
											2016-06-09 21:24:11 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Entity tag returned when the part was uploaded.
 | 
					
						
							|  |  |  | 	ETag string | 
					
						
							| 
									
										
										
										
											2015-10-17 02:26:01 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-14 16:25:10 +08:00
										 |  |  | // CompletedParts - is a collection satisfying sort.Interface.
 | 
					
						
							|  |  |  | type CompletedParts []CompletePart | 
					
						
							| 
									
										
										
										
											2015-10-17 02:26:01 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-14 16:25:10 +08:00
										 |  |  | func (a CompletedParts) Len() int           { return len(a) } | 
					
						
							|  |  |  | func (a CompletedParts) Swap(i, j int)      { a[i], a[j] = a[j], a[i] } | 
					
						
							|  |  |  | func (a CompletedParts) Less(i, j int) bool { return a[i].PartNumber < a[j].PartNumber } | 
					
						
							| 
									
										
										
										
											2015-10-17 02:26:01 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-14 16:25:10 +08:00
										 |  |  | // CompleteMultipartUpload - represents list of parts which are completed, this is sent by the
 | 
					
						
							|  |  |  | // client during CompleteMultipartUpload request.
 | 
					
						
							|  |  |  | type CompleteMultipartUpload struct { | 
					
						
							|  |  |  | 	Parts []CompletePart `xml:"Part"` | 
					
						
							| 
									
										
										
										
											2015-10-17 02:26:01 +08:00
										 |  |  | } |