/
virtualmachine.go
110 lines (91 loc) · 2.5 KB
/
virtualmachine.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
100
101
102
103
104
105
106
107
108
109
110
package machine
import (
"fmt"
"github.com/code-ready/crc/pkg/crc/constants"
"github.com/code-ready/crc/pkg/crc/machine/bundle"
"github.com/code-ready/crc/pkg/crc/machine/state"
"github.com/code-ready/crc/pkg/crc/ssh"
"github.com/code-ready/crc/pkg/libmachine"
libmachinehost "github.com/code-ready/crc/pkg/libmachine/host"
"github.com/pkg/errors"
)
type virtualMachine struct {
name string
*libmachinehost.Host
bundle *bundle.CrcBundleInfo
api libmachine.API
vsock bool
}
type MissingHostError struct {
name string
}
func errMissingHost(name string) *MissingHostError {
return &MissingHostError{name: name}
}
func (err *MissingHostError) Error() string {
return fmt.Sprintf("no such libmachine vm: %s", err.name)
}
var errInvalidBundleMetadata = errors.New("Error loading bundle metadata")
func loadVirtualMachine(name string, useVSock bool) (*virtualMachine, error) {
apiClient := libmachine.NewClient(constants.MachineBaseDir)
exists, err := apiClient.Exists(name)
if err != nil {
return nil, errors.Wrap(err, "Cannot check if machine exists")
}
if !exists {
return nil, errMissingHost(name)
}
libmachineHost, err := apiClient.Load(name)
if err != nil {
return nil, errors.Wrap(err, "Cannot load machine")
}
crcBundleMetadata, err := getBundleMetadataFromDriver(libmachineHost.Driver)
if err != nil {
err = errInvalidBundleMetadata
}
return &virtualMachine{
name: name,
Host: libmachineHost,
bundle: crcBundleMetadata,
api: apiClient,
vsock: useVSock,
}, err
}
func (vm *virtualMachine) Close() error {
return vm.api.Close()
}
func (vm *virtualMachine) Remove() error {
if err := vm.Driver.Remove(); err != nil {
return errors.Wrap(err, "Driver cannot remove machine")
}
if err := vm.api.Remove(vm.name); err != nil {
return errors.Wrap(err, "Cannot remove machine")
}
return nil
}
func (vm *virtualMachine) State() (state.State, error) {
vmStatus, err := vm.Driver.GetState()
if err != nil {
return state.Error, err
}
return state.FromMachine(vmStatus), nil
}
func (vm *virtualMachine) IP() (string, error) {
if vm.vsock {
return "127.0.0.1", nil
}
return vm.Driver.GetIP()
}
func (vm *virtualMachine) SSHPort() int {
if vm.vsock {
return constants.VsockSSHPort
}
return constants.DefaultSSHPort
}
func (vm *virtualMachine) SSHRunner() (*ssh.Runner, error) {
ip, err := vm.IP()
if err != nil {
return nil, err
}
return ssh.CreateRunner(ip, vm.SSHPort(), constants.GetPrivateKeyPath(), constants.GetRsaPrivateKeyPath(), vm.bundle.GetSSHKeyPath())
}