Skip to content

Commit 53668f8

Browse files
author
Moritz Clasmeier
committed
Read user defaults before command execution
1 parent 24e21da commit 53668f8

1 file changed

Lines changed: 43 additions & 2 deletions

File tree

cmd/main.go

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
package main
22

33
import (
4+
"fmt"
45
"os"
56

7+
"dario.cat/mergo"
68
"github.com/fatih/color"
79
"github.com/spf13/cobra"
810
"github.com/stackrox/roxie/internal/deployer"
911
"github.com/stackrox/roxie/internal/logger"
12+
"github.com/stackrox/roxie/internal/xdg"
13+
"gopkg.in/yaml.v3"
1014
)
1115

1216
var (
@@ -23,13 +27,50 @@ var (
2327
)
2428

2529
func main() {
26-
if err := rootCmd.Execute(); err != nil {
27-
red := color.New(color.FgRed, color.Bold)
30+
globalLogger = logger.New()
31+
red := color.New(color.FgRed, color.Bold)
32+
if err := run(); err != nil {
2833
red.Fprintf(os.Stderr, "Error: %v\n", err)
2934
os.Exit(1)
3035
}
3136
}
3237

38+
func run() error {
39+
if err := tryApplyUserDefaults(globalLogger, &deploySettings); err != nil {
40+
return err
41+
}
42+
return rootCmd.Execute()
43+
}
44+
45+
// If a user config file exists, apply those user defaults on top the
46+
// current config. This essentially means, that the user config can
47+
// override values, which are already initialized in NewConfig().
48+
// Note: the user config should only contain reasonable fields, which
49+
// are not already handled by roxies smart defaulting like cluster-dependent
50+
// resource profiles.
51+
func tryApplyUserDefaults(log *logger.Logger, config *deployer.Config) error {
52+
path, err := xdg.UserConfigPath()
53+
if err != nil {
54+
return nil
55+
}
56+
data, err := os.ReadFile(path)
57+
if err != nil {
58+
if os.IsNotExist(err) {
59+
return nil
60+
}
61+
return fmt.Errorf("reading user config %q: %w", path, err)
62+
}
63+
var userDefaults deployer.Config
64+
if err := yaml.Unmarshal(data, &userDefaults); err != nil {
65+
return fmt.Errorf("parsing user config %q: %w", path, err)
66+
}
67+
if err := mergo.Merge(config, &userDefaults, mergo.WithOverride, mergo.WithoutDereference); err != nil {
68+
return fmt.Errorf("merging user config %q: %w", path, err)
69+
}
70+
log.Dimf("Applied user config from %s", path)
71+
return nil
72+
}
73+
3374
var rootCmd = &cobra.Command{
3475
Use: "roxie",
3576
Short: "roxie - Advanced Cluster Security Deployment Tool",

0 commit comments

Comments
 (0)