2015-06-30 23:15:48 -04:00
/ *
config/main: Re-write config files - add to new config v3
- New config format.
```
{
"version": "3",
"address": ":9000",
"backend": {
"type": "fs",
"disk": "/path"
},
"credential": {
"accessKey": "WLGDGYAQYIGI833EV05A",
"secretKey": "BYvgJM101sHngl2uzjXS/OBF/aMxAN06JrJ3qJlF"
},
"region": "us-east-1",
"logger": {
"file": {
"enable": false,
"fileName": "",
"level": "error"
},
"syslog": {
"enable": false,
"address": "",
"level": "debug"
},
"console": {
"enable": true,
"level": "fatal"
}
}
}
```
New command lines in lieu of supporting XL.
Minio initialize filesystem backend.
~~~
$ minio init fs <path>
~~~
Minio initialize XL backend.
~~~
$ minio init xl <url1>...<url16>
~~~
For 'fs' backend it starts the server.
~~~
$ minio server
~~~
For 'xl' backend it waits for servers to join.
~~~
$ minio server
... [PROGRESS BAR] of servers connecting
~~~
Now on other servers execute 'join' and they connect.
~~~
....
minio join <url1> -- from <url2> && minio server
minio join <url1> -- from <url3> && minio server
...
...
minio join <url1> -- from <url16> && minio server
~~~
2016-02-12 18:27:10 -05:00
* Minio Cloud Storage , ( C ) 2015 , 2016 Minio , Inc .
2015-06-30 23:15:48 -04: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 .
* /
2015-09-19 03:52:01 -04:00
package main
2015-06-30 23:15:48 -04:00
import (
2016-05-04 15:18:20 -04:00
"fmt"
2015-06-30 23:15:48 -04:00
"net/http"
2016-05-04 15:18:20 -04:00
"reflect"
2015-06-30 23:15:48 -04:00
2015-08-22 21:34:00 -04:00
router "github.com/gorilla/mux"
2015-06-30 23:15:48 -04:00
)
2016-04-29 17:24:10 -04:00
// newObjectLayer - initialize any object layer depending on the
// number of export paths.
func newObjectLayer ( exportPaths ... string ) ( ObjectLayer , error ) {
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-25 21:10:40 -04:00
if len ( exportPaths ) == 1 {
exportPath := exportPaths [ 0 ]
2016-04-29 17:24:10 -04:00
// Initialize FS object layer.
return newFSObjects ( exportPath )
2016-03-28 00:52:38 -04:00
}
2016-04-29 17:24:10 -04:00
// Initialize XL object layer.
return newXLObjects ( exportPaths ... )
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-25 21:10:40 -04:00
}
// configureServer handler returns final handler for the http server.
func configureServerHandler ( srvCmdConfig serverCmdConfig ) http . Handler {
2016-05-04 15:18:20 -04:00
// FIXME: currently we don't check single exportPath which uses FS layer.
if len ( srvCmdConfig . exportPaths ) > 1 {
if isFormatConfigFileExists ( ) {
format , err := getFormatXL ( )
if err != nil {
fatalIf ( err , "Failed to read format.json" , nil )
}
if ! reflect . DeepEqual ( format . Disks , srvCmdConfig . exportPaths ) {
err = fmt . Errorf ( "Number of export paths from command-line did not match the backend configuration. Backend is configured with [%s] exports." , format . Disks )
fatalIf ( err , "" , nil )
}
} else {
// First run: save disk configuration
if err := saveFormatXL ( xlFormat { Version : "1" , Disks : srvCmdConfig . exportPaths } ) ; err != nil {
fatalIf ( err , "Unable to save 'format.json'" , nil )
}
}
}
2016-04-29 17:24:10 -04:00
objAPI , err := newObjectLayer ( srvCmdConfig . exportPaths ... )
fatalIf ( err , "Initializing object layer failed." , nil )
2016-04-12 15:45:15 -04:00
2016-04-29 17:24:10 -04:00
// Initialize storage rpc server.
storageRPC , err := newRPCServer ( srvCmdConfig . exportPaths [ 0 ] ) // FIXME: should only have one path.
fatalIf ( err , "Initializing storage rpc server failed." , nil )
2016-04-12 15:45:15 -04:00
config/main: Re-write config files - add to new config v3
- New config format.
```
{
"version": "3",
"address": ":9000",
"backend": {
"type": "fs",
"disk": "/path"
},
"credential": {
"accessKey": "WLGDGYAQYIGI833EV05A",
"secretKey": "BYvgJM101sHngl2uzjXS/OBF/aMxAN06JrJ3qJlF"
},
"region": "us-east-1",
"logger": {
"file": {
"enable": false,
"fileName": "",
"level": "error"
},
"syslog": {
"enable": false,
"address": "",
"level": "debug"
},
"console": {
"enable": true,
"level": "fatal"
}
}
}
```
New command lines in lieu of supporting XL.
Minio initialize filesystem backend.
~~~
$ minio init fs <path>
~~~
Minio initialize XL backend.
~~~
$ minio init xl <url1>...<url16>
~~~
For 'fs' backend it starts the server.
~~~
$ minio server
~~~
For 'xl' backend it waits for servers to join.
~~~
$ minio server
... [PROGRESS BAR] of servers connecting
~~~
Now on other servers execute 'join' and they connect.
~~~
....
minio join <url1> -- from <url2> && minio server
minio join <url1> -- from <url3> && minio server
...
...
minio join <url1> -- from <url16> && minio server
~~~
2016-02-12 18:27:10 -05:00
// Initialize API.
2016-04-12 15:45:15 -04:00
apiHandlers := objectAPIHandlers {
2016-04-19 23:05:38 -04:00
ObjectAPI : objAPI ,
config/main: Re-write config files - add to new config v3
- New config format.
```
{
"version": "3",
"address": ":9000",
"backend": {
"type": "fs",
"disk": "/path"
},
"credential": {
"accessKey": "WLGDGYAQYIGI833EV05A",
"secretKey": "BYvgJM101sHngl2uzjXS/OBF/aMxAN06JrJ3qJlF"
},
"region": "us-east-1",
"logger": {
"file": {
"enable": false,
"fileName": "",
"level": "error"
},
"syslog": {
"enable": false,
"address": "",
"level": "debug"
},
"console": {
"enable": true,
"level": "fatal"
}
}
}
```
New command lines in lieu of supporting XL.
Minio initialize filesystem backend.
~~~
$ minio init fs <path>
~~~
Minio initialize XL backend.
~~~
$ minio init xl <url1>...<url16>
~~~
For 'fs' backend it starts the server.
~~~
$ minio server
~~~
For 'xl' backend it waits for servers to join.
~~~
$ minio server
... [PROGRESS BAR] of servers connecting
~~~
Now on other servers execute 'join' and they connect.
~~~
....
minio join <url1> -- from <url2> && minio server
minio join <url1> -- from <url3> && minio server
...
...
minio join <url1> -- from <url16> && minio server
~~~
2016-02-12 18:27:10 -05:00
}
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-30 19:15:28 -04:00
config/main: Re-write config files - add to new config v3
- New config format.
```
{
"version": "3",
"address": ":9000",
"backend": {
"type": "fs",
"disk": "/path"
},
"credential": {
"accessKey": "WLGDGYAQYIGI833EV05A",
"secretKey": "BYvgJM101sHngl2uzjXS/OBF/aMxAN06JrJ3qJlF"
},
"region": "us-east-1",
"logger": {
"file": {
"enable": false,
"fileName": "",
"level": "error"
},
"syslog": {
"enable": false,
"address": "",
"level": "debug"
},
"console": {
"enable": true,
"level": "fatal"
}
}
}
```
New command lines in lieu of supporting XL.
Minio initialize filesystem backend.
~~~
$ minio init fs <path>
~~~
Minio initialize XL backend.
~~~
$ minio init xl <url1>...<url16>
~~~
For 'fs' backend it starts the server.
~~~
$ minio server
~~~
For 'xl' backend it waits for servers to join.
~~~
$ minio server
... [PROGRESS BAR] of servers connecting
~~~
Now on other servers execute 'join' and they connect.
~~~
....
minio join <url1> -- from <url2> && minio server
minio join <url1> -- from <url3> && minio server
...
...
minio join <url1> -- from <url16> && minio server
~~~
2016-02-12 18:27:10 -05:00
// Initialize Web.
2016-04-12 15:45:15 -04:00
webHandlers := & webAPIHandlers {
2016-04-19 23:05:38 -04:00
ObjectAPI : objAPI ,
2015-09-19 05:36:50 -04:00
}
2016-02-18 05:13:52 -05:00
2016-03-27 15:37:21 -04:00
// Initialize router.
mux := router . NewRouter ( )
// Register all routers.
2016-04-19 23:05:38 -04:00
registerStorageRPCRouter ( mux , storageRPC )
2016-04-12 15:45:15 -04:00
registerWebRouter ( mux , webHandlers )
registerAPIRouter ( mux , apiHandlers )
2016-03-27 15:37:21 -04:00
// Add new routers here.
// List of some generic handlers which are applied for all
// incoming requests.
2016-02-04 17:57:20 -05:00
var handlerFns = [ ] HandlerFunc {
2016-02-16 21:50:36 -05:00
// Redirect some pre-defined browser request paths to a static
// location prefix.
setBrowserRedirectHandler ,
// Validates if incoming request is for restricted buckets.
setPrivateBucketHandler ,
// Adds cache control for all browser requests.
setBrowserCacheControlHandler ,
// Validates all incoming requests to have a valid date header.
2016-02-04 17:57:20 -05:00
setTimeValidityHandler ,
2016-02-16 21:50:36 -05:00
// CORS setting for all browser API requests.
setCorsHandler ,
// Validates all incoming URL resources, for invalid/unsupported
// resources client receives a HTTP error.
2016-02-04 17:57:20 -05:00
setIgnoreResourcesHandler ,
2016-02-16 21:50:36 -05:00
// Auth handler verifies incoming authorization headers and
// routes them accordingly. Client receives a HTTP error for
// invalid/unsupported signatures.
2016-02-15 20:42:39 -05:00
setAuthHandler ,
2016-03-27 15:37:21 -04:00
// Add new handlers here.
2015-10-07 02:32:20 -04:00
}
2016-02-18 05:13:52 -05:00
// Register rest of the handlers.
2016-02-04 17:57:20 -05:00
return registerHandlers ( mux , handlerFns ... )
2015-06-30 23:15:48 -04:00
}