...
This commit is contained in:
281
_pkg2_dont_use/vm/manager.go
Normal file
281
_pkg2_dont_use/vm/manager.go
Normal file
@@ -0,0 +1,281 @@
|
||||
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
|
||||
}
|
38
_pkg2_dont_use/vm/params.go
Normal file
38
_pkg2_dont_use/vm/params.go
Normal file
@@ -0,0 +1,38 @@
|
||||
package vm
|
||||
|
||||
import (
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// Params is a simple helper for working with parameter maps
|
||||
type Params map[string]string
|
||||
|
||||
// Get returns the value for a key
|
||||
func (p Params) Get(key string) string {
|
||||
if val, ok := p[key]; ok {
|
||||
return val
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
// GetInt returns the value for a key as an integer
|
||||
func (p Params) GetInt(key string) int {
|
||||
val := p.Get(key)
|
||||
if val == "" {
|
||||
return 0
|
||||
}
|
||||
|
||||
i, err := strconv.Atoi(val)
|
||||
if err != nil {
|
||||
return 0
|
||||
}
|
||||
|
||||
return i
|
||||
}
|
||||
|
||||
// GetBool returns the value for a key as a boolean
|
||||
func (p Params) GetBool(key string) bool {
|
||||
val := strings.ToLower(p.Get(key))
|
||||
return val == "true" || val == "1" || val == "yes" || val == "y"
|
||||
}
|
Reference in New Issue
Block a user