cmd/hub/lifecycle/ask.go (108 lines of code) (raw):

// Copyright (c) 2022 EPAM Systems, Inc. // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. package lifecycle import ( "fmt" "log" "os" "strings" "github.com/mattn/go-isatty" "github.com/epam/hubctl/cmd/hub/config" "github.com/epam/hubctl/cmd/hub/manifest" "github.com/epam/hubctl/cmd/hub/util" ) func AskParameter(parameter manifest.Parameter, environment map[string]string, hubEnvironment, hubStackInstance, hubApplication string, isDeploy bool) (interface{}, error) { qName := parameter.QName() if parameter.FromEnv != "" { key := parameter.FromEnv if environment != nil { if v, exist := environment[key]; exist { return v, nil } } if v, exist := os.LookupEnv(key); exist { return v, nil } } if parameter.FromFile != "" { filename := parameter.FromFile if filename[0] == '$' && len(filename) > 1 { key := filename[1:] filename = "" if environment != nil { if v, exist := environment[key]; exist { filename = v } } if filename == "" { if v, exist := os.LookupEnv(key); exist { filename = v } } if filename == "" { util.Warn("Parameter `%s` `fromFile = %s` expands to an empty filename", qName, parameter.FromFile) } } if filename != "" { bytes, err := os.ReadFile(filename) if err != nil { return "(error)", fmt.Errorf("Error reading `%s`: %v", filename, err) } return string(bytes), nil } } if hubEnvironment != "" || hubStackInstance != "" || hubApplication != "" { found, v, errs := getParameterOrMaybeCreateSecret(hubEnvironment, hubStackInstance, hubApplication, parameter.Name, parameter.Component, isDeploy && parameter.Empty != "allow") if len(errs) > 0 { where := make([]string, 0, 3) if hubEnvironment != "" { where = append(where, fmt.Sprintf("environment `%s`", hubEnvironment)) } if hubStackInstance != "" { where = append(where, fmt.Sprintf("stack instance `%s`", hubStackInstance)) } if hubApplication != "" { where = append(where, fmt.Sprintf("application `%s`", hubApplication)) } util.Warn("Error query parameter `%s` in %s:\n\t%s", qName, strings.Join(where, ", "), util.Errors("\n\t", errs...)) } if found && v != "" { return v, nil } } // TODO review // if parameter with default value is marked empty: allow, then we set value to default without prompt if parameter.Empty != "allow" && isatty.IsTerminal(os.Stdin.Fd()) { prompt := "Enter value for" if parameter.Brief != "" { prompt = fmt.Sprintf("%s %s (%s)", prompt, parameter.Brief, qName) } else { prompt = fmt.Sprintf("%s %s", prompt, qName) } if !util.Empty(parameter.Default) { prompt = fmt.Sprintf("%s [%v]", prompt, parameter.Default) } fmt.Printf("%s: ", prompt) var value string read, err := fmt.Scanln(&value) if read > 0 { if err != nil { return "(error)", fmt.Errorf("Error reading input: %v (read %d items)", err, read) } return value, nil } } if !util.Empty(parameter.Default) { return parameter.Default, nil } if parameter.Env != "" && parameter.FromEnv == "" { util.Warn("Parameter `%s` has `env = %s` assigned. Did you mean `fromEnv`?", qName, parameter.Env) } if parameter.Empty == "allow" { if config.Debug { log.Printf("Empty parameter `%s` value allowed", qName) } return "", nil } return "(unknown)", fmt.Errorf("Parameter `%s` has no value nor default assigned", qName) }