mirror of
https://github.com/minio/mc.git
synced 2025-11-10 13:42:32 +03:00
148 lines
4.2 KiB
Go
148 lines
4.2 KiB
Go
/*
|
|
* MinIO Client (C) 2014, 2015 MinIO, Inc.
|
|
*
|
|
* 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.
|
|
*/
|
|
|
|
package cmd
|
|
|
|
import (
|
|
"github.com/fatih/color"
|
|
"github.com/minio/cli"
|
|
json "github.com/minio/mc/pkg/colorjson"
|
|
"github.com/minio/mc/pkg/console"
|
|
"github.com/minio/mc/pkg/probe"
|
|
)
|
|
|
|
var (
|
|
mbFlags = []cli.Flag{
|
|
cli.StringFlag{
|
|
Name: "region",
|
|
Value: "us-east-1",
|
|
Usage: "specify bucket region; defaults to 'us-east-1'",
|
|
},
|
|
cli.BoolFlag{
|
|
Name: "ignore-existing, p",
|
|
Usage: "ignore if bucket/directory already exists",
|
|
},
|
|
}
|
|
)
|
|
|
|
// make a bucket.
|
|
var mbCmd = cli.Command{
|
|
Name: "mb",
|
|
Usage: "make a bucket",
|
|
Action: mainMakeBucket,
|
|
Before: setGlobalsFromContext,
|
|
Flags: append(mbFlags, globalFlags...),
|
|
CustomHelpTemplate: `NAME:
|
|
{{.HelpName}} - {{.Usage}}
|
|
|
|
USAGE:
|
|
{{.HelpName}} [FLAGS] TARGET [TARGET...]
|
|
{{if .VisibleFlags}}
|
|
FLAGS:
|
|
{{range .VisibleFlags}}{{.}}
|
|
{{end}}{{end}}
|
|
EXAMPLES:
|
|
1. Create a bucket on Amazon S3 cloud storage.
|
|
$ {{.HelpName}} s3/mynewbucket
|
|
|
|
2. Create a new bucket on Google Cloud Storage.
|
|
$ {{.HelpName}} gcs/miniocloud
|
|
|
|
3. Create a new bucket on Amazon S3 cloud storage in region 'us-west-2'.
|
|
$ {{.HelpName}} --region=us-west-2 s3/myregionbucket
|
|
|
|
4. Create a new directory including its missing parents (equivalent to 'mkdir -p').
|
|
$ {{.HelpName}} /tmp/this/new/dir1
|
|
|
|
5. Create multiple directories including its missing parents (behavior similar to 'mkdir -p').
|
|
$ {{.HelpName}} /mnt/sdb/mydisk /mnt/sdc/mydisk /mnt/sdd/mydisk
|
|
|
|
6. Ignore if bucket/directory already exists.
|
|
$ {{.HelpName}} --ignore-existing myminio/mynewbucket
|
|
`,
|
|
}
|
|
|
|
// makeBucketMessage is container for make bucket success and failure messages.
|
|
type makeBucketMessage struct {
|
|
Status string `json:"status"`
|
|
Bucket string `json:"bucket"`
|
|
Region string `json:"region"`
|
|
}
|
|
|
|
// String colorized make bucket message.
|
|
func (s makeBucketMessage) String() string {
|
|
return console.Colorize("MakeBucket", "Bucket created successfully `"+s.Bucket+"`.")
|
|
}
|
|
|
|
// JSON jsonified make bucket message.
|
|
func (s makeBucketMessage) JSON() string {
|
|
makeBucketJSONBytes, e := json.MarshalIndent(s, "", " ")
|
|
fatalIf(probe.NewError(e), "Unable to marshal into JSON.")
|
|
|
|
return string(makeBucketJSONBytes)
|
|
}
|
|
|
|
// Validate command line arguments.
|
|
func checkMakeBucketSyntax(ctx *cli.Context) {
|
|
if !ctx.Args().Present() {
|
|
cli.ShowCommandHelpAndExit(ctx, "mb", 1) // last argument is exit code
|
|
}
|
|
}
|
|
|
|
// mainMakeBucket is entry point for mb command.
|
|
func mainMakeBucket(ctx *cli.Context) error {
|
|
|
|
// check 'mb' cli arguments.
|
|
checkMakeBucketSyntax(ctx)
|
|
|
|
// Additional command speific theme customization.
|
|
console.SetColor("MakeBucket", color.New(color.FgGreen, color.Bold))
|
|
|
|
// Save region.
|
|
region := ctx.String("region")
|
|
ignoreExisting := ctx.Bool("p")
|
|
|
|
var cErr error
|
|
for _, targetURL := range ctx.Args() {
|
|
// Instantiate client for URL.
|
|
clnt, err := newClient(targetURL)
|
|
if err != nil {
|
|
errorIf(err.Trace(targetURL), "Invalid target `"+targetURL+"`.")
|
|
cErr = exitStatus(globalErrorExitStatus)
|
|
continue
|
|
}
|
|
|
|
// Make bucket.
|
|
err = clnt.MakeBucket(region, ignoreExisting)
|
|
if err != nil {
|
|
switch err.ToGoError().(type) {
|
|
case BucketNameEmpty:
|
|
errorIf(err.Trace(targetURL), "Unable to make bucket, please use `mc mb %s/<your-bucket-name>`.", targetURL)
|
|
case BucketNameTopLevel:
|
|
errorIf(err.Trace(targetURL), "Unable to make prefix, please use `mc mb %s/`.", targetURL)
|
|
default:
|
|
errorIf(err.Trace(targetURL), "Unable to make bucket `"+targetURL+"`.")
|
|
}
|
|
cErr = exitStatus(globalErrorExitStatus)
|
|
continue
|
|
}
|
|
|
|
// Successfully created a bucket.
|
|
printMsg(makeBucketMessage{Status: "success", Bucket: targetURL})
|
|
}
|
|
return cErr
|
|
}
|