282 lines
5.6 KiB
Go
282 lines
5.6 KiB
Go
package vm
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
)
|
|
|
|
// Manager handles VM operations
|
|
type Manager struct {
|
|
vms map[string]*VM
|
|
}
|
|
|
|
// VM represents a virtual machine
|
|
type VM struct {
|
|
Name string
|
|
CPU int
|
|
Memory string
|
|
Disks []Disk
|
|
Description string
|
|
Running bool
|
|
}
|
|
|
|
// Disk represents a VM disk
|
|
type Disk struct {
|
|
Name string
|
|
Size string
|
|
Type string
|
|
}
|
|
|
|
// NewManager creates a new VM manager
|
|
func NewManager() *Manager {
|
|
return &Manager{
|
|
vms: make(map[string]*VM),
|
|
}
|
|
}
|
|
|
|
// Define creates a new VM definition
|
|
func (m *Manager) Define(params Params) string {
|
|
log.Printf("VM Manager: Define called with params: %v", params)
|
|
|
|
name := params.Get("name")
|
|
if name == "" {
|
|
return "Error: VM name is required"
|
|
}
|
|
|
|
// Check if VM already exists
|
|
if _, exists := m.vms[name]; exists {
|
|
return fmt.Sprintf("Error: VM '%s' already exists", name)
|
|
}
|
|
|
|
// Create new VM
|
|
cpu := params.GetInt("cpu")
|
|
if cpu <= 0 {
|
|
cpu = 1
|
|
}
|
|
|
|
memory := params.Get("memory")
|
|
if memory == "" {
|
|
memory = "1GB"
|
|
}
|
|
|
|
description := params.Get("description")
|
|
|
|
vm := &VM{
|
|
Name: name,
|
|
CPU: cpu,
|
|
Memory: memory,
|
|
Description: description,
|
|
Disks: []Disk{},
|
|
Running: false,
|
|
}
|
|
|
|
// Add VM to map
|
|
m.vms[name] = vm
|
|
|
|
return fmt.Sprintf("VM '%s' defined successfully with %d CPU(s) and %s memory",
|
|
name, cpu, memory)
|
|
}
|
|
|
|
// Start starts a VM
|
|
func (m *Manager) Start(params Params) string {
|
|
log.Printf("VM Manager: Start called with params: %v", params)
|
|
|
|
name := params.Get("name")
|
|
if name == "" {
|
|
return "Error: VM name is required"
|
|
}
|
|
|
|
// Find VM
|
|
vm, exists := m.vms[name]
|
|
if !exists {
|
|
return fmt.Sprintf("Error: VM '%s' not found", name)
|
|
}
|
|
|
|
// Check if already running
|
|
if vm.Running {
|
|
return fmt.Sprintf("VM '%s' is already running", name)
|
|
}
|
|
|
|
// Start VM
|
|
vm.Running = true
|
|
return fmt.Sprintf("VM '%s' started successfully", name)
|
|
}
|
|
|
|
// Stop stops a VM
|
|
func (m *Manager) Stop(params Params) string {
|
|
log.Printf("VM Manager: Stop called with params: %v", params)
|
|
|
|
name := params.Get("name")
|
|
if name == "" {
|
|
return "Error: VM name is required"
|
|
}
|
|
|
|
// Find VM
|
|
vm, exists := m.vms[name]
|
|
if !exists {
|
|
return fmt.Sprintf("Error: VM '%s' not found", name)
|
|
}
|
|
|
|
// Check if already stopped
|
|
if !vm.Running {
|
|
return fmt.Sprintf("VM '%s' is already stopped", name)
|
|
}
|
|
|
|
// Stop VM
|
|
vm.Running = false
|
|
return fmt.Sprintf("VM '%s' stopped successfully", name)
|
|
}
|
|
|
|
// DiskAdd adds a disk to a VM
|
|
func (m *Manager) DiskAdd(params Params) string {
|
|
log.Printf("VM Manager: DiskAdd called with params: %v", params)
|
|
|
|
vmName := params.Get("name")
|
|
if vmName == "" {
|
|
return "Error: VM name is required"
|
|
}
|
|
|
|
// Find VM
|
|
vm, exists := m.vms[vmName]
|
|
if !exists {
|
|
return fmt.Sprintf("Error: VM '%s' not found", vmName)
|
|
}
|
|
|
|
// Get disk parameters
|
|
diskName := params.Get("disk_name")
|
|
if diskName == "" {
|
|
return "Error: Disk name is required"
|
|
}
|
|
|
|
// Check if disk already exists
|
|
for _, disk := range vm.Disks {
|
|
if disk.Name == diskName {
|
|
return fmt.Sprintf("Error: Disk '%s' already exists on VM '%s'", diskName, vmName)
|
|
}
|
|
}
|
|
|
|
// Create new disk
|
|
size := params.Get("size")
|
|
if size == "" {
|
|
size = "10GB"
|
|
}
|
|
|
|
diskType := params.Get("type")
|
|
if diskType == "" {
|
|
diskType = "ssd"
|
|
}
|
|
|
|
disk := Disk{
|
|
Name: diskName,
|
|
Size: size,
|
|
Type: diskType,
|
|
}
|
|
|
|
// Add disk to VM
|
|
vm.Disks = append(vm.Disks, disk)
|
|
|
|
return fmt.Sprintf("Disk '%s' added to VM '%s' with size %s and type %s",
|
|
diskName, vmName, size, diskType)
|
|
}
|
|
|
|
// Delete deletes a VM
|
|
func (m *Manager) Delete(params Params) string {
|
|
log.Printf("VM Manager: Delete called with params: %v", params)
|
|
|
|
name := params.Get("name")
|
|
if name == "" {
|
|
return "Error: VM name is required"
|
|
}
|
|
|
|
// Find VM
|
|
vm, exists := m.vms[name]
|
|
if !exists {
|
|
return fmt.Sprintf("Error: VM '%s' not found", name)
|
|
}
|
|
|
|
// Check if VM is running and force flag is not set
|
|
if vm.Running && !params.GetBool("force") {
|
|
return fmt.Sprintf("Error: VM '%s' is running. Use force:true to delete anyway", name)
|
|
}
|
|
|
|
// Delete VM
|
|
delete(m.vms, name)
|
|
return fmt.Sprintf("VM '%s' deleted successfully", name)
|
|
}
|
|
|
|
// List returns a list of all VMs
|
|
func (m *Manager) List() string {
|
|
log.Printf("VM Manager: List called")
|
|
|
|
if len(m.vms) == 0 {
|
|
return "No VMs defined"
|
|
}
|
|
|
|
var result string
|
|
result = "Defined VMs:\n"
|
|
|
|
for _, vm := range m.vms {
|
|
status := "stopped"
|
|
if vm.Running {
|
|
status = "running"
|
|
}
|
|
|
|
result += fmt.Sprintf("- %s (%s): %d CPU, %s memory\n",
|
|
vm.Name, status, vm.CPU, vm.Memory)
|
|
|
|
if vm.Description != "" {
|
|
result += fmt.Sprintf(" Description: %s\n", vm.Description)
|
|
}
|
|
|
|
if len(vm.Disks) > 0 {
|
|
result += " Disks:\n"
|
|
for _, disk := range vm.Disks {
|
|
result += fmt.Sprintf(" - %s: %s %s\n",
|
|
disk.Name, disk.Size, disk.Type)
|
|
}
|
|
}
|
|
}
|
|
|
|
return result
|
|
}
|
|
|
|
// Status returns the status of a VM
|
|
func (m *Manager) Status(params Params) string {
|
|
log.Printf("VM Manager: Status called with params: %v", params)
|
|
|
|
name := params.Get("name")
|
|
if name == "" {
|
|
return "Error: VM name is required"
|
|
}
|
|
|
|
// Find VM
|
|
vm, exists := m.vms[name]
|
|
if !exists {
|
|
return fmt.Sprintf("Error: VM '%s' not found", name)
|
|
}
|
|
|
|
// Get VM status
|
|
status := "stopped"
|
|
if vm.Running {
|
|
status = "running"
|
|
}
|
|
|
|
result := fmt.Sprintf("VM '%s' status: %s\n", vm.Name, status)
|
|
result += fmt.Sprintf("CPU: %d\n", vm.CPU)
|
|
result += fmt.Sprintf("Memory: %s\n", vm.Memory)
|
|
|
|
if vm.Description != "" {
|
|
result += fmt.Sprintf("Description: %s\n", vm.Description)
|
|
}
|
|
|
|
if len(vm.Disks) > 0 {
|
|
result += "Disks:\n"
|
|
for _, disk := range vm.Disks {
|
|
result += fmt.Sprintf("- %s: %s %s\n",
|
|
disk.Name, disk.Size, disk.Type)
|
|
}
|
|
}
|
|
|
|
return result
|
|
}
|