| 
									
										
										
										
											2016-03-14 02:11:40 +08:00
										 |  |  | /* | 
					
						
							| 
									
										
										
										
											2016-04-22 14:40:01 +08:00
										 |  |  |  * Minio Cloud Storage, (C) 2015, 2016 Minio, Inc. | 
					
						
							| 
									
										
										
										
											2016-03-14 02:11:40 +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. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
											  
											
												fs: Break fs package to top-level and introduce ObjectAPI interface.
ObjectAPI interface brings in changes needed for XL ObjectAPI layer.
The new interface for any ObjectAPI layer is as below
```
// ObjectAPI interface.
type ObjectAPI interface {
        // Bucket resource API.
        DeleteBucket(bucket string) *probe.Error
        ListBuckets() ([]BucketInfo, *probe.Error)
        MakeBucket(bucket string) *probe.Error
        GetBucketInfo(bucket string) (BucketInfo, *probe.Error)
        // Bucket query API.
        ListObjects(bucket, prefix, marker, delimiter string, maxKeys int) (ListObjectsResult, *probe.Error)
        ListMultipartUploads(bucket string, resources BucketMultipartResourcesMetadata) (BucketMultipartResourcesMetadata, *probe.Error)
        // Object resource API.
        GetObject(bucket, object string, startOffset int64) (io.ReadCloser, *probe.Error)
        GetObjectInfo(bucket, object string) (ObjectInfo, *probe.Error)
        PutObject(bucket string, object string, size int64, data io.Reader, metadata map[string]string) (ObjectInfo, *probe.Error)
        DeleteObject(bucket, object string) *probe.Error
        // Object query API.
        NewMultipartUpload(bucket, object string) (string, *probe.Error)
        PutObjectPart(bucket, object, uploadID string, partID int, size int64, data io.Reader, md5Hex string) (string, *probe.Error)
        ListObjectParts(bucket, object string, resources ObjectResourcesMetadata) (ObjectResourcesMetadata, *probe.Error)
        CompleteMultipartUpload(bucket string, object string, uploadID string, parts []CompletePart) (ObjectInfo, *probe.Error)
        AbortMultipartUpload(bucket, object, uploadID string) *probe.Error
}
```
											
										 
											2016-03-31 07:15:28 +08:00
										 |  |  | package main | 
					
						
							| 
									
										
										
										
											2016-03-14 02:11:40 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"io/ioutil" | 
					
						
							|  |  |  | 	"os" | 
					
						
							| 
									
										
										
										
											2016-04-09 01:37:38 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-22 14:40:01 +08:00
										 |  |  | 	. "gopkg.in/check.v1" | 
					
						
							| 
									
										
										
										
											2016-03-14 02:11:40 +08:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-22 14:40:01 +08:00
										 |  |  | type MySuite struct{} | 
					
						
							| 
									
										
										
										
											2016-04-09 01:37:38 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-22 14:40:01 +08:00
										 |  |  | var _ = Suite(&MySuite{}) | 
					
						
							| 
									
										
										
										
											2016-03-23 21:50:24 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-23 07:19:45 +08:00
										 |  |  | func (s *MySuite) TestFSAPISuite(c *C) { | 
					
						
							| 
									
										
										
										
											2016-04-22 14:40:01 +08:00
										 |  |  | 	var storageList []string | 
					
						
							| 
									
										
										
										
											2016-05-19 06:05:23 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Initialize name space lock.
 | 
					
						
							|  |  |  | 	initNSLock() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-30 05:24:10 +08:00
										 |  |  | 	create := func() ObjectLayer { | 
					
						
							| 
									
										
										
										
											2016-04-22 14:40:01 +08:00
										 |  |  | 		path, err := ioutil.TempDir(os.TempDir(), "minio-") | 
					
						
							|  |  |  | 		c.Check(err, IsNil) | 
					
						
							| 
									
										
										
										
											2016-04-30 05:24:10 +08:00
										 |  |  | 		objAPI, err := newFSObjects(path) | 
					
						
							| 
									
										
										
											
												routers: Fix a crash while initializing network fs. (#1382)
Crash happens when 'minio server filename' a file name is
provided instead of a directory on command line argument.
```
panic: runtime error: slice bounds out of range
goroutine 1 [running]:
panic(0x5eb460, 0xc82000e0b0)
	/usr/local/opt/go/libexec/src/runtime/panic.go:464 +0x3e6
main.splitNetPath(0x7fff5fbff9bd, 0x7, 0x0, 0x0, 0x0, 0x0)
	/Users/harsha/mygo/src/github.com/minio/minio/network-fs.go:49 +0xb7
main.newNetworkFS(0x7fff5fbff9bd, 0x7, 0x0, 0x0, 0x0, 0x0)
	/Users/harsha/mygo/src/github.com/minio/minio/network-fs.go:90 +0x20a
main.configureServerHandler(0xc82024e1c8, 0x5, 0xc8200640e0, 0x1, 0x1, 0x0, 0x0)
	/Users/harsha/mygo/src/github.com/minio/minio/routers.go:43 +0x6ce
main.configureServer(0xc82024e1c8, 0x5, 0xc8200640e0, 0x1, 0x1, 0x5)
	/Users/harsha/mygo/src/github.com/minio/minio/server-main.go:86 +0x67
```
											
										 
											2016-04-26 09:10:40 +08:00
										 |  |  | 		c.Check(err, IsNil) | 
					
						
							| 
									
										
										
										
											2016-04-22 14:40:01 +08:00
										 |  |  | 		storageList = append(storageList, path) | 
					
						
							|  |  |  | 		return objAPI | 
					
						
							| 
									
										
										
										
											2016-03-23 21:50:24 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-04-22 14:40:01 +08:00
										 |  |  | 	APITestSuite(c, create) | 
					
						
							| 
									
										
										
										
											2016-06-08 09:15:04 +08:00
										 |  |  | 	defer removeRootsC(c, storageList) | 
					
						
							| 
									
										
										
										
											2016-03-23 21:50:24 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-23 07:19:45 +08:00
										 |  |  | func (s *MySuite) TestXLAPISuite(c *C) { | 
					
						
							|  |  |  | 	var storageList []string | 
					
						
							| 
									
										
										
										
											2016-04-29 16:29:09 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Initialize name space lock.
 | 
					
						
							|  |  |  | 	initNSLock() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-30 05:24:10 +08:00
										 |  |  | 	create := func() ObjectLayer { | 
					
						
							| 
									
										
										
										
											2016-04-23 07:19:45 +08:00
										 |  |  | 		var nDisks = 16 // Maximum disks.
 | 
					
						
							|  |  |  | 		var erasureDisks []string | 
					
						
							|  |  |  | 		for i := 0; i < nDisks; i++ { | 
					
						
							|  |  |  | 			path, err := ioutil.TempDir(os.TempDir(), "minio-") | 
					
						
							|  |  |  | 			c.Check(err, IsNil) | 
					
						
							|  |  |  | 			erasureDisks = append(erasureDisks, path) | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2016-05-20 17:22:22 +08:00
										 |  |  | 		objAPI, err := newXLObjects(erasureDisks) | 
					
						
							| 
									
										
										
										
											2016-04-23 07:19:45 +08:00
										 |  |  | 		c.Check(err, IsNil) | 
					
						
							|  |  |  | 		return objAPI | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	APITestSuite(c, create) | 
					
						
							| 
									
										
										
										
											2016-06-08 09:15:04 +08:00
										 |  |  | 	defer removeRootsC(c, storageList) | 
					
						
							| 
									
										
										
										
											2016-04-23 07:19:45 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-08 09:15:04 +08:00
										 |  |  | func removeRootsC(c *C, roots []string) { | 
					
						
							| 
									
										
										
										
											2016-04-22 14:40:01 +08:00
										 |  |  | 	for _, root := range roots { | 
					
						
							| 
									
										
										
										
											2016-06-13 17:53:09 +08:00
										 |  |  | 		removeAll(root) | 
					
						
							| 
									
										
										
										
											2016-03-14 02:11:40 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | } |