From 55e4d0c6a5a27d914b08764bd6da19f1b68b8887 Mon Sep 17 00:00:00 2001 From: Harshavardhana Date: Sun, 12 Jul 2015 20:59:39 -0700 Subject: [PATCH] mkdonut now creates a donut processing cli args --- Makefile | 1 + cmd/mkdonut/.gitignore | 1 + cmd/mkdonut/disks.go | 11 +++++----- cmd/mkdonut/main.go | 49 +++++++++++++++++++++++++++++++++++++++++- pkg/donut/common.go | 16 ++++++++++++++ 5 files changed, 71 insertions(+), 7 deletions(-) create mode 100644 cmd/mkdonut/.gitignore diff --git a/Makefile b/Makefile index 744dffc17..4a4411528 100644 --- a/Makefile +++ b/Makefile @@ -34,6 +34,7 @@ cyclo: gomake-all: getdeps verifiers @echo "Installing minio:" @go run make.go install + @go run cmd/mkdonut/make.go install release: getdeps verifiers @echo "Installing minio:" diff --git a/cmd/mkdonut/.gitignore b/cmd/mkdonut/.gitignore new file mode 100644 index 000000000..eec95e2df --- /dev/null +++ b/cmd/mkdonut/.gitignore @@ -0,0 +1 @@ +mkdonut \ No newline at end of file diff --git a/cmd/mkdonut/disks.go b/cmd/mkdonut/disks.go index b98a5c022..324aedaae 100644 --- a/cmd/mkdonut/disks.go +++ b/cmd/mkdonut/disks.go @@ -17,22 +17,21 @@ package main import ( - "errors" + "fmt" "io/ioutil" "os" - "path/filepath" "syscall" "github.com/minio/minio/pkg/iodine" ) -// IsUsable provides a comprehensive way of knowing if the provided mountPath is mounted and writable -func IsUsable(mountPath string) (bool, error) { +// isUsable provides a comprehensive way of knowing if the provided mountPath is mounted and writable +func isUsable(mountPath string) (bool, error) { mntpoint, err := os.Stat(mountPath) if err != nil { return false, iodine.New(err, nil) } - parent, err := os.Stat(filepath.Join(mountPath, "..")) + parent, err := os.Stat("/") if err != nil { return false, iodine.New(err, nil) } @@ -40,7 +39,7 @@ func IsUsable(mountPath string) (bool, error) { parentSt := parent.Sys().(*syscall.Stat_t) if mntpointSt.Dev == parentSt.Dev { - return false, iodine.New(errors.New("not mounted"), nil) + return false, iodine.New(fmt.Errorf("Not mounted %s", mountPath), nil) } testFile, err := ioutil.TempFile(mountPath, "writetest-") if err != nil { diff --git a/cmd/mkdonut/main.go b/cmd/mkdonut/main.go index a9c033f2f..4572d9eb2 100644 --- a/cmd/mkdonut/main.go +++ b/cmd/mkdonut/main.go @@ -20,12 +20,14 @@ import ( "fmt" "os" "os/user" + "path/filepath" "runtime" "strconv" "time" "github.com/dustin/go-humanize" "github.com/minio/cli" + "github.com/minio/minio/pkg/donut" "github.com/minio/minio/pkg/iodine" ) @@ -72,6 +74,50 @@ func getSystemData() map[string]string { } } +func runMkdonut(c *cli.Context) { + if !c.Args().Present() || c.Args().First() == "help" { + cli.ShowAppHelp(c) + os.Exit(1) + } + donutName := c.Args().First() + if c.Args().First() != "" { + if !donut.IsValidDonut(donutName) { + Fatalf("Invalid donutname %s\n", donutName) + } + } + var disks []string + for _, disk := range c.Args().Tail() { + if _, err := isUsable(disk); err != nil { + Fatalln(err) + } + disks = append(disks, disk) + } + for _, disk := range disks { + if err := os.MkdirAll(filepath.Join(disk, donutName), 0700); err != nil { + Fatalln(err) + } + } + + hostname, err := os.Hostname() + if err != nil { + Fatalln(err) + } + donutConfig := &donut.Config{} + donutConfig.Version = "0.0.1" + donutConfig.DonutName = donutName + donutConfig.NodeDiskMap = make(map[string][]string) + // keep it in exact order as it was specified, do not try to sort disks + donutConfig.NodeDiskMap[hostname] = disks + // default cache is unlimited + donutConfig.MaxSize = 0 + + if err := donut.SaveConfig(donutConfig); err != nil { + Fatalln(err) + } + + Infoln("Success!") +} + func main() { // set up iodine iodine.SetGlobalState("mkdonut.version", Version) @@ -82,7 +128,8 @@ func main() { // set up app app := cli.NewApp() - app.Name = "minio" + app.Action = runMkdonut + app.Name = "mkdonut" app.Version = Version app.Compiled = getVersion() app.Author = "Minio.io" diff --git a/pkg/donut/common.go b/pkg/donut/common.go index 92efa3de7..96fadd4fb 100644 --- a/pkg/donut/common.go +++ b/pkg/donut/common.go @@ -28,6 +28,22 @@ import ( "github.com/minio/minio/pkg/utils/atomic" ) +// IsValidDonut - verify donut name is correct +func IsValidDonut(donutName string) bool { + if len(donutName) < 3 || len(donutName) > 63 { + return false + } + if donutName[0] == '.' || donutName[len(donutName)-1] == '.' { + return false + } + if match, _ := regexp.MatchString("\\.\\.", donutName); match == true { + return false + } + // We don't support donutNames with '.' in them + match, _ := regexp.MatchString("^[a-zA-Z][a-zA-Z0-9\\-]+[a-zA-Z0-9]$", donutName) + return match +} + // IsValidBucket - verify bucket name in accordance with // - http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingBucket.html func IsValidBucket(bucket string) bool {