diff --git a/cli/cmd/config.go b/cli/cmd/config.go index 0a6dab3ea..2b30a9630 100644 --- a/cli/cmd/config.go +++ b/cli/cmd/config.go @@ -2,28 +2,28 @@ package cmd import ( "fmt" + "github.com/creasty/defaults" "github.com/spf13/cobra" "github.com/up9inc/mizu/cli/config" + "github.com/up9inc/mizu/cli/config/configStructs" "github.com/up9inc/mizu/cli/logger" "github.com/up9inc/mizu/cli/telemetry" "github.com/up9inc/mizu/cli/uiUtils" "io/ioutil" ) -var regenerateFile bool - var configCmd = &cobra.Command{ Use: "config", Short: "Generate config with default values", RunE: func(cmd *cobra.Command, args []string) error { - go telemetry.ReportRun("config", config.Config) + go telemetry.ReportRun("config", config.Config.Config) template, err := config.GetConfigWithDefaults() if err != nil { logger.Log.Errorf("Failed generating config with defaults %v", err) return nil } - if regenerateFile { + if config.Config.Config.Regenerate { data := []byte(template) if err := ioutil.WriteFile(config.GetConfigFilePath(), data, 0644); err != nil { logger.Log.Errorf("Failed writing config %v", err) @@ -40,5 +40,9 @@ var configCmd = &cobra.Command{ func init() { rootCmd.AddCommand(configCmd) - configCmd.Flags().BoolVarP(®enerateFile, "regenerate", "r", false, fmt.Sprintf("Regenerate the config file with default values %s", config.GetConfigFilePath())) + + defaultConfigConfig := configStructs.ConfigConfig{} + defaults.Set(&defaultConfigConfig) + + configCmd.Flags().BoolP(configStructs.RegenerateConfigName, "r", defaultConfigConfig.Regenerate, fmt.Sprintf("Regenerate the config file with default values %s", config.GetConfigFilePath())) } diff --git a/cli/cmd/logs.go b/cli/cmd/logs.go index 838fc8dbb..6c3bde0f4 100644 --- a/cli/cmd/logs.go +++ b/cli/cmd/logs.go @@ -2,42 +2,37 @@ package cmd import ( "context" + "github.com/creasty/defaults" "github.com/spf13/cobra" "github.com/up9inc/mizu/cli/config" + "github.com/up9inc/mizu/cli/config/configStructs" + "github.com/up9inc/mizu/cli/errormessage" "github.com/up9inc/mizu/cli/kubernetes" "github.com/up9inc/mizu/cli/logger" "github.com/up9inc/mizu/cli/mizu/fsUtils" "github.com/up9inc/mizu/cli/telemetry" - "os" - "path" ) -var filePath string - var logsCmd = &cobra.Command{ Use: "logs", Short: "Create a zip file with logs for Github issue or troubleshoot", RunE: func(cmd *cobra.Command, args []string) error { - go telemetry.ReportRun("logs", config.Config) + go telemetry.ReportRun("logs", config.Config.Logs) - kubernetesProvider, err := kubernetes.NewProvider(config.Config.View.KubeConfigPath) + kubernetesProvider, err := kubernetes.NewProvider(config.Config.KubeConfigPath) if err != nil { return nil } ctx, _ := context.WithCancel(context.Background()) - if filePath == "" { - pwd, err := os.Getwd() - if err != nil { - logger.Log.Errorf("Failed to get PWD, %v (try using `mizu logs -f )`", err) - return nil - } - filePath = path.Join(pwd, "mizu_logs.zip") + if validationErr := config.Config.Logs.Validate(); validationErr != nil { + return errormessage.FormatError(validationErr) } - logger.Log.Debugf("Using file path %s", filePath) - if err := fsUtils.DumpLogs(kubernetesProvider, ctx, filePath); err != nil { - logger.Log.Errorf("Failed dump logs %v", err) + logger.Log.Debugf("Using file path %s", config.Config.Logs.FilePath()) + + if dumpLogsErr := fsUtils.DumpLogs(kubernetesProvider, ctx, config.Config.Logs.FilePath()); dumpLogsErr != nil { + logger.Log.Errorf("Failed dump logs %v", dumpLogsErr) } return nil @@ -46,5 +41,9 @@ var logsCmd = &cobra.Command{ func init() { rootCmd.AddCommand(logsCmd) - logsCmd.Flags().StringVarP(&filePath, "file", "f", "", "Path for zip file (default current \\mizu_logs.zip)") + + defaultLogsConfig := configStructs.LogsConfig{} + defaults.Set(&defaultLogsConfig) + + logsCmd.Flags().StringP(configStructs.FileLogsName, "f", defaultLogsConfig.FileStr, "Path for zip file (default current \\mizu_logs.zip)") } diff --git a/cli/cmd/tapRunner.go b/cli/cmd/tapRunner.go index 92d42d19a..0045cb438 100644 --- a/cli/cmd/tapRunner.go +++ b/cli/cmd/tapRunner.go @@ -265,7 +265,7 @@ func cleanUpMizuResources(kubernetesProvider *kubernetes.Provider) { if config.Config.DumpLogs { mizuDir := mizu.GetMizuFolderPath() - filePath = path.Join(mizuDir, fmt.Sprintf("mizu_logs_%s.zip", time.Now().Format("2006_01_02__15_04_05"))) + filePath := path.Join(mizuDir, fmt.Sprintf("mizu_logs_%s.zip", time.Now().Format("2006_01_02__15_04_05"))) if err := fsUtils.DumpLogs(kubernetesProvider, removalCtx, filePath); err != nil { logger.Log.Errorf("Failed dump logs %v", err) } diff --git a/cli/cmd/view.go b/cli/cmd/view.go index 39aaf75b4..a8379cf42 100644 --- a/cli/cmd/view.go +++ b/cli/cmd/view.go @@ -25,5 +25,4 @@ func init() { defaults.Set(&defaultViewConfig) viewCmd.Flags().Uint16P(configStructs.GuiPortViewName, "p", defaultViewConfig.GuiPort, "Provide a custom port for the web interface webserver") - viewCmd.Flags().StringP(configStructs.KubeConfigPathViewName, "k", defaultViewConfig.KubeConfigPath, "Path to kube-config file") } diff --git a/cli/cmd/viewRunner.go b/cli/cmd/viewRunner.go index b85384efd..081262545 100644 --- a/cli/cmd/viewRunner.go +++ b/cli/cmd/viewRunner.go @@ -12,7 +12,7 @@ import ( ) func runMizuView() { - kubernetesProvider, err := kubernetes.NewProvider(config.Config.View.KubeConfigPath) + kubernetesProvider, err := kubernetes.NewProvider(config.Config.KubeConfigPath) if err != nil { logger.Log.Error(err) return diff --git a/cli/config/config.go b/cli/config/config.go index 9c2467414..4bd8d97f2 100644 --- a/cli/config/config.go +++ b/cli/config/config.go @@ -51,8 +51,8 @@ func InitConfig(cmd *cobra.Command) error { } if err := mergeConfigFile(); err != nil { - return fmt.Errorf("invalid config %w\n"+ - "you can regenerate the file using `mizu config -r` or just remove it %v", err, GetConfigFilePath()) + return fmt.Errorf("invalid config, %w\n" + + "you can regenerate the file by removing it (%v) and using `mizu config -r`", err, GetConfigFilePath()) } cmd.Flags().Visit(initFlag) diff --git a/cli/config/configStruct.go b/cli/config/configStruct.go index 431e5d67e..503984d1e 100644 --- a/cli/config/configStruct.go +++ b/cli/config/configStruct.go @@ -16,12 +16,14 @@ type ConfigStruct struct { Fetch configStructs.FetchConfig `yaml:"fetch"` Version configStructs.VersionConfig `yaml:"version"` View configStructs.ViewConfig `yaml:"view"` + Logs configStructs.LogsConfig `yaml:"logs"` + Config configStructs.ConfigConfig `yaml:"config,omitempty"` AgentImage string `yaml:"agent-image,omitempty" readonly:""` ImagePullPolicyStr string `yaml:"image-pull-policy" default:"Always"` MizuResourcesNamespace string `yaml:"mizu-resources-namespace" default:"mizu"` Telemetry bool `yaml:"telemetry" default:"true"` DumpLogs bool `yaml:"dump-logs" default:"false"` - KubeConfigPath string `yaml:"kube-config-path" default:""` + KubeConfigPath string `yaml:"kube-config-path"` } func (config *ConfigStruct) SetDefaults() { diff --git a/cli/config/configStructs/configConfig.go b/cli/config/configStructs/configConfig.go new file mode 100644 index 000000000..3fc9a5626 --- /dev/null +++ b/cli/config/configStructs/configConfig.go @@ -0,0 +1,9 @@ +package configStructs + +const ( + RegenerateConfigName = "regenerate" +) + +type ConfigConfig struct { + Regenerate bool `yaml:"regenerate,omitempty" default:"false" readonly:""` +} diff --git a/cli/config/configStructs/logsConfig.go b/cli/config/configStructs/logsConfig.go new file mode 100644 index 000000000..90d41888f --- /dev/null +++ b/cli/config/configStructs/logsConfig.go @@ -0,0 +1,35 @@ +package configStructs + +import ( + "fmt" + "os" + "path" +) + +const ( + FileLogsName = "file" +) + +type LogsConfig struct { + FileStr string `yaml:"file"` +} + +func (config *LogsConfig) Validate() error { + if config.FileStr == "" { + _, err := os.Getwd() + if err != nil { + return fmt.Errorf("failed to get PWD, %v (try using `mizu logs -f )`", err) + } + } + + return nil +} + +func (config *LogsConfig) FilePath() string { + if config.FileStr == "" { + pwd, _ := os.Getwd() + return path.Join(pwd, "mizu_logs.zip") + } + + return config.FileStr +} \ No newline at end of file diff --git a/cli/config/configStructs/viewConfig.go b/cli/config/configStructs/viewConfig.go index 6f26ca9dc..aa41a7353 100644 --- a/cli/config/configStructs/viewConfig.go +++ b/cli/config/configStructs/viewConfig.go @@ -1,11 +1,9 @@ package configStructs const ( - GuiPortViewName = "gui-port" - KubeConfigPathViewName = "kube-config" + GuiPortViewName = "gui-port" ) type ViewConfig struct { - GuiPort uint16 `yaml:"gui-port" default:"8899"` - KubeConfigPath string `yaml:"kube-config"` + GuiPort uint16 `yaml:"gui-port" default:"8899"` } diff --git a/cli/mizu/version/versionCheck.go b/cli/mizu/version/versionCheck.go index 8ac0a356d..85f929d14 100644 --- a/cli/mizu/version/versionCheck.go +++ b/cli/mizu/version/versionCheck.go @@ -89,7 +89,10 @@ func CheckNewerVersion() { gitHubVersion := string(data) gitHubVersion = gitHubVersion[:len(gitHubVersion)-1] logger.Log.Debugf("Finished version validation, took %v", time.Since(start)) - if mizu.SemVer < gitHubVersion { + + gitHubVersionSemVer := semver.SemVersion(gitHubVersion) + currentSemVer := semver.SemVersion(mizu.SemVer) + if gitHubVersionSemVer.GreaterThan(currentSemVer) { logger.Log.Infof(uiUtils.Yellow, fmt.Sprintf("Update available! %v -> %v (%v)", mizu.SemVer, gitHubVersion, *latestRelease.HTMLURL)) } } diff --git a/shared/semver/semver.go b/shared/semver/semver.go index f27ca33f0..441b610fb 100644 --- a/shared/semver/semver.go +++ b/shared/semver/semver.go @@ -26,3 +26,23 @@ func (v SemVersion) Patch() string { _, _, patch := v.Breakdown() return patch } + +func (v SemVersion) GreaterThan(v2 SemVersion) bool { + if v.Major() > v2.Major() { + return true + } else if v.Major() < v2.Major() { + return false + } + + if v.Minor() > v2.Minor() { + return true + } else if v.Minor() < v2.Minor() { + return false + } + + if v.Patch() > v2.Patch() { + return true + } + + return false +}