diff --git a/cmd/fission-cli/app/app.go b/cmd/fission-cli/app/app.go index cf649681..8d343b18 100644 --- a/cmd/fission-cli/app/app.go +++ b/cmd/fission-cli/app/app.go @@ -37,7 +37,7 @@ func App() *cobra.Command { Use: "fission", Long: usage, //SilenceUsage: true, - PreRunE: wrapper.Wrapper( + PersistentPreRunE: wrapper.Wrapper( func(input cli.Input) error { console.Verbosity = input.Int(flagkey.Verbosity) return nil @@ -53,7 +53,7 @@ func App() *cobra.Command { }) wrapper.SetFlags(rootCmd, flag.FlagSet{ - Optional: []flag.Flag{flag.GlobalServer, flag.GlobalVerbosity}, + Global: []flag.Flag{flag.GlobalServer, flag.GlobalVerbosity}, }) groups := helptemplate.CommandGroups{} @@ -64,7 +64,9 @@ func App() *cobra.Command { groups = append(groups, helptemplate.CreateCmdGroup("Other Commands", support.Commands(), version.Commands())) groups.Add(rootCmd) - helptemplate.ActsAsRootCommand(rootCmd, nil, groups...) + flagExposer := helptemplate.ActsAsRootCommand(rootCmd, nil, groups...) + // show global options in usage + flagExposer.ExposeFlags(rootCmd, flagkey.Server, flagkey.Verbosity) return rootCmd } diff --git a/pkg/fission-cli/cliwrapper/driver/cobra/cobra.go b/pkg/fission-cli/cliwrapper/driver/cobra/cobra.go index 55908723..7a97fe76 100644 --- a/pkg/fission-cli/cliwrapper/driver/cobra/cobra.go +++ b/pkg/fission-cli/cliwrapper/driver/cobra/cobra.go @@ -53,6 +53,14 @@ func Wrapper(action cmd.CommandAction) func(*cobra.Command, []string) error { func SetFlags(cmd *cobra.Command, flagSet flag.FlagSet) { aliases := make(map[string]string) + // set global flags + for _, f := range flagSet.Global { + globalFlags(cmd, f) + for _, alias := range f.Aliases { + aliases[alias] = f.Name + } + } + // set required flags for _, f := range flagSet.Required { requiredFlags(cmd, f) @@ -84,7 +92,7 @@ func SetFlags(cmd *cobra.Command, flagSet flag.FlagSet) { func optionalFlags(cmd *cobra.Command, flags ...flag.Flag) { for _, f := range flags { - toCobraFlag(cmd, f) + toCobraFlag(cmd, f, false) if f.Deprecated { usage := fmt.Sprintf("Use --%v instead. The flag still works for now and will be removed in future", f.Substitute) cmd.Flags().MarkDeprecated(f.Name, usage) @@ -96,12 +104,18 @@ func optionalFlags(cmd *cobra.Command, flags ...flag.Flag) { func requiredFlags(cmd *cobra.Command, flags ...flag.Flag) { for _, f := range flags { - toCobraFlag(cmd, f) + toCobraFlag(cmd, f, false) cmd.MarkFlagRequired(f.Name) } } -func toCobraFlag(cmd *cobra.Command, f flag.Flag) { +func globalFlags(cmd *cobra.Command, flags ...flag.Flag) { + for _, f := range flags { + toCobraFlag(cmd, f, true) + } +} + +func toCobraFlag(cmd *cobra.Command, f flag.Flag, global bool) { // Workaround to pass aliases to templater for generating flag aliases. if len(f.Aliases) > 0 { var aliases []string @@ -119,67 +133,72 @@ func toCobraFlag(cmd *cobra.Command, f flag.Flag) { helptemplate.AliasSeparator, f.Usage) } + flagset := cmd.Flags() + if global { + flagset = cmd.PersistentFlags() + } + switch f.Type { case flag.Bool: val, ok := f.DefaultValue.(bool) if !ok { val = false } - cmd.Flags().BoolP(f.Name, f.Short, val, f.Usage) + flagset.BoolP(f.Name, f.Short, val, f.Usage) case flag.String: val, ok := f.DefaultValue.(string) if !ok { val = "" } - cmd.Flags().StringP(f.Name, f.Short, val, f.Usage) + flagset.StringP(f.Name, f.Short, val, f.Usage) case flag.StringSlice: val, ok := f.DefaultValue.([]string) if !ok { val = []string{} } - cmd.Flags().StringArrayP(f.Name, f.Short, val, f.Usage) + flagset.StringArrayP(f.Name, f.Short, val, f.Usage) case flag.Int: val, ok := f.DefaultValue.(int) if !ok { val = 0 } - cmd.Flags().IntP(f.Name, f.Short, val, f.Usage) + flagset.IntP(f.Name, f.Short, val, f.Usage) case flag.IntSlice: val, ok := f.DefaultValue.([]int) if !ok { val = []int{} } - cmd.Flags().IntSliceP(f.Name, f.Short, val, f.Usage) + flagset.IntSliceP(f.Name, f.Short, val, f.Usage) case flag.Int64: val, ok := f.DefaultValue.(int64) if !ok { val = 0 } - cmd.Flags().Int64P(f.Name, f.Short, val, f.Usage) + flagset.Int64P(f.Name, f.Short, val, f.Usage) case flag.Int64Slice: val, ok := f.DefaultValue.([]int64) if !ok { val = []int64{} } - cmd.Flags().Int64SliceP(f.Name, f.Short, val, f.Usage) + flagset.Int64SliceP(f.Name, f.Short, val, f.Usage) case flag.Float32: val, ok := f.DefaultValue.(float32) if !ok { val = 0 } - cmd.Flags().Float32P(f.Name, f.Short, val, f.Usage) + flagset.Float32P(f.Name, f.Short, val, f.Usage) case flag.Float64: val, ok := f.DefaultValue.(float64) if !ok { val = 0 } - cmd.Flags().Float64P(f.Name, f.Short, val, f.Usage) + flagset.Float64P(f.Name, f.Short, val, f.Usage) case flag.Duration: val, ok := f.DefaultValue.(time.Duration) if !ok { val = 0 } - cmd.Flags().DurationP(f.Name, f.Short, val, f.Usage) + flagset.DurationP(f.Name, f.Short, val, f.Usage) } } diff --git a/pkg/fission-cli/cliwrapper/driver/cobra/helptemplate/templates.go b/pkg/fission-cli/cliwrapper/driver/cobra/helptemplate/templates.go index 4414480b..de83a3c7 100644 --- a/pkg/fission-cli/cliwrapper/driver/cobra/helptemplate/templates.go +++ b/pkg/fission-cli/cliwrapper/driver/cobra/helptemplate/templates.go @@ -50,7 +50,7 @@ const ( {{end}}` // SectionFlags is the help template section that displays the command's flags. - SectionFlags = `{{ if or $visibleFlags.HasFlags $explicitlyExposedFlags.HasFlags}}Options: + SectionFlags = `{{ if or $visibleFlags.HasFlags $explicitlyExposedFlags.HasFlags}}Options {{ if $visibleFlags.HasFlags}}{{trimRight (flagsUsages $visibleFlags)}}{{end}}{{ if $explicitlyExposedFlags.HasFlags}}{{ if $visibleFlags.HasFlags}} {{end}}{{trimRight (flagsUsages $explicitlyExposedFlags)}}{{end}} diff --git a/pkg/fission-cli/cmd/function/test.go b/pkg/fission-cli/cmd/function/test.go index 47798275..401ab129 100644 --- a/pkg/fission-cli/cmd/function/test.go +++ b/pkg/fission-cli/cmd/function/test.go @@ -31,6 +31,7 @@ import ( "github.com/fission/fission/pkg/controller/client" "github.com/fission/fission/pkg/fission-cli/cliwrapper/cli" "github.com/fission/fission/pkg/fission-cli/cmd/httptrigger" + "github.com/fission/fission/pkg/fission-cli/console" flagkey "github.com/fission/fission/pkg/fission-cli/flag/key" "github.com/fission/fission/pkg/fission-cli/util" ) @@ -65,6 +66,7 @@ func (opts *TestSubCommand) do(input cli.Input) error { } routerURL = "127.0.0.1:" + localRouterPort } else { + console.Verbose(2, "Env FISSION_ROUTER: %v", routerURL) routerURL = strings.TrimPrefix(routerURL, "http://") } @@ -77,6 +79,9 @@ func (opts *TestSubCommand) do(input cli.Input) error { if err != nil { return err } + + console.Verbose(2, "Function test url: %v", functionUrl.String()) + queryParams := input.StringSlice(flagkey.FnTestQuery) if len(queryParams) > 0 { query := url.Values{} diff --git a/pkg/fission-cli/flag/flag.go b/pkg/fission-cli/flag/flag.go index 9cefbc58..475d2139 100644 --- a/pkg/fission-cli/flag/flag.go +++ b/pkg/fission-cli/flag/flag.go @@ -31,6 +31,7 @@ type ( FlagType = int FlagSet struct { + Global []Flag Required []Flag Optional []Flag }