From 549daae01ff591adfd0926a1822b45807accde2c Mon Sep 17 00:00:00 2001 From: Gean Jair Silva <89494158+GeanJair@users.noreply.github.com> Date: Fri, 24 Jul 2026 06:00:07 -0300 Subject: [PATCH 1/2] correction in vpc limit assignment (#13627) Co-authored-by: Gean Jair Silva --- .../java/org/apache/cloudstack/api/response/DomainResponse.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/src/main/java/org/apache/cloudstack/api/response/DomainResponse.java b/api/src/main/java/org/apache/cloudstack/api/response/DomainResponse.java index c848c67af467..506090176be0 100644 --- a/api/src/main/java/org/apache/cloudstack/api/response/DomainResponse.java +++ b/api/src/main/java/org/apache/cloudstack/api/response/DomainResponse.java @@ -357,7 +357,7 @@ public void setNetworkAvailable(String networkAvailable) { @Override public void setVpcLimit(String vpcLimit) { - this.vpcLimit = networkLimit; + this.vpcLimit = vpcLimit; } @Override From 03006c29ec37a9f13cf95fda3374626e54beab44 Mon Sep 17 00:00:00 2001 From: Brad <100990646+Dogface2k@users.noreply.github.com> Date: Thu, 6 Aug 2026 10:20:31 +0100 Subject: [PATCH 2/2] server: skip HA restart for VMs in Error state --- .../cloud/ha/HighAvailabilityManagerImpl.java | 10 ++++ .../ha/HighAvailabilityManagerImplTest.java | 48 +++++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/server/src/main/java/com/cloud/ha/HighAvailabilityManagerImpl.java b/server/src/main/java/com/cloud/ha/HighAvailabilityManagerImpl.java index e3f67420a2ab..bd63d595f844 100644 --- a/server/src/main/java/com/cloud/ha/HighAvailabilityManagerImpl.java +++ b/server/src/main/java/com/cloud/ha/HighAvailabilityManagerImpl.java @@ -433,6 +433,11 @@ public boolean scheduleMigration(final VMInstanceVO vm) { @Override public void scheduleRestart(VMInstanceVO vm, boolean investigate, ReasonType reasonType) { + if (VirtualMachine.State.Error.equals(vm.getState())) { + logger.info("Skipping HA restart for VM {} because it is in Error state", vm); + return; + } + if (!VmHaEnabled.valueIn(vm.getDataCenterId())) { String message = String.format("Unable to schedule restart for the VM %s (%d), VM high availability manager is disabled.", vm.getName(), vm.getId()); if (logger.isDebugEnabled()) { @@ -600,6 +605,11 @@ protected Long restart(final HaWorkVO work) { logger.info("Unable to find vm: " + vmId); return null; } + if (VirtualMachine.State.Error.equals(vm.getState())) { + logger.info("Skipping HA restart for VM {} because it is in Error state", vm); + return null; + } + if (checkAndCancelWorkIfNeeded(work)) { return null; } diff --git a/server/src/test/java/com/cloud/ha/HighAvailabilityManagerImplTest.java b/server/src/test/java/com/cloud/ha/HighAvailabilityManagerImplTest.java index 9274bd1ff085..8ab941b000e4 100644 --- a/server/src/test/java/com/cloud/ha/HighAvailabilityManagerImplTest.java +++ b/server/src/test/java/com/cloud/ha/HighAvailabilityManagerImplTest.java @@ -267,6 +267,54 @@ public void scheduleRestartHostNotSupported() { highAvailabilityManager.scheduleRestart(vm, true); } + @Test + public void scheduleRestartVMInErrorState() { + VMInstanceVO vm = Mockito.mock(VMInstanceVO.class); + Mockito.when(vm.getState()).thenReturn(VirtualMachine.State.Error); + + highAvailabilityManager.scheduleRestart(vm, true); + + Mockito.verifyNoInteractions(_haDao, _itMgr, _alertMgr); + } + + @Test + public void restartVMInErrorState() { + long vmId = 1L; + long workId = 2L; + VMInstanceVO vm = Mockito.mock(VMInstanceVO.class); + + Mockito.when(mockWork.getInstanceId()).thenReturn(vmId); + Mockito.when(mockWork.getId()).thenReturn(workId); + Mockito.when(_haDao.listFutureHaWorkForVm(vmId, workId)).thenReturn(new ArrayList()); + Mockito.when(_haDao.listRunningHaWorkForVm(vmId)).thenReturn(new ArrayList()); + Mockito.when(_itMgr.findById(vmId)).thenReturn(vm); + Mockito.when(vm.getState()).thenReturn(VirtualMachine.State.Error); + + assertNull(highAvailabilityManager.restart(mockWork)); + + Mockito.verifyNoInteractions(_hostDao, _alertMgr, userVmManager, volumeMgr); + Mockito.verify(mockWork, Mockito.never()).setStep(Mockito.any()); + } + + @Test + public void restartVMNotInErrorStateContinuesProcessing() { + long vmId = 1L; + long workId = 2L; + VMInstanceVO vm = Mockito.mock(VMInstanceVO.class); + + Mockito.when(mockWork.getInstanceId()).thenReturn(vmId); + Mockito.when(mockWork.getId()).thenReturn(workId); + Mockito.when(_haDao.listFutureHaWorkForVm(vmId, workId)).thenReturn(new ArrayList()); + Mockito.when(_haDao.listRunningHaWorkForVm(vmId)).thenReturn(new ArrayList()); + Mockito.when(_itMgr.findById(vmId)).thenReturn(vm); + Mockito.when(vm.getState()).thenReturn(VirtualMachine.State.Running); + Mockito.doReturn(true).when(highAvailabilityManagerSpy).checkAndCancelWorkIfNeeded(mockWork); + + assertNull(highAvailabilityManagerSpy.restart(mockWork)); + + Mockito.verify(highAvailabilityManagerSpy).checkAndCancelWorkIfNeeded(mockWork); + } + @Test public void scheduleStop() { VMInstanceVO vm = Mockito.mock(VMInstanceVO.class);