|
|
@@ -1,14 +1,20 @@
|
|
|
package cmd
|
|
|
|
|
|
import (
|
|
|
+ "context"
|
|
|
"fmt"
|
|
|
"io/ioutil"
|
|
|
"os"
|
|
|
"path/filepath"
|
|
|
"strconv"
|
|
|
"strings"
|
|
|
+ "time"
|
|
|
|
|
|
+ "github.com/briandowns/spinner"
|
|
|
"github.com/fatih/color"
|
|
|
+ api "github.com/porter-dev/porter/api/client"
|
|
|
+ "github.com/porter-dev/porter/api/types"
|
|
|
+ "github.com/porter-dev/porter/cli/cmd/utils"
|
|
|
"github.com/spf13/cobra"
|
|
|
"github.com/spf13/viper"
|
|
|
|
|
|
@@ -278,63 +284,87 @@ var configCmd = &cobra.Command{
|
|
|
|
|
|
var configSetProjectCmd = &cobra.Command{
|
|
|
Use: "set-project [id]",
|
|
|
- Args: cobra.ExactArgs(1),
|
|
|
+ Args: cobra.MaximumNArgs(1),
|
|
|
Short: "Saves the project id in the default configuration",
|
|
|
Run: func(cmd *cobra.Command, args []string) {
|
|
|
- projID, err := strconv.ParseUint(args[0], 10, 64)
|
|
|
+ if len(args) == 0 {
|
|
|
+ err := checkLoginAndRun(args, listAndSetProject)
|
|
|
|
|
|
- if err != nil {
|
|
|
- color.New(color.FgRed).Printf("An error occurred: %v\n", err)
|
|
|
- os.Exit(1)
|
|
|
- }
|
|
|
+ if err != nil {
|
|
|
+ os.Exit(1)
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ projID, err := strconv.ParseUint(args[0], 10, 64)
|
|
|
|
|
|
- err = config.SetProject(uint(projID))
|
|
|
+ if err != nil {
|
|
|
+ color.New(color.FgRed).Printf("An error occurred: %v\n", err)
|
|
|
+ os.Exit(1)
|
|
|
+ }
|
|
|
|
|
|
- if err != nil {
|
|
|
- color.New(color.FgRed).Printf("An error occurred: %v\n", err)
|
|
|
- os.Exit(1)
|
|
|
+ err = config.SetProject(uint(projID))
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ color.New(color.FgRed).Printf("An error occurred: %v\n", err)
|
|
|
+ os.Exit(1)
|
|
|
+ }
|
|
|
}
|
|
|
},
|
|
|
}
|
|
|
|
|
|
var configSetClusterCmd = &cobra.Command{
|
|
|
Use: "set-cluster [id]",
|
|
|
- Args: cobra.ExactArgs(1),
|
|
|
+ Args: cobra.MaximumNArgs(1),
|
|
|
Short: "Saves the cluster id in the default configuration",
|
|
|
Run: func(cmd *cobra.Command, args []string) {
|
|
|
- clusterID, err := strconv.ParseUint(args[0], 10, 64)
|
|
|
+ if len(args) == 0 {
|
|
|
+ err := checkLoginAndRun(args, listAndSetCluster)
|
|
|
|
|
|
- if err != nil {
|
|
|
- color.New(color.FgRed).Printf("An error occurred: %v\n", err)
|
|
|
- os.Exit(1)
|
|
|
- }
|
|
|
+ if err != nil {
|
|
|
+ os.Exit(1)
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ clusterID, err := strconv.ParseUint(args[0], 10, 64)
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ color.New(color.FgRed).Printf("An error occurred: %v\n", err)
|
|
|
+ os.Exit(1)
|
|
|
+ }
|
|
|
|
|
|
- err = config.SetCluster(uint(clusterID))
|
|
|
+ err = config.SetCluster(uint(clusterID))
|
|
|
|
|
|
- if err != nil {
|
|
|
- color.New(color.FgRed).Printf("An error occurred: %v\n", err)
|
|
|
- os.Exit(1)
|
|
|
+ if err != nil {
|
|
|
+ color.New(color.FgRed).Printf("An error occurred: %v\n", err)
|
|
|
+ os.Exit(1)
|
|
|
+ }
|
|
|
}
|
|
|
},
|
|
|
}
|
|
|
|
|
|
var configSetRegistryCmd = &cobra.Command{
|
|
|
Use: "set-registry [id]",
|
|
|
- Args: cobra.ExactArgs(1),
|
|
|
+ Args: cobra.MaximumNArgs(1),
|
|
|
Short: "Saves the registry id in the default configuration",
|
|
|
Run: func(cmd *cobra.Command, args []string) {
|
|
|
- registryID, err := strconv.ParseUint(args[0], 10, 64)
|
|
|
+ if len(args) == 0 {
|
|
|
+ err := checkLoginAndRun(args, listAndSetRegistry)
|
|
|
|
|
|
- if err != nil {
|
|
|
- color.New(color.FgRed).Printf("An error occurred: %v\n", err)
|
|
|
- os.Exit(1)
|
|
|
- }
|
|
|
+ if err != nil {
|
|
|
+ os.Exit(1)
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ registryID, err := strconv.ParseUint(args[0], 10, 64)
|
|
|
|
|
|
- err = config.SetRegistry(uint(registryID))
|
|
|
+ if err != nil {
|
|
|
+ color.New(color.FgRed).Printf("An error occurred: %v\n", err)
|
|
|
+ os.Exit(1)
|
|
|
+ }
|
|
|
|
|
|
- if err != nil {
|
|
|
- color.New(color.FgRed).Printf("An error occurred: %v\n", err)
|
|
|
- os.Exit(1)
|
|
|
+ err = config.SetRegistry(uint(registryID))
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ color.New(color.FgRed).Printf("An error occurred: %v\n", err)
|
|
|
+ os.Exit(1)
|
|
|
+ }
|
|
|
}
|
|
|
},
|
|
|
}
|
|
|
@@ -391,7 +421,131 @@ func printConfig() error {
|
|
|
return err
|
|
|
}
|
|
|
|
|
|
- fmt.Printf(string(config))
|
|
|
+ fmt.Println(string(config))
|
|
|
+
|
|
|
+ return nil
|
|
|
+}
|
|
|
+
|
|
|
+func listAndSetProject(_ *types.GetAuthenticatedUserResponse, client *api.Client, args []string) error {
|
|
|
+ s := spinner.New(spinner.CharSets[9], 100*time.Millisecond)
|
|
|
+ s.Color("cyan")
|
|
|
+ s.Suffix = " Loading list of projects"
|
|
|
+ s.Start()
|
|
|
+
|
|
|
+ resp, err := client.ListUserProjects(context.Background())
|
|
|
+
|
|
|
+ s.Stop()
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ var projID uint64
|
|
|
+
|
|
|
+ if len(*resp) > 1 {
|
|
|
+ // only give the option to select when more than one option exists
|
|
|
+ projName, err := utils.PromptSelect("Select a project with ID", func() []string {
|
|
|
+ var names []string
|
|
|
+
|
|
|
+ for _, proj := range *resp {
|
|
|
+ names = append(names, fmt.Sprintf("%s - %d", proj.Name, proj.ID))
|
|
|
+ }
|
|
|
+
|
|
|
+ return names
|
|
|
+ }())
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ projID, _ = strconv.ParseUint(strings.Split(projName, " - ")[1], 10, 64)
|
|
|
+ } else {
|
|
|
+ projID = uint64((*resp)[0].ID)
|
|
|
+ }
|
|
|
+
|
|
|
+ config.SetProject(uint(projID))
|
|
|
+
|
|
|
+ return nil
|
|
|
+}
|
|
|
+
|
|
|
+func listAndSetCluster(_ *types.GetAuthenticatedUserResponse, client *api.Client, args []string) error {
|
|
|
+ s := spinner.New(spinner.CharSets[9], 100*time.Millisecond)
|
|
|
+ s.Color("cyan")
|
|
|
+ s.Suffix = " Loading list of clusters"
|
|
|
+ s.Start()
|
|
|
+
|
|
|
+ resp, err := client.ListProjectClusters(context.Background(), config.Project)
|
|
|
+
|
|
|
+ s.Stop()
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ var clusterID uint64
|
|
|
+
|
|
|
+ if len(*resp) > 1 {
|
|
|
+ clusterName, err := utils.PromptSelect("Select a cluster with ID", func() []string {
|
|
|
+ var names []string
|
|
|
+
|
|
|
+ for _, cluster := range *resp {
|
|
|
+ names = append(names, fmt.Sprintf("%s - %d", cluster.Name, cluster.ID))
|
|
|
+ }
|
|
|
+
|
|
|
+ return names
|
|
|
+ }())
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ clusterID, _ = strconv.ParseUint(strings.Split(clusterName, " - ")[1], 10, 64)
|
|
|
+ } else {
|
|
|
+ clusterID = uint64((*resp)[0].ID)
|
|
|
+ }
|
|
|
+
|
|
|
+ config.SetCluster(uint(clusterID))
|
|
|
+
|
|
|
+ return nil
|
|
|
+}
|
|
|
+
|
|
|
+func listAndSetRegistry(_ *types.GetAuthenticatedUserResponse, client *api.Client, args []string) error {
|
|
|
+ s := spinner.New(spinner.CharSets[9], 100*time.Millisecond)
|
|
|
+ s.Color("cyan")
|
|
|
+ s.Suffix = " Loading list of registries"
|
|
|
+ s.Start()
|
|
|
+
|
|
|
+ resp, err := client.ListRegistries(context.Background(), config.Project)
|
|
|
+
|
|
|
+ s.Stop()
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ var regID uint64
|
|
|
+
|
|
|
+ if len(*resp) > 1 {
|
|
|
+ regName, err := utils.PromptSelect("Select a registry with ID", func() []string {
|
|
|
+ var names []string
|
|
|
+
|
|
|
+ for _, cluster := range *resp {
|
|
|
+ names = append(names, fmt.Sprintf("%s - %d", cluster.Name, cluster.ID))
|
|
|
+ }
|
|
|
+
|
|
|
+ return names
|
|
|
+ }())
|
|
|
+
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ regID, _ = strconv.ParseUint(strings.Split(regName, " - ")[1], 10, 64)
|
|
|
+ } else {
|
|
|
+ regID = uint64((*resp)[0].ID)
|
|
|
+ }
|
|
|
+
|
|
|
+ config.SetRegistry(uint(regID))
|
|
|
|
|
|
return nil
|
|
|
}
|