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/crc-org/crc/v2/pkg/crc/constants"
"github.com/crc-org/crc/v2/pkg/crc/machine/bundle"
"github.com/crc-org/crc/v2/pkg/crc/machine/state"
"github.com/crc-org/crc/v2/pkg/crc/ssh"
"github.com/crc-org/crc/v2/pkg/libmachine"
libmachinehost "github.com/crc-org/crc/v2/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())
}
|