This appears to me to be a bug. Is it a known bug? I tried searching the Github bug list but Github's search function is awful.
Cloudstack 4.19.1.3, Ubuntu 20.04 management server, Ubuntu 22.04 compute hosts, KVM hypervisor. Scenario: There are four physical hosts, A, B, C, D. Let's say they're host ID 62,63,64,65 in the hosts table. Each host has at least one virtual machine running on it. Shut down the virtual machines on host A (without starting them elsewhere) which sets the last_host_id to 62, and delete host A in the Infrastructure tab. As an end user (not an admin), try to start one of the virtual machines that were formerly on host A. End result: The deployment planner returns the last_host_id of host A as the host to start the VM on. Since that host is marked deleted, the deployment executor removes it from the list of available hosts to start the VM on, and then throws an exception. The exception then appears on the GUI as a red box that basically gives the end user zero useful information. Expected result: The same as for admin users — the deployment planner notices that host A is deleted and cannot be used to deploy the VM, and instead picks a host from [B,C,D]. 2025-01-09 13:28:35,463 DEBUG [c.c.d.DeploymentPlanningManagerImpl] (API-Job-Executor-81:ctx-4b9a2500 job-418252 ctx-34040330) (logid:086f0ba0) Adding pods to avoid lists for non-explicit VM deployment: [] 2025-01-09 13:28:35,463 DEBUG [c.c.d.DeploymentPlanningManagerImpl] (API-Job-Executor-81:ctx-4b9a2500 job-418252 ctx-34040330) (logid:086f0ba0) Adding clusters to avoid lists for non-explicit VM deployment: [] 2025-01-09 13:28:35,463 DEBUG [c.c.d.DeploymentPlanningManagerImpl] (API-Job-Executor-81:ctx-4b9a2500 job-418252 ctx-34040330) (logid:086f0ba0) Adding hosts to avoid lists for non-explicit VM deployment: [] 2025-01-09 13:28:35,463 DEBUG [c.c.d.DeploymentPlanningManagerImpl] (API-Job-Executor-81:ctx-4b9a2500 job-418252 ctx-34040330) (logid:086f0ba0) DeploymentPlanner allocation algorithm: null 2025-01-09 13:28:35,463 DEBUG [c.c.d.DeploymentPlanningManagerImpl] (API-Job-Executor-81:ctx-4b9a2500 job-418252 ctx-34040330) (logid:086f0ba0) Trying to allocate a host and storage pools from dc:1, pod:null,cluster:null, requested cpu: 4000, requested ram: (4.00 GB) 4294967296 2025-01-09 13:28:35,463 DEBUG [c.c.d.DeploymentPlanningManagerImpl] (API-Job-Executor-81:ctx-4b9a2500 job-418252 ctx-34040330) (logid:086f0ba0) Is ROOT volume READY (pool already allocated)?: Yes 2025-01-09 13:28:35,466 DEBUG [c.c.a.ApiServer] (qtp364604394-5358:ctx-c649c5e4 ctx-618420eb) (logid:14ea3491) CIDRs from which account 'Account [{"accountName":"eric.green","id":8,"uuid":"e8baeda0-90a5-4c97-aa51-0adbfa3c0e4c"}]' is allowed to perform API calls: 0.0.0.0/0,::/0 2025-01-09 13:28:35,466 DEBUG [c.c.d.DeploymentPlanningManagerImpl] (API-Job-Executor-81:ctx-4b9a2500 job-418252 ctx-34040330) (logid:086f0ba0) Deploy avoids pods: [], clusters: [], hosts: [] 2025-01-09 13:28:35,466 DEBUG [c.c.d.DeploymentPlanningManagerImpl] (API-Job-Executor-81:ctx-4b9a2500 job-418252 ctx-34040330) (logid:086f0ba0) Deploy hosts with priorities {} , hosts have NORMAL priority by default 2025-01-09 13:28:35,467 DEBUG [c.c.d.DeploymentPlanningManagerImpl] (API-Job-Executor-81:ctx-4b9a2500 job-418252 ctx-34040330) (logid:086f0ba0) This VM has last host_id specified, trying to choose the same host: 62 2025-01-09 13:28:35,471 DEBUG [o.a.c.a.StaticRoleBasedAPIAccessChecker] (qtp364604394-5358:ctx-c649c5e4 ctx-618420eb) (logid:14ea3491) RoleService is enabled. We will use it instead of StaticRoleBasedAPIAccessChecker. 2025-01-09 13:28:35,471 DEBUG [o.a.c.r.ApiRateLimitServiceImpl] (qtp364604394-5358:ctx-c649c5e4 ctx-618420eb) (logid:14ea3491) API rate limiting is disabled. We will not use ApiRateLimitService. 2025-01-09 13:28:35,473 ERROR [c.c.a.ApiAsyncJobDispatcher] (API-Job-Executor-81:ctx-4b9a2500 job-418252) (logid:086f0ba0) Unexpected exception while executing org.apache.cloudstack.api.command.user.vm.StartVMCmd java.lang.NullPointerException at com.cloud.host.dao.HostDaoImpl.loadHostTags(HostDaoImpl.java:879) at jdk.internal.reflect.GeneratedMethodAccessor336.invoke(Unknown Source) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344) at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at com.cloud.utils.db.TransactionContextInterceptor.invoke(TransactionContextInterceptor.java:34) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175) at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215) at com.sun.proxy.$Proxy96.loadHostTags(Unknown Source) at com.cloud.deploy.DeploymentPlanningManagerImpl.planDeployment(DeploymentPlanningManagerImpl.java:451) at org.apache.cloudstack.engine.cloud.entity.api.VMEntityManagerImpl.reserveVirtualMachine(VMEntityManagerImpl.java:206) at org.apache.cloudstack.engine.cloud.entity.api.VirtualMachineEntityImpl.reserve(VirtualMachineEntityImpl.java:202) at com.cloud.vm.UserVmManagerImpl.startVirtualMachine(UserVmManagerImpl.java:5445) at com.cloud.vm.UserVmManagerImpl.startVirtualMachine(UserVmManagerImpl.java:5299) at com.cloud.vm.UserVmManagerImpl.startVirtualMachine(UserVmManagerImpl.java:3224) at jdk.internal.reflect.GeneratedMethodAccessor787.invoke(Unknown Source) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344) at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.apache.cloudstack.network.contrail.management.EventUtils$EventInterceptor.invoke(EventUtils.java:107) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175) at com.cloud.event.ActionEventInterceptor.invoke(ActionEventInterceptor.java:52) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175) at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215) at com.sun.proxy.$Proxy186.startVirtualMachine(Unknown Source) at org.apache.cloudstack.api.command.user.vm.StartVMCmd.execute(StartVMCmd.java:181) at com.cloud.api.ApiDispatcher.dispatch(ApiDispatcher.java:172) at com.cloud.api.ApiAsyncJobDispatcher.runJob(ApiAsyncJobDispatcher.java:112) at org.apache.cloudstack.framework.jobs.impl.AsyncJobManagerImpl$5.runInContext(AsyncJobManagerImpl.java:654) at org.apache.cloudstack.managed.context.ManagedContextRunnable$1.run(ManagedContextRunnable.java:48) at org.apache.cloudstack.managed.context.impl.DefaultManagedContext$1.call(DefaultManagedContext.java:55) at org.apache.cloudstack.managed.context.impl.DefaultManagedContext.callWithContext(DefaultManagedContext.java:102) at org.apache.cloudstack.managed.context.impl.DefaultManagedContext.runWithContext(DefaultManagedContext.java:52) at org.apache.cloudstack.managed.context.ManagedContextRunnable.run(ManagedContextRunnable.java:45) at org.apache.cloudstack.framework.jobs.impl.AsyncJobManagerImpl$5.run(AsyncJobManagerImpl.java:602) at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at java.base/java.lang.Thread.run(Thread.java:829)