diff --git a/src/client/cmdVM/vmCreate.go b/src/client/cmdVM/vmCreate.go index 57f8994b1a86e09d4950c48e7062bdcab0aee834..4a4763c6ac577a1198942016096ca2c998bd790a 100644 --- a/src/client/cmdVM/vmCreate.go +++ b/src/client/cmdVM/vmCreate.go @@ -124,7 +124,7 @@ func (cmd *Create) Run(args []string) int { vm, err := libclient.VMCreate(vmArgs) if err != nil { - u.PrintlnErr(err) + u.PrintlnErr("Error: failed creating VM: " + err.Error()) statusCode = 1 } else { u.Println("Created VM \"" + vm.Name + "\" | " + vm.ID.String()) diff --git a/src/client/cmdVM/vmEdit.go b/src/client/cmdVM/vmEdit.go index eced17e4bbeb562a11a2ac9e314d9c0b664324e6..4650648a20c0920c7609b83bfa8f64da9b719b17 100644 --- a/src/client/cmdVM/vmEdit.go +++ b/src/client/cmdVM/vmEdit.go @@ -82,8 +82,14 @@ func (cmd *Edit) Run(args []string) int { u.PrintlnErr(err) statusCode = 1 } else { - u.Println("Successfully edited VM \"" + vmID + "\":") - u.Println(vmEdited.String()) + str, err := vmEdited.String() + if err != nil { + u.Println("Successfully edited VM \"" + vmID + "\" but failed decoding VM to string.") + statusCode = 1 + } else { + u.Println("Successfully edited VM \"" + vmID + "\":") + u.Println(str) + } } } diff --git a/src/client/cmdVM/vmList.go b/src/client/cmdVM/vmList.go index a2fa9de3dbe4442568354b87d9f64407f28dc866..c1f1d79f46205383d2d3c222d8cc77a8161aeeb2 100644 --- a/src/client/cmdVM/vmList.go +++ b/src/client/cmdVM/vmList.go @@ -61,11 +61,14 @@ func (cmd *List) printFilteredVMs(args []string, route string) int { return 1 } + statusCode := 0 + if foundLongOutputFlag >= 0 { for _, vm := range vms { str, err := vm.String() if err != nil { u.PrintlnErr("Failed decoding VM " + vm.ID.String() + " to string. Skipped.") + statusCode = 1 } else { u.Println(str) } @@ -94,5 +97,5 @@ func (cmd *List) printFilteredVMs(args []string, route string) int { } } - return 0 + return statusCode } diff --git a/src/client/cmdVM/vmListSingle.go b/src/client/cmdVM/vmListSingle.go index 8d06c5d71dfafc12cb1fffa8e0b5512949b3168a..983769ea74ceba9c6fd705eb1b2564057cd5ad51 100644 --- a/src/client/cmdVM/vmListSingle.go +++ b/src/client/cmdVM/vmListSingle.go @@ -42,11 +42,13 @@ func (cmd *ListSingle) Run(args []string) int { return 1 } - vmStr, err := vm.String() + str, err := vm.String() if err != nil { - u.PrintlnErr(err) + u.PrintlnErr("Failed decoding VM " + vm.ID.String() + " to string. Skipped.") return 1 + } else { + u.Println(str) } - u.Println(vmStr) + return 0 } diff --git a/src/server/vms/vms.go b/src/server/vms/vms.go index ffa120d1236555973aaddb10cb5aab0d8e931a24..657a22e2d402a76dd7d36d117502862cc519d76a 100644 --- a/src/server/vms/vms.go +++ b/src/server/vms/vms.go @@ -375,15 +375,13 @@ func (vms *VMs) prepareStartVM(vmID uuid.UUID, attachPwd string) (*osexec.Cmd, * // in argument is used. // Concurrency: safe func (vms *VMs) StartVM(vmID uuid.UUID, attachPwd string) error { - prefix := "Failed starting VM[2]: " - cmd, vm, attachPwd, spicePort, estimatedVmRAM, err := vms.prepareStartVM(vmID, attachPwd) if err != nil { return err } else { go func() { if err := cmd.Wait(); err != nil { - log.Error(prefix + vm.v.ID.String() + ": exec.Wait error: " + err.Error()) + log.Error("Failed starting VM: " + vm.v.ID.String() + ": exec.Wait error: " + err.Error()) log.Error("Failed cmd: " + cmd.String()) } @@ -783,27 +781,35 @@ func (vms *VMs) ExportVMFiles(vm *VM, vmDir, tarGzFile string) error { prefix := "Failed exporting files from VM: " vm.mutex.Lock() - defer vm.mutex.Unlock() if vm.IsRunning() { + vm.mutex.Unlock() return errors.New(prefix + "VM must be stopped") } if vm.IsDiskBusy() { + vm.mutex.Unlock() return errors.New(prefix + "disk in use (busy)") } vm.DiskBusy = true - defer func(vm *VM) { vm.DiskBusy = false }(vm) + vm.mutex.Unlock() vmDisk := vm.getDiskPath() if err := exec.CopyFromVM(vmDisk, vmDir, tarGzFile); err != nil { + vm.mutex.Lock() + vm.DiskBusy = false + vm.mutex.Unlock() msg := prefix + err.Error() log.Error(msg) return errors.New(msg) } + vm.mutex.Lock() + vm.DiskBusy = false + vm.mutex.Unlock() + return nil } @@ -813,26 +819,34 @@ func (vms *VMs) ImportFilesToVM(vm *VM, tarGzFile, vmDir string) error { prefix := "Failed importing files into VM: " vm.mutex.Lock() - defer vm.mutex.Unlock() if vm.IsRunning() { + vm.mutex.Unlock() return errors.New(prefix + "VM must be stopped") } if vm.IsDiskBusy() { + vm.mutex.Unlock() return errors.New(prefix + "disk in use (busy)") } vm.DiskBusy = true - defer func(vm *VM) { vm.DiskBusy = false }(vm) + vm.mutex.Unlock() vmDisk := vm.getDiskPath() if err := exec.CopyToVM(vmDisk, tarGzFile, vmDir); err != nil { + vm.mutex.Lock() + vm.DiskBusy = false + vm.mutex.Unlock() msg := prefix + err.Error() log.Error(msg) return errors.New(msg) } + vm.mutex.Lock() + vm.DiskBusy = false + vm.mutex.Unlock() + return nil } diff --git a/tests/run_tests b/tests/run_tests index 35ec4644970f0d8455b176588d301a11e877a78c..da41f16aecbdb6de8c8e1cdf0a2e5107af53290f 100755 --- a/tests/run_tests +++ b/tests/run_tests @@ -26,7 +26,7 @@ cleanup () { $nexus_cli vmkill "$vm_base_name" sleep 3 $nexus_cli vmdel "$vm_tpl_name" - $nexus_cli tpldel "$vm_tpl_name" + $nexus_cli tpldel "$template_id" echo "calling del_gen_files..." del_gen_files } @@ -76,6 +76,8 @@ OK echo -e "Starting validation tests...\n" +echo "[1]===========================================" + # Look for the first template containing "Xubuntu 22.04" in its name tpl="Xubuntu 22.04" echo "List templates..." @@ -91,12 +93,12 @@ check_last_cmd_failed "vmcreate" OK echo "Attempt to create an invalid VM (invalid CPU)..." -vm_id=`$nexus_cli vmcreate "$vm_base_name" 17 1024 none none $base_template_id` +vm_id=`$nexus_cli vmcreate "$vm_base_name" 33 1024 none none $base_template_id` check_last_cmd_failed "vmcreate" OK echo "Attempt to create an invalid VM (invalid RAM)..." -vm_id=`$nexus_cli vmcreate "$vm_base_name" 1 250 user 067b:2303 $base_template_id` +vm_id=`$nexus_cli vmcreate "$vm_base_name" 1 127 user 067b:2303 $base_template_id` check_last_cmd_failed "vmcreate" OK @@ -120,6 +122,8 @@ vm_id=`$nexus_cli vmcreate "$vm_base_name" 1 1024 none 067b:23x3 $base_template_ check_last_cmd_failed "vmcreate" OK +echo "[2]===========================================" + passes=3 echo -e "Start stress tests: $passes passes...\n" @@ -158,6 +162,8 @@ done echo -e "\nStress tests completed.\n" +echo "[3]===========================================" + echo "Create base VM..." vm_id=`$nexus_cli vmcreate "$vm_base_name" 2 1024 user 067b:2303 $base_template_id` check_last_cmd_succeeded "vmcreate" @@ -182,6 +188,8 @@ $nexus_cli tpledit "$template_id" name="$vm_tpl_name extra" check_last_cmd_succeeded "tpledit" OK +echo "[4]===========================================" + echo "Create students VMs..." $nexus_cli vmcreate "$vm_base_name" 2 1024 none 1fc9:0132,03eb:6124 $template_id data/students.csv check_last_cmd_succeeded "vmcreate VMs" @@ -208,6 +216,8 @@ $nexus_cli vmcreds2csv "$vm_base_name" $creds_csv_file check_last_cmd_succeeded "vmcreds2csv" OK +echo "[5]===========================================" + echo "Kill students VMs..." $nexus_cli vmkill "$vm_base_name" sleep 3 @@ -215,7 +225,7 @@ check_last_cmd_succeeded "vmkill VMs" OK echo "Export files from VMs..." -$nexus_cli vmexportdir "$vm_base_name" /home +$nexus_cli vmexportdir "$vm_base_name" /usr/share/pixmaps check_last_cmd_succeeded "vmexportdir" OK