Skip to content
This repository has been archived by the owner on Sep 16, 2023. It is now read-only.

Commit

Permalink
feat: improve config-system with viper
Browse files Browse the repository at this point in the history
close #40

Signed-off-by: Christian Kotzbauer <christian.kotzbauer@gmail.com>
  • Loading branch information
ckotzbauer committed Oct 2, 2021
1 parent ddbe62d commit d1123d0
Show file tree
Hide file tree
Showing 12 changed files with 120 additions and 55 deletions.
30 changes: 19 additions & 11 deletions cmd/deprecation/kyverno_create.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"github.com/ckotzbauer/chekr/pkg/deprecation"
"github.com/ckotzbauer/chekr/pkg/kubernetes"
"github.com/spf13/cobra"
"github.com/spf13/viper"
"k8s.io/client-go/tools/clientcmd"
)

Expand All @@ -15,7 +16,7 @@ func createKyvernoCreateCmd(overrides *clientcmd.ConfigOverrides) *cobra.Command
Use: "kyverno-create",
Short: "Creates Kyverno validation policies for deprecated objects in cluster.",
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
output, _ := cmd.Flags().GetString("output")
output := viper.GetString("output")

if output != "yaml" && output != "json" {
return fmt.Errorf("Output-Format not valid: %v", output)
Expand All @@ -24,15 +25,14 @@ func createKyvernoCreateCmd(overrides *clientcmd.ConfigOverrides) *cobra.Command
return nil
},
Run: func(cmd *cobra.Command, args []string) {
k8sVersion, _ := cmd.Flags().GetString("k8s-version")
ignoredKinds, _ := cmd.Flags().GetStringSlice("ignored-kinds")
category, _ := cmd.Flags().GetString("category")
subject, _ := cmd.Flags().GetString("subject")
validationFailureAction, _ := cmd.Flags().GetString("validation-failure-action")
background, _ := cmd.Flags().GetBool("background")
k8sVersion := viper.GetString("k8s-version")
ignoredKinds := viper.GetStringSlice("ignored-kinds")
category := viper.GetString("category")
subject := viper.GetString("subject")
validationFailureAction := viper.GetString("validation-failure-action")
background := viper.GetBool("background")

r := deprecation.Deprecation{
KubeOverrides: overrides,
KubeClient: kubernetes.NewClient(cmd, overrides),
K8sVersion: k8sVersion,
IgnoredKinds: ignoredKinds,
Expand All @@ -45,9 +45,9 @@ func createKyvernoCreateCmd(overrides *clientcmd.ConfigOverrides) *cobra.Command
policyCrd := r.ExecuteKyvernoCreate()
stringOutput := policyCrd

output, _ := cmd.Flags().GetString("output")
outputFile, _ := cmd.Flags().GetString("output-file")
dryRun, _ := cmd.Flags().GetBool("dry-run")
output := viper.GetString("output")
outputFile := viper.GetString("output-file")
dryRun := viper.GetBool("dry-run")

r.HandleKyvernoResult(stringOutput, output, outputFile, dryRun)
},
Expand All @@ -61,6 +61,14 @@ func createKyvernoCreateCmd(overrides *clientcmd.ConfigOverrides) *cobra.Command
kyvernoCreateCmd.Flags().String("validation-failure-action", "audit", "Validation-Failure-Action of the policy (audit or failure).")
kyvernoCreateCmd.Flags().Bool("background", true, "Whether background scans should be performed.")
kyvernoCreateCmd.Flags().Bool("dry-run", false, "Whether or not the generated policy should be applied.")

viper.BindPFlag("k8s-version", kyvernoCreateCmd.Flags().Lookup("k8s-version"))
viper.BindPFlag("ignored-kinds", kyvernoCreateCmd.Flags().Lookup("ignored-kinds"))
viper.BindPFlag("category", kyvernoCreateCmd.Flags().Lookup("category"))
viper.BindPFlag("k8s-subject", kyvernoCreateCmd.Flags().Lookup("subject"))
viper.BindPFlag("validation-failure-action", kyvernoCreateCmd.Flags().Lookup("validation-failure-action"))
viper.BindPFlag("background", kyvernoCreateCmd.Flags().Lookup("background"))
viper.BindPFlag("dry-run", kyvernoCreateCmd.Flags().Lookup("dry-run"))
return kyvernoCreateCmd
}

