Skip to content

Commit eb155e9

Browse files
committed
refactor: make dtm start module more readable
Signed-off-by: Daniel Hu <[email protected]>
1 parent e2597ad commit eb155e9

File tree

3 files changed

+152
-170
lines changed

3 files changed

+152
-170
lines changed

internal/pkg/start/install.go

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
package start
2+
3+
import (
4+
"fmt"
5+
"os"
6+
"os/exec"
7+
"time"
8+
9+
"github.com/manifoldco/promptui"
10+
)
11+
12+
func installDocker() error {
13+
if !confirm("Docker") {
14+
return fmt.Errorf("user cancelled")
15+
}
16+
17+
if err := execCommand([]string{"brew", "install", "docker", "--cask"}); err != nil {
18+
return err
19+
}
20+
if err := execCommand([]string{"open", "-a", "Docker"}); err != nil {
21+
return err
22+
}
23+
24+
return waitForDockerRun()
25+
}
26+
27+
func installMinikube() error {
28+
if !confirm("Minikube") {
29+
return fmt.Errorf("user cancelled")
30+
}
31+
32+
if err := execCommand([]string{"brew", "install", "minikube"}); err != nil {
33+
return err
34+
}
35+
return nil
36+
}
37+
38+
func installHelm() error {
39+
if !confirm("Helm") {
40+
return fmt.Errorf("user cancelled")
41+
}
42+
43+
if err := execCommand([]string{"brew", "install", "helm"}); err != nil {
44+
return err
45+
}
46+
return nil
47+
}
48+
49+
func installArgocd() error {
50+
if !confirm("Argo CD") {
51+
return fmt.Errorf("user cancelled")
52+
}
53+
54+
if err := execCommand([]string{"helm", "repo", "add", "argo", "https://argoproj.github.io/argo-helm"}); err != nil {
55+
return err
56+
}
57+
if err := execCommand([]string{"helm", "install", "argo/argo-cd", "-n", "argocd", "--create-namespace"}); err != nil {
58+
return err
59+
}
60+
return nil
61+
}
62+
63+
func waitForDockerRun() error {
64+
fmt.Println("\nPlease make sure your docker has been started. The OS may ask you to authorize it manually.")
65+
fmt.Println()
66+
time.Sleep(time.Second)
67+
prompt := promptui.Prompt{
68+
Label: "I've verified that Docker is running properly by using the `docker version` command.",
69+
IsConfirm: true,
70+
}
71+
72+
_, err := prompt.Run()
73+
if err != nil {
74+
fmt.Println("Please make sure docker starts properly first.")
75+
return err
76+
}
77+
78+
return nil
79+
}
80+
81+
func confirm(name string) bool {
82+
prompt := promptui.Prompt{
83+
Label: fmt.Sprintf("Install %s now.", name),
84+
IsConfirm: true,
85+
}
86+
87+
_, err := prompt.Run()
88+
if err != nil {
89+
fmt.Printf("%s must be installed. Quit now.", name)
90+
return false
91+
}
92+
return true
93+
}
94+
95+
func execCommand(cmdStr []string) error {
96+
cmd := exec.Command(cmdStr[0], cmdStr[1:]...)
97+
cmd.Stdout = os.Stdout
98+
cmd.Stderr = os.Stderr
99+
return cmd.Run()
100+
}

internal/pkg/start/start.go

Lines changed: 6 additions & 170 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,6 @@ package start
22

33
import (
44
"fmt"
5-
"os"
6-
"os/exec"
7-
"time"
8-
9-
"github.com/manifoldco/promptui"
105
)
116

127
func Start() error {
@@ -17,176 +12,17 @@ func Start() error {
1712
return err
1813
}
1914

20-
fmt.Println("Enjoy!")
15+
fmt.Println("Enjoy it!☺️")
2116
return nil
2217
}
2318

