86 lines
1.5 KiB
Go
86 lines
1.5 KiB
Go
package vmmanager
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"fmt"
|
|
v1 "github.com/cirruslabs/orchard/pkg/resource/v1"
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
var ErrFailed = errors.New("VM manager failed")
|
|
|
|
type VMManager struct {
|
|
vms map[string]*VM
|
|
}
|
|
|
|
func New() *VMManager {
|
|
return &VMManager{
|
|
vms: map[string]*VM{},
|
|
}
|
|
}
|
|
|
|
func (vmm *VMManager) Exists(vmResource v1.VM) bool {
|
|
_, ok := vmm.vms[vmResource.UID]
|
|
|
|
return ok
|
|
}
|
|
|
|
func (vmm *VMManager) Get(vmResource v1.VM) (*VM, error) {
|
|
managedVM, ok := vmm.vms[vmResource.UID]
|
|
if !ok {
|
|
return nil, fmt.Errorf("%w: VM does not exist", ErrFailed)
|
|
}
|
|
|
|
return managedVM, nil
|
|
}
|
|
|
|
func (vmm *VMManager) Create(ctx context.Context, vmResource v1.VM, logger *zap.SugaredLogger) (*VM, error) {
|
|
if _, ok := vmm.vms[vmResource.UID]; ok {
|
|
return nil, fmt.Errorf("%w: VM already exists", ErrFailed)
|
|
}
|
|
|
|
managedVM, err := NewVM(ctx, vmResource, logger)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
vmm.vms[vmResource.UID] = managedVM
|
|
|
|
return managedVM, nil
|
|
}
|
|
|
|
func (vmm *VMManager) Stop(vmResource v1.VM) error {
|
|
managedVM, ok := vmm.vms[vmResource.UID]
|
|
if !ok {
|
|
return fmt.Errorf("%w: VM does not exist", ErrFailed)
|
|
}
|
|
|
|
return managedVM.Stop()
|
|
}
|
|
|
|
func (vmm *VMManager) Delete(vmResource v1.VM) error {
|
|
managedVM, ok := vmm.vms[vmResource.UID]
|
|
if !ok {
|
|
return fmt.Errorf("%w: VM does not exist", ErrFailed)
|
|
}
|
|
|
|
if err := managedVM.Delete(); err != nil {
|
|
return err
|
|
}
|
|
|
|
delete(vmm.vms, vmResource.UID)
|
|
|
|
return nil
|
|
}
|
|
|
|
func (vmm *VMManager) List() []*VM {
|
|
var vms []*VM
|
|
|
|
for _, vm := range vmm.vms {
|
|
vms = append(vms, vm)
|
|
}
|
|
|
|
return vms
|
|
}
|