/
cmd.go
98 lines (80 loc) · 2.38 KB
/
cmd.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
package cmd
import (
"os"
"path"
"runtime"
"github.com/alessiodionisi/vmkit/engine"
"github.com/alessiodionisi/vmkit/qemu"
"github.com/spf13/cobra"
)
type globalOptions struct {
// driver string
qemuExecutableName string
configPath string
}
func New() (*cobra.Command, error) {
cmd := &cobra.Command{
Short: "Spin up Linux VMs with QEMU",
Use: "vmkit",
}
// cmd.AddCommand(newLogsCommand())
cmd.AddCommand(newCompletionCommand())
cmd.AddCommand(newRunCommand())
cmd.AddCommand(newExecCommand())
cmd.AddCommand(newImagesCommand())
cmd.AddCommand(newListCommand())
cmd.AddCommand(newPullCommand())
cmd.AddCommand(newRemoveCommand())
cmd.AddCommand(newRestartCommand())
cmd.AddCommand(newSSHCommand())
cmd.AddCommand(newStartCommand())
cmd.AddCommand(newStopCommand())
// cmd.AddCommand(newXtermCommand())
cmd.AddCommand(newMacAddressCommand())
homePath, err := os.UserHomeDir()
if err != nil {
return nil, err
}
defaultConfigPath := path.Join(homePath, ".vmkit")
var defaultQEMUExecutableName string
switch runtime.GOARCH {
case "arm64":
defaultQEMUExecutableName = qemu.Aarch64ExecutableName
case "amd64":
defaultQEMUExecutableName = qemu.X8664ExecutableName
default:
return nil, ErrUnsupportedArchitecture
}
configPathEnv := os.Getenv("VMKIT_CONFIG_PATH")
if configPathEnv != "" {
defaultConfigPath = configPathEnv
}
qemuExecutableNameEnv := os.Getenv("VMKIT_QEMU_EXECUTABLE_NAME")
if qemuExecutableNameEnv != "" {
defaultQEMUExecutableName = qemuExecutableNameEnv
}
cmd.PersistentFlags().String("config-path", defaultConfigPath, "configuration path (env VMKIT_CONFIG_PATH)")
cmd.PersistentFlags().String("qemu-executable-name", defaultQEMUExecutableName, "qemu executable name (env VMKIT_QEMU_EXECUTABLE_NAME)")
return cmd, nil
}
func newGlobalOptions(cmd *cobra.Command) (*globalOptions, error) {
configPath, err := cmd.Flags().GetString("config-path")
if err != nil {
return nil, err
}
qemuExecutableName, err := cmd.Flags().GetString("qemu-executable-name")
if err != nil {
return nil, err
}
return &globalOptions{
qemuExecutableName: qemuExecutableName,
configPath: configPath,
}, nil
}
func newEngine(opts *globalOptions) (*engine.Engine, error) {
return engine.New(&engine.NewOptions{
QEMUExecutableName: opts.qemuExecutableName,
Path: opts.configPath,
Writer: os.Stderr,
})
}