diff --git a/server/src/main/java/com/cloud/user/AccountManagerImpl.java b/server/src/main/java/com/cloud/user/AccountManagerImpl.java index 1f6e8d5b49ee..e69680a1d86f 100644 --- a/server/src/main/java/com/cloud/user/AccountManagerImpl.java +++ b/server/src/main/java/com/cloud/user/AccountManagerImpl.java @@ -2100,14 +2100,30 @@ public boolean deleteUserAccount(long accountId) { protected void checkIfAccountManagesProjects(long accountId) { List managedProjectIds = _projectAccountDao.listAdministratedProjectIds(accountId); - if (!CollectionUtils.isEmpty(managedProjectIds)) { - throw new InvalidParameterValueException(String.format( + + if (CollectionUtils.isEmpty(managedProjectIds)) { + return; + } + + List activeManagedProjects = new ArrayList<>(); + + for (Long projectId : managedProjectIds) { + ProjectVO project = _projectDao.findById(projectId); + if (project != null && project.getRemoved() == null) { + activeManagedProjects.add(projectId); + } + } + + if (!activeManagedProjects.isEmpty()) { + throw new InvalidParameterValueException( + String.format( "Unable to delete account [%s], because it manages the following project(s): %s. Please, remove the account from these projects or demote it to a regular project role first.", - accountId, managedProjectIds + accountId, activeManagedProjects )); } } + protected boolean isDeleteNeeded(AccountVO account, long accountId, Account caller) { if (account == null) { logger.info(String.format("The account, identified by id %d, doesn't exist", accountId )); diff --git a/server/src/test/java/com/cloud/user/AccountManagerImplTest.java b/server/src/test/java/com/cloud/user/AccountManagerImplTest.java index 6f5fbb0fdc12..dcaa95e2b360 100644 --- a/server/src/test/java/com/cloud/user/AccountManagerImplTest.java +++ b/server/src/test/java/com/cloud/user/AccountManagerImplTest.java @@ -73,6 +73,7 @@ import com.cloud.vm.UserVmVO; import com.cloud.vm.VMInstanceVO; import com.cloud.vm.snapshot.VMSnapshotVO; +import com.cloud.projects.ProjectVO; public class AccountManagerImplTest extends AccountManagentImplTestBase { @@ -1388,6 +1389,9 @@ public void checkIfAccountManagesProjectsTestThrowExceptionWhenTheAccountIsAProj List managedProjectIds = List.of(1L); Mockito.when(_projectAccountDao.listAdministratedProjectIds(accountId)).thenReturn(managedProjectIds); + ProjectVO project = Mockito.mock(ProjectVO.class); + Mockito.when(project.getRemoved()).thenReturn(null); + Mockito.when(_projectDao.findById(1L)).thenReturn(project); accountManagerImpl.checkIfAccountManagesProjects(accountId); }