2419
func installToolsIfNotExist() error {
25-
if !dockerExists() {
26-
if err := installDocker(); err != nil {
27-
return err
28-
}
29-
}
30-
31-
if !minikubeExists() {
32-
if err := installMinikube(); err != nil {
33-
return err
34-
}
35-
}
36-
37-
if !helmExists() {
38-
if err := installHelm(); err != nil {
39-
return err
40-
}
41-
}
42-
43-
if !argocdExists() {
44-
if err := installArgocd(); err != nil {
45-
return err
20+
for _, t := range tools {
21+
if !t.Exists() {
22+
if err := t.Install(); err != nil {
23+
return err
24+
}
4625
}
4726
}
48-
49-
return nil
50-
}
51-
52-
func dockerExists() bool {
53-
// TODO(daniel-hutao)
54-
return false
55-
}
56-
57-
func minikubeExists() bool {
58-
_, err := exec.LookPath("minikube")
59-
return err == nil
60-
}
61-
62-
func helmExists() bool {
63-
_, err := exec.LookPath("helm")
64-
return err == nil
65-
}
66-
67-
func argocdExists() bool {
68-
// TODO(daniel-hutao)
69-
return false
70-
}
71-
72-
func installDocker() error {
73-
prompt := promptui.Prompt{
74-
Label: "Install Docker now",
75-
IsConfirm: true,
76-
}
77-
78-
_, err := prompt.Run()
79-
if err != nil {
80-
fmt.Println("Docker must be installed. Quit now.")
81-
return err
82-
}
83-
84-
cmd := exec.Command("brew", "install", "docker", "--cask")
85-
cmd.Stdout = os.Stdout
86-
cmd.Stderr = os.Stderr
87-
if err = cmd.Run(); err != nil {
88-
fmt.Printf("Failed to install Docker. Error: %s", err)
89-
}
90-
91-
cmd = exec.Command("open", "-a", "Docker")
92-
cmd.Stdout = os.Stdout
93-
cmd.Stderr = os.Stderr
94-
if err = cmd.Run(); err != nil {
95-
fmt.Printf("Failed to start up Docker. Error: %s", err)
96-
return err
97-
}
98-
99-
return waitForDockerRun()
100-
}
101-
102-
func waitForDockerRun() error {
103-
fmt.Println("\nPlease make sure your docker has been started. The OS may ask you to authorize it manually.")
104-
fmt.Println()
105-
time.Sleep(time.Second)
106-
prompt := promptui.Prompt{
107-
Label: "I've verified that Docker is running properly by using the `docker version` command.",
108-
IsConfirm: true,
109-
}
110-
111-
_, err := prompt.Run()
112-
if err != nil {
113-
fmt.Println("Please make sure docker starts properly first.")
114-
return err
115-
}
116-
117-
return nil
118-
}
119-
120-
func installMinikube() error {
121-
prompt := promptui.Prompt{
122-
Label: "Install Minikube now",
123-
IsConfirm: true,
124-
}
125-
126-
_, err := prompt.Run()
127-
if err != nil {
128-
fmt.Println("Minikube must be installed. Quit now.")
129-
return err
130-
}
131-
132-
cmd := exec.Command("brew", "install", "minikube")
133-
cmd.Stdout = os.Stdout
134-
cmd.Stderr = os.Stderr
135-
if err = cmd.Run(); err != nil {
136-
fmt.Printf("Failed to install Minikube. Error: %s", err)
137-
return err
138-
}
139-
return nil
140-
}
141-
142-
func installHelm() error {
143-
prompt := promptui.Prompt{
144-
Label: "Install Helm now",
145-
IsConfirm: true,
146-
}
147-
148-
_, err := prompt.Run()
149-
if err != nil {
150-
fmt.Println("Helm must be installed. Quit now.")
151-
return err
152-
}
153-
154-
cmd := exec.Command("brew", "install", "helm")
155-
cmd.Stdout = os.Stdout
156-
cmd.Stderr = os.Stderr
157-
if err = cmd.Run(); err != nil {
158-
fmt.Printf("Failed to install Helm. Error: %s", err)
159-
return err
160-
}
161-
return nil
162-
}
163-
164-
func installArgocd() error {
165-
prompt := promptui.Prompt{
166-
Label: "Install Argo CD now",
167-
IsConfirm: true,
168-
}
169-
170-
_, err := prompt.Run()
171-
if err != nil {
172-
fmt.Println("Argo CD must be installed. Quit now.")
173-
return err
174-
}
175-
176-
cmd := exec.Command("helm", "repo", "add", "argo", "https://argoproj.github.io/argo-helm")
177-
cmd.Stdout = os.Stdout
178-
cmd.Stderr = os.Stderr
179-
if err = cmd.Run(); err != nil {
180-
fmt.Printf("Failed to add Helm repo. Error: %s", err)
181-
return err
182-
}
183-
184-
cmd = exec.Command("helm", "install", "argo/argo-cd", "-n", "argocd", "--create-namespace")
185-
cmd.Stdout = os.Stdout
186-
cmd.Stderr = os.Stderr
187-
if err = cmd.Run(); err != nil {
188-
fmt.Printf("Failed to install Argo CD. Error: %s", err)
189-
return err
190-
}
19127
return nil
19228
}

internal/pkg/start/tool.go

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package start
2+
3+
import "os/exec"
4+
5+
type existsFunc func() bool
6+
type installFunc func() error
7+
type tool struct {
8+
Name string
9+
Exists existsFunc
10+
Install installFunc
11+
}
12+
13+
var tools = []tool{
14+
{
15+
Name: "Docker",
16+
Exists: func() bool {
17+
_, err := exec.LookPath("docker")
18+
return err == nil
19+
},
20+
Install: installDocker,
21+
},
22+
{
23+
Name: "Minikube",
24+
Exists: func() bool {
25+
_, err := exec.LookPath("minikube")
26+
return err == nil
27+
},
28+
Install: installMinikube,
29+
},
30+
{
31+
Name: "Helm",
32+
Exists: func() bool {
33+
_, err := exec.LookPath("helm")
34+
return err == nil
35+
},
36+
Install: installHelm,
37+
},
38+
{
39+
Name: "Argo CD",
40+
Exists: func() bool {
41+
// TODO(dh)
42+
return false
43+
},
44+
Install: installArgocd,
45+
},
46+
}

0 commit comments

Comments
 (0)