Skip to content

Commit e0cb110

Browse files
committed
feat: add tools start logic to dtm start command
Signed-off-by: Daniel Hu <[email protected]>
1 parent eb155e9 commit e0cb110

File tree

9 files changed

+205
-147
lines changed

9 files changed

+205
-147
lines changed

internal/pkg/start/install.go

Lines changed: 0 additions & 100 deletions
This file was deleted.

internal/pkg/start/start.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package start
22

33
import (
44
"fmt"
5+
"github.com/devstream-io/devstream/internal/pkg/start/tool"
56
)
67

78
func Start() error {
@@ -17,12 +18,17 @@ func Start() error {
1718
}
1819

1920
func installToolsIfNotExist() error {
20-
for _, t := range tools {
21+
for _, t := range tool.Tools {
2122
if !t.Exists() {
2223
if err := t.Install(); err != nil {
2324
return err
2425
}
2526
}
27+
if !t.Stopped() {
28+
if err := t.Start(); err != nil {
29+
return err
30+
}
31+
}
2632
}
2733
return nil
2834
}

internal/pkg/start/tool.go

Lines changed: 0 additions & 46 deletions
This file was deleted.

internal/pkg/start/tool/argocd.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package tool
2+
3+
import "fmt"
4+
5+
var toolArgocd = tool{
6+
Name: "Argo CD",
7+
Exists: func() bool {
8+
// TODO(dh)
9+
return false
10+
},
11+
12+
Install: func() error {
13+
if !confirm("Argo CD") {
14+
return fmt.Errorf("user cancelled")
15+
}
16+
17+
if err := execCommand([]string{"helm", "repo", "add", "argo", "https://argoproj.github.io/argo-helm"}); err != nil {
18+
return err
19+
}
20+
if err := execCommand([]string{"helm", "install", "argo/argo-cd", "-n", "argocd", "--create-namespace"}); err != nil {
21+
return err
22+
}
23+
return nil
24+
},
25+
}

internal/pkg/start/tool/docker.go

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package tool
2+
3+
import (
4+
"fmt"
5+
"os/exec"
6+
"time"
7+
8+
"github.com/manifoldco/promptui"
9+
)
10+
11+
var toolDocker = tool{
12+
Name: "Docker",
13+
14+
Exists: func() bool {
15+
_, err := exec.LookPath("docker")
16+
return err == nil
17+
},
18+
19+
Stopped: func() bool {
20+
cmd := exec.Command("docker", "version")
21+
return cmd.Run() != nil
22+
},
23+
24+
Install: func() error {
25+
if !confirm("Docker") {
26+
return fmt.Errorf("user cancelled")
27+
}
28+
29+
if err := execCommand([]string{"brew", "install", "docker", "--cask"}); err != nil {
30+
return err
31+
}
32+
return nil
33+
},
34+
35+
Start: func() error {
36+
if err := execCommand([]string{"open", "-a", "Docker"}); err != nil {
37+
return err
38+
}
39+
40+
return waitForDockerRun()
41+
},
42+
}
43+
44+
func waitForDockerRun() error {
45+
fmt.Println("\nPlease make sure your docker has been started. The OS may ask you to authorize it manually.")
46+
fmt.Println()
47+
time.Sleep(time.Second)
48+
prompt := promptui.Prompt{
49+
Label: "I've verified that Docker is running properly by using the `docker version` command.",
50+
IsConfirm: true,
51+
}
52+
53+
_, err := prompt.Run()
54+
if err != nil {
55+
fmt.Println("Please make sure docker starts properly first.")
56+
return err
57+
}
58+
59+
return nil
60+
}

internal/pkg/start/tool/helm.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package tool
2+
3+
import (
4+
"fmt"
5+
"os/exec"
6+
)
7+
8+
var toolHelm = tool{
9+
Name: "Helm",
10+
11+
Exists: func() bool {
12+
_, err := exec.LookPath("helm")
13+
return err == nil
14+
},
15+
16+
Install: func() error {
17+
if !confirm("Helm") {
18+
return fmt.Errorf("user cancelled")
19+
}
20+
21+
if err := execCommand([]string{"brew", "install", "helm"}); err != nil {
22+
return err
23+
}
24+
return nil
25+
},
26+
}

internal/pkg/start/tool/helper.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package tool
2+
3+
import (
4+
"fmt"
5+
"os"
6+
"os/exec"
7+
8+
"github.com/manifoldco/promptui"
9+
)
10+
11+
func confirm(name string) bool {
12+
prompt := promptui.Prompt{
13+
Label: fmt.Sprintf("Install %s now.", name),
14+
IsConfirm: true,
15+
}
16+
17+
_, err := prompt.Run()
18+
if err != nil {
19+
fmt.Printf("%s must be installed. Quit now.", name)
20+
return false
21+
}
22+
return true
23+
}
24+
25+
func execCommand(cmdStr []string) error {
26+
cmd := exec.Command(cmdStr[0], cmdStr[1:]...)
27+
cmd.Stdout = os.Stdout
28+
cmd.Stderr = os.Stderr
29+
return cmd.Run()
30+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package tool
2+
3+
import (
4+
"fmt"
5+
"os/exec"
6+
)
7+
8+
var toolMinikube = tool{
9+
Name: "Minikube",
10+
11+
Exists: func() bool {
12+
_, err := exec.LookPath("minikube")
13+
return err == nil
14+
},
15+
16+
Stopped: func() bool {
17+
cmd := exec.Command("minikube", "status")
18+
return cmd.Run() != nil
19+
},
20+
21+
Install: func() error {
22+
if !confirm("Minikube") {
23+
return fmt.Errorf("user cancelled")
24+
}
25+
26+
if err := execCommand([]string{"brew", "install", "minikube"}); err != nil {
27+
return err
28+
}
29+
return nil
30+
},
31+
32+
Start: func() error {
33+
if err := execCommand([]string{"minikube", "start"}); err != nil {
34+
return err
35+
}
36+
return nil
37+
},
38+
}

internal/pkg/start/tool/tool.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package tool
2+
3+
type existsFunc func() bool
4+
type stopedFunc func() bool
5+
type installFunc func() error
6+
type startFunc func() error
7+
type tool struct {
8+
Name string
9+
Exists existsFunc
10+
Stopped stopedFunc
11+
Install installFunc
12+
Start startFunc
13+
}
14+
15+
var Tools []tool
16+
17+
func init() {
18+
Tools = []tool{toolDocker, toolMinikube, toolHelm, toolArgocd}
19+
}

0 commit comments

Comments
 (0)