orchard/internal/worker/vmmanager/vmmanager.go

74 lines
1.4 KiB
Go

package vmmanager
import (
"context"
"github.com/cirruslabs/orchard/internal/worker/ondiskname"
"github.com/cirruslabs/orchard/pkg/client"
v1 "github.com/cirruslabs/orchard/pkg/resource/v1"
"github.com/puzpuzpuz/xsync/v4"
)
type VM interface {
Resource() v1.VM
SetResource(vmResource v1.VM)
OnDiskName() ondiskname.OnDiskName
ImageFQN() *string
Status() v1.VMStatus
StatusMessage() string
Err() error
Conditions() []v1.Condition
Start(eventStreamer *client.EventStreamer)
Suspend() <-chan error
IP(ctx context.Context) (string, error)
Stop() <-chan error
Delete() error
}
type VMManager struct {
vms *xsync.Map[ondiskname.OnDiskName, VM]
}
func New() *VMManager {
return &VMManager{
vms: xsync.NewMap[ondiskname.OnDiskName, VM](),
}
}
func (vmm *VMManager) Exists(key ondiskname.OnDiskName) bool {
_, ok := vmm.vms.Load(key)
return ok
}
func (vmm *VMManager) Get(key ondiskname.OnDiskName) (VM, bool) {
vm, ok := vmm.vms.Load(key)
return vm, ok
}
func (vmm *VMManager) Put(key ondiskname.OnDiskName, vm VM) {
vmm.vms.Store(key, vm)
}
func (vmm *VMManager) Delete(key ondiskname.OnDiskName) {
vmm.vms.Delete(key)
}
func (vmm *VMManager) Len() int {
return vmm.vms.Size()
}
func (vmm *VMManager) List() []VM {
var vms []VM
vmm.vms.Range(func(odn ondiskname.OnDiskName, vm VM) bool {
vms = append(vms, vm)
return true
})
return vms
}