-
Notifications
You must be signed in to change notification settings - Fork 34
/
virtualenv.go
99 lines (76 loc) · 1.96 KB
/
virtualenv.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
package virtualenv
import (
"fmt"
"os/exec"
"path/filepath"
"github.com/MusicDin/kubitect/cli/ui"
)
type (
VirtualEnv interface {
Init() error
Path() string
}
virtualEnv struct {
path string
workingDir string
requirementsPath string
initialized bool
}
)
func NewVirtualEnv(path, workingDir, reqPath string) VirtualEnv {
return &virtualEnv{
path: path,
workingDir: workingDir,
requirementsPath: reqPath,
}
}
func (e *virtualEnv) Path() string {
return e.path
}
// Init creates virtual environment in the cluster path
// and installs required pip3 and ansible dependencies.
func (e *virtualEnv) Init() error {
if e.initialized {
return nil
}
ui.Println(ui.INFO, "Setting up virtual environment...")
if err := e.create(); err != nil {
return err
}
ui.Println(ui.INFO, "Installing pip3 dependencies...")
ui.Println(ui.INFO, "This can take up to a minute when the virtual environment is initialized for the first time...")
if err := e.installPipReq(); err != nil {
return err
}
e.initialized = true
return nil
}
// create creates virtual environment if it does not yet exist.
func (e *virtualEnv) create() error {
cmd := exec.Command("virtualenv", "-p", "python3", e.path)
cmd.Dir = e.workingDir
if ui.Debug() {
cmd.Stdout = ui.Streams().Out().File()
cmd.Stderr = ui.Streams().Err().File()
}
err := cmd.Run()
if err != nil {
return fmt.Errorf("failed to create virtual environment: %v", err)
}
return nil
}
// installPipReq installs pip3 requirements into virtual environment.
func (e *virtualEnv) installPipReq() error {
cmd := exec.Command("pip3", "install", "-r", e.requirementsPath)
cmd.Path = filepath.Join(e.path, "bin", "pip3")
cmd.Dir = e.workingDir
if ui.Debug() {
cmd.Stdout = ui.Streams().Out().File()
cmd.Stderr = ui.Streams().Err().File()
}
err := cmd.Run()
if err != nil {
return fmt.Errorf("failed to install pip3 requirements: %v", err)
}
return nil
}