From 2eae0f5385fb76eb9d554e5460ef1da56936579b Mon Sep 17 00:00:00 2001 From: Pearl Dsilva Date: Wed, 19 May 2021 13:00:17 +0530 Subject: [PATCH] SystemVM: Set agent state to disconnected on Stopping the systemVM (#5010) Fixes: #4972 This PR sets systevms' agent state to disconnected when it is stopped. Currently, when a systemVM (Console Proxy VM / Secondary storage VM) is stopped, the agent state still appears to be 'Up' --- api/src/main/java/com/cloud/host/Status.java | 3 +++ api/src/main/java/com/cloud/vm/VirtualMachine.java | 3 +++ .../java/com/cloud/vm/VirtualMachineManagerImpl.java | 9 +++++++++ .../src/main/java/com/cloud/api/ApiResponseHelper.java | 2 +- 4 files changed, 16 insertions(+), 1 deletion(-) diff --git a/api/src/main/java/com/cloud/host/Status.java b/api/src/main/java/com/cloud/host/Status.java index e381115db41..5dc82bbfaef 100644 --- a/api/src/main/java/com/cloud/host/Status.java +++ b/api/src/main/java/com/cloud/host/Status.java @@ -131,6 +131,9 @@ public enum Status { s_fsm.addTransition(Status.Up, Event.PingTimeout, Status.Alert); s_fsm.addTransition(Status.Up, Event.AgentDisconnected, Status.Alert); s_fsm.addTransition(Status.Up, Event.ShutdownRequested, Status.Disconnected); + s_fsm.addTransition(Status.Disconnected, Event.ShutdownRequested, Status.Disconnected); + s_fsm.addTransition(Status.Down, Event.ShutdownRequested, Status.Disconnected); + s_fsm.addTransition(Status.Rebalancing, Event.ShutdownRequested, Status.Disconnected); s_fsm.addTransition(Status.Up, Event.HostDown, Status.Down); s_fsm.addTransition(Status.Up, Event.Ping, Status.Up); s_fsm.addTransition(Status.Up, Event.AgentConnected, Status.Connecting); diff --git a/api/src/main/java/com/cloud/vm/VirtualMachine.java b/api/src/main/java/com/cloud/vm/VirtualMachine.java index 4d6014f0a94..829e743df73 100644 --- a/api/src/main/java/com/cloud/vm/VirtualMachine.java +++ b/api/src/main/java/com/cloud/vm/VirtualMachine.java @@ -20,6 +20,8 @@ import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.Map; +import java.util.Set; +import java.util.HashSet; import org.apache.cloudstack.acl.ControlledEntity; import org.apache.cloudstack.api.Displayable; @@ -186,6 +188,7 @@ public interface VirtualMachine extends RunningOn, ControlledEntity, Partition, } } + static final Set systemVMs = new HashSet<>(Arrays.asList(VirtualMachine.Type.ConsoleProxy, VirtualMachine.Type.SecondaryStorageVm)); static final String IsDynamicScalingEnabled = "enable.dynamic.scaling"; public enum Event { diff --git a/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java b/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java index 28f875366d1..6dde706a5a3 100755 --- a/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java +++ b/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java @@ -40,6 +40,7 @@ import java.util.concurrent.TimeUnit; import javax.inject.Inject; import javax.naming.ConfigurationException; +import com.cloud.api.ApiDBUtils; import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.command.admin.vm.MigrateVMCmd; @@ -1984,6 +1985,14 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac s_logger.warn("Unable to actually stop " + vm + " but continue with release because it's a force stop"); vmGuru.finalizeStop(profile, answer); } + } else { + if (VirtualMachine.systemVMs.contains(vm.getType())) { + HostVO systemVmHost = ApiDBUtils.findHostByTypeNameAndZoneId(vm.getDataCenterId(), vm.getHostName(), + VirtualMachine.Type.SecondaryStorageVm.equals(vm.getType()) ? Host.Type.SecondaryStorageVM : Host.Type.ConsoleProxy); + if (systemVmHost != null) { + _agentMgr.agentStatusTransitTo(systemVmHost, Status.Event.ShutdownRequested, _nodeId); + } + } } } diff --git a/server/src/main/java/com/cloud/api/ApiResponseHelper.java b/server/src/main/java/com/cloud/api/ApiResponseHelper.java index a7da96a8241..0bbc0227f1f 100644 --- a/server/src/main/java/com/cloud/api/ApiResponseHelper.java +++ b/server/src/main/java/com/cloud/api/ApiResponseHelper.java @@ -1450,7 +1450,7 @@ public class ApiResponseHelper implements ResponseGenerator { } } - if (vm.getType() == Type.SecondaryStorageVm || vm.getType() == Type.ConsoleProxy) { + if (VirtualMachine.systemVMs.contains(vm.getType())) { Host systemVmHost = ApiDBUtils.findHostByTypeNameAndZoneId(vm.getDataCenterId(), vm.getHostName(), Type.SecondaryStorageVm.equals(vm.getType()) ? Host.Type.SecondaryStorageVM : Host.Type.ConsoleProxy); if (systemVmHost != null) {