|
|
@@ -14,262 +14,12 @@ import (
|
|
|
"github.com/fatih/color"
|
|
|
api "github.com/porter-dev/porter/api/client"
|
|
|
"github.com/porter-dev/porter/api/types"
|
|
|
+ cliConfig "github.com/porter-dev/porter/cli/cmd/config"
|
|
|
"github.com/porter-dev/porter/cli/cmd/utils"
|
|
|
"github.com/spf13/cobra"
|
|
|
- "github.com/spf13/viper"
|
|
|
-
|
|
|
- flag "github.com/spf13/pflag"
|
|
|
)
|
|
|
|
|
|
-// shared sets of flags used by multiple commands
|
|
|
-var driverFlagSet = flag.NewFlagSet("driver", flag.ExitOnError)
|
|
|
-var defaultFlagSet = flag.NewFlagSet("shared", flag.ExitOnError) // used by all commands
|
|
|
-var registryFlagSet = flag.NewFlagSet("registry", flag.ExitOnError)
|
|
|
-var helmRepoFlagSet = flag.NewFlagSet("helmrepo", flag.ExitOnError)
|
|
|
-
|
|
|
-// config is a shared object used by all commands
|
|
|
-var config = &CLIConfig{}
|
|
|
-
|
|
|
-// CLIConfig is the set of shared configuration options for the CLI commands.
|
|
|
-// This config is used by viper: calling Set() function for any parameter will
|
|
|
-// update the corresponding field in the viper config file.
|
|
|
-type CLIConfig struct {
|
|
|
- // Driver can be either "docker" or "local", and represents which driver is
|
|
|
- // used to run an instance of the server.
|
|
|
- Driver string `yaml:"driver"`
|
|
|
-
|
|
|
- Host string `yaml:"host"`
|
|
|
- Project uint `yaml:"project"`
|
|
|
- Cluster uint `yaml:"cluster"`
|
|
|
-
|
|
|
- Token string `yaml:"token"`
|
|
|
-
|
|
|
- Registry uint `yaml:"registry"`
|
|
|
- HelmRepo uint `yaml:"helm_repo"`
|
|
|
-}
|
|
|
-
|
|
|
-// InitAndLoadConfig populates the config object with the following precedence rules:
|
|
|
-// 1. flag
|
|
|
-// 2. env
|
|
|
-// 3. config
|
|
|
-// 4. default
|
|
|
-//
|
|
|
-// It populates the shared config object above
|
|
|
-func InitAndLoadConfig() {
|
|
|
- initAndLoadConfig(config)
|
|
|
-}
|
|
|
-
|
|
|
-func InitAndLoadNewConfig() *CLIConfig {
|
|
|
- newConfig := &CLIConfig{}
|
|
|
-
|
|
|
- initAndLoadConfig(newConfig)
|
|
|
-
|
|
|
- return newConfig
|
|
|
-}
|
|
|
-
|
|
|
-func initAndLoadConfig(_config *CLIConfig) {
|
|
|
- initFlagSet()
|
|
|
-
|
|
|
- // check that the .porter folder exists; create if not
|
|
|
- porterDir := filepath.Join(home, ".porter")
|
|
|
-
|
|
|
- if _, err := os.Stat(porterDir); os.IsNotExist(err) {
|
|
|
- os.Mkdir(porterDir, 0700)
|
|
|
- } else if err != nil {
|
|
|
- color.New(color.FgRed).Printf("%v\n", err)
|
|
|
- os.Exit(1)
|
|
|
- }
|
|
|
-
|
|
|
- viper.SetConfigName("porter")
|
|
|
- viper.SetConfigType("yaml")
|
|
|
- viper.AddConfigPath(porterDir)
|
|
|
-
|
|
|
- // Bind the flagset initialized above
|
|
|
- viper.BindPFlags(driverFlagSet)
|
|
|
- viper.BindPFlags(defaultFlagSet)
|
|
|
- viper.BindPFlags(registryFlagSet)
|
|
|
- viper.BindPFlags(helmRepoFlagSet)
|
|
|
-
|
|
|
- // Bind the environment variables with prefix "PORTER_"
|
|
|
- viper.SetEnvPrefix("PORTER")
|
|
|
- viper.BindEnv("host")
|
|
|
- viper.BindEnv("project")
|
|
|
- viper.BindEnv("cluster")
|
|
|
- viper.BindEnv("token")
|
|
|
-
|
|
|
- err := viper.ReadInConfig()
|
|
|
-
|
|
|
- if err != nil {
|
|
|
- if _, ok := err.(viper.ConfigFileNotFoundError); ok {
|
|
|
- // create blank config file
|
|
|
- err := ioutil.WriteFile(filepath.Join(home, ".porter", "porter.yaml"), []byte{}, 0644)
|
|
|
-
|
|
|
- if err != nil {
|
|
|
- color.New(color.FgRed).Printf("%v\n", err)
|
|
|
- os.Exit(1)
|
|
|
- }
|
|
|
- } else {
|
|
|
- // Config file was found but another error was produced
|
|
|
- color.New(color.FgRed).Printf("%v\n", err)
|
|
|
- os.Exit(1)
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // unmarshal the config into the shared config struct
|
|
|
- viper.Unmarshal(_config)
|
|
|
-}
|
|
|
-
|
|
|
-// initFlagSet initializes the shared flags used by multiple commands
|
|
|
-func initFlagSet() {
|
|
|
- driverFlagSet.StringVar(
|
|
|
- &config.Driver,
|
|
|
- "driver",
|
|
|
- "local",
|
|
|
- "driver to use (local or docker)",
|
|
|
- )
|
|
|
-
|
|
|
- defaultFlagSet.StringVar(
|
|
|
- &config.Host,
|
|
|
- "host",
|
|
|
- "https://dashboard.getporter.dev",
|
|
|
- "host URL of Porter instance",
|
|
|
- )
|
|
|
-
|
|
|
- defaultFlagSet.UintVar(
|
|
|
- &config.Project,
|
|
|
- "project",
|
|
|
- 0,
|
|
|
- "project ID of Porter project",
|
|
|
- )
|
|
|
-
|
|
|
- defaultFlagSet.UintVar(
|
|
|
- &config.Cluster,
|
|
|
- "cluster",
|
|
|
- 0,
|
|
|
- "cluster ID of Porter cluster",
|
|
|
- )
|
|
|
-
|
|
|
- defaultFlagSet.StringVar(
|
|
|
- &config.Token,
|
|
|
- "token",
|
|
|
- "",
|
|
|
- "token for Porter authentication",
|
|
|
- )
|
|
|
-
|
|
|
- registryFlagSet.UintVar(
|
|
|
- &config.Registry,
|
|
|
- "registry",
|
|
|
- 0,
|
|
|
- "registry ID of connected Porter registry",
|
|
|
- )
|
|
|
-
|
|
|
- helmRepoFlagSet.UintVar(
|
|
|
- &config.HelmRepo,
|
|
|
- "helmrepo",
|
|
|
- 0,
|
|
|
- "helm repo ID of connected Porter Helm repository",
|
|
|
- )
|
|
|
-}
|
|
|
-
|
|
|
-func (c *CLIConfig) SetDriver(driver string) error {
|
|
|
- viper.Set("driver", driver)
|
|
|
- color.New(color.FgGreen).Printf("Set the current driver as %s\n", driver)
|
|
|
- err := viper.WriteConfig()
|
|
|
-
|
|
|
- if err != nil {
|
|
|
- return err
|
|
|
- }
|
|
|
-
|
|
|
- config.Driver = driver
|
|
|
-
|
|
|
- return nil
|
|
|
-}
|
|
|
-
|
|
|
-func (c *CLIConfig) SetHost(host string) error {
|
|
|
- // a trailing / can lead to errors with the api server
|
|
|
- host = strings.TrimRight(host, "/")
|
|
|
-
|
|
|
- viper.Set("host", host)
|
|
|
- color.New(color.FgGreen).Printf("Set the current host as %s\n", host)
|
|
|
- err := viper.WriteConfig()
|
|
|
-
|
|
|
- if err != nil {
|
|
|
- return err
|
|
|
- }
|
|
|
-
|
|
|
- config.Host = host
|
|
|
-
|
|
|
- return nil
|
|
|
-}
|
|
|
-
|
|
|
-func (c *CLIConfig) SetProject(projectID uint) error {
|
|
|
- viper.Set("project", projectID)
|
|
|
- color.New(color.FgGreen).Printf("Set the current project as %d\n", projectID)
|
|
|
- err := viper.WriteConfig()
|
|
|
-
|
|
|
- if err != nil {
|
|
|
- return err
|
|
|
- }
|
|
|
-
|
|
|
- config.Project = projectID
|
|
|
-
|
|
|
- return nil
|
|
|
-}
|
|
|
-
|
|
|
-func (c *CLIConfig) SetCluster(clusterID uint) error {
|
|
|
- viper.Set("cluster", clusterID)
|
|
|
- color.New(color.FgGreen).Printf("Set the current cluster as %d\n", clusterID)
|
|
|
- err := viper.WriteConfig()
|
|
|
-
|
|
|
- if err != nil {
|
|
|
- return err
|
|
|
- }
|
|
|
-
|
|
|
- config.Cluster = clusterID
|
|
|
-
|
|
|
- return nil
|
|
|
-}
|
|
|
-
|
|
|
-func (c *CLIConfig) SetToken(token string) error {
|
|
|
- viper.Set("token", token)
|
|
|
- err := viper.WriteConfig()
|
|
|
-
|
|
|
- if err != nil {
|
|
|
- return err
|
|
|
- }
|
|
|
-
|
|
|
- config.Token = token
|
|
|
-
|
|
|
- return nil
|
|
|
-}
|
|
|
-
|
|
|
-func (c *CLIConfig) SetRegistry(registryID uint) error {
|
|
|
- viper.Set("registry", registryID)
|
|
|
- color.New(color.FgGreen).Printf("Set the current registry as %d\n", registryID)
|
|
|
- err := viper.WriteConfig()
|
|
|
-
|
|
|
- if err != nil {
|
|
|
- return err
|
|
|
- }
|
|
|
-
|
|
|
- config.Registry = registryID
|
|
|
-
|
|
|
- return nil
|
|
|
-}
|
|
|
-
|
|
|
-func (c *CLIConfig) SetHelmRepo(helmRepoID uint) error {
|
|
|
- viper.Set("helm_repo", helmRepoID)
|
|
|
- color.New(color.FgGreen).Printf("Set the current Helm repo as %d\n", helmRepoID)
|
|
|
- err := viper.WriteConfig()
|
|
|
-
|
|
|
- if err != nil {
|
|
|
- return err
|
|
|
- }
|
|
|
-
|
|
|
- config.HelmRepo = helmRepoID
|
|
|
-
|
|
|
- return nil
|
|
|
-}
|
|
|
+var cliConf = cliConfig.GetCLIConfig()
|
|
|
|
|
|
var configCmd = &cobra.Command{
|
|
|
Use: "config",
|
|
|
@@ -301,7 +51,7 @@ var configSetProjectCmd = &cobra.Command{
|
|
|
os.Exit(1)
|
|
|
}
|
|
|
|
|
|
- err = config.SetProject(uint(projID))
|
|
|
+ err = cliConf.SetProject(uint(projID))
|
|
|
|
|
|
if err != nil {
|
|
|
color.New(color.FgRed).Printf("An error occurred: %v\n", err)
|
|
|
@@ -330,7 +80,7 @@ var configSetClusterCmd = &cobra.Command{
|
|
|
os.Exit(1)
|
|
|
}
|
|
|
|
|
|
- err = config.SetCluster(uint(clusterID))
|
|
|
+ err = cliConf.SetCluster(uint(clusterID))
|
|
|
|
|
|
if err != nil {
|
|
|
color.New(color.FgRed).Printf("An error occurred: %v\n", err)
|
|
|
@@ -359,7 +109,7 @@ var configSetRegistryCmd = &cobra.Command{
|
|
|
os.Exit(1)
|
|
|
}
|
|
|
|
|
|
- err = config.SetRegistry(uint(registryID))
|
|
|
+ err = cliConf.SetRegistry(uint(registryID))
|
|
|
|
|
|
if err != nil {
|
|
|
color.New(color.FgRed).Printf("An error occurred: %v\n", err)
|
|
|
@@ -381,7 +131,7 @@ var configSetHelmRepoCmd = &cobra.Command{
|
|
|
os.Exit(1)
|
|
|
}
|
|
|
|
|
|
- err = config.SetHelmRepo(uint(hrID))
|
|
|
+ err = cliConf.SetHelmRepo(uint(hrID))
|
|
|
|
|
|
if err != nil {
|
|
|
color.New(color.FgRed).Printf("An error occurred: %v\n", err)
|
|
|
@@ -395,7 +145,7 @@ var configSetHostCmd = &cobra.Command{
|
|
|
Args: cobra.ExactArgs(1),
|
|
|
Short: "Saves the host in the default configuration",
|
|
|
Run: func(cmd *cobra.Command, args []string) {
|
|
|
- err := config.SetHost(args[0])
|
|
|
+ err := cliConf.SetHost(args[0])
|
|
|
|
|
|
if err != nil {
|
|
|
color.New(color.FgRed).Printf("An error occurred: %v\n", err)
|
|
|
@@ -463,7 +213,7 @@ func listAndSetProject(_ *types.GetAuthenticatedUserResponse, client *api.Client
|
|
|
projID = uint64((*resp)[0].ID)
|
|
|
}
|
|
|
|
|
|
- config.SetProject(uint(projID))
|
|
|
+ cliConf.SetProject(uint(projID))
|
|
|
|
|
|
return nil
|
|
|
}
|
|
|
@@ -474,7 +224,7 @@ func listAndSetCluster(_ *types.GetAuthenticatedUserResponse, client *api.Client
|
|
|
s.Suffix = " Loading list of clusters"
|
|
|
s.Start()
|
|
|
|
|
|
- resp, err := client.ListProjectClusters(context.Background(), config.Project)
|
|
|
+ resp, err := client.ListProjectClusters(context.Background(), cliConf.Project)
|
|
|
|
|
|
s.Stop()
|
|
|
|
|
|
@@ -504,7 +254,7 @@ func listAndSetCluster(_ *types.GetAuthenticatedUserResponse, client *api.Client
|
|
|
clusterID = uint64((*resp)[0].ID)
|
|
|
}
|
|
|
|
|
|
- config.SetCluster(uint(clusterID))
|
|
|
+ cliConf.SetCluster(uint(clusterID))
|
|
|
|
|
|
return nil
|
|
|
}
|
|
|
@@ -515,7 +265,7 @@ func listAndSetRegistry(_ *types.GetAuthenticatedUserResponse, client *api.Clien
|
|
|
s.Suffix = " Loading list of registries"
|
|
|
s.Start()
|
|
|
|
|
|
- resp, err := client.ListRegistries(context.Background(), config.Project)
|
|
|
+ resp, err := client.ListRegistries(context.Background(), cliConf.Project)
|
|
|
|
|
|
s.Stop()
|
|
|
|
|
|
@@ -545,7 +295,7 @@ func listAndSetRegistry(_ *types.GetAuthenticatedUserResponse, client *api.Clien
|
|
|
regID = uint64((*resp)[0].ID)
|
|
|
}
|
|
|
|
|
|
- config.SetRegistry(uint(regID))
|
|
|
+ cliConf.SetRegistry(uint(regID))
|
|
|
|
|
|
return nil
|
|
|
}
|