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 }