Expand Down
3 changes: 1 addition & 2 deletions cmd/deprecation/kyverno_delete.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,7 @@ func createKyvernoDeleteCmd(overrides *clientcmd.ConfigOverrides) *cobra.Command
Short: "Deletes Kyverno validation policies for deprecated objects in cluster.",
Run: func(cmd *cobra.Command, args []string) {
r := deprecation.Deprecation{
KubeOverrides: overrides,
KubeClient: kubernetes.NewClient(cmd, overrides),
KubeClient: kubernetes.NewClient(cmd, overrides),
}

r.DeletePolicy()
Expand Down
19 changes: 12 additions & 7 deletions cmd/deprecation/list.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"github.com/ckotzbauer/chekr/pkg/kubernetes"
"github.com/ckotzbauer/chekr/pkg/printer"
"github.com/spf13/cobra"
"github.com/spf13/viper"
"k8s.io/client-go/tools/clientcmd"
)

Expand All @@ -16,12 +17,11 @@ func createListCmd(overrides *clientcmd.ConfigOverrides) *cobra.Command {
Use: "list",
Short: "Lists deprecated objects in cluster.",
Run: func(cmd *cobra.Command, args []string) {
k8sVersion, _ := cmd.Flags().GetString("k8s-version")
ignoredKinds, _ := cmd.Flags().GetStringSlice("ignored-kinds")
throttleBurst, _ := cmd.Flags().GetInt("throttle-burst")
k8sVersion := viper.GetString("k8s-version")
ignoredKinds := viper.GetStringSlice("ignored-kinds")
throttleBurst := viper.GetInt("throttle-burst")

r := deprecation.Deprecation{
KubeOverrides: overrides,
KubeClient: kubernetes.NewClient(cmd, overrides),
K8sVersion: k8sVersion,
IgnoredKinds: ignoredKinds,
Expand All @@ -30,9 +30,9 @@ func createListCmd(overrides *clientcmd.ConfigOverrides) *cobra.Command {

list := r.ExecuteList()

output, _ := cmd.Flags().GetString("output")
outputFile, _ := cmd.Flags().GetString("output-file")
omitExitCode, _ := cmd.Flags().GetBool("omit-exit-code")
output := viper.GetString("output")
outputFile := viper.GetString("output-file")
omitExitCode := viper.GetBool("omit-exit-code")

printer := printer.Printer{Type: output, File: outputFile}
printer.Print(list)
Expand All @@ -48,6 +48,11 @@ func createListCmd(overrides *clientcmd.ConfigOverrides) *cobra.Command {
listCmd.Flags().StringSliceP("ignored-kinds", "i", []string{}, "All kinds you want to ignore (e.g. Deployment,DaemonSet)")
listCmd.Flags().Bool("omit-exit-code", false, "Omits the non-zero exit code if deprecations were found.")
listCmd.Flags().IntP("throttle-burst", "t", 100, "Burst used for throttling of Kubernetes discovery-client")

viper.BindPFlag("k8s-version", listCmd.Flags().Lookup("k8s-version"))
viper.BindPFlag("ignored-kinds", listCmd.Flags().Lookup("ignored-kinds"))
viper.BindPFlag("omit-exit-code", listCmd.Flags().Lookup("omit-exit-code"))
viper.BindPFlag("throttle-burst", listCmd.Flags().Lookup("throttle-burst"))
return listCmd
}

Expand Down
16 changes: 9 additions & 7 deletions cmd/ha.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,19 @@ import (
"github.com/ckotzbauer/chekr/pkg/kubernetes"
"github.com/ckotzbauer/chekr/pkg/printer"
"github.com/spf13/cobra"
"github.com/spf13/viper"
)

// haCmd represents the ha command
var haCmd = &cobra.Command{
Use: "ha",
Short: "Creates high-availability report of your workload.",
Run: func(cmd *cobra.Command, args []string) {
labelSelector, _ := cmd.Flags().GetString("selector")
annotationSelector, _ := cmd.Flags().GetString("annotation")
namespace, _ := cmd.Flags().GetString("namespace")
labelSelector := viper.GetString("selector")
annotationSelector := viper.GetString("annotation")
namespace := viper.GetString("namespace")

r := ha.HighAvailability{
KubeOverrides: overrides,
KubeClient: kubernetes.NewClient(cmd, overrides),
Pods: args,
LabelSelector: labelSelector,
Expand All @@ -27,8 +27,8 @@ var haCmd = &cobra.Command{

list := r.Execute()

output, _ := cmd.Flags().GetString("output")
outputFile, _ := cmd.Flags().GetString("output-file")
output := viper.GetString("output")
outputFile := viper.GetString("output-file")

printer := printer.Printer{Type: output, File: outputFile}
printer.Print(list)
Expand All @@ -39,5 +39,7 @@ func init() {
rootCmd.AddCommand(haCmd)
haCmd.Flags().StringP("selector", "l", "", "Label-Selector")
haCmd.Flags().StringP("annotation", "a", "", "Annotation-Selector")
// Output

viper.BindPFlag("selector", haCmd.Flags().Lookup("selector"))
viper.BindPFlag("annotation", haCmd.Flags().Lookup("annotation"))
}
38 changes: 23 additions & 15 deletions cmd/resources.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,24 +9,25 @@ import (
"github.com/ckotzbauer/chekr/pkg/resources"
"github.com/prometheus/common/config"
"github.com/spf13/cobra"
"github.com/spf13/viper"
)

// resourcesCmd represents the resources command
var resourcesCmd = &cobra.Command{
Use: "resources",
Short: "Analyze resource requests and limits of pods.",
Run: func(cmd *cobra.Command, args []string) {
url, _ := cmd.Flags().GetString("prometheus-url")
username, _ := cmd.Flags().GetString("prometheus-username")
password, _ := cmd.Flags().GetString("prometheus-password")
countDays, _ := cmd.Flags().GetInt64("count-days")
timeout, _ := cmd.Flags().GetDuration("timeout")
url := viper.GetString("prometheus-url")
username := viper.GetString("prometheus-username")
password := viper.GetString("prometheus-password")
countDays := viper.GetInt64("count-days")
timeout := viper.GetDuration("timeout")

labelSelector, _ := cmd.Flags().GetString("selector")
annotationSelector, _ := cmd.Flags().GetString("annotation")
namespace, _ := cmd.Flags().GetString("namespace")
cpuMetric, _ := cmd.Flags().GetString("cpu-metric")
memoryMetric, _ := cmd.Flags().GetString("memory-metric")
labelSelector := viper.GetString("selector")
annotationSelector := viper.GetString("annotation")
namespace := viper.GetString("namespace")
cpuMetric := viper.GetString("cpu-metric")
memoryMetric := viper.GetString("memory-metric")

r := resources.Resource{
Prometheus: prometheus.Prometheus{
Expand All @@ -36,7 +37,6 @@ var resourcesCmd = &cobra.Command{
CountDays: countDays,
Timeout: timeout,
},
KubeOverrides: overrides,
KubeClient: kubernetes.NewClient(cmd, overrides),
Pods: args,
LabelSelector: labelSelector,
Expand All @@ -48,8 +48,8 @@ var resourcesCmd = &cobra.Command{

list := r.Execute()

output, _ := cmd.Flags().GetString("output")
outputFile, _ := cmd.Flags().GetString("output-file")
output := viper.GetString("output")
outputFile := viper.GetString("output-file")

printer := printer.Printer{Type: output, File: outputFile}
printer.Print(list)
Expand All @@ -65,9 +65,17 @@ func init() {
resourcesCmd.Flags().String("memory-metric", "container_memory_working_set_bytes", "Memory-Usage metric to query")
resourcesCmd.Flags().Int64P("count-days", "d", 30, "Count of days to analyze metrics from (until now).")
resourcesCmd.Flags().DurationP("timeout", "t", time.Duration(30)*time.Second, "Timeout")

resourcesCmd.Flags().StringP("selector", "l", "", "Label-Selector")
resourcesCmd.Flags().StringP("annotation", "a", "", "Annotation-Selector")

resourcesCmd.MarkFlagRequired("prometheus-url")

viper.BindPFlag("prometheus-url", haCmd.Flags().Lookup("prometheus-url"))
viper.BindPFlag("prometheus-username", haCmd.Flags().Lookup("prometheus-username"))
viper.BindPFlag("prometheus-password", haCmd.Flags().Lookup("prometheus-password"))
viper.BindPFlag("cpu-metric", haCmd.Flags().Lookup("cpu-metric"))
viper.BindPFlag("memory-metric", haCmd.Flags().Lookup("memory-metric"))
viper.BindPFlag("count-days", haCmd.Flags().Lookup("count-days"))
viper.BindPFlag("timeout", haCmd.Flags().Lookup("timeout"))
viper.BindPFlag("selector", haCmd.Flags().Lookup("selector"))
viper.BindPFlag("annotation", haCmd.Flags().Lookup("annotation"))
}
32 changes: 29 additions & 3 deletions cmd/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,13 @@ import (
"github.com/ckotzbauer/chekr/pkg/kubernetes"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
"github.com/spf13/viper"
"k8s.io/client-go/tools/clientcmd"
)

var (
overrides *clientcmd.ConfigOverrides
cfgFile string
verbosity string

rootCmd = &cobra.Command{
Expand All @@ -23,7 +25,7 @@ var (
return err
}

output, _ := cmd.Flags().GetString("output")
output := viper.GetString("output")

if output != "table" && output != "json" && output != "html" {
return fmt.Errorf("Output-Format not valid: %v", output)
Expand All @@ -41,14 +43,38 @@ func Execute(version, commit, date, builtBy string) error {
}

func init() {
cobra.OnInitialize()
cobra.OnInitialize(initConfig)

rootCmd.PersistentFlags().StringVarP(&cfgFile, "config", "c", "", "Path to the chekr config-file.")
rootCmd.PersistentFlags().StringP("output", "o", "table", "Output-Format. Valid values are [table, json, html]")
rootCmd.PersistentFlags().StringP("output-file", "", "", "File to write to output to.")
rootCmd.PersistentFlags().StringP(clientcmd.RecommendedConfigPathFlag, "", "", "Path to the kubeconfig file to use for CLI requests.")
rootCmd.PersistentFlags().String(clientcmd.RecommendedConfigPathFlag, "", "Path to the kubeconfig file to use for CLI requests.")
rootCmd.PersistentFlags().StringVarP(&verbosity, "verbosity", "v", logrus.WarnLevel.String(), "Log-level (debug, info, warn, error, fatal, panic)")

overrides = kubernetes.BindFlags(rootCmd.PersistentFlags())

viper.BindPFlag("output", rootCmd.PersistentFlags().Lookup("output"))
viper.BindPFlag("output-file", rootCmd.PersistentFlags().Lookup("output-file"))
viper.BindPFlag(clientcmd.RecommendedConfigPathFlag, rootCmd.PersistentFlags().Lookup(clientcmd.RecommendedConfigPathFlag))
viper.BindPFlag("verbosity", rootCmd.PersistentFlags().Lookup("verbosity"))
}

func initConfig() {
if cfgFile != "" {
viper.SetConfigFile(cfgFile)
} else {
viper.SetConfigName("chekr")
viper.SetConfigType("yaml")
viper.AddConfigPath("$HOME/.config/chekr")
viper.AddConfigPath(".")
}

viper.AutomaticEnv()
viper.SetEnvPrefix("CHEKR")

if err := viper.ReadInConfig(); err != nil && cfgFile != "" {
logrus.WithError(err).Fatalf("An error occurred while reading the config!")
}
}

//setUpLogs set the log output ans the log level
Expand Down
11 changes: 11 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ require (
github.com/sirupsen/logrus v1.8.1
github.com/spf13/cobra v1.2.1
github.com/spf13/pflag v1.0.5
github.com/spf13/viper v1.8.1
k8s.io/api v0.22.2
k8s.io/apimachinery v0.22.2
k8s.io/cli-runtime v0.22.2
Expand All @@ -31,6 +32,7 @@ require (
github.com/evanphx/json-patch v4.11.0+incompatible // indirect
github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d // indirect
github.com/fatih/camelcase v1.0.0 // indirect
github.com/fsnotify/fsnotify v1.4.9 // indirect
github.com/fvbommel/sortorder v1.0.1 // indirect
github.com/go-errors/errors v1.0.1 // indirect
github.com/go-logr/logr v0.4.0 // indirect
Expand All @@ -46,28 +48,36 @@ require (
github.com/google/uuid v1.1.2 // indirect
github.com/googleapis/gnostic v0.5.5 // indirect
github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 // indirect
github.com/hashicorp/hcl v1.0.0 // indirect
github.com/imdario/mergo v0.3.5 // indirect
github.com/inconshreveable/mousetrap v1.0.0 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/jpillora/backoff v1.0.0 // indirect
github.com/json-iterator/go v1.1.11 // indirect
github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de // indirect
github.com/magiconair/properties v1.8.5 // indirect
github.com/mailru/easyjson v0.7.6 // indirect
github.com/mattn/go-runewidth v0.0.9 // indirect
github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect
github.com/mitchellh/go-wordwrap v1.0.0 // indirect
github.com/mitchellh/mapstructure v1.4.1 // indirect
github.com/moby/spdystream v0.2.0 // indirect
github.com/moby/term v0.0.0-20210610120745-9d4ed1856297 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.1 // indirect
github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 // indirect
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect
github.com/pelletier/go-toml v1.9.3 // indirect
github.com/peterbourgon/diskv v2.0.1+incompatible // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/prometheus/client_model v0.2.0 // indirect
github.com/prometheus/procfs v0.6.0 // indirect
github.com/russross/blackfriday v1.5.2 // indirect
github.com/spf13/afero v1.6.0 // indirect
github.com/spf13/cast v1.3.1 // indirect
github.com/spf13/jwalterweatherman v1.1.0 // indirect
github.com/stretchr/testify v1.7.0 // indirect
github.com/subosito/gotenv v1.2.0 // indirect
github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca // indirect
go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 // indirect
golang.org/x/net v0.0.0-20210525063256-abc453219eb5 // indirect
Expand All @@ -79,6 +89,7 @@ require (
google.golang.org/appengine v1.6.7 // indirect
google.golang.org/protobuf v1.26.0 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/ini.v1 v1.62.0 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect
k8s.io/component-base v0.22.2 // indirect
Expand Down
Loading

0 comments on commit d1123d0

Please sign in to comment.