mirror of
https://github.com/percona/percona-toolkit.git
synced 2025-09-09 18:30:16 +00:00
PT-75 Fixed command line arg parse
This commit is contained in:
@@ -508,28 +508,28 @@ func getOptions() (*options, error) {
|
|||||||
AuthDB: DEFAULT_AUTHDB,
|
AuthDB: DEFAULT_AUTHDB,
|
||||||
}
|
}
|
||||||
|
|
||||||
getopt.BoolVarLong(&opts.Help, "help", '?', "Show help")
|
gop := getopt.New()
|
||||||
getopt.BoolVarLong(&opts.Version, "version", 'v', "Show version & exit")
|
gop.BoolVarLong(&opts.Help, "help", '?', "Show help")
|
||||||
getopt.BoolVarLong(&opts.NoVersionCheck, "no-version-check", 'c', "Default: Don't check for updates")
|
gop.BoolVarLong(&opts.Version, "version", 'v', "Show version & exit")
|
||||||
|
gop.BoolVarLong(&opts.NoVersionCheck, "no-version-check", 'c', "Default: Don't check for updates")
|
||||||
|
|
||||||
getopt.IntVarLong(&opts.Limit, "limit", 'n', "Show the first n queries")
|
gop.IntVarLong(&opts.Limit, "limit", 'n', "Show the first n queries")
|
||||||
|
|
||||||
getopt.ListVarLong(&opts.OrderBy, "order-by", 'o',
|
gop.ListVarLong(&opts.OrderBy, "order-by", 'o',
|
||||||
"Comma separated list of order by fields (max values): "+
|
"Comma separated list of order by fields (max values): "+
|
||||||
"count,ratio,query-time,docs-scanned,docs-returned. "+
|
"count,ratio,query-time,docs-scanned,docs-returned. "+
|
||||||
"- in front of the field name denotes reverse order. Default: "+DEFAULT_ORDERBY)
|
"- in front of the field name denotes reverse order. Default: "+DEFAULT_ORDERBY)
|
||||||
getopt.ListVarLong(&opts.SkipCollections, "skip-collections", 's', "A comma separated list of collections (namespaces) to skip."+
|
gop.ListVarLong(&opts.SkipCollections, "skip-collections", 's', "A comma separated list of collections (namespaces) to skip."+
|
||||||
" Default: "+DEFAULT_SKIPCOLLECTIONS)
|
" Default: "+DEFAULT_SKIPCOLLECTIONS)
|
||||||
|
|
||||||
getopt.StringVarLong(&opts.AuthDB, "authenticationDatabase", 'a', "admin", "Database to use for optional MongoDB authentication. Default: admin")
|
gop.StringVarLong(&opts.AuthDB, "authenticationDatabase", 'a', "admin", "Database to use for optional MongoDB authentication. Default: admin")
|
||||||
getopt.StringVarLong(&opts.Database, "database", 'd', "", "MongoDB database to profile")
|
gop.StringVarLong(&opts.Database, "database", 'd', "", "MongoDB database to profile")
|
||||||
getopt.StringVarLong(&opts.LogLevel, "log-level", 'l', "Log level: error", "panic, fatal, error, warn, info, debug. Default: error")
|
gop.StringVarLong(&opts.LogLevel, "log-level", 'l', "Log level: error", "panic, fatal, error, warn, info, debug. Default: error")
|
||||||
getopt.StringVarLong(&opts.Password, "password", 'p', "", "Password to use for optional MongoDB authentication").SetOptional()
|
gop.StringVarLong(&opts.Password, "password", 'p', "", "Password to use for optional MongoDB authentication").SetOptional()
|
||||||
getopt.StringVarLong(&opts.User, "username", 'u', "Username to use for optional MongoDB authentication")
|
gop.StringVarLong(&opts.User, "username", 'u', "Username to use for optional MongoDB authentication")
|
||||||
|
|
||||||
getopt.SetParameters("host[:port]/database")
|
gop.SetParameters("host[:port]/database")
|
||||||
|
|
||||||
var gop = getopt.CommandLine
|
|
||||||
gop.Parse(os.Args)
|
gop.Parse(os.Args)
|
||||||
if gop.NArgs() > 0 {
|
if gop.NArgs() > 0 {
|
||||||
opts.Host = gop.Arg(0)
|
opts.Host = gop.Arg(0)
|
||||||
@@ -539,13 +539,7 @@ func getOptions() (*options, error) {
|
|||||||
return opts, nil
|
return opts, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
//args := getopt.Args() // host is a positional arg
|
if gop.IsSet("order-by") {
|
||||||
//if len(args) > 0 {
|
|
||||||
// opts.Host = args[0]
|
|
||||||
|
|
||||||
//}
|
|
||||||
|
|
||||||
if getopt.IsSet("order-by") {
|
|
||||||
validFields := []string{"count", "ratio", "query-time", "docs-scanned", "docs-returned"}
|
validFields := []string{"count", "ratio", "query-time", "docs-scanned", "docs-returned"}
|
||||||
for _, field := range opts.OrderBy {
|
for _, field := range opts.OrderBy {
|
||||||
valid := false
|
valid := false
|
||||||
@@ -558,11 +552,9 @@ func getOptions() (*options, error) {
|
|||||||
return nil, fmt.Errorf("invalid sort field '%q'", field)
|
return nil, fmt.Errorf("invalid sort field '%q'", field)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
opts.OrderBy = []string{"count"}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if getopt.IsSet("password") && opts.Password == "" {
|
if gop.IsSet("password") && opts.Password == "" {
|
||||||
print("Password: ")
|
print("Password: ")
|
||||||
pass, err := gopass.GetPasswd()
|
pass, err := gopass.GetPasswd()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@@ -6,9 +6,11 @@ import (
|
|||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
"reflect"
|
"reflect"
|
||||||
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/pborman/getopt/v2"
|
||||||
"github.com/percona/percona-toolkit/src/go/mongolib/proto"
|
"github.com/percona/percona-toolkit/src/go/mongolib/proto"
|
||||||
"github.com/percona/pmgo"
|
"github.com/percona/pmgo"
|
||||||
|
|
||||||
@@ -345,3 +347,44 @@ func TestIsProfilerEnabled(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestParseArgs(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
args []string
|
||||||
|
want *options
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
args: []string{TOOLNAME}, // arg[0] is the command itself
|
||||||
|
want: &options{
|
||||||
|
Host: DEFAULT_HOST,
|
||||||
|
LogLevel: DEFAULT_LOGLEVEL,
|
||||||
|
OrderBy: strings.Split(DEFAULT_ORDERBY, ","),
|
||||||
|
SkipCollections: strings.Split(DEFAULT_SKIPCOLLECTIONS, ","),
|
||||||
|
AuthDB: DEFAULT_AUTHDB,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
args: []string{TOOLNAME, "zapp.brannigan.net:27018/samples", "--help"},
|
||||||
|
want: &options{
|
||||||
|
Host: "zapp.brannigan.net:27018/samples",
|
||||||
|
LogLevel: DEFAULT_LOGLEVEL,
|
||||||
|
OrderBy: strings.Split(DEFAULT_ORDERBY, ","),
|
||||||
|
SkipCollections: strings.Split(DEFAULT_SKIPCOLLECTIONS, ","),
|
||||||
|
AuthDB: DEFAULT_AUTHDB,
|
||||||
|
Help: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for i, test := range tests {
|
||||||
|
getopt.Reset()
|
||||||
|
os.Args = test.args
|
||||||
|
got, err := getOptions()
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("error parsing command line arguments: %s", err.Error())
|
||||||
|
}
|
||||||
|
if !reflect.DeepEqual(got, test.want) {
|
||||||
|
t.Errorf("invalid command line options test %d\ngot %+v\nwant %+v\n", i, got, test.want)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user