Enable browser support for gateway (#4425)

This commit is contained in:
poornas 2017-06-01 09:43:20 -07:00 committed by Harshavardhana
parent 64f4dbc272
commit 18c4e5d357
38 changed files with 260 additions and 146 deletions

View File

@ -731,7 +731,7 @@ func TestListObjectsHealHandler(t *testing.T) {
} }
defer adminTestBed.TearDown() defer adminTestBed.TearDown()
err = adminTestBed.objLayer.MakeBucket("mybucket") err = adminTestBed.objLayer.MakeBucketWithLocation("mybucket","")
if err != nil { if err != nil {
t.Fatalf("Failed to make bucket - %v", err) t.Fatalf("Failed to make bucket - %v", err)
} }
@ -859,7 +859,7 @@ func TestHealBucketHandler(t *testing.T) {
} }
defer adminTestBed.TearDown() defer adminTestBed.TearDown()
err = adminTestBed.objLayer.MakeBucket("mybucket") err = adminTestBed.objLayer.MakeBucketWithLocation("mybucket","")
if err != nil { if err != nil {
t.Fatalf("Failed to make bucket - %v", err) t.Fatalf("Failed to make bucket - %v", err)
} }
@ -936,7 +936,7 @@ func TestHealObjectHandler(t *testing.T) {
// Create an object myobject under bucket mybucket. // Create an object myobject under bucket mybucket.
bucketName := "mybucket" bucketName := "mybucket"
objName := "myobject" objName := "myobject"
err = adminTestBed.objLayer.MakeBucket(bucketName) err = adminTestBed.objLayer.MakeBucketWithLocation(bucketName,"")
if err != nil { if err != nil {
t.Fatalf("Failed to make bucket %s - %v", bucketName, err) t.Fatalf("Failed to make bucket %s - %v", bucketName, err)
} }
@ -1067,7 +1067,7 @@ func TestHealUploadHandler(t *testing.T) {
// Create an object myobject under bucket mybucket. // Create an object myobject under bucket mybucket.
bucketName := "mybucket" bucketName := "mybucket"
objName := "myobject" objName := "myobject"
err = adminTestBed.objLayer.MakeBucket(bucketName) err = adminTestBed.objLayer.MakeBucketWithLocation(bucketName,"")
if err != nil { if err != nil {
t.Fatalf("Failed to make bucket %s - %v", bucketName, err) t.Fatalf("Failed to make bucket %s - %v", bucketName, err)
} }
@ -1455,7 +1455,7 @@ func TestListHealUploadsHandler(t *testing.T) {
} }
defer adminTestBed.TearDown() defer adminTestBed.TearDown()
err = adminTestBed.objLayer.MakeBucket("mybucket") err = adminTestBed.objLayer.MakeBucketWithLocation("mybucket","")
if err != nil { if err != nil {
t.Fatalf("Failed to make bucket - %v", err) t.Fatalf("Failed to make bucket - %v", err)
} }

View File

@ -39,7 +39,7 @@ func runPutObjectBenchmark(b *testing.B, obj ObjectLayer, objSize int) {
// obtains random bucket name. // obtains random bucket name.
bucket := getRandomBucketName() bucket := getRandomBucketName()
// create bucket. // create bucket.
err = obj.MakeBucket(bucket) err = obj.MakeBucketWithLocation(bucket, "")
if err != nil { if err != nil {
b.Fatal(err) b.Fatal(err)
} }
@ -78,7 +78,7 @@ func runPutObjectPartBenchmark(b *testing.B, obj ObjectLayer, partSize int) {
object := getRandomObjectName() object := getRandomObjectName()
// create bucket. // create bucket.
err = obj.MakeBucket(bucket) err = obj.MakeBucketWithLocation(bucket, "")
if err != nil { if err != nil {
b.Fatal(err) b.Fatal(err)
} }
@ -199,7 +199,7 @@ func runGetObjectBenchmark(b *testing.B, obj ObjectLayer, objSize int) {
// obtains random bucket name. // obtains random bucket name.
bucket := getRandomBucketName() bucket := getRandomBucketName()
// create bucket. // create bucket.
err = obj.MakeBucket(bucket) err = obj.MakeBucketWithLocation(bucket, "")
if err != nil { if err != nil {
b.Fatal(err) b.Fatal(err)
} }
@ -307,7 +307,7 @@ func runPutObjectBenchmarkParallel(b *testing.B, obj ObjectLayer, objSize int) {
// obtains random bucket name. // obtains random bucket name.
bucket := getRandomBucketName() bucket := getRandomBucketName()
// create bucket. // create bucket.
err = obj.MakeBucket(bucket) err = obj.MakeBucketWithLocation(bucket, "")
if err != nil { if err != nil {
b.Fatal(err) b.Fatal(err)
} }
@ -355,7 +355,7 @@ func runGetObjectBenchmarkParallel(b *testing.B, obj ObjectLayer, objSize int) {
// obtains random bucket name. // obtains random bucket name.
bucket := getRandomBucketName() bucket := getRandomBucketName()
// create bucket. // create bucket.
err = obj.MakeBucket(bucket) err = obj.MakeBucketWithLocation(bucket, "")
if err != nil { if err != nil {
b.Fatal(err) b.Fatal(err)
} }

View File

@ -83,6 +83,10 @@ func enforceBucketPolicy(bucket, action, resource, referer string, queryParams u
// Check if the action is allowed on the bucket/prefix. // Check if the action is allowed on the bucket/prefix.
func isBucketActionAllowed(action, bucket, prefix string) bool { func isBucketActionAllowed(action, bucket, prefix string) bool {
if globalBucketPolicies == nil {
return false
}
policy := globalBucketPolicies.GetBucketPolicy(bucket) policy := globalBucketPolicies.GetBucketPolicy(bucket)
if policy == nil { if policy == nil {
return false return false
@ -389,7 +393,7 @@ func (api objectAPIHandlers) PutBucketHandler(w http.ResponseWriter, r *http.Req
defer bucketLock.Unlock() defer bucketLock.Unlock()
// Proceed to creating a bucket. // Proceed to creating a bucket.
err := objectAPI.MakeBucket(bucket) err := objectAPI.MakeBucketWithLocation(bucket, "")
if err != nil { if err != nil {
errorIf(err, "Unable to create a bucket.") errorIf(err, "Unable to create a bucket.")
writeErrorResponse(w, toAPIErrorCode(err), r.URL) writeErrorResponse(w, toAPIErrorCode(err), r.URL)

View File

@ -771,3 +771,36 @@ func testAPIDeleteMultipleObjectsHandler(obj ObjectLayer, instanceType, bucketNa
// `ExecObjectLayerAPINilTest` manages the operation. // `ExecObjectLayerAPINilTest` manages the operation.
ExecObjectLayerAPINilTest(t, nilBucket, nilObject, instanceType, apiRouter, nilReq) ExecObjectLayerAPINilTest(t, nilBucket, nilObject, instanceType, apiRouter, nilReq)
} }
func TestIsBucketActionAllowed(t *testing.T) {
ExecObjectLayerAPITest(t, testIsBucketActionAllowedHandler, []string{"BucketLocation"})
}
func testIsBucketActionAllowedHandler(obj ObjectLayer, instanceType, bucketName string, apiRouter http.Handler,
credentials credential, t *testing.T) {
testCases := []struct {
// input.
action string
bucket string
prefix string
isGlobalPoliciesNil bool
// flag indicating whether the test should pass.
shouldPass bool
}{
{"s3:GetBucketLocation", "mybucket", "abc", true, false},
{"s3:ListObject", "mybucket", "abc", false, false},
}
for i, testCase := range testCases {
if testCase.isGlobalPoliciesNil {
globalBucketPolicies = nil
} else {
initBucketPolicies(obj)
}
isAllowed := isBucketActionAllowed(testCase.action, testCase.bucket, testCase.prefix)
if isAllowed != testCase.shouldPass {
t.Errorf("Case %d: Expected the response status to be `%t`, but instead found `%t`", i+1, testCase.shouldPass, isAllowed)
}
}
}

View File

@ -251,7 +251,7 @@ func testPutBucketPolicyHandler(obj ObjectLayer, instanceType, bucketName string
initBucketPolicies(obj) initBucketPolicies(obj)
bucketName1 := fmt.Sprintf("%s-1", bucketName) bucketName1 := fmt.Sprintf("%s-1", bucketName)
if err := obj.MakeBucket(bucketName1); err != nil { if err := obj.MakeBucketWithLocation(bucketName1, ""); err != nil {
t.Fatal(err) t.Fatal(err)
} }

View File

@ -28,14 +28,14 @@ const (
accessKeyMinLen = 5 accessKeyMinLen = 5
accessKeyMaxLen = 20 accessKeyMaxLen = 20
secretKeyMinLen = 8 secretKeyMinLen = 8
secretKeyMaxLenAmazon = 40 secretKeyMaxLenAmazon = 100
alphaNumericTable = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" alphaNumericTable = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
alphaNumericTableLen = byte(len(alphaNumericTable)) alphaNumericTableLen = byte(len(alphaNumericTable))
) )
var ( var (
errInvalidAccessKeyLength = errors.New("Invalid access key, access key should be 5 to 20 characters in length") errInvalidAccessKeyLength = errors.New("Invalid access key, access key should be 5 to 20 characters in length")
errInvalidSecretKeyLength = errors.New("Invalid secret key, secret key should be 8 to 40 characters in length") errInvalidSecretKeyLength = errors.New("Invalid secret key, secret key should be 8 to 100 characters in length")
) )
var secretKeyMaxLen = secretKeyMaxLenAmazon var secretKeyMaxLen = secretKeyMaxLenAmazon

View File

@ -42,7 +42,7 @@ func TestCreateCredential(t *testing.T) {
// Secret key too small. // Secret key too small.
{"myuser", "pass", false, errInvalidSecretKeyLength}, {"myuser", "pass", false, errInvalidSecretKeyLength},
// Secret key too long. // Secret key too long.
{"myuser", "pass1234567890123456789012345678901234567", false, errInvalidSecretKeyLength}, {"myuser", "pass1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890", false, errInvalidSecretKeyLength},
// Success when access key contains leading/trailing spaces. // Success when access key contains leading/trailing spaces.
{" user ", cred.SecretKey, true, nil}, {" user ", cred.SecretKey, true, nil},
{"myuser", "mypassword", true, nil}, {"myuser", "mypassword", true, nil},

View File

@ -45,7 +45,7 @@ func TestInitEventNotifierFaultyDisks(t *testing.T) {
} }
bucketName := "bucket" bucketName := "bucket"
if err := obj.MakeBucket(bucketName); err != nil { if err := obj.MakeBucketWithLocation(bucketName, ""); err != nil {
t.Fatal("Unexpected error:", err) t.Fatal("Unexpected error:", err)
} }
@ -343,7 +343,7 @@ func TestInitEventNotifier(t *testing.T) {
} }
// create bucket // create bucket
if err := obj.MakeBucket(bucketName); err != nil { if err := obj.MakeBucketWithLocation(bucketName, ""); err != nil {
t.Fatal("Unexpected error:", err) t.Fatal("Unexpected error:", err)
} }
@ -408,7 +408,7 @@ func TestListenBucketNotification(t *testing.T) {
objectName := "object" objectName := "object"
// Create the bucket to listen on // Create the bucket to listen on
if err := obj.MakeBucket(bucketName); err != nil { if err := obj.MakeBucketWithLocation(bucketName, ""); err != nil {
t.Fatal("Unexpected error:", err) t.Fatal("Unexpected error:", err)
} }
@ -518,7 +518,7 @@ func TestAddRemoveBucketListenerConfig(t *testing.T) {
// Make a bucket to store topicConfigs. // Make a bucket to store topicConfigs.
randBucket := getRandomBucketName() randBucket := getRandomBucketName()
if err := obj.MakeBucket(randBucket); err != nil { if err := obj.MakeBucketWithLocation(randBucket, ""); err != nil {
t.Fatalf("Failed to make bucket %s", randBucket) t.Fatalf("Failed to make bucket %s", randBucket)
} }

View File

@ -223,7 +223,7 @@ func prepareFormatXLHealFreshDisks(obj ObjectLayer) ([]StorageAPI, error) {
var err error var err error
xl := obj.(*xlObjects) xl := obj.(*xlObjects)
err = obj.MakeBucket("bucket") err = obj.MakeBucketWithLocation("bucket", "")
if err != nil { if err != nil {
return []StorageAPI{}, err return []StorageAPI{}, err
} }
@ -346,7 +346,7 @@ func TestFormatXLHealCorruptedDisks(t *testing.T) {
xl := obj.(*xlObjects) xl := obj.(*xlObjects)
err = obj.MakeBucket("bucket") err = obj.MakeBucketWithLocation("bucket", "")
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -419,7 +419,7 @@ func TestFormatXLReorderByInspection(t *testing.T) {
xl := obj.(*xlObjects) xl := obj.(*xlObjects)
err = obj.MakeBucket("bucket") err = obj.MakeBucketWithLocation("bucket", "")
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }

View File

@ -48,7 +48,7 @@ func TestReadFSMetadata(t *testing.T) {
bucketName := "bucket" bucketName := "bucket"
objectName := "object" objectName := "object"
if err := obj.MakeBucket(bucketName); err != nil { if err := obj.MakeBucketWithLocation(bucketName, ""); err != nil {
t.Fatal("Unexpected err: ", err) t.Fatal("Unexpected err: ", err)
} }
sha256sum := "" sha256sum := ""
@ -85,7 +85,7 @@ func TestWriteFSMetadata(t *testing.T) {
bucketName := "bucket" bucketName := "bucket"
objectName := "object" objectName := "object"
if err := obj.MakeBucket(bucketName); err != nil { if err := obj.MakeBucketWithLocation(bucketName, ""); err != nil {
t.Fatal("Unexpected err: ", err) t.Fatal("Unexpected err: ", err)
} }
sha256sum := "" sha256sum := ""

View File

@ -33,7 +33,7 @@ func TestFSWriteUploadJSON(t *testing.T) {
bucketName := "bucket" bucketName := "bucket"
objectName := "object" objectName := "object"
obj.MakeBucket(bucketName) obj.MakeBucketWithLocation(bucketName, "")
_, err := obj.NewMultipartUpload(bucketName, objectName, nil) _, err := obj.NewMultipartUpload(bucketName, objectName, nil)
if err != nil { if err != nil {
t.Fatal("Unexpected err: ", err) t.Fatal("Unexpected err: ", err)
@ -60,7 +60,7 @@ func TestNewMultipartUploadFaultyDisk(t *testing.T) {
bucketName := "bucket" bucketName := "bucket"
objectName := "object" objectName := "object"
if err := obj.MakeBucket(bucketName); err != nil { if err := obj.MakeBucketWithLocation(bucketName, ""); err != nil {
t.Fatal("Cannot create bucket, err: ", err) t.Fatal("Cannot create bucket, err: ", err)
} }
@ -91,7 +91,7 @@ func TestPutObjectPartFaultyDisk(t *testing.T) {
data := []byte("12345") data := []byte("12345")
dataLen := int64(len(data)) dataLen := int64(len(data))
if err = obj.MakeBucket(bucketName); err != nil { if err = obj.MakeBucketWithLocation(bucketName, ""); err != nil {
t.Fatal("Cannot create bucket, err: ", err) t.Fatal("Cannot create bucket, err: ", err)
} }
@ -122,7 +122,7 @@ func TestCompleteMultipartUploadFaultyDisk(t *testing.T) {
objectName := "object" objectName := "object"
data := []byte("12345") data := []byte("12345")
if err := obj.MakeBucket(bucketName); err != nil { if err := obj.MakeBucketWithLocation(bucketName, ""); err != nil {
t.Fatal("Cannot create bucket, err: ", err) t.Fatal("Cannot create bucket, err: ", err)
} }
@ -161,7 +161,7 @@ func TestListMultipartUploadsFaultyDisk(t *testing.T) {
objectName := "object" objectName := "object"
data := []byte("12345") data := []byte("12345")
if err := obj.MakeBucket(bucketName); err != nil { if err := obj.MakeBucketWithLocation(bucketName, ""); err != nil {
t.Fatal("Cannot create bucket, err: ", err) t.Fatal("Cannot create bucket, err: ", err)
} }

View File

@ -302,7 +302,7 @@ func (fs fsObjects) statBucketDir(bucket string) (os.FileInfo, error) {
// MakeBucket - create a new bucket, returns if it // MakeBucket - create a new bucket, returns if it
// already exists. // already exists.
func (fs fsObjects) MakeBucket(bucket string) error { func (fs fsObjects) MakeBucketWithLocation(bucket, location string) error {
bucketDir, err := fs.getBucketDir(bucket) bucketDir, err := fs.getBucketDir(bucket)
if err != nil { if err != nil {
return toObjectErr(err, bucket) return toObjectErr(err, bucket)

View File

@ -66,7 +66,7 @@ func TestFSShutdown(t *testing.T) {
obj := initFSObjects(disk, t) obj := initFSObjects(disk, t)
fs := obj.(*fsObjects) fs := obj.(*fsObjects)
objectContent := "12345" objectContent := "12345"
obj.MakeBucket(bucketName) obj.MakeBucketWithLocation(bucketName, "")
sha256sum := "" sha256sum := ""
obj.PutObject(bucketName, objectName, int64(len(objectContent)), bytes.NewReader([]byte(objectContent)), nil, sha256sum) obj.PutObject(bucketName, objectName, int64(len(objectContent)), bytes.NewReader([]byte(objectContent)), nil, sha256sum)
return fs, disk return fs, disk
@ -498,7 +498,7 @@ func TestFSGetBucketInfo(t *testing.T) {
fs := obj.(*fsObjects) fs := obj.(*fsObjects)
bucketName := "bucket" bucketName := "bucket"
obj.MakeBucket(bucketName) obj.MakeBucketWithLocation(bucketName, "")
// Test with valid parameters // Test with valid parameters
info, err := fs.GetBucketInfo(bucketName) info, err := fs.GetBucketInfo(bucketName)
@ -533,7 +533,7 @@ func TestFSPutObject(t *testing.T) {
bucketName := "bucket" bucketName := "bucket"
objectName := "1/2/3/4/object" objectName := "1/2/3/4/object"
if err := obj.MakeBucket(bucketName); err != nil { if err := obj.MakeBucketWithLocation(bucketName, ""); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -603,7 +603,7 @@ func TestFSDeleteObject(t *testing.T) {
bucketName := "bucket" bucketName := "bucket"
objectName := "object" objectName := "object"
obj.MakeBucket(bucketName) obj.MakeBucketWithLocation(bucketName, "")
sha256sum := "" sha256sum := ""
obj.PutObject(bucketName, objectName, int64(len("abcd")), bytes.NewReader([]byte("abcd")), nil, sha256sum) obj.PutObject(bucketName, objectName, int64(len("abcd")), bytes.NewReader([]byte("abcd")), nil, sha256sum)
@ -648,7 +648,7 @@ func TestFSDeleteBucket(t *testing.T) {
fs := obj.(*fsObjects) fs := obj.(*fsObjects)
bucketName := "bucket" bucketName := "bucket"
err := obj.MakeBucket(bucketName) err := obj.MakeBucketWithLocation(bucketName, "")
if err != nil { if err != nil {
t.Fatal("Unexpected error: ", err) t.Fatal("Unexpected error: ", err)
} }
@ -666,7 +666,7 @@ func TestFSDeleteBucket(t *testing.T) {
t.Fatal("Unexpected error: ", err) t.Fatal("Unexpected error: ", err)
} }
obj.MakeBucket(bucketName) obj.MakeBucketWithLocation(bucketName, "")
// Delete bucker should get error disk not found. // Delete bucker should get error disk not found.
removeAll(disk) removeAll(disk)
@ -687,7 +687,7 @@ func TestFSListBuckets(t *testing.T) {
fs := obj.(*fsObjects) fs := obj.(*fsObjects)
bucketName := "bucket" bucketName := "bucket"
if err := obj.MakeBucket(bucketName); err != nil { if err := obj.MakeBucketWithLocation(bucketName, ""); err != nil {
t.Fatal("Unexpected error: ", err) t.Fatal("Unexpected error: ", err)
} }

View File

@ -183,12 +183,6 @@ func (a *azureObjects) StorageInfo() StorageInfo {
return StorageInfo{} return StorageInfo{}
} }
// MakeBucket - Create a new container on azure backend.
func (a *azureObjects) MakeBucket(bucket string) error {
// will never be called, only satisfy ObjectLayer interface
return traceError(NotImplemented{})
}
// MakeBucketWithLocation - Create a new container on azure backend. // MakeBucketWithLocation - Create a new container on azure backend.
func (a *azureObjects) MakeBucketWithLocation(bucket, location string) error { func (a *azureObjects) MakeBucketWithLocation(bucket, location string) error {
err := a.client.CreateContainer(bucket, storage.ContainerAccessTypePrivate) err := a.client.CreateContainer(bucket, storage.ContainerAccessTypePrivate)

View File

@ -19,12 +19,11 @@ package cmd
import ( import (
"errors" "errors"
"fmt" "fmt"
"github.com/gorilla/mux"
"github.com/minio/cli"
"net/url" "net/url"
"os" "os"
"strings" "strings"
"github.com/gorilla/mux"
"github.com/minio/cli"
) )
var gatewayTemplate = `NAME: var gatewayTemplate = `NAME:
@ -45,6 +44,9 @@ ENVIRONMENT VARIABLES:
MINIO_ACCESS_KEY: Username or access key of your storage backend. MINIO_ACCESS_KEY: Username or access key of your storage backend.
MINIO_SECRET_KEY: Password or secret key of your storage backend. MINIO_SECRET_KEY: Password or secret key of your storage backend.
BROWSER:
MINIO_BROWSER: To disable web browser access, set this value to "off".
EXAMPLES: EXAMPLES:
1. Start minio gateway server for Azure Blob Storage backend. 1. Start minio gateway server for Azure Blob Storage backend.
$ export MINIO_ACCESS_KEY=azureaccountname $ export MINIO_ACCESS_KEY=azureaccountname
@ -96,12 +98,27 @@ func mustGetGatewayCredsFromEnv() (accessKey, secretKey string) {
return accessKey, secretKey return accessKey, secretKey
} }
// Set browser setting from environment variables
func mustSetBrowserSettingFromEnv(){
if browser := os.Getenv("MINIO_BROWSER"); browser != "" {
browserFlag, err := ParseBrowserFlag(browser)
if err != nil {
fatalIf(errors.New("invalid value"), "Unknown value %s in MINIO_BROWSER environment variable.", browser)
}
// browser Envs are set globally, this does not represent
// if browser is turned off or on.
globalIsEnvBrowser = true
globalIsBrowserEnabled = bool(browserFlag)
}
}
// Initialize gateway layer depending on the backend type. // Initialize gateway layer depending on the backend type.
// Supported backend types are // Supported backend types are
// //
// - Azure Blob Storage. // - Azure Blob Storage.
// - Add your favorite backend here. // - Add your favorite backend here.
func newGatewayLayer(backendType, endpoint, accessKey, secretKey string, secure bool) (GatewayLayer, error) { func newGatewayLayer(backendType, endpoint, accessKey, secretKey string, secure bool) (GatewayLayer, error) {
switch gatewayBackend(backendType) { switch gatewayBackend(backendType) {
case azureBackend: case azureBackend:
return newAzureLayer(endpoint, accessKey, secretKey, secure) return newAzureLayer(endpoint, accessKey, secretKey, secure)
@ -171,11 +188,11 @@ func gatewayMain(ctx *cli.Context) {
// Fetch access and secret key from env. // Fetch access and secret key from env.
accessKey, secretKey := mustGetGatewayCredsFromEnv() accessKey, secretKey := mustGetGatewayCredsFromEnv()
// Fetch browser env setting
mustSetBrowserSettingFromEnv()
// Initialize new gateway config. // Initialize new gateway config.
//
// TODO: add support for custom region when we add
// support for S3 backend storage, currently this can
// default to "us-east-1"
newGatewayConfig(accessKey, secretKey, globalMinioDefaultRegion) newGatewayConfig(accessKey, secretKey, globalMinioDefaultRegion)
// Get quiet flag from command line argument. // Get quiet flag from command line argument.
@ -214,6 +231,12 @@ func gatewayMain(ctx *cli.Context) {
initNSLock(false) // Enable local namespace lock. initNSLock(false) // Enable local namespace lock.
router := mux.NewRouter().SkipClean(true) router := mux.NewRouter().SkipClean(true)
// Register web router when its enabled.
if globalIsBrowserEnabled {
aerr := registerWebRouter(router)
fatalIf(aerr, "Unable to configure web browser")
}
registerGatewayAPIRouter(router, newObject) registerGatewayAPIRouter(router, newObject)
var handlerFns = []HandlerFunc{ var handlerFns = []HandlerFunc{
@ -224,6 +247,13 @@ func gatewayMain(ctx *cli.Context) {
// Adds 'crossdomain.xml' policy handler to serve legacy flash clients. // Adds 'crossdomain.xml' policy handler to serve legacy flash clients.
setCrossDomainPolicy, setCrossDomainPolicy,
// Validates all incoming requests to have a valid date header. // Validates all incoming requests to have a valid date header.
// 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.
setTimeValidityHandler, setTimeValidityHandler,
// CORS setting for all browser API requests. // CORS setting for all browser API requests.
setCorsHandler, setCorsHandler,
@ -234,6 +264,8 @@ func gatewayMain(ctx *cli.Context) {
// routes them accordingly. Client receives a HTTP error for // routes them accordingly. Client receives a HTTP error for
// invalid/unsupported signatures. // invalid/unsupported signatures.
setAuthHandler, setAuthHandler,
// Add new handlers here.
} }
apiServer := NewServerMux(serverAddr, registerHandlers(router, handlerFns...)) apiServer := NewServerMux(serverAddr, registerHandlers(router, handlerFns...))

View File

@ -16,7 +16,10 @@
package cmd package cmd
import "testing" import (
"os"
"testing"
)
// Test parseGatewayEndpoint // Test parseGatewayEndpoint
func TestParseGatewayEndpoint(t *testing.T) { func TestParseGatewayEndpoint(t *testing.T) {
@ -48,3 +51,25 @@ func TestParseGatewayEndpoint(t *testing.T) {
} }
} }
} }
func TestSetBrowserFromEnv(t *testing.T) {
browser := os.Getenv("MINIO_BROWSER")
os.Setenv("MINIO_BROWSER", "on")
mustSetBrowserSettingFromEnv()
if globalIsBrowserEnabled != true {
t.Errorf("Expected the response status to be `%t`, but instead found `%t`", globalIsBrowserEnabled, false)
}
os.Setenv("MINIO_BROWSER", "off")
mustSetBrowserSettingFromEnv()
if globalIsBrowserEnabled != false {
t.Errorf("Expected the response status to be `%t`, but instead found `%t`", globalIsBrowserEnabled, true)
}
os.Setenv("MINIO_BROWSER", "")
mustSetBrowserSettingFromEnv()
if globalIsBrowserEnabled != false {
t.Errorf("Expected the response status to be `%t`, but instead found `%t`", globalIsBrowserEnabled, true)
}
os.Setenv("MINIO_BROWSER", browser)
}

View File

@ -27,8 +27,6 @@ import (
type GatewayLayer interface { type GatewayLayer interface {
ObjectLayer ObjectLayer
MakeBucketWithLocation(bucket, location string) error
AnonGetObject(bucket, object string, startOffset int64, length int64, writer io.Writer) (err error) AnonGetObject(bucket, object string, startOffset int64, length int64, writer io.Writer) (err error)
AnonGetObjectInfo(bucket, object string) (objInfo ObjectInfo, err error) AnonGetObjectInfo(bucket, object string) (objInfo ObjectInfo, err error)

View File

@ -17,12 +17,11 @@
package cmd package cmd
import ( import (
"encoding/hex"
"io" "io"
"net/http" "net/http"
"path" "path"
"encoding/hex"
minio "github.com/minio/minio-go" minio "github.com/minio/minio-go"
"github.com/minio/minio-go/pkg/policy" "github.com/minio/minio-go/pkg/policy"
) )
@ -133,12 +132,6 @@ func (l *s3Objects) StorageInfo() StorageInfo {
return StorageInfo{} return StorageInfo{}
} }
// MakeBucket creates a new container on S3 backend.
func (l *s3Objects) MakeBucket(bucket string) error {
// will never be called, only satisfy ObjectLayer interface
return traceError(NotImplemented{})
}
// MakeBucket creates a new container on S3 backend. // MakeBucket creates a new container on S3 backend.
func (l *s3Objects) MakeBucketWithLocation(bucket, location string) error { func (l *s3Objects) MakeBucketWithLocation(bucket, location string) error {
err := l.Client.MakeBucket(bucket, location) err := l.Client.MakeBucket(bucket, location)
@ -565,6 +558,5 @@ func (l *s3Objects) DeleteBucketPolicies(bucket string) error {
if err := l.Client.PutBucketPolicy(bucket, policy.BucketAccessPolicy{}); err != nil { if err := l.Client.PutBucketPolicy(bucket, policy.BucketAccessPolicy{}); err != nil {
return s3ToObjectError(traceError(err), bucket, "") return s3ToObjectError(traceError(err), bucket, "")
} }
return nil return nil
} }

View File

@ -44,7 +44,7 @@ func testAuthenticate(authType string, t *testing.T) {
// Secret key too small. // Secret key too small.
{"myuser", "pass", errInvalidSecretKeyLength}, {"myuser", "pass", errInvalidSecretKeyLength},
// Secret key too long. // Secret key too long.
{"myuser", "pass1234567890123456789012345678901234567", errInvalidSecretKeyLength}, {"myuser", "pass1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890", errInvalidSecretKeyLength},
// Authentication error. // Authentication error.
{"myuser", "mypassword", errInvalidAccessKeyID}, {"myuser", "mypassword", errInvalidAccessKeyID},
// Authentication error. // Authentication error.

View File

@ -39,7 +39,7 @@ func testGetObject(obj ObjectLayer, instanceType string, t TestErrHandler) {
bucketName := getRandomBucketName() bucketName := getRandomBucketName()
objectName := "test-object" objectName := "test-object"
// create bucket. // create bucket.
err := obj.MakeBucket(bucketName) err := obj.MakeBucketWithLocation(bucketName, "")
// Stop the test if creation of the bucket fails. // Stop the test if creation of the bucket fails.
if err != nil { if err != nil {
t.Fatalf("%s : %s", instanceType, err.Error()) t.Fatalf("%s : %s", instanceType, err.Error())
@ -192,7 +192,7 @@ func testGetObjectPermissionDenied(obj ObjectLayer, instanceType string, disks [
// Setup for the tests. // Setup for the tests.
bucketName := getRandomBucketName() bucketName := getRandomBucketName()
// create bucket. // create bucket.
err := obj.MakeBucket(bucketName) err := obj.MakeBucketWithLocation(bucketName, "")
// Stop the test if creation of the bucket fails. // Stop the test if creation of the bucket fails.
if err != nil { if err != nil {
t.Fatalf("%s : %s", instanceType, err.Error()) t.Fatalf("%s : %s", instanceType, err.Error())
@ -303,7 +303,7 @@ func testGetObjectDiskNotFound(obj ObjectLayer, instanceType string, disks []str
bucketName := getRandomBucketName() bucketName := getRandomBucketName()
objectName := "test-object" objectName := "test-object"
// create bucket. // create bucket.
err := obj.MakeBucket(bucketName) err := obj.MakeBucketWithLocation(bucketName, "")
// Stop the test if creation of the bucket fails. // Stop the test if creation of the bucket fails.
if err != nil { if err != nil {
t.Fatalf("%s : %s", instanceType, err.Error()) t.Fatalf("%s : %s", instanceType, err.Error())

View File

@ -29,7 +29,7 @@ func TestGetObjectInfo(t *testing.T) {
// Testing GetObjectInfo(). // Testing GetObjectInfo().
func testGetObjectInfo(obj ObjectLayer, instanceType string, t TestErrHandler) { func testGetObjectInfo(obj ObjectLayer, instanceType string, t TestErrHandler) {
// This bucket is used for testing getObjectInfo operations. // This bucket is used for testing getObjectInfo operations.
err := obj.MakeBucket("test-getobjectinfo") err := obj.MakeBucketWithLocation("test-getobjectinfo", "")
if err != nil { if err != nil {
t.Fatalf("%s : %s", instanceType, err.Error()) t.Fatalf("%s : %s", instanceType, err.Error())
} }

View File

@ -25,7 +25,7 @@ type ObjectLayer interface {
StorageInfo() StorageInfo StorageInfo() StorageInfo
// Bucket operations. // Bucket operations.
MakeBucket(bucket string) error MakeBucketWithLocation(bucket string, location string) error
GetBucketInfo(bucket string) (bucketInfo BucketInfo, err error) GetBucketInfo(bucket string) (bucketInfo BucketInfo, err error)
ListBuckets() (buckets []BucketInfo, err error) ListBuckets() (buckets []BucketInfo, err error)
DeleteBucket(bucket string) error DeleteBucket(bucket string) error

View File

@ -41,7 +41,7 @@ func testListObjects(obj ObjectLayer, instanceType string, t TestErrHandler) {
"empty-bucket", "empty-bucket",
} }
for _, bucket := range testBuckets { for _, bucket := range testBuckets {
err := obj.MakeBucket(bucket) err := obj.MakeBucketWithLocation(bucket, "")
if err != nil { if err != nil {
t.Fatalf("%s : %s", instanceType, err.Error()) t.Fatalf("%s : %s", instanceType, err.Error())
} }
@ -599,7 +599,7 @@ func BenchmarkListObjects(b *testing.B) {
bucket := "ls-benchmark-bucket" bucket := "ls-benchmark-bucket"
// Create a bucket. // Create a bucket.
err = obj.MakeBucket(bucket) err = obj.MakeBucketWithLocation(bucket, "")
if err != nil { if err != nil {
b.Fatal(err) b.Fatal(err)
} }

View File

@ -52,7 +52,7 @@ func testObjectNewMultipartUpload(obj ObjectLayer, instanceType string, t TestEr
} }
// Create bucket before intiating NewMultipartUpload. // Create bucket before intiating NewMultipartUpload.
err = obj.MakeBucket(bucket) err = obj.MakeBucketWithLocation(bucket, "")
if err != nil { if err != nil {
// failed to create newbucket, abort. // failed to create newbucket, abort.
t.Fatalf("%s : %s", instanceType, err.Error()) t.Fatalf("%s : %s", instanceType, err.Error())
@ -91,7 +91,7 @@ func testObjectAbortMultipartUpload(obj ObjectLayer, instanceType string, t Test
object := "minio-object" object := "minio-object"
// Create bucket before intiating NewMultipartUpload. // Create bucket before intiating NewMultipartUpload.
err := obj.MakeBucket(bucket) err := obj.MakeBucketWithLocation(bucket, "")
if err != nil { if err != nil {
// failed to create newbucket, abort. // failed to create newbucket, abort.
t.Fatalf("%s : %s", instanceType, err.Error()) t.Fatalf("%s : %s", instanceType, err.Error())
@ -137,7 +137,7 @@ func testObjectAPIIsUploadIDExists(obj ObjectLayer, instanceType string, t TestE
object := "minio-object" object := "minio-object"
// Create bucket before intiating NewMultipartUpload. // Create bucket before intiating NewMultipartUpload.
err := obj.MakeBucket(bucket) err := obj.MakeBucketWithLocation(bucket, "")
if err != nil { if err != nil {
// Failed to create newbucket, abort. // Failed to create newbucket, abort.
t.Fatalf("%s : %s", instanceType, err.Error()) t.Fatalf("%s : %s", instanceType, err.Error())
@ -173,7 +173,7 @@ func testPutObjectPartDiskNotFound(obj ObjectLayer, instanceType string, disks [
// objectNames[0]. // objectNames[0].
// uploadIds [0]. // uploadIds [0].
// Create bucket before intiating NewMultipartUpload. // Create bucket before intiating NewMultipartUpload.
err := obj.MakeBucket(bucketNames[0]) err := obj.MakeBucketWithLocation(bucketNames[0], "")
if err != nil { if err != nil {
// Failed to create newbucket, abort. // Failed to create newbucket, abort.
t.Fatalf("%s : %s", instanceType, err.Error()) t.Fatalf("%s : %s", instanceType, err.Error())
@ -253,7 +253,7 @@ func testObjectAPIPutObjectPart(obj ObjectLayer, instanceType string, t TestErrH
object := "minio-object" object := "minio-object"
// Create bucket before intiating NewMultipartUpload. // Create bucket before intiating NewMultipartUpload.
err := obj.MakeBucket(bucket) err := obj.MakeBucketWithLocation(bucket, "")
if err != nil { if err != nil {
// Failed to create newbucket, abort. // Failed to create newbucket, abort.
t.Fatalf("%s : %s", instanceType, err.Error()) t.Fatalf("%s : %s", instanceType, err.Error())
@ -265,7 +265,7 @@ func testObjectAPIPutObjectPart(obj ObjectLayer, instanceType string, t TestErrH
t.Fatalf("%s : %s", instanceType, err.Error()) t.Fatalf("%s : %s", instanceType, err.Error())
} }
// Creating a dummy bucket for tests. // Creating a dummy bucket for tests.
err = obj.MakeBucket("unused-bucket") err = obj.MakeBucketWithLocation("unused-bucket", "")
if err != nil { if err != nil {
// Failed to create newbucket, abort. // Failed to create newbucket, abort.
t.Fatalf("%s : %s", instanceType, err.Error()) t.Fatalf("%s : %s", instanceType, err.Error())
@ -386,7 +386,7 @@ func testListMultipartUploads(obj ObjectLayer, instanceType string, t TestErrHan
// objectNames[0]. // objectNames[0].
// uploadIds [0]. // uploadIds [0].
// Create bucket before initiating NewMultipartUpload. // Create bucket before initiating NewMultipartUpload.
err := obj.MakeBucket(bucketNames[0]) err := obj.MakeBucketWithLocation(bucketNames[0], "")
if err != nil { if err != nil {
// Failed to create newbucket, abort. // Failed to create newbucket, abort.
t.Fatalf("%s : %s", instanceType, err.Error()) t.Fatalf("%s : %s", instanceType, err.Error())
@ -404,7 +404,7 @@ func testListMultipartUploads(obj ObjectLayer, instanceType string, t TestErrHan
// objectNames[0]. // objectNames[0].
// uploadIds [1-3]. // uploadIds [1-3].
// Bucket to test for mutiple upload Id's for a given object. // Bucket to test for mutiple upload Id's for a given object.
err = obj.MakeBucket(bucketNames[1]) err = obj.MakeBucketWithLocation(bucketNames[1], "")
if err != nil { if err != nil {
// Failed to create newbucket, abort. // Failed to create newbucket, abort.
t.Fatalf("%s : %s", instanceType, err.Error()) t.Fatalf("%s : %s", instanceType, err.Error())
@ -425,7 +425,7 @@ func testListMultipartUploads(obj ObjectLayer, instanceType string, t TestErrHan
// bucketnames[2]. // bucketnames[2].
// objectNames[0-2]. // objectNames[0-2].
// uploadIds [4-9]. // uploadIds [4-9].
err = obj.MakeBucket(bucketNames[2]) err = obj.MakeBucketWithLocation(bucketNames[2], "")
if err != nil { if err != nil {
// Failed to create newbucket, abort. // Failed to create newbucket, abort.
t.Fatalf("%s : %s", instanceType, err.Error()) t.Fatalf("%s : %s", instanceType, err.Error())
@ -1288,7 +1288,7 @@ func testListObjectPartsDiskNotFound(obj ObjectLayer, instanceType string, disks
// objectNames[0]. // objectNames[0].
// uploadIds [0]. // uploadIds [0].
// Create bucket before intiating NewMultipartUpload. // Create bucket before intiating NewMultipartUpload.
err := obj.MakeBucket(bucketNames[0]) err := obj.MakeBucketWithLocation(bucketNames[0], "")
if err != nil { if err != nil {
// Failed to create newbucket, abort. // Failed to create newbucket, abort.
t.Fatalf("%s : %s", instanceType, err.Error()) t.Fatalf("%s : %s", instanceType, err.Error())
@ -1531,7 +1531,7 @@ func testListObjectParts(obj ObjectLayer, instanceType string, t TestErrHandler)
// objectNames[0]. // objectNames[0].
// uploadIds [0]. // uploadIds [0].
// Create bucket before intiating NewMultipartUpload. // Create bucket before intiating NewMultipartUpload.
err := obj.MakeBucket(bucketNames[0]) err := obj.MakeBucketWithLocation(bucketNames[0], "")
if err != nil { if err != nil {
// Failed to create newbucket, abort. // Failed to create newbucket, abort.
t.Fatalf("%s : %s", instanceType, err.Error()) t.Fatalf("%s : %s", instanceType, err.Error())
@ -1769,7 +1769,7 @@ func testObjectCompleteMultipartUpload(obj ObjectLayer, instanceType string, t T
// objectNames[0]. // objectNames[0].
// uploadIds [0]. // uploadIds [0].
// Create bucket before intiating NewMultipartUpload. // Create bucket before intiating NewMultipartUpload.
err = obj.MakeBucket(bucketNames[0]) err = obj.MakeBucketWithLocation(bucketNames[0], "")
if err != nil { if err != nil {
// Failed to create newbucket, abort. // Failed to create newbucket, abort.
t.Fatalf("%s : %s", instanceType, err) t.Fatalf("%s : %s", instanceType, err)

View File

@ -44,14 +44,14 @@ func testObjectAPIPutObject(obj ObjectLayer, instanceType string, t TestErrHandl
object := "minio-object" object := "minio-object"
// Create bucket. // Create bucket.
err := obj.MakeBucket(bucket) err := obj.MakeBucketWithLocation(bucket, "")
if err != nil { if err != nil {
// Failed to create newbucket, abort. // Failed to create newbucket, abort.
t.Fatalf("%s : %s", instanceType, err.Error()) t.Fatalf("%s : %s", instanceType, err.Error())
} }
// Creating a dummy bucket for tests. // Creating a dummy bucket for tests.
err = obj.MakeBucket("unused-bucket") err = obj.MakeBucketWithLocation("unused-bucket", "")
if err != nil { if err != nil {
// Failed to create newbucket, abort. // Failed to create newbucket, abort.
t.Fatalf("%s : %s", instanceType, err.Error()) t.Fatalf("%s : %s", instanceType, err.Error())
@ -189,14 +189,14 @@ func testObjectAPIPutObjectDiskNotFound(obj ObjectLayer, instanceType string, di
object := "minio-object" object := "minio-object"
// Create bucket. // Create bucket.
err := obj.MakeBucket(bucket) err := obj.MakeBucketWithLocation(bucket, "")
if err != nil { if err != nil {
// Failed to create newbucket, abort. // Failed to create newbucket, abort.
t.Fatalf("%s : %s", instanceType, err.Error()) t.Fatalf("%s : %s", instanceType, err.Error())
} }
// Creating a dummy bucket for tests. // Creating a dummy bucket for tests.
err = obj.MakeBucket("unused-bucket") err = obj.MakeBucketWithLocation("unused-bucket", "")
if err != nil { if err != nil {
// Failed to create newbucket, abort. // Failed to create newbucket, abort.
t.Fatalf("%s : %s", instanceType, err.Error()) t.Fatalf("%s : %s", instanceType, err.Error())
@ -303,7 +303,7 @@ func testObjectAPIPutObjectStaleFiles(obj ObjectLayer, instanceType string, disk
object := "minio-object" object := "minio-object"
// Create bucket. // Create bucket.
err := obj.MakeBucket(bucket) err := obj.MakeBucketWithLocation(bucket, "")
if err != nil { if err != nil {
// Failed to create newbucket, abort. // Failed to create newbucket, abort.
t.Fatalf("%s : %s", instanceType, err.Error()) t.Fatalf("%s : %s", instanceType, err.Error())
@ -338,7 +338,7 @@ func testObjectAPIMultipartPutObjectStaleFiles(obj ObjectLayer, instanceType str
object := "minio-object" object := "minio-object"
// Create bucket. // Create bucket.
err := obj.MakeBucket(bucket) err := obj.MakeBucketWithLocation(bucket, "")
if err != nil { if err != nil {
// Failed to create newbucket, abort. // Failed to create newbucket, abort.
t.Fatalf("%s : %s", instanceType, err.Error()) t.Fatalf("%s : %s", instanceType, err.Error())

View File

@ -79,7 +79,7 @@ func (s *ObjectLayerAPISuite) TestMakeBucket(c *C) {
// Tests validate bucket creation. // Tests validate bucket creation.
func testMakeBucket(obj ObjectLayer, instanceType string, c TestErrHandler) { func testMakeBucket(obj ObjectLayer, instanceType string, c TestErrHandler) {
err := obj.MakeBucket("bucket-unknown") err := obj.MakeBucketWithLocation("bucket-unknown", "")
if err != nil { if err != nil {
c.Fatalf("%s: <ERROR> %s", instanceType, err) c.Fatalf("%s: <ERROR> %s", instanceType, err)
} }
@ -92,7 +92,7 @@ func (s *ObjectLayerAPISuite) TestMultipartObjectCreation(c *C) {
// Tests validate creation of part files during Multipart operation. // Tests validate creation of part files during Multipart operation.
func testMultipartObjectCreation(obj ObjectLayer, instanceType string, c TestErrHandler) { func testMultipartObjectCreation(obj ObjectLayer, instanceType string, c TestErrHandler) {
err := obj.MakeBucket("bucket") err := obj.MakeBucketWithLocation("bucket", "")
if err != nil { if err != nil {
c.Fatalf("%s: <ERROR> %s", instanceType, err) c.Fatalf("%s: <ERROR> %s", instanceType, err)
} }
@ -135,7 +135,7 @@ func (s *ObjectLayerAPISuite) TestMultipartObjectAbort(c *C) {
// Tests validate abortion of Multipart operation. // Tests validate abortion of Multipart operation.
func testMultipartObjectAbort(obj ObjectLayer, instanceType string, c TestErrHandler) { func testMultipartObjectAbort(obj ObjectLayer, instanceType string, c TestErrHandler) {
err := obj.MakeBucket("bucket") err := obj.MakeBucketWithLocation("bucket", "")
if err != nil { if err != nil {
c.Fatalf("%s: <ERROR> %s", instanceType, err) c.Fatalf("%s: <ERROR> %s", instanceType, err)
} }
@ -180,7 +180,7 @@ func (s *ObjectLayerAPISuite) TestMultipleObjectCreation(c *C) {
// Tests validate object creation. // Tests validate object creation.
func testMultipleObjectCreation(obj ObjectLayer, instanceType string, c TestErrHandler) { func testMultipleObjectCreation(obj ObjectLayer, instanceType string, c TestErrHandler) {
objects := make(map[string][]byte) objects := make(map[string][]byte)
err := obj.MakeBucket("bucket") err := obj.MakeBucketWithLocation("bucket", "")
if err != nil { if err != nil {
c.Fatalf("%s: <ERROR> %s", instanceType, err) c.Fatalf("%s: <ERROR> %s", instanceType, err)
} }
@ -235,7 +235,7 @@ func (s *ObjectLayerAPISuite) TestPaging(c *C) {
// Tests validate creation of objects and the order of listing using various filters for ListObjects operation. // Tests validate creation of objects and the order of listing using various filters for ListObjects operation.
func testPaging(obj ObjectLayer, instanceType string, c TestErrHandler) { func testPaging(obj ObjectLayer, instanceType string, c TestErrHandler) {
obj.MakeBucket("bucket") obj.MakeBucketWithLocation("bucket", "")
result, err := obj.ListObjects("bucket", "", "", "", 0) result, err := obj.ListObjects("bucket", "", "", "", 0)
if err != nil { if err != nil {
c.Fatalf("%s: <ERROR> %s", instanceType, err) c.Fatalf("%s: <ERROR> %s", instanceType, err)
@ -438,7 +438,7 @@ func (s *ObjectLayerAPISuite) TestObjectOverwriteWorks(c *C) {
// Tests validate overwriting of an existing object. // Tests validate overwriting of an existing object.
func testObjectOverwriteWorks(obj ObjectLayer, instanceType string, c TestErrHandler) { func testObjectOverwriteWorks(obj ObjectLayer, instanceType string, c TestErrHandler) {
err := obj.MakeBucket("bucket") err := obj.MakeBucketWithLocation("bucket", "")
if err != nil { if err != nil {
c.Fatalf("%s: <ERROR> %s", instanceType, err) c.Fatalf("%s: <ERROR> %s", instanceType, err)
} }
@ -488,11 +488,11 @@ func (s *ObjectLayerAPISuite) TestBucketRecreateFails(c *C) {
// Tests validate that recreation of the bucket fails. // Tests validate that recreation of the bucket fails.
func testBucketRecreateFails(obj ObjectLayer, instanceType string, c TestErrHandler) { func testBucketRecreateFails(obj ObjectLayer, instanceType string, c TestErrHandler) {
err := obj.MakeBucket("string") err := obj.MakeBucketWithLocation("string", "")
if err != nil { if err != nil {
c.Fatalf("%s: <ERROR> %s", instanceType, err) c.Fatalf("%s: <ERROR> %s", instanceType, err)
} }
err = obj.MakeBucket("string") err = obj.MakeBucketWithLocation("string", "")
if err == nil { if err == nil {
c.Fatalf("%s: Expected error but found nil.", instanceType) c.Fatalf("%s: Expected error but found nil.", instanceType)
} }
@ -513,7 +513,7 @@ func testPutObject(obj ObjectLayer, instanceType string, c TestErrHandler) {
length := int64(len(content)) length := int64(len(content))
readerEOF := newTestReaderEOF(content) readerEOF := newTestReaderEOF(content)
readerNoEOF := newTestReaderNoEOF(content) readerNoEOF := newTestReaderNoEOF(content)
err := obj.MakeBucket("bucket") err := obj.MakeBucketWithLocation("bucket", "")
if err != nil { if err != nil {
c.Fatalf("%s: <ERROR> %s", instanceType, err) c.Fatalf("%s: <ERROR> %s", instanceType, err)
} }
@ -552,7 +552,7 @@ func (s *ObjectLayerAPISuite) TestPutObjectInSubdir(c *C) {
// Tests validate PutObject with subdirectory prefix. // Tests validate PutObject with subdirectory prefix.
func testPutObjectInSubdir(obj ObjectLayer, instanceType string, c TestErrHandler) { func testPutObjectInSubdir(obj ObjectLayer, instanceType string, c TestErrHandler) {
err := obj.MakeBucket("bucket") err := obj.MakeBucketWithLocation("bucket", "")
if err != nil { if err != nil {
c.Fatalf("%s: <ERROR> %s", instanceType, err) c.Fatalf("%s: <ERROR> %s", instanceType, err)
} }
@ -593,7 +593,7 @@ func testListBuckets(obj ObjectLayer, instanceType string, c TestErrHandler) {
} }
// add one and test exists. // add one and test exists.
err = obj.MakeBucket("bucket1") err = obj.MakeBucketWithLocation("bucket1", "")
if err != nil { if err != nil {
c.Fatalf("%s: <ERROR> %s", instanceType, err) c.Fatalf("%s: <ERROR> %s", instanceType, err)
} }
@ -607,7 +607,7 @@ func testListBuckets(obj ObjectLayer, instanceType string, c TestErrHandler) {
} }
// add two and test exists. // add two and test exists.
err = obj.MakeBucket("bucket2") err = obj.MakeBucketWithLocation("bucket2", "")
if err != nil { if err != nil {
c.Fatalf("%s: <ERROR> %s", instanceType, err) c.Fatalf("%s: <ERROR> %s", instanceType, err)
} }
@ -621,7 +621,7 @@ func testListBuckets(obj ObjectLayer, instanceType string, c TestErrHandler) {
} }
// add three and test exists + prefix. // add three and test exists + prefix.
err = obj.MakeBucket("bucket22") err = obj.MakeBucketWithLocation("bucket22", "")
if err != nil { if err != nil {
c.Fatalf("%s: <ERROR> %s", instanceType, err) c.Fatalf("%s: <ERROR> %s", instanceType, err)
} }
@ -645,11 +645,11 @@ func testListBucketsOrder(obj ObjectLayer, instanceType string, c TestErrHandler
// if implementation contains a map, order of map keys will vary. // if implementation contains a map, order of map keys will vary.
// this ensures they return in the same order each time. // this ensures they return in the same order each time.
// add one and test exists. // add one and test exists.
err := obj.MakeBucket("bucket1") err := obj.MakeBucketWithLocation("bucket1", "")
if err != nil { if err != nil {
c.Fatalf("%s: <ERROR> %s", instanceType, err) c.Fatalf("%s: <ERROR> %s", instanceType, err)
} }
err = obj.MakeBucket("bucket2") err = obj.MakeBucketWithLocation("bucket2", "")
if err != nil { if err != nil {
c.Fatalf("%s: <ERROR> %s", instanceType, err) c.Fatalf("%s: <ERROR> %s", instanceType, err)
} }
@ -698,7 +698,7 @@ func (s *ObjectLayerAPISuite) TestNonExistantObjectInBucket(c *C) {
// Tests validate that GetObject fails on a non-existent bucket as expected. // Tests validate that GetObject fails on a non-existent bucket as expected.
func testNonExistantObjectInBucket(obj ObjectLayer, instanceType string, c TestErrHandler) { func testNonExistantObjectInBucket(obj ObjectLayer, instanceType string, c TestErrHandler) {
err := obj.MakeBucket("bucket") err := obj.MakeBucketWithLocation("bucket", "")
if err != nil { if err != nil {
c.Fatalf("%s: <ERROR> %s", instanceType, err) c.Fatalf("%s: <ERROR> %s", instanceType, err)
} }
@ -736,7 +736,7 @@ func (s *ObjectLayerAPISuite) TestGetDirectoryReturnsObjectNotFound(c *C) {
// Tests validate that GetObject on an existing directory fails as expected. // Tests validate that GetObject on an existing directory fails as expected.
func testGetDirectoryReturnsObjectNotFound(obj ObjectLayer, instanceType string, c TestErrHandler) { func testGetDirectoryReturnsObjectNotFound(obj ObjectLayer, instanceType string, c TestErrHandler) {
bucketName := "bucket" bucketName := "bucket"
err := obj.MakeBucket(bucketName) err := obj.MakeBucketWithLocation(bucketName, "")
if err != nil { if err != nil {
c.Fatalf("%s: <ERROR> %s", instanceType, err) c.Fatalf("%s: <ERROR> %s", instanceType, err)
} }
@ -781,7 +781,7 @@ func (s *ObjectLayerAPISuite) TestContentType(c *C) {
// Test content-type. // Test content-type.
func testContentType(obj ObjectLayer, instanceType string, c TestErrHandler) { func testContentType(obj ObjectLayer, instanceType string, c TestErrHandler) {
err := obj.MakeBucket("bucket") err := obj.MakeBucketWithLocation("bucket", "")
if err != nil { if err != nil {
c.Fatalf("%s: <ERROR> %s", instanceType, err) c.Fatalf("%s: <ERROR> %s", instanceType, err)
} }

View File

@ -143,7 +143,7 @@ func testPostPolicyBucketHandler(obj ObjectLayer, instanceType string, t TestErr
// objectNames[0]. // objectNames[0].
// uploadIds [0]. // uploadIds [0].
// Create bucket before initiating NewMultipartUpload. // Create bucket before initiating NewMultipartUpload.
err = obj.MakeBucket(bucketName) err = obj.MakeBucketWithLocation(bucketName, "")
if err != nil { if err != nil {
// Failed to create newbucket, abort. // Failed to create newbucket, abort.
t.Fatalf("%s : %s", instanceType, err.Error()) t.Fatalf("%s : %s", instanceType, err.Error())
@ -459,7 +459,7 @@ func testPostPolicyBucketHandlerRedirect(obj ObjectLayer, instanceType string, t
curTime := UTCNow() curTime := UTCNow()
curTimePlus5Min := curTime.Add(time.Minute * 5) curTimePlus5Min := curTime.Add(time.Minute * 5)
err = obj.MakeBucket(bucketName) err = obj.MakeBucketWithLocation(bucketName, "")
if err != nil { if err != nil {
// Failed to create newbucket, abort. // Failed to create newbucket, abort.
t.Fatalf("%s : %s", instanceType, err.Error()) t.Fatalf("%s : %s", instanceType, err.Error())

View File

@ -1721,7 +1721,7 @@ func initAPIHandlerTest(obj ObjectLayer, endpoints []string) (string, http.Handl
bucketName := getRandomBucketName() bucketName := getRandomBucketName()
// Create bucket. // Create bucket.
err := obj.MakeBucket(bucketName) err := obj.MakeBucketWithLocation(bucketName, "")
if err != nil { if err != nil {
// failed to create newbucket, return err. // failed to create newbucket, return err.
return "", nil, err return "", nil, err

View File

@ -132,7 +132,8 @@ func (web *webAPIHandlers) MakeBucket(r *http.Request, args *MakeBucketArgs, rep
bucketLock := globalNSMutex.NewNSLock(args.BucketName, "") bucketLock := globalNSMutex.NewNSLock(args.BucketName, "")
bucketLock.Lock() bucketLock.Lock()
defer bucketLock.Unlock() defer bucketLock.Unlock()
if err := objectAPI.MakeBucket(args.BucketName); err != nil {
if err := objectAPI.MakeBucketWithLocation(args.BucketName, serverConfig.GetRegion()); err != nil {
return toJSONError(err, args.BucketName) return toJSONError(err, args.BucketName)
} }
@ -679,6 +680,22 @@ func readBucketAccessPolicy(objAPI ObjectLayer, bucketName string) (policy.Bucke
} }
func getBucketAccessPolicy(objAPI ObjectLayer, bucketName string) (policy.BucketAccessPolicy, error) {
// FIXME: remove this code when S3 layer for gateway and server is unified.
var policyInfo policy.BucketAccessPolicy
var err error
switch layer := objAPI.(type) {
case *s3Objects:
policyInfo, err = layer.GetBucketPolicies(bucketName)
case *azureObjects:
policyInfo, err = layer.GetBucketPolicies(bucketName)
default:
policyInfo, err = readBucketAccessPolicy(objAPI, bucketName)
}
return policyInfo, err
}
// GetBucketPolicy - get bucket policy. // GetBucketPolicy - get bucket policy.
func (web *webAPIHandlers) GetBucketPolicy(r *http.Request, args *GetBucketPolicyArgs, reply *GetBucketPolicyRep) error { func (web *webAPIHandlers) GetBucketPolicy(r *http.Request, args *GetBucketPolicyArgs, reply *GetBucketPolicyRep) error {
objectAPI := web.ObjectAPI() objectAPI := web.ObjectAPI()
@ -728,12 +745,14 @@ func (web *webAPIHandlers) ListAllBucketPolicies(r *http.Request, args *ListAllB
if !isHTTPRequestValid(r) { if !isHTTPRequestValid(r) {
return toJSONError(errAuthentication) return toJSONError(errAuthentication)
} }
var policyInfo, err = getBucketAccessPolicy(objectAPI, args.BucketName)
policyInfo, err := readBucketAccessPolicy(objectAPI, args.BucketName)
if err != nil { if err != nil {
return toJSONError(err, args.BucketName) _, ok := errorCause(err).(PolicyNotFound)
if !ok {
return toJSONError(err, args.BucketName)
}
} }
reply.UIVersion = browser.UIVersion reply.UIVersion = browser.UIVersion
for prefix, policy := range policy.GetPolicies(policyInfo.Statements, args.BucketName) { for prefix, policy := range policy.GetPolicies(policyInfo.Statements, args.BucketName) {
reply.Policies = append(reply.Policies, BucketAccessPolicy{ reply.Policies = append(reply.Policies, BucketAccessPolicy{
@ -769,11 +788,26 @@ func (web *webAPIHandlers) SetBucketPolicy(r *http.Request, args *SetBucketPolic
} }
} }
policyInfo, err := readBucketAccessPolicy(objectAPI, args.BucketName) var policyInfo, err = getBucketAccessPolicy(objectAPI, args.BucketName)
if err != nil { if err != nil {
return toJSONError(err, args.BucketName) if _, ok := errorCause(err).(PolicyNotFound); !ok {
return toJSONError(err, args.BucketName)
}
policyInfo = policy.BucketAccessPolicy{Version: "2012-10-17"}
} }
policyInfo.Statements = policy.SetPolicy(policyInfo.Statements, bucketP, args.BucketName, args.Prefix) policyInfo.Statements = policy.SetPolicy(policyInfo.Statements, bucketP, args.BucketName, args.Prefix)
switch g := objectAPI.(type) {
case GatewayLayer:
err = g.SetBucketPolicies(args.BucketName, policyInfo)
if err != nil {
return toJSONError(err)
}
reply.UIVersion = browser.UIVersion
return nil
}
if len(policyInfo.Statements) == 0 { if len(policyInfo.Statements) == 0 {
err = persistAndNotifyBucketPolicyChange(args.BucketName, policyChange{true, nil}, objectAPI) err = persistAndNotifyBucketPolicyChange(args.BucketName, policyChange{true, nil}, objectAPI)
if err != nil { if err != nil {
@ -798,7 +832,6 @@ func (web *webAPIHandlers) SetBucketPolicy(r *http.Request, args *SetBucketPolic
} }
return toJSONError(err, args.BucketName) return toJSONError(err, args.BucketName)
} }
reply.UIVersion = browser.UIVersion
return nil return nil
} }

View File

@ -315,7 +315,7 @@ func testListBucketsWebHandler(obj ObjectLayer, instanceType string, t TestErrHa
bucketName := getRandomBucketName() bucketName := getRandomBucketName()
// Create bucket. // Create bucket.
err = obj.MakeBucket(bucketName) err = obj.MakeBucketWithLocation(bucketName, "")
if err != nil { if err != nil {
// failed to create newbucket, abort. // failed to create newbucket, abort.
t.Fatalf("%s : %s", instanceType, err) t.Fatalf("%s : %s", instanceType, err)
@ -366,7 +366,7 @@ func testListObjectsWebHandler(obj ObjectLayer, instanceType string, t TestErrHa
objectSize := 1 * humanize.KiByte objectSize := 1 * humanize.KiByte
// Create bucket. // Create bucket.
err = obj.MakeBucket(bucketName) err = obj.MakeBucketWithLocation(bucketName, "")
if err != nil { if err != nil {
// failed to create newbucket, abort. // failed to create newbucket, abort.
t.Fatalf("%s : %s", instanceType, err) t.Fatalf("%s : %s", instanceType, err)
@ -460,7 +460,7 @@ func testRemoveObjectWebHandler(obj ObjectLayer, instanceType string, t TestErrH
objectSize := 1 * humanize.KiByte objectSize := 1 * humanize.KiByte
// Create bucket. // Create bucket.
err = obj.MakeBucket(bucketName) err = obj.MakeBucketWithLocation(bucketName, "")
if err != nil { if err != nil {
// failed to create newbucket, abort. // failed to create newbucket, abort.
t.Fatalf("%s : %s", instanceType, err) t.Fatalf("%s : %s", instanceType, err)
@ -700,7 +700,7 @@ func testUploadWebHandler(obj ObjectLayer, instanceType string, t TestErrHandler
return rec.Code return rec.Code
} }
// Create bucket. // Create bucket.
err = obj.MakeBucket(bucketName) err = obj.MakeBucketWithLocation(bucketName, "")
if err != nil { if err != nil {
// failed to create newbucket, abort. // failed to create newbucket, abort.
t.Fatalf("%s : %s", instanceType, err) t.Fatalf("%s : %s", instanceType, err)
@ -785,7 +785,7 @@ func testDownloadWebHandler(obj ObjectLayer, instanceType string, t TestErrHandl
} }
// Create bucket. // Create bucket.
err = obj.MakeBucket(bucketName) err = obj.MakeBucketWithLocation(bucketName, "")
if err != nil { if err != nil {
// failed to create newbucket, abort. // failed to create newbucket, abort.
t.Fatalf("%s : %s", instanceType, err) t.Fatalf("%s : %s", instanceType, err)
@ -852,7 +852,7 @@ func testWebHandlerDownloadZip(obj ObjectLayer, instanceType string, t TestErrHa
fileThree := "cccccccccccccc" fileThree := "cccccccccccccc"
// Create bucket. // Create bucket.
err = obj.MakeBucket(bucket) err = obj.MakeBucketWithLocation(bucket, "")
if err != nil { if err != nil {
// failed to create newbucket, abort. // failed to create newbucket, abort.
t.Fatalf("%s : %s", instanceType, err) t.Fatalf("%s : %s", instanceType, err)
@ -937,7 +937,7 @@ func testWebPresignedGetHandler(obj ObjectLayer, instanceType string, t TestErrH
objectSize := 1 * humanize.KiByte objectSize := 1 * humanize.KiByte
// Create bucket. // Create bucket.
err = obj.MakeBucket(bucketName) err = obj.MakeBucketWithLocation(bucketName, "")
if err != nil { if err != nil {
// failed to create newbucket, abort. // failed to create newbucket, abort.
t.Fatalf("%s : %s", instanceType, err) t.Fatalf("%s : %s", instanceType, err)
@ -1037,7 +1037,7 @@ func testWebGetBucketPolicyHandler(obj ObjectLayer, instanceType string, t TestE
rec := httptest.NewRecorder() rec := httptest.NewRecorder()
bucketName := getRandomBucketName() bucketName := getRandomBucketName()
if err := obj.MakeBucket(bucketName); err != nil { if err := obj.MakeBucketWithLocation(bucketName, ""); err != nil {
t.Fatal("Unexpected error: ", err) t.Fatal("Unexpected error: ", err)
} }
@ -1111,7 +1111,7 @@ func testWebListAllBucketPoliciesHandler(obj ObjectLayer, instanceType string, t
rec := httptest.NewRecorder() rec := httptest.NewRecorder()
bucketName := getRandomBucketName() bucketName := getRandomBucketName()
if err := obj.MakeBucket(bucketName); err != nil { if err := obj.MakeBucketWithLocation(bucketName, ""); err != nil {
t.Fatal("Unexpected error: ", err) t.Fatal("Unexpected error: ", err)
} }
@ -1209,7 +1209,7 @@ func testWebSetBucketPolicyHandler(obj ObjectLayer, instanceType string, t TestE
// Create a bucket // Create a bucket
bucketName := getRandomBucketName() bucketName := getRandomBucketName()
if err = obj.MakeBucket(bucketName); err != nil { if err = obj.MakeBucketWithLocation(bucketName, ""); err != nil {
t.Fatal("Unexpected error: ", err) t.Fatal("Unexpected error: ", err)
} }
@ -1445,7 +1445,7 @@ func TestWebObjectLayerFaultyDisks(t *testing.T) {
defer removeRoots(fsDirs) defer removeRoots(fsDirs)
bucketName := "mybucket" bucketName := "mybucket"
err = obj.MakeBucket(bucketName) err = obj.MakeBucketWithLocation(bucketName, "")
if err != nil { if err != nil {
t.Fatal("Cannot make bucket:", err) t.Fatal("Cannot make bucket:", err)
} }

View File

@ -30,7 +30,7 @@ var bucketMetadataOpIgnoredErrs = append(bucketOpIgnoredErrs, errVolumeNotFound)
/// Bucket operations /// Bucket operations
// MakeBucket - make a bucket. // MakeBucket - make a bucket.
func (xl xlObjects) MakeBucket(bucket string) error { func (xl xlObjects) MakeBucketWithLocation(bucket, location string) error {
// Verify if bucket is valid. // Verify if bucket is valid.
if !IsValidBucketName(bucket) { if !IsValidBucketName(bucket) {
return traceError(BucketNameInvalid{Bucket: bucket}) return traceError(BucketNameInvalid{Bucket: bucket})

View File

@ -214,7 +214,7 @@ func TestListOnlineDisks(t *testing.T) {
obj.DeleteObject(bucket, object) obj.DeleteObject(bucket, object)
obj.DeleteBucket(bucket) obj.DeleteBucket(bucket)
err = obj.MakeBucket("bucket") err = obj.MakeBucketWithLocation("bucket", "")
if err != nil { if err != nil {
t.Fatalf("Failed to make a bucket %v", err) t.Fatalf("Failed to make a bucket %v", err)
} }

View File

@ -212,7 +212,7 @@ func TestHealFormatXL(t *testing.T) {
t.Fatal(err) t.Fatal(err)
} }
xl = obj.(*xlObjects) xl = obj.(*xlObjects)
if err = obj.MakeBucket(getRandomBucketName()); err != nil { if err = obj.MakeBucketWithLocation(getRandomBucketName(), ""); err != nil {
t.Fatal(err) t.Fatal(err)
} }
for i := 0; i <= 2; i++ { for i := 0; i <= 2; i++ {
@ -248,7 +248,7 @@ func TestUndoMakeBucket(t *testing.T) {
} }
bucketName := getRandomBucketName() bucketName := getRandomBucketName()
if err = obj.MakeBucket(bucketName); err != nil { if err = obj.MakeBucketWithLocation(bucketName, ""); err != nil {
t.Fatal(err) t.Fatal(err)
} }
xl := obj.(*xlObjects) xl := obj.(*xlObjects)
@ -288,7 +288,7 @@ func TestQuickHeal(t *testing.T) {
} }
bucketName := getRandomBucketName() bucketName := getRandomBucketName()
if err = obj.MakeBucket(bucketName); err != nil { if err = obj.MakeBucketWithLocation(bucketName, ""); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -383,13 +383,13 @@ func TestListBucketsHeal(t *testing.T) {
// Create a bucket that won't get corrupted // Create a bucket that won't get corrupted
saneBucket := "sanebucket" saneBucket := "sanebucket"
if err = obj.MakeBucket(saneBucket); err != nil { if err = obj.MakeBucketWithLocation(saneBucket, ""); err != nil {
t.Fatal(err) t.Fatal(err)
} }
// Create a bucket that will be removed in some disks // Create a bucket that will be removed in some disks
corruptedBucketName := getRandomBucketName() corruptedBucketName := getRandomBucketName()
if err = obj.MakeBucket(corruptedBucketName); err != nil { if err = obj.MakeBucketWithLocation(corruptedBucketName, ""); err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -445,7 +445,7 @@ func TestHealObjectXL(t *testing.T) {
object := "object" object := "object"
data := bytes.Repeat([]byte("a"), 5*1024*1024) data := bytes.Repeat([]byte("a"), 5*1024*1024)
err = obj.MakeBucket(bucket) err = obj.MakeBucketWithLocation(bucket, "")
if err != nil { if err != nil {
t.Fatalf("Failed to make a bucket - %v", err) t.Fatalf("Failed to make a bucket - %v", err)
} }

View File

@ -48,7 +48,7 @@ func TestListObjectsHeal(t *testing.T) {
objName := "obj" objName := "obj"
// Create test bucket // Create test bucket
err = xl.MakeBucket(bucketName) err = xl.MakeBucketWithLocation(bucketName, "")
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -166,7 +166,7 @@ func TestListUploadsHeal(t *testing.T) {
objName := path.Join(prefix, "obj") objName := path.Join(prefix, "obj")
// Create test bucket. // Create test bucket.
err = xl.MakeBucket(bucketName) err = xl.MakeBucketWithLocation(bucketName, "")
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }

View File

@ -37,7 +37,7 @@ func testXLReadStat(obj ObjectLayer, instanceType string, disks []string, t *tes
bucketName := getRandomBucketName() bucketName := getRandomBucketName()
objectName := "test-object" objectName := "test-object"
// create bucket. // create bucket.
err := obj.MakeBucket(bucketName) err := obj.MakeBucketWithLocation(bucketName, "")
// Stop the test if creation of the bucket fails. // Stop the test if creation of the bucket fails.
if err != nil { if err != nil {
t.Fatalf("%s : %s", instanceType, err.Error()) t.Fatalf("%s : %s", instanceType, err.Error())
@ -113,7 +113,7 @@ func testXLReadMetaParts(obj ObjectLayer, instanceType string, disks []string, t
// objectNames[0]. // objectNames[0].
// uploadIds [0]. // uploadIds [0].
// Create bucket before intiating NewMultipartUpload. // Create bucket before intiating NewMultipartUpload.
err := obj.MakeBucket(bucketNames[0]) err := obj.MakeBucketWithLocation(bucketNames[0] ,"")
if err != nil { if err != nil {
// Failed to create newbucket, abort. // Failed to create newbucket, abort.
t.Fatalf("%s : %s", instanceType, err.Error()) t.Fatalf("%s : %s", instanceType, err.Error())

View File

@ -38,7 +38,7 @@ func TestUpdateUploadJSON(t *testing.T) {
defer removeRoots(fsDirs) defer removeRoots(fsDirs)
bucket, object := "bucket", "object" bucket, object := "bucket", "object"
err = obj.MakeBucket(bucket) err = obj.MakeBucketWithLocation(bucket, "")
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }

View File

@ -42,7 +42,7 @@ func TestRepeatPutObjectPart(t *testing.T) {
// cleaning up of temporary test directories // cleaning up of temporary test directories
defer removeRoots(disks) defer removeRoots(disks)
err = objLayer.MakeBucket("bucket1") err = objLayer.MakeBucketWithLocation("bucket1", "")
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -86,7 +86,7 @@ func TestXLDeleteObjectBasic(t *testing.T) {
} }
// Make bucket for Test 7 to pass // Make bucket for Test 7 to pass
err = xl.MakeBucket("bucket") err = xl.MakeBucketWithLocation("bucket", "")
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -120,7 +120,7 @@ func TestXLDeleteObjectDiskNotFound(t *testing.T) {
xl := obj.(*xlObjects) xl := obj.(*xlObjects)
// Create "bucket" // Create "bucket"
err = obj.MakeBucket("bucket") err = obj.MakeBucketWithLocation("bucket", "")
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -170,7 +170,7 @@ func TestGetObjectNoQuorum(t *testing.T) {
xl := obj.(*xlObjects) xl := obj.(*xlObjects)
// Create "bucket" // Create "bucket"
err = obj.MakeBucket("bucket") err = obj.MakeBucketWithLocation("bucket", "")
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -222,7 +222,7 @@ func TestPutObjectNoQuorum(t *testing.T) {
xl := obj.(*xlObjects) xl := obj.(*xlObjects)
// Create "bucket" // Create "bucket"
err = obj.MakeBucket("bucket") err = obj.MakeBucketWithLocation("bucket", "")
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
@ -279,7 +279,7 @@ func TestHealing(t *testing.T) {
xl := obj.(*xlObjects) xl := obj.(*xlObjects)
// Create "bucket" // Create "bucket"
err = obj.MakeBucket("bucket") err = obj.MakeBucketWithLocation("bucket", "")
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }

View File

@ -16,7 +16,10 @@ export MINIO_ACCESS_KEY=azureaccountname
export MINIO_SECRET_KEY=azureaccountkey export MINIO_SECRET_KEY=azureaccountkey
minio gateway azure minio gateway azure
``` ```
## Test using Minio Browser
Minio Gateway comes with an embedded web based object browser. Point your web browser to http://127.0.0.1:9000 ensure your server has started successfully.
![Screenshot](https://github.com/minio/minio/blob/master/docs/screenshots/minio-browser.jpg?raw=true)
## Test using Minio Client `mc` ## Test using Minio Client `mc`
`mc` provides a modern alternative to UNIX commands such as ls, cat, cp, mirror, diff etc. It supports filesystems and Amazon S3 compatible cloud storage services. `mc` provides a modern alternative to UNIX commands such as ls, cat, cp, mirror, diff etc. It supports filesystems and Amazon S3 compatible cloud storage services.