diff --git a/cmd/werf/bundle/render/render.go b/cmd/werf/bundle/render/render.go index 2f265b5197..f8c52284ac 100644 --- a/cmd/werf/bundle/render/render.go +++ b/cmd/werf/bundle/render/render.go @@ -22,6 +22,7 @@ import ( "github.com/werf/werf/pkg/deploy/helm/chart_extender/helpers" "github.com/werf/werf/pkg/deploy/helm/command_helpers" "github.com/werf/werf/pkg/storage" + "github.com/werf/werf/pkg/util" "github.com/werf/werf/pkg/werf" "github.com/werf/werf/pkg/werf/global_warnings" ) @@ -94,14 +95,14 @@ func NewCmd() *cobra.Command { cmd.Flags().StringVarP(&cmdData.Tag, "tag", "", defaultTag, "Provide exact tag version or semver-based pattern, werf will render the latest version of the specified bundle ($WERF_TAG or latest by default)") - cmd.Flags().BoolVarP(&cmdData.IncludeCRDs, "include-crds", "", common.GetBoolEnvironmentDefaultTrue("WERF_INCLUDE_CRDS"), + cmd.Flags().BoolVarP(&cmdData.IncludeCRDs, "include-crds", "", util.GetBoolEnvironmentDefaultTrue("WERF_INCLUDE_CRDS"), "Include CRDs in the templated output (default $WERF_INCLUDE_CRDS)") cmd.Flags().StringVarP(&cmdData.RenderOutput, "output", "", os.Getenv("WERF_RENDER_OUTPUT"), "Write render output to the specified file instead of stdout ($WERF_RENDER_OUTPUT by default)") cmd.Flags().StringVarP(&cmdData.BundleDir, "bundle-dir", "b", os.Getenv(("WERF_BUNDLE_DIR")), "Get extracted bundle from directory instead of registry (default $WERF_BUNDLE_DIR)") - cmd.Flags().BoolVarP(&cmdData.Validate, "validate", "", common.GetBoolEnvironmentDefaultFalse("WERF_VALIDATE"), "Validate your manifests against the Kubernetes cluster you are currently pointing at (default $WERF_VALIDATE)") + cmd.Flags().BoolVarP(&cmdData.Validate, "validate", "", util.GetBoolEnvironmentDefaultFalse("WERF_VALIDATE"), "Validate your manifests against the Kubernetes cluster you are currently pointing at (default $WERF_VALIDATE)") return cmd } diff --git a/cmd/werf/ci_env/ci_env.go b/cmd/werf/ci_env/ci_env.go index 7fb35fd4ed..ae31c1b4f3 100644 --- a/cmd/werf/ci_env/ci_env.go +++ b/cmd/werf/ci_env/ci_env.go @@ -24,6 +24,7 @@ import ( "github.com/werf/werf/pkg/git_repo/gitdata" "github.com/werf/werf/pkg/tmp_manager" "github.com/werf/werf/pkg/true_git" + "github.com/werf/werf/pkg/util" "github.com/werf/werf/pkg/werf" ) @@ -74,8 +75,8 @@ Currently supported only GitLab (gitlab) and GitHub (github) CI systems`, common.SetupLogOptions(&commonCmdData, cmd) - cmd.Flags().BoolVarP(&cmdData.AsFile, "as-file", "", common.GetBoolEnvironmentDefaultFalse("WERF_AS_FILE"), "Create the script and print the path for sourcing (default $WERF_AS_FILE).") - cmd.Flags().BoolVarP(&cmdData.AsEnvFile, "as-env-file", "", common.GetBoolEnvironmentDefaultFalse("WERF_AS_ENV_FILE"), "Create the .env file and print the path for sourcing (default $WERF_AS_ENV_FILE).") + cmd.Flags().BoolVarP(&cmdData.AsFile, "as-file", "", util.GetBoolEnvironmentDefaultFalse("WERF_AS_FILE"), "Create the script and print the path for sourcing (default $WERF_AS_FILE).") + cmd.Flags().BoolVarP(&cmdData.AsEnvFile, "as-env-file", "", util.GetBoolEnvironmentDefaultFalse("WERF_AS_ENV_FILE"), "Create the .env file and print the path for sourcing (default $WERF_AS_ENV_FILE).") cmd.Flags().StringVarP(&cmdData.OutputFilePath, "output-file-path", "o", os.Getenv("WERF_OUTPUT_FILE_PATH"), "Write to custom file (default $WERF_OUTPUT_FILE_PATH).") cmd.Flags().StringVarP(&cmdData.Shell, "shell", "", os.Getenv("WERF_SHELL"), "Set to cmdexe, powershell or use the default behaviour that is compatible with any unix shell (default $WERF_SHELL).") cmd.Flags().StringVarP(&cmdData.TaggingStrategyStub, "tagging-strategy", "", "", `stub`) diff --git a/cmd/werf/common/cleanup_namespaces_scan.go b/cmd/werf/common/cleanup_namespaces_scan.go index f4477b5503..9bd1c07f94 100644 --- a/cmd/werf/common/cleanup_namespaces_scan.go +++ b/cmd/werf/common/cleanup_namespaces_scan.go @@ -7,11 +7,12 @@ import ( "github.com/werf/kubedog/pkg/kube" "github.com/werf/logboek" + "github.com/werf/werf/pkg/util" ) func SetupScanContextNamespaceOnly(cmdData *CmdData, cmd *cobra.Command) { cmdData.ScanContextNamespaceOnly = new(bool) - cmd.Flags().BoolVarP(cmdData.ScanContextNamespaceOnly, "scan-context-namespace-only", "", GetBoolEnvironmentDefaultFalse("WERF_SCAN_CONTEXT_NAMESPACE_ONLY"), "Scan for used images only in namespace linked with context for each available context in kube-config (or only for the context specified with option --kube-context). When disabled will scan all namespaces in all contexts (or only for the context specified with option --kube-context). (Default $WERF_SCAN_CONTEXT_NAMESPACE_ONLY)") + cmd.Flags().BoolVarP(cmdData.ScanContextNamespaceOnly, "scan-context-namespace-only", "", util.GetBoolEnvironmentDefaultFalse("WERF_SCAN_CONTEXT_NAMESPACE_ONLY"), "Scan for used images only in namespace linked with context for each available context in kube-config (or only for the context specified with option --kube-context). When disabled will scan all namespaces in all contexts (or only for the context specified with option --kube-context). (Default $WERF_SCAN_CONTEXT_NAMESPACE_ONLY)") } func GetKubernetesContextClients(cmdData *CmdData) ([]*kube.ContextClient, error) { diff --git a/cmd/werf/common/common.go b/cmd/werf/common/common.go index c8d5e14bcd..d0d48506d4 100644 --- a/cmd/werf/common/common.go +++ b/cmd/werf/common/common.go @@ -5,8 +5,6 @@ import ( "fmt" "os" "path/filepath" - "sort" - "strconv" "strings" "time" @@ -139,7 +137,7 @@ func GetLongCommandDescription(text string) string { func SetupSetDockerConfigJsonValue(cmdData *CmdData, cmd *cobra.Command) { cmdData.SetDockerConfigJsonValue = new(bool) - cmd.Flags().BoolVarP(cmdData.SetDockerConfigJsonValue, "set-docker-config-json-value", "", GetBoolEnvironmentDefaultFalse("WERF_SET_DOCKER_CONFIG_JSON_VALUE"), "Shortcut to set current docker config into the .Values.dockerconfigjson") + cmd.Flags().BoolVarP(cmdData.SetDockerConfigJsonValue, "set-docker-config-json-value", "", util.GetBoolEnvironmentDefaultFalse("WERF_SET_DOCKER_CONFIG_JSON_VALUE"), "Shortcut to set current docker config into the .Values.dockerconfigjson") } func SetupGitWorkTree(cmdData *CmdData, cmd *cobra.Command) { @@ -185,12 +183,12 @@ func SetupGiterminismOptions(cmdData *CmdData, cmd *cobra.Command) { func setupLooseGiterminism(cmdData *CmdData, cmd *cobra.Command) { cmdData.LooseGiterminism = new(bool) - cmd.Flags().BoolVarP(cmdData.LooseGiterminism, "loose-giterminism", "", GetBoolEnvironmentDefaultFalse("WERF_LOOSE_GITERMINISM"), "Loose werf giterminism mode restrictions (NOTE: not all restrictions can be removed, more info https://werf.io/documentation/advanced/giterminism.html, default $WERF_LOOSE_GITERMINISM)") + cmd.Flags().BoolVarP(cmdData.LooseGiterminism, "loose-giterminism", "", util.GetBoolEnvironmentDefaultFalse("WERF_LOOSE_GITERMINISM"), "Loose werf giterminism mode restrictions (NOTE: not all restrictions can be removed, more info https://werf.io/documentation/advanced/giterminism.html, default $WERF_LOOSE_GITERMINISM)") } func setupDev(cmdData *CmdData, cmd *cobra.Command) { cmdData.Dev = new(bool) - cmd.Flags().BoolVarP(cmdData.Dev, "dev", "", GetBoolEnvironmentDefaultFalse("WERF_DEV"), `Enable development mode (default $WERF_DEV). + cmd.Flags().BoolVarP(cmdData.Dev, "dev", "", util.GetBoolEnvironmentDefaultFalse("WERF_DEV"), `Enable development mode (default $WERF_DEV). The mode allows working with project files without doing redundant commits during debugging and development`) } @@ -275,13 +273,13 @@ func GetReportFormat(cmdData *CmdData) (build.ReportFormat, error) { func SetupWithoutKube(cmdData *CmdData, cmd *cobra.Command) { cmdData.WithoutKube = new(bool) - cmd.Flags().BoolVarP(cmdData.WithoutKube, "without-kube", "", GetBoolEnvironmentDefaultFalse("WERF_WITHOUT_KUBE"), "Do not skip deployed Kubernetes images (default $WERF_WITHOUT_KUBE)") + cmd.Flags().BoolVarP(cmdData.WithoutKube, "without-kube", "", util.GetBoolEnvironmentDefaultFalse("WERF_WITHOUT_KUBE"), "Do not skip deployed Kubernetes images (default $WERF_WITHOUT_KUBE)") } func SetupKeepStagesBuiltWithinLastNHours(cmdData *CmdData, cmd *cobra.Command) { cmdData.KeepStagesBuiltWithinLastNHours = new(uint64) - envValue, err := GetUint64EnvVar("WERF_KEEP_STAGES_BUILT_WITHIN_LAST_N_HOURS") + envValue, err := util.GetUint64EnvVar("WERF_KEEP_STAGES_BUILT_WITHIN_LAST_N_HOURS") if err != nil { TerminateWithError(err.Error(), 1) } @@ -296,29 +294,6 @@ func SetupKeepStagesBuiltWithinLastNHours(cmdData *CmdData, cmd *cobra.Command) cmd.Flags().Uint64VarP(cmdData.KeepStagesBuiltWithinLastNHours, "keep-stages-built-within-last-n-hours", "", defaultValue, "Keep stages that were built within last hours (default $WERF_KEEP_STAGES_BUILT_WITHIN_LAST_N_HOURS or 2)") } -func PredefinedValuesByEnvNamePrefix(envNamePrefix string, envNamePrefixesToExcept ...string) []string { - var result []string - - env := os.Environ() - sort.Strings(env) - -environLoop: - for _, keyValue := range env { - parts := strings.SplitN(keyValue, "=", 2) - if strings.HasPrefix(parts[0], envNamePrefix) { - for _, exceptEnvNamePrefix := range envNamePrefixesToExcept { - if strings.HasPrefix(parts[0], exceptEnvNamePrefix) { - continue environLoop - } - } - - result = append(result, parts[1]) - } - } - - return result -} - func SetupEnvironment(cmdData *CmdData, cmd *cobra.Command) { cmdData.Environment = new(string) cmd.Flags().StringVarP(cmdData.Environment, "env", "", os.Getenv("WERF_ENV"), "Use specified environment (default $WERF_ENV)") @@ -365,7 +340,7 @@ func SetupKubeConfig(cmdData *CmdData, cmd *cobra.Command) { } func GetFirstExistingKubeConfigEnvVar() string { - return GetFirstExistingEnvVarAsString("WERF_KUBE_CONFIG", "WERF_KUBECONFIG", "KUBECONFIG") + return util.GetFirstExistingEnvVarAsString("WERF_KUBE_CONFIG", "WERF_KUBECONFIG", "KUBECONFIG") } func SetupKubeConfigBase64(cmdData *CmdData, cmd *cobra.Command) { @@ -374,17 +349,7 @@ func SetupKubeConfigBase64(cmdData *CmdData, cmd *cobra.Command) { } func GetFirstExistingKubeConfigBase64EnvVar() string { - return GetFirstExistingEnvVarAsString("WERF_KUBE_CONFIG_BASE64", "WERF_KUBECONFIG_BASE64", "KUBECONFIG_BASE64") -} - -func GetFirstExistingEnvVarAsString(envNames ...string) string { - for _, envName := range envNames { - if v := os.Getenv(envName); v != "" { - return v - } - } - - return "" + return util.GetFirstExistingEnvVarAsString("WERF_KUBE_CONFIG_BASE64", "WERF_KUBECONFIG_BASE64", "KUBECONFIG_BASE64") } func SetupSecondaryStagesStorageOptions(cmdData *CmdData, cmd *cobra.Command) { @@ -453,7 +418,7 @@ func SetupStatusProgressPeriodP(destination *int64, cmd *cobra.Command) { func SetupReleasesHistoryMax(cmdData *CmdData, cmd *cobra.Command) { cmdData.ReleasesHistoryMax = new(int) - defaultValueP, err := GetIntEnvVar("WERF_RELEASES_HISTORY_MAX") + defaultValueP, err := util.GetIntEnvVar("WERF_RELEASES_HISTORY_MAX") if err != nil { TerminateWithError(fmt.Sprintf("bad WERF_RELEASES_HISTORY_MAX value: %s", err), 1) } @@ -475,13 +440,13 @@ func SetupReleasesHistoryMax(cmdData *CmdData, cmd *cobra.Command) { func statusProgressPeriodDefaultValue() *int64 { defaultValue := int64(5) - v, err := GetIntEnvVar("WERF_STATUS_PROGRESS_PERIOD_SECONDS") + v, err := util.GetIntEnvVar("WERF_STATUS_PROGRESS_PERIOD_SECONDS") if err != nil { TerminateWithError(err.Error(), 1) } if v == nil { - v, err = GetIntEnvVar("WERF_STATUS_PROGRESS_PERIOD") + v, err = util.GetIntEnvVar("WERF_STATUS_PROGRESS_PERIOD") if err != nil { TerminateWithError(err.Error(), 1) } @@ -514,13 +479,13 @@ func SetupHooksStatusProgressPeriodP(destination *int64, cmd *cobra.Command) { func hooksStatusProgressPeriodDefaultValue() *int64 { defaultValue := statusProgressPeriodDefaultValue() - v, err := GetIntEnvVar("WERF_HOOKS_STATUS_PROGRESS_PERIOD_SECONDS") + v, err := util.GetIntEnvVar("WERF_HOOKS_STATUS_PROGRESS_PERIOD_SECONDS") if err != nil { TerminateWithError(err.Error(), 1) } if v == nil { - v, err = GetIntEnvVar("WERF_HOOKS_STATUS_PROGRESS_PERIOD") + v, err = util.GetIntEnvVar("WERF_HOOKS_STATUS_PROGRESS_PERIOD") if err != nil { TerminateWithError(err.Error(), 1) } @@ -537,7 +502,7 @@ func hooksStatusProgressPeriodDefaultValue() *int64 { func SetupInsecureHelmDependencies(cmdData *CmdData, cmd *cobra.Command) { cmdData.InsecureHelmDependencies = new(bool) - cmd.Flags().BoolVarP(cmdData.InsecureHelmDependencies, "insecure-helm-dependencies", "", GetBoolEnvironmentDefaultFalse("WERF_INSECURE_HELM_DEPENDENCIES"), "Allow insecure oci registries to be used in the .helm/Chart.yaml dependencies configuration (default $WERF_INSECURE_HELM_DEPENDENCIES)") + cmd.Flags().BoolVarP(cmdData.InsecureHelmDependencies, "insecure-helm-dependencies", "", util.GetBoolEnvironmentDefaultFalse("WERF_INSECURE_HELM_DEPENDENCIES"), "Allow insecure oci registries to be used in the .helm/Chart.yaml dependencies configuration (default $WERF_INSECURE_HELM_DEPENDENCIES)") } func SetupInsecureRegistry(cmdData *CmdData, cmd *cobra.Command) { @@ -546,7 +511,7 @@ func SetupInsecureRegistry(cmdData *CmdData, cmd *cobra.Command) { } cmdData.InsecureRegistry = new(bool) - cmd.Flags().BoolVarP(cmdData.InsecureRegistry, "insecure-registry", "", GetBoolEnvironmentDefaultFalse("WERF_INSECURE_REGISTRY"), "Use plain HTTP requests when accessing a registry (default $WERF_INSECURE_REGISTRY)") + cmd.Flags().BoolVarP(cmdData.InsecureRegistry, "insecure-registry", "", util.GetBoolEnvironmentDefaultFalse("WERF_INSECURE_REGISTRY"), "Use plain HTTP requests when accessing a registry (default $WERF_INSECURE_REGISTRY)") } func SetupSkipTlsVerifyRegistry(cmdData *CmdData, cmd *cobra.Command) { @@ -555,12 +520,12 @@ func SetupSkipTlsVerifyRegistry(cmdData *CmdData, cmd *cobra.Command) { } cmdData.SkipTlsVerifyRegistry = new(bool) - cmd.Flags().BoolVarP(cmdData.SkipTlsVerifyRegistry, "skip-tls-verify-registry", "", GetBoolEnvironmentDefaultFalse("WERF_SKIP_TLS_VERIFY_REGISTRY"), "Skip TLS certificate validation when accessing a registry (default $WERF_SKIP_TLS_VERIFY_REGISTRY)") + cmd.Flags().BoolVarP(cmdData.SkipTlsVerifyRegistry, "skip-tls-verify-registry", "", util.GetBoolEnvironmentDefaultFalse("WERF_SKIP_TLS_VERIFY_REGISTRY"), "Skip TLS certificate validation when accessing a registry (default $WERF_SKIP_TLS_VERIFY_REGISTRY)") } func SetupDryRun(cmdData *CmdData, cmd *cobra.Command) { cmdData.DryRun = new(bool) - cmd.Flags().BoolVarP(cmdData.DryRun, "dry-run", "", GetBoolEnvironmentDefaultFalse("WERF_DRY_RUN"), "Indicate what the command would do without actually doing that (default $WERF_DRY_RUN)") + cmd.Flags().BoolVarP(cmdData.DryRun, "dry-run", "", util.GetBoolEnvironmentDefaultFalse("WERF_DRY_RUN"), "Indicate what the command would do without actually doing that (default $WERF_DRY_RUN)") } func SetupDockerConfig(cmdData *CmdData, cmd *cobra.Command, extraDesc string) { @@ -608,7 +573,7 @@ func setupLogDebug(cmdData *CmdData, cmd *cobra.Command) { "WERF_DEBUG", } { if os.Getenv(envName) != "" { - defaultValue = GetBoolEnvironmentDefaultFalse(envName) + defaultValue = util.GetBoolEnvironmentDefaultFalse(envName) break } } @@ -657,9 +622,9 @@ func setupLogQuiet(cmdData *CmdData, cmd *cobra.Command, isDefaultQuiet bool) { } { if os.Getenv(envName) != "" { if defaultValue { - defaultValue = GetBoolEnvironmentDefaultTrue(envName) + defaultValue = util.GetBoolEnvironmentDefaultTrue(envName) } else { - defaultValue = GetBoolEnvironmentDefaultFalse(envName) + defaultValue = util.GetBoolEnvironmentDefaultFalse(envName) } break @@ -693,7 +658,7 @@ func setupLogVerbose(cmdData *CmdData, cmd *cobra.Command) { "WERF_VERBOSE", } { if os.Getenv(envName) != "" { - defaultValue = GetBoolEnvironmentDefaultFalse(envName) + defaultValue = util.GetBoolEnvironmentDefaultFalse(envName) break } } @@ -721,7 +686,7 @@ func setupLogPretty(cmdData *CmdData, cmd *cobra.Command) { var defaultValue bool if os.Getenv("WERF_LOG_PRETTY") != "" { - defaultValue = GetBoolEnvironmentDefaultFalse("WERF_LOG_PRETTY") + defaultValue = util.GetBoolEnvironmentDefaultFalse("WERF_LOG_PRETTY") } else { defaultValue = true } @@ -769,7 +734,7 @@ Also, can be defined with $WERF_SECRET_VALUES_* (e.g. $WERF_SECRET_VALUES_ENV=.h func SetupIgnoreSecretKey(cmdData *CmdData, cmd *cobra.Command) { cmdData.IgnoreSecretKey = new(bool) - cmd.Flags().BoolVarP(cmdData.IgnoreSecretKey, "ignore-secret-key", "", GetBoolEnvironmentDefaultFalse("WERF_IGNORE_SECRET_KEY"), "Disable secrets decryption (default $WERF_IGNORE_SECRET_KEY)") + cmd.Flags().BoolVarP(cmdData.IgnoreSecretKey, "ignore-secret-key", "", util.GetBoolEnvironmentDefaultFalse("WERF_IGNORE_SECRET_KEY"), "Disable secrets decryption (default $WERF_IGNORE_SECRET_KEY)") } func SetupParallelOptions(cmdData *CmdData, cmd *cobra.Command, defaultValue int64) { @@ -779,7 +744,7 @@ func SetupParallelOptions(cmdData *CmdData, cmd *cobra.Command, defaultValue int func SetupParallel(cmdData *CmdData, cmd *cobra.Command) { cmdData.Parallel = new(bool) - cmd.Flags().BoolVarP(cmdData.Parallel, "parallel", "p", GetBoolEnvironmentDefaultTrue("WERF_PARALLEL"), "Run in parallel (default $WERF_PARALLEL or true)") + cmd.Flags().BoolVarP(cmdData.Parallel, "parallel", "p", util.GetBoolEnvironmentDefaultTrue("WERF_PARALLEL"), "Run in parallel (default $WERF_PARALLEL or true)") } func SetupParallelTasksLimit(cmdData *CmdData, cmd *cobra.Command, defaultValue int64) { @@ -789,7 +754,7 @@ func SetupParallelTasksLimit(cmdData *CmdData, cmd *cobra.Command, defaultValue func SetupLogProjectDir(cmdData *CmdData, cmd *cobra.Command) { cmdData.LogProjectDir = new(bool) - cmd.Flags().BoolVarP(cmdData.LogProjectDir, "log-project-dir", "", GetBoolEnvironmentDefaultFalse("WERF_LOG_PROJECT_DIR"), `Print current project directory path (default $WERF_LOG_PROJECT_DIR)`) + cmd.Flags().BoolVarP(cmdData.LogProjectDir, "log-project-dir", "", util.GetBoolEnvironmentDefaultFalse("WERF_LOG_PROJECT_DIR"), `Print current project directory path (default $WERF_LOG_PROJECT_DIR)`) } func SetupIntrospectAfterError(cmdData *CmdData, cmd *cobra.Command) { @@ -816,17 +781,17 @@ STAGE_NAME should be one of the following: `+strings.Join(allStagesNames(), ", " func SetupSkipBuild(cmdData *CmdData, cmd *cobra.Command) { cmdData.SkipBuild = new(bool) - cmd.Flags().BoolVarP(cmdData.SkipBuild, "skip-build", "Z", GetBoolEnvironmentDefaultFalse("WERF_SKIP_BUILD"), "Disable building of docker images, cached images in the repo should exist in the repo if werf.yaml contains at least one image description (default $WERF_SKIP_BUILD)") + cmd.Flags().BoolVarP(cmdData.SkipBuild, "skip-build", "Z", util.GetBoolEnvironmentDefaultFalse("WERF_SKIP_BUILD"), "Disable building of docker images, cached images in the repo should exist in the repo if werf.yaml contains at least one image description (default $WERF_SKIP_BUILD)") } func SetupStubTags(cmdData *CmdData, cmd *cobra.Command) { cmdData.StubTags = new(bool) - cmd.Flags().BoolVarP(cmdData.StubTags, "stub-tags", "", GetBoolEnvironmentDefaultFalse("WERF_STUB_TAGS"), "Use stubs instead of real tags (default $WERF_STUB_TAGS)") + cmd.Flags().BoolVarP(cmdData.StubTags, "stub-tags", "", util.GetBoolEnvironmentDefaultFalse("WERF_STUB_TAGS"), "Use stubs instead of real tags (default $WERF_STUB_TAGS)") } func SetupFollow(cmdData *CmdData, cmd *cobra.Command) { cmdData.Follow = new(bool) - cmd.Flags().BoolVarP(cmdData.Follow, "follow", "", GetBoolEnvironmentDefaultFalse("WERF_FOLLOW"), `Enable follow mode (default $WERF_FOLLOW). + cmd.Flags().BoolVarP(cmdData.Follow, "follow", "", util.GetBoolEnvironmentDefaultFalse("WERF_FOLLOW"), `Enable follow mode (default $WERF_FOLLOW). The mode allows restarting the command on a new commit. In development mode (--dev), werf restarts the command on any changes (including untracked files) in the git repository worktree`) } @@ -840,90 +805,24 @@ func allStagesNames() []string { return stageNames } -func GetBoolEnvironmentDefaultFalse(environmentName string) bool { - switch os.Getenv(environmentName) { - case "1", "true", "yes": - return true - default: - return false - } -} - -func GetBoolEnvironmentDefaultTrue(environmentName string) bool { - switch os.Getenv(environmentName) { - case "0", "false", "no": - return false - default: - return true - } -} - -func getInt64EnvVar(varName string) (*int64, error) { - if v := os.Getenv(varName); v != "" { - vInt, err := strconv.ParseInt(v, 10, 64) - if err != nil { - return nil, fmt.Errorf("bad %s variable value %q: %w", varName, v, err) - } - - res := new(int64) - *res = vInt - - return res, nil - } - - return nil, nil -} - func GetIntEnvVarStrict(varName string) *int64 { - valP, err := GetIntEnvVar(varName) + valP, err := util.GetIntEnvVar(varName) if err != nil { TerminateWithError(fmt.Sprintf("bad %s value: %s", varName, err), 1) } return valP } -func GetIntEnvVar(varName string) (*int64, error) { - if v := os.Getenv(varName); v != "" { - vInt, err := strconv.ParseInt(v, 10, 64) - if err != nil { - return nil, fmt.Errorf("bad %s variable value %q: %w", varName, v, err) - } - - res := new(int64) - *res = vInt - - return res, nil - } - - return nil, nil -} - func GetUint64EnvVarStrict(varName string) *uint64 { - valP, err := GetUint64EnvVar(varName) + valP, err := util.GetUint64EnvVar(varName) if err != nil { TerminateWithError(fmt.Sprintf("bad %s value: %s", varName, err), 1) } return valP } -func GetUint64EnvVar(varName string) (*uint64, error) { - if v := os.Getenv(varName); v != "" { - vUint, err := strconv.ParseUint(v, 10, 64) - if err != nil { - return nil, fmt.Errorf("bad %s variable value %q: %w", varName, v, err) - } - - res := new(uint64) - *res = vUint - - return res, nil - } - - return nil, nil -} - func GetParallelTasksLimit(cmdData *CmdData) (int64, error) { - v, err := getInt64EnvVar("WERF_PARALLEL_TASKS_LIMIT") + v, err := util.GetInt64EnvVar("WERF_PARALLEL_TASKS_LIMIT") if err != nil { return 0, err } @@ -1177,51 +1076,51 @@ func GetNamespace(cmdData *CmdData) string { } func GetDevIgnore(cmdData *CmdData) []string { - return append(PredefinedValuesByEnvNamePrefix("WERF_DEV_IGNORE_"), *cmdData.DevIgnore...) + return append(util.PredefinedValuesByEnvNamePrefix("WERF_DEV_IGNORE_"), *cmdData.DevIgnore...) } func GetSSHKey(cmdData *CmdData) []string { - return append(PredefinedValuesByEnvNamePrefix("WERF_SSH_KEY_"), *cmdData.SSHKeys...) + return append(util.PredefinedValuesByEnvNamePrefix("WERF_SSH_KEY_"), *cmdData.SSHKeys...) } func GetAddLabels(cmdData *CmdData) []string { - return append(PredefinedValuesByEnvNamePrefix("WERF_ADD_LABEL_"), *cmdData.AddLabels...) + return append(util.PredefinedValuesByEnvNamePrefix("WERF_ADD_LABEL_"), *cmdData.AddLabels...) } func GetAddAnnotations(cmdData *CmdData) []string { - return append(PredefinedValuesByEnvNamePrefix("WERF_ADD_ANNOTATION_"), *cmdData.AddAnnotations...) + return append(util.PredefinedValuesByEnvNamePrefix("WERF_ADD_ANNOTATION_"), *cmdData.AddAnnotations...) } func GetCacheStagesStorage(cmdData *CmdData) []string { - return append(PredefinedValuesByEnvNamePrefix("WERF_CACHE_REPO_"), *cmdData.CacheStagesStorage...) + return append(util.PredefinedValuesByEnvNamePrefix("WERF_CACHE_REPO_"), *cmdData.CacheStagesStorage...) } func GetSecondaryStagesStorage(cmdData *CmdData) []string { - return append(PredefinedValuesByEnvNamePrefix("WERF_SECONDARY_REPO_"), *cmdData.SecondaryStagesStorage...) + return append(util.PredefinedValuesByEnvNamePrefix("WERF_SECONDARY_REPO_"), *cmdData.SecondaryStagesStorage...) } func getAddCustomTag(cmdData *CmdData) []string { - return append(PredefinedValuesByEnvNamePrefix("WERF_ADD_CUSTOM_TAG_"), *cmdData.AddCustomTag...) + return append(util.PredefinedValuesByEnvNamePrefix("WERF_ADD_CUSTOM_TAG_"), *cmdData.AddCustomTag...) } func GetSet(cmdData *CmdData) []string { - return append(PredefinedValuesByEnvNamePrefix("WERF_SET_", "WERF_SET_STRING_", "WERF_SET_FILE_", "WERF_SET_DOCKER_CONFIG_JSON_VALUE"), *cmdData.Set...) + return append(util.PredefinedValuesByEnvNamePrefix("WERF_SET_", "WERF_SET_STRING_", "WERF_SET_FILE_", "WERF_SET_DOCKER_CONFIG_JSON_VALUE"), *cmdData.Set...) } func GetSetString(cmdData *CmdData) []string { - return append(PredefinedValuesByEnvNamePrefix("WERF_SET_STRING_"), *cmdData.SetString...) + return append(util.PredefinedValuesByEnvNamePrefix("WERF_SET_STRING_"), *cmdData.SetString...) } func GetSetFile(cmdData *CmdData) []string { - return append(PredefinedValuesByEnvNamePrefix("WERF_SET_FILE_"), *cmdData.SetFile...) + return append(util.PredefinedValuesByEnvNamePrefix("WERF_SET_FILE_"), *cmdData.SetFile...) } func GetValues(cmdData *CmdData) []string { - return append(PredefinedValuesByEnvNamePrefix("WERF_VALUES_"), *cmdData.Values...) + return append(util.PredefinedValuesByEnvNamePrefix("WERF_VALUES_"), *cmdData.Values...) } func GetSecretValues(cmdData *CmdData) []string { - return append(PredefinedValuesByEnvNamePrefix("WERF_SECRET_VALUES_"), *cmdData.SecretValues...) + return append(util.PredefinedValuesByEnvNamePrefix("WERF_SECRET_VALUES_"), *cmdData.SecretValues...) } func GetRequiredRelease(cmdData *CmdData) (string, error) { @@ -1346,7 +1245,7 @@ func ProcessLogTerminalWidth(cmdData *CmdData) error { logboek.Streams().SetWidth(int(value)) } else { - pInt64, err := getInt64EnvVar("WERF_LOG_TERMINAL_WIDTH") + pInt64, err := util.GetInt64EnvVar("WERF_LOG_TERMINAL_WIDTH") if err != nil { return err } @@ -1416,7 +1315,7 @@ func TerminateWithError(errMsg string, exitCode int) { func SetupVirtualMerge(cmdData *CmdData, cmd *cobra.Command) { cmdData.VirtualMerge = new(bool) - cmd.Flags().BoolVarP(cmdData.VirtualMerge, "virtual-merge", "", GetBoolEnvironmentDefaultFalse("WERF_VIRTUAL_MERGE"), "Enable virtual/ephemeral merge commit mode when building current application state ($WERF_VIRTUAL_MERGE by default)") + cmd.Flags().BoolVarP(cmdData.VirtualMerge, "virtual-merge", "", util.GetBoolEnvironmentDefaultFalse("WERF_VIRTUAL_MERGE"), "Enable virtual/ephemeral merge commit mode when building current application state ($WERF_VIRTUAL_MERGE by default)") } func SetupPlatform(cmdData *CmdData, cmd *cobra.Command) { diff --git a/cmd/werf/common/host_cleanup.go b/cmd/werf/common/host_cleanup.go index 0ea63c33b1..8c2c90d9b4 100644 --- a/cmd/werf/common/host_cleanup.go +++ b/cmd/werf/common/host_cleanup.go @@ -9,6 +9,7 @@ import ( "github.com/werf/werf/pkg/container_backend" "github.com/werf/werf/pkg/host_cleaning" + "github.com/werf/werf/pkg/util" ) func RunAutoHostCleanup(ctx context.Context, cmdData *CmdData, containerBackend container_backend.ContainerBackend) error { @@ -45,7 +46,7 @@ func RunAutoHostCleanup(ctx context.Context, cmdData *CmdData, containerBackend func SetupDisableAutoHostCleanup(cmdData *CmdData, cmd *cobra.Command) { cmdData.DisableAutoHostCleanup = new(bool) - cmd.Flags().BoolVarP(cmdData.DisableAutoHostCleanup, "disable-auto-host-cleanup", "", GetBoolEnvironmentDefaultFalse("WERF_DISABLE_AUTO_HOST_CLEANUP"), "Disable auto host cleanup procedure in main werf commands like werf-build, werf-converge and other (default disabled or WERF_DISABLE_AUTO_HOST_CLEANUP)") + cmd.Flags().BoolVarP(cmdData.DisableAutoHostCleanup, "disable-auto-host-cleanup", "", util.GetBoolEnvironmentDefaultFalse("WERF_DISABLE_AUTO_HOST_CLEANUP"), "Disable auto host cleanup procedure in main werf commands like werf-build, werf-converge and other (default disabled or WERF_DISABLE_AUTO_HOST_CLEANUP)") } func SetupAllowedDockerStorageVolumeUsage(cmdData *CmdData, cmd *cobra.Command) { diff --git a/cmd/werf/converge/converge.go b/cmd/werf/converge/converge.go index 34f9886d2a..9a3b80e84e 100644 --- a/cmd/werf/converge/converge.go +++ b/cmd/werf/converge/converge.go @@ -39,6 +39,7 @@ import ( "github.com/werf/werf/pkg/storage/manager" "github.com/werf/werf/pkg/tmp_manager" "github.com/werf/werf/pkg/true_git" + "github.com/werf/werf/pkg/util" "github.com/werf/werf/pkg/werf" "github.com/werf/werf/pkg/werf/global_warnings" ) @@ -155,13 +156,13 @@ werf converge --repo registry.mydomain.com/web --env production`, common.SetupAllowedLocalCacheVolumeUsageMargin(&commonCmdData, cmd) common.SetupDockerServerStoragePath(&commonCmdData, cmd) - defaultTimeout, err := common.GetIntEnvVar("WERF_TIMEOUT") + defaultTimeout, err := util.GetIntEnvVar("WERF_TIMEOUT") if err != nil || defaultTimeout == nil { defaultTimeout = new(int64) } cmd.Flags().IntVarP(&cmdData.Timeout, "timeout", "t", int(*defaultTimeout), "Resources tracking timeout in seconds ($WERF_TIMEOUT by default)") - cmd.Flags().BoolVarP(&cmdData.AutoRollback, "auto-rollback", "R", common.GetBoolEnvironmentDefaultFalse("WERF_AUTO_ROLLBACK"), "Enable auto rollback of the failed release to the previous deployed release version when current deploy process have failed ($WERF_AUTO_ROLLBACK by default)") - cmd.Flags().BoolVarP(&cmdData.AutoRollback, "atomic", "", common.GetBoolEnvironmentDefaultFalse("WERF_ATOMIC"), "Enable auto rollback of the failed release to the previous deployed release version when current deploy process have failed ($WERF_ATOMIC by default)") + cmd.Flags().BoolVarP(&cmdData.AutoRollback, "auto-rollback", "R", util.GetBoolEnvironmentDefaultFalse("WERF_AUTO_ROLLBACK"), "Enable auto rollback of the failed release to the previous deployed release version when current deploy process have failed ($WERF_AUTO_ROLLBACK by default)") + cmd.Flags().BoolVarP(&cmdData.AutoRollback, "atomic", "", util.GetBoolEnvironmentDefaultFalse("WERF_ATOMIC"), "Enable auto rollback of the failed release to the previous deployed release version when current deploy process have failed ($WERF_ATOMIC by default)") return cmd } diff --git a/cmd/werf/cr/login/login.go b/cmd/werf/cr/login/login.go index b5ec9a10b5..3493346439 100644 --- a/cmd/werf/cr/login/login.go +++ b/cmd/werf/cr/login/login.go @@ -14,6 +14,7 @@ import ( "github.com/werf/logboek" "github.com/werf/werf/cmd/werf/common" secret_common "github.com/werf/werf/cmd/werf/helm/secret/common" + "github.com/werf/werf/pkg/util" "github.com/werf/werf/pkg/werf" "github.com/werf/werf/pkg/werf/global_warnings" ) @@ -72,7 +73,7 @@ werf cr login --insecure-registry registry.example.com`, cmd.Flags().StringVarP(&cmdData.Username, "username", "u", os.Getenv("WERF_USERNAME"), "Use specified username for login (default $WERF_USERNAME)") cmd.Flags().StringVarP(&cmdData.Password, "password", "p", os.Getenv("WERF_PASSWORD"), "Use specified password for login (default $WERF_PASSWORD)") - cmd.Flags().BoolVarP(&cmdData.PasswordStdin, "password-stdin", "", common.GetBoolEnvironmentDefaultFalse("WERF_PASSWORD_STDIN"), "Read password from stdin for login (default $WERF_PASSWORD_STDIN)") + cmd.Flags().BoolVarP(&cmdData.PasswordStdin, "password-stdin", "", util.GetBoolEnvironmentDefaultFalse("WERF_PASSWORD_STDIN"), "Read password from stdin for login (default $WERF_PASSWORD_STDIN)") return cmd } diff --git a/cmd/werf/dismiss/dismiss.go b/cmd/werf/dismiss/dismiss.go index bee7a6c02d..6e41278467 100644 --- a/cmd/werf/dismiss/dismiss.go +++ b/cmd/werf/dismiss/dismiss.go @@ -22,6 +22,7 @@ import ( "github.com/werf/werf/pkg/image" "github.com/werf/werf/pkg/storage/lrumeta" "github.com/werf/werf/pkg/true_git" + "github.com/werf/werf/pkg/util" "github.com/werf/werf/pkg/werf" "github.com/werf/werf/pkg/werf/global_warnings" ) @@ -116,8 +117,8 @@ Read more info about Helm Release name, Kubernetes Namespace and how to change i common.SetupPlatform(&commonCmdData, cmd) - cmd.Flags().BoolVarP(&cmdData.WithNamespace, "with-namespace", "", common.GetBoolEnvironmentDefaultFalse("WERF_WITH_NAMESPACE"), "Delete Kubernetes Namespace after purging Helm Release (default $WERF_WITH_NAMESPACE)") - cmd.Flags().BoolVarP(&cmdData.WithHooks, "with-hooks", "", common.GetBoolEnvironmentDefaultTrue("WERF_WITH_HOOKS"), "Delete Helm Release hooks getting from existing revisions (default $WERF_WITH_HOOKS or true)") + cmd.Flags().BoolVarP(&cmdData.WithNamespace, "with-namespace", "", util.GetBoolEnvironmentDefaultFalse("WERF_WITH_NAMESPACE"), "Delete Kubernetes Namespace after purging Helm Release (default $WERF_WITH_NAMESPACE)") + cmd.Flags().BoolVarP(&cmdData.WithHooks, "with-hooks", "", util.GetBoolEnvironmentDefaultTrue("WERF_WITH_HOOKS"), "Delete Helm Release hooks getting from existing revisions (default $WERF_WITH_HOOKS or true)") return cmd } diff --git a/cmd/werf/host/cleanup/cleanup.go b/cmd/werf/host/cleanup/cleanup.go index 62c059e448..549a5f7ab1 100644 --- a/cmd/werf/host/cleanup/cleanup.go +++ b/cmd/werf/host/cleanup/cleanup.go @@ -15,6 +15,7 @@ import ( "github.com/werf/werf/pkg/image" "github.com/werf/werf/pkg/storage/lrumeta" "github.com/werf/werf/pkg/true_git" + "github.com/werf/werf/pkg/util" "github.com/werf/werf/pkg/werf" "github.com/werf/werf/pkg/werf/global_warnings" ) @@ -80,7 +81,7 @@ It is safe to run this command periodically by automated cleanup job in parallel common.SetupInsecureRegistry(&commonCmdData, cmd) common.SetupSkipTlsVerifyRegistry(&commonCmdData, cmd) - cmd.Flags().BoolVarP(&cmdData.Force, "force", "", common.GetBoolEnvironmentDefaultFalse("WERF_FORCE"), "Force deletion of images which are being used by some containers (default $WERF_FORCE)") + cmd.Flags().BoolVarP(&cmdData.Force, "force", "", util.GetBoolEnvironmentDefaultFalse("WERF_FORCE"), "Force deletion of images which are being used by some containers (default $WERF_FORCE)") return cmd } diff --git a/cmd/werf/kube_run/kube_run.go b/cmd/werf/kube_run/kube_run.go index f47274ba87..92324a58a6 100644 --- a/cmd/werf/kube_run/kube_run.go +++ b/cmd/werf/kube_run/kube_run.go @@ -190,11 +190,11 @@ func NewCmd() *cobra.Command { cmd.Flags().StringVarP(&cmdData.Pod, "pod", "", os.Getenv("WERF_POD"), "Set created pod name (default $WERF_POD or autogenerated if not specified)") cmd.Flags().StringVarP(&cmdData.Overrides, "overrides", "", os.Getenv("WERF_OVERRIDES"), "Inline JSON to override/extend any fields in created Pod, e.g. to add imagePullSecrets field (default $WERF_OVERRIDES). %pod_name% and %container_name% will be replaced with names of a created pod and a container.") cmd.Flags().StringVarP(&cmdData.RunExtraOptions, "extra-options", "", os.Getenv("WERF_EXTRA_OPTIONS"), "Pass extra options to \"kubectl run\" command, which will create a Pod (default $WERF_EXTRA_OPTIONS)") - cmd.Flags().BoolVarP(&cmdData.Rm, "rm", "", common.GetBoolEnvironmentDefaultTrue("WERF_RM"), "Remove pod and other created resources after command completion (default $WERF_RM or true if not specified)") - cmd.Flags().BoolVarP(&cmdData.RmWithNamespace, "rm-with-namespace", "", common.GetBoolEnvironmentDefaultFalse("WERF_RM_WITH_NAMESPACE"), "Remove also a namespace after command completion (default $WERF_RM_WITH_NAMESPACE or false if not specified)") - cmd.Flags().BoolVarP(&cmdData.Interactive, "interactive", "i", common.GetBoolEnvironmentDefaultFalse("WERF_INTERACTIVE"), "Enable interactive mode (default $WERF_INTERACTIVE or false if not specified)") - cmd.Flags().BoolVarP(&cmdData.AllocateTty, "tty", "t", common.GetBoolEnvironmentDefaultFalse("WERF_TTY"), "Allocate a TTY (default $WERF_TTY or false if not specified)") - cmd.Flags().BoolVarP(&cmdData.AutoPullSecret, "auto-pull-secret", "", common.GetBoolEnvironmentDefaultTrue("WERF_AUTO_PULL_SECRET"), "Automatically create docker config secret in the namespace and plug it via pod's imagePullSecrets for private registry access (default $WERF_AUTO_PULL_SECRET or true if not specified)") + cmd.Flags().BoolVarP(&cmdData.Rm, "rm", "", util.GetBoolEnvironmentDefaultTrue("WERF_RM"), "Remove pod and other created resources after command completion (default $WERF_RM or true if not specified)") + cmd.Flags().BoolVarP(&cmdData.RmWithNamespace, "rm-with-namespace", "", util.GetBoolEnvironmentDefaultFalse("WERF_RM_WITH_NAMESPACE"), "Remove also a namespace after command completion (default $WERF_RM_WITH_NAMESPACE or false if not specified)") + cmd.Flags().BoolVarP(&cmdData.Interactive, "interactive", "i", util.GetBoolEnvironmentDefaultFalse("WERF_INTERACTIVE"), "Enable interactive mode (default $WERF_INTERACTIVE or false if not specified)") + cmd.Flags().BoolVarP(&cmdData.AllocateTty, "tty", "t", util.GetBoolEnvironmentDefaultFalse("WERF_TTY"), "Allocate a TTY (default $WERF_TTY or false if not specified)") + cmd.Flags().BoolVarP(&cmdData.AutoPullSecret, "auto-pull-secret", "", util.GetBoolEnvironmentDefaultTrue("WERF_AUTO_PULL_SECRET"), "Automatically create docker config secret in the namespace and plug it via pod's imagePullSecrets for private registry access (default $WERF_AUTO_PULL_SECRET or true if not specified)") cmd.Flags().StringArrayVarP(&cmdData.CopyFrom, "copy-from", "", []string{}, "Copy file/dir from container to local machine after user command execution (default $WERF_COPY_FROM). Example: \"/from/file:to\".") cmd.Flags().StringArrayVarP(&cmdData.CopyTo, "copy-to", "", []string{}, "Copy file/dir from local machine to container before user command execution (default $WERF_COPY_TO). Example: \"from:/to/file\".") @@ -1107,9 +1107,9 @@ func cleanCopyToLocalPath(rawPath string) (string, error) { } func getCopyFromRaw() []string { - return append(common.PredefinedValuesByEnvNamePrefix("WERF_COPY_FROM_"), cmdData.CopyFrom...) + return append(util.PredefinedValuesByEnvNamePrefix("WERF_COPY_FROM_"), cmdData.CopyFrom...) } func getCopyToRaw() []string { - return append(common.PredefinedValuesByEnvNamePrefix("WERF_COPY_TO_"), cmdData.CopyTo...) + return append(util.PredefinedValuesByEnvNamePrefix("WERF_COPY_TO_"), cmdData.CopyTo...) } diff --git a/cmd/werf/kubectl/kubectl.go b/cmd/werf/kubectl/kubectl.go index 592af90869..2bb98c28d7 100644 --- a/cmd/werf/kubectl/kubectl.go +++ b/cmd/werf/kubectl/kubectl.go @@ -14,6 +14,7 @@ import ( "github.com/werf/werf/cmd/werf/common" "github.com/werf/werf/pkg/tmp_manager" + util2 "github.com/werf/werf/pkg/util" "github.com/werf/werf/pkg/werf" ) @@ -49,7 +50,7 @@ func NewCmd() *cobra.Command { skipTlsVerifyRegistryFlag := kubectlCmd.Flag("insecure-skip-tls-verify") skipTlsVerifyRegistryFlag.Usage = "If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure (default $WERF_SKIP_TLS_VERIFY_REGISTRY)" - if isSkipTlsVerifyRegistry := common.GetBoolEnvironmentDefaultFalse("WERF_SKIP_TLS_VERIFY_REGISTRY"); isSkipTlsVerifyRegistry { + if isSkipTlsVerifyRegistry := util2.GetBoolEnvironmentDefaultFalse("WERF_SKIP_TLS_VERIFY_REGISTRY"); isSkipTlsVerifyRegistry { if err := kubectlCmd.Flags().Set("insecure-skip-tls-verify", "true"); err != nil { util.CheckErr(fmt.Errorf("unable to set insecure-skip-tls-verify flag for kubectl: %w", err)) } diff --git a/cmd/werf/render/render.go b/cmd/werf/render/render.go index aab1d1fe0d..3b55ce01fa 100644 --- a/cmd/werf/render/render.go +++ b/cmd/werf/render/render.go @@ -137,8 +137,8 @@ func NewCmd() *cobra.Command { common.SetupSkipBuild(&commonCmdData, cmd) common.SetupPlatform(&commonCmdData, cmd) - cmd.Flags().BoolVarP(&cmdData.Validate, "validate", "", common.GetBoolEnvironmentDefaultFalse("WERF_VALIDATE"), "Validate your manifests against the Kubernetes cluster you are currently pointing at (default $WERF_VALIDATE)") - cmd.Flags().BoolVarP(&cmdData.IncludeCRDs, "include-crds", "", common.GetBoolEnvironmentDefaultTrue("WERF_INCLUDE_CRDS"), "Include CRDs in the templated output (default $WERF_INCLUDE_CRDS)") + cmd.Flags().BoolVarP(&cmdData.Validate, "validate", "", util.GetBoolEnvironmentDefaultFalse("WERF_VALIDATE"), "Validate your manifests against the Kubernetes cluster you are currently pointing at (default $WERF_VALIDATE)") + cmd.Flags().BoolVarP(&cmdData.IncludeCRDs, "include-crds", "", util.GetBoolEnvironmentDefaultTrue("WERF_INCLUDE_CRDS"), "Include CRDs in the templated output (default $WERF_INCLUDE_CRDS)") cmd.Flags().StringVarP(&cmdData.RenderOutput, "output", "", os.Getenv("WERF_RENDER_OUTPUT"), "Write render output to the specified file instead of stdout ($WERF_RENDER_OUTPUT by default)") cmd.Flags().StringArrayVarP(&cmdData.ShowOnly, "show-only", "s", []string{}, "only show manifests rendered from the given templates") @@ -147,7 +147,7 @@ func NewCmd() *cobra.Command { } func getShowOnly() []string { - return append(common.PredefinedValuesByEnvNamePrefix("WERF_SHOW_ONLY"), cmdData.ShowOnly...) + return append(util.PredefinedValuesByEnvNamePrefix("WERF_SHOW_ONLY"), cmdData.ShowOnly...) } func runRender(ctx context.Context) error { diff --git a/cmd/werf/synchronization/main.go b/cmd/werf/synchronization/main.go index e19f4b865f..dbfd1d5887 100644 --- a/cmd/werf/synchronization/main.go +++ b/cmd/werf/synchronization/main.go @@ -17,6 +17,7 @@ import ( "github.com/werf/werf/pkg/kubeutils" "github.com/werf/werf/pkg/storage" "github.com/werf/werf/pkg/storage/synchronization_server" + "github.com/werf/werf/pkg/util" "github.com/werf/werf/pkg/werf" ) @@ -65,11 +66,11 @@ func NewCmd() *cobra.Command { common.SetupKubeConfigBase64(&commonCmdData, cmd) common.SetupKubeContext(&commonCmdData, cmd) - cmd.Flags().BoolVarP(&cmdData.Local, "local", "", common.GetBoolEnvironmentDefaultTrue("WERF_LOCAL"), "Use file lock-manager and file stages-storage-cache (true by default or $WERF_LOCAL)") + cmd.Flags().BoolVarP(&cmdData.Local, "local", "", util.GetBoolEnvironmentDefaultTrue("WERF_LOCAL"), "Use file lock-manager and file stages-storage-cache (true by default or $WERF_LOCAL)") cmd.Flags().StringVarP(&cmdData.LocalLockManagerBaseDir, "local-lock-manager-base-dir", "", os.Getenv("WERF_LOCAL_LOCK_MANAGER_BASE_DIR"), "Use specified directory as base for file lock-manager (~/.werf/synchronization_server/lock_manager by default or $WERF_LOCAL_LOCK_MANAGER_BASE_DIR)") cmd.Flags().StringVarP(&cmdData.LocalStagesStorageCacheBaseDir, "local-stages-storage-cache-base-dir", "", os.Getenv("WERF_LOCAL_STAGES_STORAGE_CACHE_BASE_DIR"), "Use specified directory as base for file stages-storage-cache (~/.werf/synchronization_server/stages_storage_cache by default or $WERF_LOCAL_STAGES_STORAGE_CACHE_BASE_DIR)") - cmd.Flags().BoolVarP(&cmdData.Kubernetes, "kubernetes", "", common.GetBoolEnvironmentDefaultFalse("WERF_KUBERNETES"), "Use kubernetes lock-manager stages-storage-cache (default $WERF_KUBERNETES)") + cmd.Flags().BoolVarP(&cmdData.Kubernetes, "kubernetes", "", util.GetBoolEnvironmentDefaultFalse("WERF_KUBERNETES"), "Use kubernetes lock-manager stages-storage-cache (default $WERF_KUBERNETES)") cmd.Flags().StringVarP(&cmdData.KubernetesNamespacePrefix, "kubernetes-namespace-prefix", "", os.Getenv("WERF_KUBERNETES_NAMESPACE_PREFIX"), "Use specified prefix for namespaces created for lock-manager and stages-storage-cache (defaults to 'werf-synchronization-' when --kubernetes option is used or $WERF_KUBERNETES_NAMESPACE_PREFIX)") cmd.Flags().StringVarP(&cmdData.TTL, "ttl", "", os.Getenv("WERF_TTL"), "Time to live for lock-manager locks and stages-storage-cache records (default $WERF_TTL)") diff --git a/pkg/util/env.go b/pkg/util/env.go new file mode 100644 index 0000000000..7074492df8 --- /dev/null +++ b/pkg/util/env.go @@ -0,0 +1,108 @@ +package util + +import ( + "fmt" + "os" + "sort" + "strconv" + "strings" +) + +func GetBoolEnvironmentDefaultFalse(environmentName string) bool { + switch os.Getenv(environmentName) { + case "1", "true", "yes": + return true + default: + return false + } +} + +func GetBoolEnvironmentDefaultTrue(environmentName string) bool { + switch os.Getenv(environmentName) { + case "0", "false", "no": + return false + default: + return true + } +} + +func GetFirstExistingEnvVarAsString(envNames ...string) string { + for _, envName := range envNames { + if v := os.Getenv(envName); v != "" { + return v + } + } + + return "" +} + +func PredefinedValuesByEnvNamePrefix(envNamePrefix string, envNamePrefixesToExcept ...string) []string { + var result []string + + env := os.Environ() + sort.Strings(env) + +environLoop: + for _, keyValue := range env { + parts := strings.SplitN(keyValue, "=", 2) + if strings.HasPrefix(parts[0], envNamePrefix) { + for _, exceptEnvNamePrefix := range envNamePrefixesToExcept { + if strings.HasPrefix(parts[0], exceptEnvNamePrefix) { + continue environLoop + } + } + + result = append(result, parts[1]) + } + } + + return result +} + +func GetInt64EnvVar(varName string) (*int64, error) { + if v := os.Getenv(varName); v != "" { + vInt, err := strconv.ParseInt(v, 10, 64) + if err != nil { + return nil, fmt.Errorf("bad %s variable value %q: %w", varName, v, err) + } + + res := new(int64) + *res = vInt + + return res, nil + } + + return nil, nil +} + +func GetIntEnvVar(varName string) (*int64, error) { + if v := os.Getenv(varName); v != "" { + vInt, err := strconv.ParseInt(v, 10, 64) + if err != nil { + return nil, fmt.Errorf("bad %s variable value %q: %w", varName, v, err) + } + + res := new(int64) + *res = vInt + + return res, nil + } + + return nil, nil +} + +func GetUint64EnvVar(varName string) (*uint64, error) { + if v := os.Getenv(varName); v != "" { + vUint, err := strconv.ParseUint(v, 10, 64) + if err != nil { + return nil, fmt.Errorf("bad %s variable value %q: %w", varName, v, err) + } + + res := new(uint64) + *res = vUint + + return res, nil + } + + return nil, nil +}