From f1d092f23bf749f20a4dbf4eb859bf4968f87ea6 Mon Sep 17 00:00:00 2001 From: nvazquez Date: Wed, 18 May 2022 08:50:18 -0300 Subject: [PATCH 1/5] Prevent NPE on reboot stopped VM --- server/src/main/java/com/cloud/vm/UserVmManagerImpl.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java index 78745403601f..daf9c5ce2241 100644 --- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java @@ -3130,6 +3130,10 @@ public UserVm rebootVirtualMachine(RebootVMCmd cmd) throws InsufficientCapacityE throw new InvalidParameterValueException("Unable to find a virtual machine with id " + vmId); } + if (!vmInstance.getState().equals(State.Running)) { + throw new InvalidParameterValueException("The VM with id " + vmId + " is not in Running state"); + } + _accountMgr.checkAccess(caller, null, true, vmInstance); checkIfHostOfVMIsInPrepareForMaintenanceState(vmInstance.getHostId(), vmId, "Reboot"); From 16a0db11ea9847409b191a2b6318ac0511f5439f Mon Sep 17 00:00:00 2001 From: nvazquez Date: Wed, 18 May 2022 10:00:55 -0300 Subject: [PATCH 2/5] Use VM UUID instead of VM ID --- server/src/main/java/com/cloud/vm/UserVmManagerImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java index daf9c5ce2241..a9a4dad73b71 100644 --- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java @@ -3131,7 +3131,7 @@ public UserVm rebootVirtualMachine(RebootVMCmd cmd) throws InsufficientCapacityE } if (!vmInstance.getState().equals(State.Running)) { - throw new InvalidParameterValueException("The VM with id " + vmId + " is not in Running state"); + throw new InvalidParameterValueException("The VM with id " + vmInstance.getUuid() + " is not in Running state"); } _accountMgr.checkAccess(caller, null, true, vmInstance); From 92af98c4507b71d5d6d24e3b6dccf0cb8aed85f6 Mon Sep 17 00:00:00 2001 From: nvazquez Date: Wed, 18 May 2022 10:12:35 -0300 Subject: [PATCH 3/5] Apply suggestion --- server/src/main/java/com/cloud/vm/UserVmManagerImpl.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java index a9a4dad73b71..4eb17b0c7776 100644 --- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java @@ -3130,8 +3130,10 @@ public UserVm rebootVirtualMachine(RebootVMCmd cmd) throws InsufficientCapacityE throw new InvalidParameterValueException("Unable to find a virtual machine with id " + vmId); } - if (!vmInstance.getState().equals(State.Running)) { - throw new InvalidParameterValueException("The VM with id " + vmInstance.getUuid() + " is not in Running state"); + if (!State.Running.equals(vmInstance.getState())) { + throw new InvalidParameterValueException(String.format("The VM %s is not in %s state", + StringUtils.firstNonBlank(vmInstance.getDisplayName(), vmInstance.getName(), + vmInstance.getUuid()), State.Running)); } _accountMgr.checkAccess(caller, null, true, vmInstance); From 9a422666b5a7fd6c49d9e375f1e472d8f57677b2 Mon Sep 17 00:00:00 2001 From: nvazquez Date: Wed, 18 May 2022 10:56:29 -0300 Subject: [PATCH 4/5] Refactor and fix start VM output --- .../schema/src/main/java/com/cloud/vm/UserVmVO.java | 5 +++++ .../main/java/com/cloud/vm/UserVmManagerImpl.java | 12 ++++++------ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/engine/schema/src/main/java/com/cloud/vm/UserVmVO.java b/engine/schema/src/main/java/com/cloud/vm/UserVmVO.java index e62162e25960..465d00f0b82f 100644 --- a/engine/schema/src/main/java/com/cloud/vm/UserVmVO.java +++ b/engine/schema/src/main/java/com/cloud/vm/UserVmVO.java @@ -28,6 +28,7 @@ import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.uservm.UserVm; +import org.apache.commons.lang3.StringUtils; @Entity @Table(name = "user_vm") @@ -141,4 +142,8 @@ public void setUserVmType(String userVmType) { public String getName() { return instanceName; } + + public String getDisplayNameOrHostName() { + return StringUtils.isNotBlank(displayName) ? displayName : getHostName(); + } } diff --git a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java index 4eb17b0c7776..690130d6107c 100644 --- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java @@ -3130,10 +3130,9 @@ public UserVm rebootVirtualMachine(RebootVMCmd cmd) throws InsufficientCapacityE throw new InvalidParameterValueException("Unable to find a virtual machine with id " + vmId); } - if (!State.Running.equals(vmInstance.getState())) { - throw new InvalidParameterValueException(String.format("The VM %s is not in %s state", - StringUtils.firstNonBlank(vmInstance.getDisplayName(), vmInstance.getName(), - vmInstance.getUuid()), State.Running)); + if (vmInstance.getState() != State.Running) { + throw new InvalidParameterValueException(String.format("The VM %s (%s) is not running, unable to reboot it", + vmInstance.getUuid(), vmInstance.getDisplayNameOrHostName())); } _accountMgr.checkAccess(caller, null, true, vmInstance); @@ -5125,8 +5124,9 @@ public Pair> startVirtualMach throw new InvalidParameterValueException("unable to find a virtual machine with id " + vmId); } - if (vm.getState()== State.Running) { - throw new InvalidParameterValueException("The virtual machine "+ vm.getUuid()+ " ("+ vm.getDisplayName()+ ") is already running"); + if (vm.getState() == State.Running) { + throw new InvalidParameterValueException("The virtual machine " + vm.getUuid() + + " (" + vm.getDisplayNameOrHostName() + ") is already running"); } _accountMgr.checkAccess(callerAccount, null, true, vm); From 7cda3130f6b41f1e065d3819a8b018fc0ce11b5b Mon Sep 17 00:00:00 2001 From: nvazquez Date: Wed, 18 May 2022 11:03:26 -0300 Subject: [PATCH 5/5] Use format instead of concatenation --- .../main/java/com/cloud/api/query/dao/UserVmJoinDaoImpl.java | 2 +- server/src/main/java/com/cloud/vm/UserVmManagerImpl.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/server/src/main/java/com/cloud/api/query/dao/UserVmJoinDaoImpl.java b/server/src/main/java/com/cloud/api/query/dao/UserVmJoinDaoImpl.java index 7a867620900f..03fdb542d2f0 100644 --- a/server/src/main/java/com/cloud/api/query/dao/UserVmJoinDaoImpl.java +++ b/server/src/main/java/com/cloud/api/query/dao/UserVmJoinDaoImpl.java @@ -127,7 +127,7 @@ public UserVmResponse newUserVmResponse(ResponseView view, String objectName, Us userVmResponse.setName(userVm.getName()); if (userVm.getDisplayName() != null) { - userVmResponse.setDisplayName(userVm.getDisplayName()); + userVmResponse.setDisplayName(userVm.getDisplayName()); } else { userVmResponse.setDisplayName(userVm.getName()); } diff --git a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java index 690130d6107c..3034b56cd708 100644 --- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java @@ -5125,8 +5125,8 @@ public Pair> startVirtualMach } if (vm.getState() == State.Running) { - throw new InvalidParameterValueException("The virtual machine " + vm.getUuid() + - " (" + vm.getDisplayNameOrHostName() + ") is already running"); + throw new InvalidParameterValueException(String.format("The virtual machine %s (%s) is already running", + vm.getUuid(), vm.getDisplayNameOrHostName())); } _accountMgr.checkAccess(callerAccount, null, true, vm);