From caa9fdf96a459f1ba4926093287c38ac547b2196 Mon Sep 17 00:00:00 2001 From: Jared Watts Date: Wed, 23 Aug 2017 22:20:14 -0700 Subject: [PATCH] log version, arguments and flags at start up --- Makefile | 1 + cmd/rook/api.go | 4 +++- cmd/rook/main.go | 20 ++++++++++++++++++-- cmd/rook/mds.go | 4 +++- cmd/rook/mgr.go | 4 +++- cmd/rook/mon.go | 4 +++- cmd/rook/operator.go | 4 +++- cmd/rook/osd.go | 4 +++- cmd/rook/rgw.go | 4 +++- pkg/clusterd/join.go | 3 --- pkg/util/flags/flags.go | 20 ++++++++++++++++++++ pkg/util/flags/flags_test.go | 28 ++++++++++++++++++++++++++++ pkg/version/version.go | 1 + 13 files changed, 89 insertions(+), 12 deletions(-) diff --git a/Makefile b/Makefile index ca671bfab..16339fc3c 100644 --- a/Makefile +++ b/Makefile @@ -62,6 +62,7 @@ TEST_PACKAGES = $(GO_PROJECT)/tests/smoke # the root go project GO_PROJECT=github.com/rook/rook +# inject the version number into the golang version package using the -X linker flag LDFLAGS += -X $(GO_PROJECT)/pkg/version.Version=$(VERSION) # ==================================================================================== diff --git a/cmd/rook/api.go b/cmd/rook/api.go index 9b52536ce..8973c1976 100644 --- a/cmd/rook/api.go +++ b/cmd/rook/api.go @@ -44,7 +44,7 @@ func init() { apiCmd.Flags().StringVar(&namespace, "namespace", "", "the namespace in which the api service is running") addCephFlags(apiCmd) - flags.SetFlagsFromEnv(apiCmd.Flags(), "ROOK") + flags.SetFlagsFromEnv(apiCmd.Flags(), RookEnvVarPrefix) apiCmd.RunE = startAPI } @@ -60,6 +60,8 @@ func startAPI(cmd *cobra.Command, args []string) error { setLogLevel() + logStartupInfo(apiCmd.Flags()) + clientset, _, err := getClientset() if err != nil { fmt.Printf("failed to init k8s client. %+v\n", err) diff --git a/cmd/rook/main.go b/cmd/rook/main.go index 0f9f9c819..7be33ea04 100644 --- a/cmd/rook/main.go +++ b/cmd/rook/main.go @@ -28,6 +28,7 @@ import ( "github.com/coreos/pkg/capnslog" "github.com/spf13/cobra" + "github.com/spf13/pflag" "github.com/rook/rook/pkg/api" "github.com/rook/rook/pkg/ceph" @@ -39,6 +40,11 @@ import ( "github.com/rook/rook/pkg/util/exec" "github.com/rook/rook/pkg/util/flags" "github.com/rook/rook/pkg/util/proc" + "github.com/rook/rook/pkg/version" +) + +const ( + RookEnvVarPrefix = "ROOK" ) var rootCmd = &cobra.Command{ @@ -89,8 +95,8 @@ func init() { rootCmd.PersistentFlags().StringVar(&logLevelRaw, "log-level", "INFO", "logging level for logging/tracing output (valid values: CRITICAL,ERROR,WARNING,NOTICE,INFO,DEBUG,TRACE)") // load the environment variables - flags.SetFlagsFromEnv(rootCmd.Flags(), "ROOK") - flags.SetFlagsFromEnv(rootCmd.PersistentFlags(), "ROOK") + flags.SetFlagsFromEnv(rootCmd.Flags(), RookEnvVarPrefix) + flags.SetFlagsFromEnv(rootCmd.PersistentFlags(), RookEnvVarPrefix) rootCmd.RunE = startJoinCluster } @@ -123,6 +129,8 @@ func startJoinCluster(cmd *cobra.Command, args []string) error { setLogLevel() + logStartupInfo(rootCmd.Flags()) + if err := joinCluster(); err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) @@ -232,6 +240,14 @@ func setLogLevel() { capnslog.SetGlobalLogLevel(cfg.logLevel) } +func logStartupInfo(cmdFlags *pflag.FlagSet) { + // log the version number, arguments, and all final flag values (environment variable overrides + // have already been taken into account) + flagValues := flags.GetFlagsAndValues(cmdFlags, "secret") + logger.Infof("starting Rook %s with arguments '%s'", version.Version, strings.Join(os.Args, " ")) + logger.Infof("flag values: %s", strings.Join(flagValues, ", ")) +} + func createContext() *clusterd.Context { executor := &exec.CommandExecutor{} return &clusterd.Context{ diff --git a/cmd/rook/mds.go b/cmd/rook/mds.go index e7b691f67..44da46ab9 100644 --- a/cmd/rook/mds.go +++ b/cmd/rook/mds.go @@ -41,7 +41,7 @@ func init() { mdsCmd.Flags().StringVar(&mdsKeyring, "mds-keyring", "", "the mds keyring") addCephFlags(mdsCmd) - flags.SetFlagsFromEnv(mdsCmd.Flags(), "ROOK") + flags.SetFlagsFromEnv(mdsCmd.Flags(), RookEnvVarPrefix) mdsCmd.RunE = startMDS } @@ -54,6 +54,8 @@ func startMDS(cmd *cobra.Command, args []string) error { setLogLevel() + logStartupInfo(mdsCmd.Flags()) + clusterInfo.Monitors = mon.ParseMonEndpoints(cfg.monEndpoints) config := &mds.Config{ ID: mdsID, diff --git a/cmd/rook/mgr.go b/cmd/rook/mgr.go index 96616a453..039b8935e 100644 --- a/cmd/rook/mgr.go +++ b/cmd/rook/mgr.go @@ -41,7 +41,7 @@ func init() { mgrCmd.Flags().StringVar(&mgrKeyring, "mgr-keyring", "", "the mgr keyring") addCephFlags(mgrCmd) - flags.SetFlagsFromEnv(mgrCmd.Flags(), "ROOK") + flags.SetFlagsFromEnv(mgrCmd.Flags(), RookEnvVarPrefix) mgrCmd.RunE = startMgr } @@ -54,6 +54,8 @@ func startMgr(cmd *cobra.Command, args []string) error { setLogLevel() + logStartupInfo(mgrCmd.Flags()) + clusterInfo.Monitors = mon.ParseMonEndpoints(cfg.monEndpoints) config := &mgr.Config{ Name: mgrName, diff --git a/cmd/rook/mon.go b/cmd/rook/mon.go index a17311b37..336ae7535 100644 --- a/cmd/rook/mon.go +++ b/cmd/rook/mon.go @@ -52,7 +52,7 @@ func init() { monCmd.Flags().IntVar(&monPort, "port", 0, "port of the monitor") addCephFlags(monCmd) - flags.SetFlagsFromEnv(monCmd.Flags(), "ROOK") + flags.SetFlagsFromEnv(monCmd.Flags(), RookEnvVarPrefix) monCmd.RunE = startMon } @@ -65,6 +65,8 @@ func startMon(cmd *cobra.Command, args []string) error { setLogLevel() + logStartupInfo(monCmd.Flags()) + if monPort == 0 { return fmt.Errorf("missing mon port") } diff --git a/cmd/rook/operator.go b/cmd/rook/operator.go index 4c178b249..9b57e0e4b 100644 --- a/cmd/rook/operator.go +++ b/cmd/rook/operator.go @@ -37,7 +37,7 @@ https://github.com/rook/rook`, } func init() { - flags.SetFlagsFromEnv(operatorCmd.Flags(), "ROOK") + flags.SetFlagsFromEnv(operatorCmd.Flags(), RookEnvVarPrefix) operatorCmd.RunE = startOperator } @@ -46,6 +46,8 @@ func startOperator(cmd *cobra.Command, args []string) error { setLogLevel() + logStartupInfo(operatorCmd.Flags()) + clientset, apiExtClientset, err := getClientset() if err != nil { fmt.Printf("failed to get k8s client. %+v", err) diff --git a/cmd/rook/osd.go b/cmd/rook/osd.go index 956c0538f..a40305007 100644 --- a/cmd/rook/osd.go +++ b/cmd/rook/osd.go @@ -55,7 +55,7 @@ func addOSDFlags(command *cobra.Command) { func init() { addOSDFlags(osdCmd) addCephFlags(osdCmd) - flags.SetFlagsFromEnv(osdCmd.Flags(), "ROOK") + flags.SetFlagsFromEnv(osdCmd.Flags(), RookEnvVarPrefix) osdCmd.RunE = startOSD } @@ -81,6 +81,8 @@ func startOSD(cmd *cobra.Command, args []string) error { setLogLevel() + logStartupInfo(osdCmd.Flags()) + forceFormat := false clusterInfo.Monitors = mon.ParseMonEndpoints(cfg.monEndpoints) agent := osd.NewAgent(dataDevices, usingDeviceFilter, cfg.metadataDevice, cfg.directories, forceFormat, diff --git a/cmd/rook/rgw.go b/cmd/rook/rgw.go index a91d92134..5cae94ed5 100644 --- a/cmd/rook/rgw.go +++ b/cmd/rook/rgw.go @@ -43,7 +43,7 @@ func init() { rgwCmd.Flags().IntVar(&rgwPort, "rgw-port", 0, "rgw port number") addCephFlags(rgwCmd) - flags.SetFlagsFromEnv(rgwCmd.Flags(), "ROOK") + flags.SetFlagsFromEnv(rgwCmd.Flags(), RookEnvVarPrefix) rgwCmd.RunE = startRGW } @@ -60,6 +60,8 @@ func startRGW(cmd *cobra.Command, args []string) error { setLogLevel() + logStartupInfo(rgwCmd.Flags()) + clusterInfo.Monitors = mon.ParseMonEndpoints(cfg.monEndpoints) config := &rgw.Config{ ClusterInfo: &clusterInfo, diff --git a/pkg/clusterd/join.go b/pkg/clusterd/join.go index 93519e1a7..62ea748e8 100644 --- a/pkg/clusterd/join.go +++ b/pkg/clusterd/join.go @@ -31,9 +31,6 @@ import ( func StartJoinCluster(services []*ClusterService, configDir, nodeID, discoveryURL, etcdMembers string, networkInfo NetworkInfo, configFileOverride string, logLevel capnslog.LogLevel) (*Context, error) { - logger.Infof("Starting cluster. configDir=%s, nodeID=%s, url=%s, members=%s, networkInfo=%+v, configFileOverride=%s, logLevel=%s", - configDir, nodeID, discoveryURL, etcdMembers, networkInfo, configFileOverride, logLevel) - if err := VerifyNetworkInfo(networkInfo); err != nil { return nil, fmt.Errorf("invalid network info: %+v. %+v", networkInfo, err) } diff --git a/pkg/util/flags/flags.go b/pkg/util/flags/flags.go index 7b4adeed1..5ddf0f669 100644 --- a/pkg/util/flags/flags.go +++ b/pkg/util/flags/flags.go @@ -18,6 +18,7 @@ package flags import ( "fmt" "os" + "regexp" "strings" "github.com/spf13/cobra" @@ -72,3 +73,22 @@ func SetFlagsFromEnv(flags *pflag.FlagSet, prefix string) error { return nil } + +// GetFlagsAndValues returns all flags and their values as a slice with elements in the format of +// "--=" +func GetFlagsAndValues(flags *pflag.FlagSet, excludeFilter string) []string { + var flagValues []string + + flags.VisitAll(func(f *pflag.Flag) { + val := f.Value.String() + if excludeFilter != "" { + if matched, _ := regexp.Match(excludeFilter, []byte(f.Name)); matched { + val = "*****" + } + } + + flagValues = append(flagValues, fmt.Sprintf("--%s=%s", f.Name, val)) + }) + + return flagValues +} diff --git a/pkg/util/flags/flags_test.go b/pkg/util/flags/flags_test.go index c55d58230..42a4f9bd7 100644 --- a/pkg/util/flags/flags_test.go +++ b/pkg/util/flags/flags_test.go @@ -73,3 +73,31 @@ func TestUintFlags(t *testing.T) { err = VerifyRequiredUint64Flags(cmd, []string{"foo", "bar"}) assert.Nil(t, err) } + +func TestGetFlagsAndValues(t *testing.T) { + cmd := &cobra.Command{ + Use: "test", + Short: "Creates a test arg", + } + + var arg1 string + var arg2 string + cmd.Flags().StringVar(&arg1, "foo-data", "", "test 1") + cmd.Flags().StringVar(&arg2, "bar-secret", "", "test 2") + + cmd.Flags().Set("foo-data", "1234") + cmd.Flags().Set("bar-secret", "mypassword") + + // get all flags and their values, providing no filter. all of them should be returned. + flagValues := GetFlagsAndValues(cmd.Flags(), "") + assert.Equal(t, 2, len(flagValues)) + assert.Contains(t, flagValues, "--foo-data=1234") + assert.Contains(t, flagValues, "--bar-secret=mypassword") + + // get all flags and their values, filtering any flags with "secret" in their name. + // the --bar-secret flag should be redacted. + flagValues = GetFlagsAndValues(cmd.Flags(), "secret") + assert.Equal(t, 2, len(flagValues)) + assert.Contains(t, flagValues, "--foo-data=1234") + assert.Contains(t, flagValues, "--bar-secret=*****") +} diff --git a/pkg/version/version.go b/pkg/version/version.go index 8fab04d3f..04167c6c3 100644 --- a/pkg/version/version.go +++ b/pkg/version/version.go @@ -15,4 +15,5 @@ limitations under the License. */ package version +// Version will be overridden with the current version at build time using the -X linker flag var Version = "0.0.0"