github.com/henvic/wedeploycli@v1.7.6-0.20200319005353-3630f582f284/command/new/project/project.go (about)

     1  package project
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"strings"
     7  
     8  	"github.com/henvic/wedeploycli/cmdflagsfromhost"
     9  	"github.com/henvic/wedeploycli/color"
    10  	"github.com/henvic/wedeploycli/command/internal/we"
    11  	"github.com/henvic/wedeploycli/fancy"
    12  	"github.com/henvic/wedeploycli/projects"
    13  	"github.com/henvic/wedeploycli/prompt"
    14  	"github.com/spf13/cobra"
    15  )
    16  
    17  // Don't use this anywhere but on Cmd.RunE
    18  var sh = cmdflagsfromhost.SetupHost{
    19  	Pattern: cmdflagsfromhost.RegionPattern | cmdflagsfromhost.ProjectAndRemotePattern,
    20  
    21  	Requires: cmdflagsfromhost.Requires{
    22  		Auth: true,
    23  	},
    24  }
    25  
    26  // Cmd is the command for creating a new project
    27  var Cmd = &cobra.Command{
    28  	Use:   "project",
    29  	Short: "Create new project",
    30  	// Don't use other run functions besides RunE here
    31  	// or fix NewCmd to call it correctly
    32  	RunE: runE,
    33  	Args: cobra.NoArgs,
    34  }
    35  
    36  func runE(cmd *cobra.Command, args []string) (err error) {
    37  	if err := sh.Process(context.Background(), we.Context()); err != nil {
    38  		return err
    39  	}
    40  
    41  	return Run(sh.Project(), sh.Region())
    42  }
    43  
    44  // Run command for creating a project
    45  func Run(projectID, region string) (err error) {
    46  	if projectID != "" {
    47  		return createProject(projectID, region)
    48  	}
    49  
    50  	fmt.Println(fancy.Question("Choose a project ID") + " " + fancy.Tip("default: random"))
    51  	projectID, err = fancy.Prompt()
    52  
    53  	if err != nil {
    54  		return err
    55  	}
    56  
    57  	return createProject(projectID, region)
    58  }
    59  
    60  func createProject(projectID, region string) error {
    61  	var err error
    62  	var project projects.Project
    63  
    64  	if region == "" {
    65  		region, err = promptRegion()
    66  
    67  		if err != nil {
    68  			return err
    69  		}
    70  	}
    71  
    72  	wectx := we.Context()
    73  	projectsClient := projects.New(wectx)
    74  
    75  	project, err = projectsClient.Create(context.Background(), projects.Project{
    76  		ProjectID: projectID,
    77  		Region:    region,
    78  	})
    79  
    80  	if err != nil {
    81  		return err
    82  	}
    83  
    84  	if strings.Contains(project.ProjectID, "-") {
    85  		return createdEnvironment(project)
    86  	}
    87  
    88  	return createdProject(project)
    89  }
    90  
    91  func promptRegion() (string, error) {
    92  	wectx := we.Context()
    93  	projectsClient := projects.New(wectx)
    94  
    95  	fmt.Printf("Please %s a region from the list below.\n",
    96  		color.Format(color.FgMagenta, color.Bold, "select"))
    97  
    98  	var regions, err = projectsClient.Regions(context.Background())
    99  
   100  	if err != nil {
   101  		return "", err
   102  	}
   103  
   104  	var m = map[string]int{}
   105  
   106  	fmt.Println(color.Format(color.FgHiBlack, "#\tRegion"))
   107  
   108  	for k, v := range regions {
   109  		fmt.Printf("%d\t%v (%v)\n", k+1, v.Location, v.Name)
   110  		m[v.Name] = k + 1
   111  	}
   112  
   113  	fmt.Print("Choice: ")
   114  	var i int
   115  	i, err = prompt.SelectOption(len(regions), m)
   116  
   117  	if err != nil {
   118  		return "", err
   119  	}
   120  
   121  	return regions[i].Name, nil
   122  }
   123  
   124  func createdProject(p projects.Project) error {
   125  	wectx := we.Context()
   126  
   127  	fmt.Printf(color.Format(
   128  		color.FgHiBlack, "Project \"")+
   129  		"%v"+
   130  		color.Format(color.FgHiBlack, "\" created on ")+
   131  		wectx.InfrastructureDomain()+
   132  		color.Format(color.FgHiBlack, ".")+
   133  		"\n",
   134  		p.ProjectID)
   135  	return nil
   136  }
   137  
   138  func createdEnvironment(p projects.Project) error {
   139  	wectx := we.Context()
   140  
   141  	fmt.Printf(color.Format(
   142  		color.FgHiBlack, "Project environment \"")+
   143  		"%v"+
   144  		color.Format(color.FgHiBlack, "\" created on ")+
   145  		wectx.InfrastructureDomain()+
   146  		color.Format(color.FgHiBlack, ".")+
   147  		"\n",
   148  		p.ProjectID)
   149  	return nil
   150  }
   151  
   152  func init() {
   153  	sh.Init(Cmd)
   154  }