From bef7bf8525a875a25c350cb093faad145bed8cfc Mon Sep 17 00:00:00 2001 From: dprunier Date: Wed, 29 May 2024 14:02:56 -0400 Subject: [PATCH] allow config and pre-processed configuration to leverage environment variables --- cmd/cluster/clusterCreate.go | 11 ++++++----- cmd/cluster/clusterDelete.go | 30 +++++++++++++++++++++++++----- 2 files changed, 31 insertions(+), 10 deletions(-) diff --git a/cmd/cluster/clusterCreate.go b/cmd/cluster/clusterCreate.go index 8fbd28fa9e..bd11b408ca 100644 --- a/cmd/cluster/clusterCreate.go +++ b/cmd/cluster/clusterCreate.go @@ -47,8 +47,6 @@ import ( "github.com/k3d-io/k3d/v5/version" ) -var configFile string - const clusterCreateDescription = ` Create a new k3s cluster with containerized nodes (k3s in docker). Every cluster will consist of one or more containers: @@ -72,13 +70,15 @@ var ( func initConfig() error { // Viper for pre-processed config options ppViper.SetEnvPrefix("K3D") + ppViper.AutomaticEnv() + ppViper.SetEnvKeyReplacer(strings.NewReplacer(".", "_")) if l.Log().GetLevel() >= logrus.DebugLevel { c, _ := yaml.Marshal(ppViper.AllSettings()) l.Log().Debugf("Additional CLI Configuration:\n%s", c) } - return cliconfig.InitViperWithConfigFile(cfgViper, configFile) + return cliconfig.InitViperWithConfigFile(cfgViper, ppViper.GetString("config")) } // NewCmdClusterCreate returns a new cobra command @@ -123,7 +123,7 @@ func NewCmdClusterCreate() *cobra.Command { l.Log().Fatalf("error processing/sanitizing simple config: %v", err) } - clusterConfig, err := config.TransformSimpleToClusterConfig(cmd.Context(), runtimes.SelectedRuntime, simpleCfg, configFile) + clusterConfig, err := config.TransformSimpleToClusterConfig(cmd.Context(), runtimes.SelectedRuntime, simpleCfg, ppViper.GetString("config")) if err != nil { l.Log().Fatalln(err) } @@ -208,7 +208,8 @@ func NewCmdClusterCreate() *cobra.Command { * Config File * ***************/ - cmd.Flags().StringVarP(&configFile, "config", "c", "", "Path of a config file to use") + cmd.Flags().StringP("config", "c", "", "Path of a config file to use") + _ = ppViper.BindPFlag("config", cmd.Flags().Lookup("config")) if err := cmd.MarkFlagFilename("config", "yaml", "yml"); err != nil { l.Log().Fatalln("Failed to mark flag 'config' as filename flag") } diff --git a/cmd/cluster/clusterDelete.go b/cmd/cluster/clusterDelete.go index 07f6c57d17..98f6686444 100644 --- a/cmd/cluster/clusterDelete.go +++ b/cmd/cluster/clusterDelete.go @@ -26,6 +26,7 @@ import ( "fmt" "os" "path" + "strings" "github.com/k3d-io/k3d/v5/cmd/util" cliconfig "github.com/k3d-io/k3d/v5/cmd/util/config" @@ -35,13 +36,31 @@ import ( "github.com/k3d-io/k3d/v5/pkg/runtimes" k3d "github.com/k3d-io/k3d/v5/pkg/types" k3dutil "github.com/k3d-io/k3d/v5/pkg/util" + "github.com/sirupsen/logrus" + "sigs.k8s.io/yaml" "github.com/spf13/cobra" "github.com/spf13/viper" ) -var clusterDeleteConfigFile string -var clusterDeleteCfgViper = viper.New() +var ( + clusterDeleteCfgViper = viper.New() + clusterDeletePpViper = viper.New() +) + +func initClusterDeleteConfig() error { + // Viper for pre-processed config options + ppViper.SetEnvPrefix("K3D") + ppViper.AutomaticEnv() + ppViper.SetEnvKeyReplacer(strings.NewReplacer(".", "_")) + + if l.Log().GetLevel() >= logrus.DebugLevel { + c, _ := yaml.Marshal(ppViper.AllSettings()) + l.Log().Debugf("Additional CLI Configuration:\n%s", c) + } + + return cliconfig.InitViperWithConfigFile(cfgViper, ppViper.GetString("config")) +} // NewCmdClusterDelete returns a new cobra command func NewCmdClusterDelete() *cobra.Command { @@ -54,7 +73,7 @@ func NewCmdClusterDelete() *cobra.Command { Args: cobra.MinimumNArgs(0), // 0 or n arguments; 0 = default cluster name ValidArgsFunction: util.ValidArgsAvailableClusters, PreRunE: func(cmd *cobra.Command, args []string) error { - return cliconfig.InitViperWithConfigFile(clusterDeleteCfgViper, clusterDeleteConfigFile) + return initClusterDeleteConfig() }, Run: func(cmd *cobra.Command, args []string) { clusters := parseDeleteClusterCmd(cmd, args) @@ -99,7 +118,8 @@ func NewCmdClusterDelete() *cobra.Command { * Config File * ***************/ - cmd.Flags().StringVarP(&clusterDeleteConfigFile, "config", "c", "", "Path of a config file to use") + cmd.Flags().StringP("config", "c", "", "Path of a config file to use") + _ = ppViper.BindPFlag("config", cmd.Flags().Lookup("config")) if err := cmd.MarkFlagFilename("config", "yaml", "yml"); err != nil { l.Log().Fatalln("Failed to mark flag 'config' as filename flag") } @@ -119,7 +139,7 @@ func parseDeleteClusterCmd(cmd *cobra.Command, args []string) []*k3d.Cluster { } // --config - if clusterDeleteConfigFile != "" { + if clusterDeletePpViper.GetString("config") != "" { // not allowed with --all or more args if len(args) > 0 || all { l.Log().Fatalln("failed to delete cluster: cannot use `--config` flag with additional arguments or `--all`")