124 lines
3.6 KiB
Go
124 lines
3.6 KiB
Go
package client
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"runtime"
|
|
"strings"
|
|
|
|
Cli "github.com/hyperhq/hypercli/cli"
|
|
"github.com/hyperhq/hypercli/cliconfig"
|
|
flag "github.com/hyperhq/hypercli/pkg/mflag"
|
|
)
|
|
|
|
// CmdConfig
|
|
//
|
|
// Usage: hyper config
|
|
func (cli *DockerCli) CmdConfig(args ...string) error {
|
|
cmd := Cli.Subcmd("config", []string{"[REGION]"}, Cli.DockerCommands["config"].Description+".\nIf no region is specified, the default is defined as "+cliconfig.DefaultHyperRegion, true)
|
|
cmd.Require(flag.Max, 1)
|
|
|
|
flAccesskey := cmd.String([]string{"-accesskey"}, "", "Access Key")
|
|
flSecretkey := cmd.String([]string{"-secretkey"}, "", "Secret Key")
|
|
flDefaultRegion := cmd.String([]string{"-default-region"}, "", "Default Region Endpoint")
|
|
|
|
cmd.ParseFlags(args, true)
|
|
|
|
// On Windows, force the use of the regular OS stdin stream. Fixes #14336/#14210
|
|
if runtime.GOOS == "windows" {
|
|
cli.in = os.Stdin
|
|
}
|
|
|
|
var serverAddress string
|
|
if len(cmd.Args()) > 0 {
|
|
serverAddress = cmd.Arg(0)
|
|
} else {
|
|
serverAddress = cliconfig.DefaultHyperFormat
|
|
}
|
|
|
|
_, err := cli.configureCloud(serverAddress, *flDefaultRegion, *flAccesskey, *flSecretkey)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := cli.configFile.Save(); err != nil {
|
|
return fmt.Errorf("Error saving config file: %v", err)
|
|
}
|
|
fmt.Fprintf(cli.out, "WARNING: Your login credentials has been saved in %s\n", cli.configFile.Filename())
|
|
|
|
return nil
|
|
}
|
|
|
|
func (cli *DockerCli) configureCloud(serverAddress, flRegion, flAccesskey, flSecretkey string) (cliconfig.CloudConfig, error) {
|
|
cloudConfig := cliconfig.CloudConfig{}
|
|
if serverAddress != "" {
|
|
if cc, ok := cli.configFile.CloudConfig[serverAddress]; ok {
|
|
cloudConfig = cc
|
|
} else {
|
|
// for legacy format
|
|
defaultHost := "tcp://" + cliconfig.DefaultHyperRegion + "." + cliconfig.DefaultHyperEndpoint
|
|
cloudConfig, ok = cli.configFile.CloudConfig[defaultHost]
|
|
if ok {
|
|
delete(cli.configFile.CloudConfig, defaultHost)
|
|
}
|
|
}
|
|
}
|
|
|
|
defaultRegion := cli.getDefaultRegion()
|
|
if cloudConfig.Region != "" {
|
|
defaultRegion = cloudConfig.Region
|
|
}
|
|
if flAccesskey = strings.TrimSpace(flAccesskey); flAccesskey == "" {
|
|
cli.promptWithDefault("Enter Access Key", cloudConfig.AccessKey)
|
|
flAccesskey = readInput(cli.in, cli.out)
|
|
flAccesskey = strings.TrimSpace(flAccesskey)
|
|
if flAccesskey == "" {
|
|
flAccesskey = cloudConfig.AccessKey
|
|
}
|
|
}
|
|
if flSecretkey = strings.TrimSpace(flSecretkey); flSecretkey == "" {
|
|
cli.promptWithDefault("Enter Secret Key", cloudConfig.SecretKey)
|
|
flSecretkey = readInput(cli.in, cli.out)
|
|
flSecretkey = strings.TrimSpace(flSecretkey)
|
|
if flSecretkey == "" {
|
|
flSecretkey = cloudConfig.SecretKey
|
|
}
|
|
}
|
|
if flRegion = strings.TrimSpace(flRegion); flRegion == "" {
|
|
cli.promptWithDefault("Enter Default Region", defaultRegion)
|
|
flRegion = readInput(cli.in, cli.out)
|
|
flRegion = strings.TrimSpace(flRegion)
|
|
if flRegion == "" {
|
|
flRegion = defaultRegion
|
|
}
|
|
}
|
|
|
|
cloudConfig.AccessKey = flAccesskey
|
|
cloudConfig.SecretKey = flSecretkey
|
|
cloudConfig.Region = flRegion
|
|
if serverAddress != "" {
|
|
cli.configFile.CloudConfig[serverAddress] = cloudConfig
|
|
}
|
|
|
|
return cloudConfig, nil
|
|
}
|
|
|
|
func (cli *DockerCli) checkCloudConfig() error {
|
|
_, ok := cli.configFile.CloudConfig[cli.host]
|
|
if !ok {
|
|
_, ok = cli.configFile.CloudConfig[cliconfig.DefaultHyperFormat]
|
|
if !ok {
|
|
return fmt.Errorf("Config info for the host is not found, please run 'hyper config %s' first.", cli.host)
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (cli *DockerCli) getDefaultRegion() string {
|
|
cc, ok := cli.configFile.CloudConfig[cliconfig.DefaultHyperFormat]
|
|
if ok && cc.Region != "" {
|
|
return cc.Region
|
|
}
|
|
return cliconfig.DefaultHyperRegion
|
|
}
|