diff --git a/server/src/com/cloud/projects/dao/ProjectAccountDao.java b/server/src/com/cloud/projects/dao/ProjectAccountDao.java index 3e72eee9974..f113d283c39 100644 --- a/server/src/com/cloud/projects/dao/ProjectAccountDao.java +++ b/server/src/com/cloud/projects/dao/ProjectAccountDao.java @@ -36,7 +36,9 @@ public interface ProjectAccountDao extends GenericDao { List listPermittedAccountIds(long accountId); - List listAdministratedProjects(long adminAccountId); + List listAdministratedProjectIds(long adminAccountId); Long countByAccountIdAndRole(long accountId, ProjectAccount.Role role); + + void removeAccountFromProjects(long accountId); } diff --git a/server/src/com/cloud/projects/dao/ProjectAccountDaoImpl.java b/server/src/com/cloud/projects/dao/ProjectAccountDaoImpl.java index 1eb28cae1f9..49e31114bb1 100644 --- a/server/src/com/cloud/projects/dao/ProjectAccountDaoImpl.java +++ b/server/src/com/cloud/projects/dao/ProjectAccountDaoImpl.java @@ -21,6 +21,8 @@ import java.util.List; import javax.ejb.Local; +import org.apache.log4j.Logger; + import com.cloud.projects.ProjectAccount; import com.cloud.projects.ProjectAccountVO; import com.cloud.utils.db.GenericDaoBase; @@ -36,6 +38,7 @@ public class ProjectAccountDaoImpl extends GenericDaoBase AdminSearch; final GenericSearchBuilder ProjectAccountSearch; final GenericSearchBuilder CountByRoleSearch; + public static final Logger s_logger = Logger.getLogger(ProjectAccountDaoImpl.class.getName()); protected ProjectAccountDaoImpl() { AllFieldsSearch = createSearchBuilder(); @@ -124,7 +127,7 @@ public class ProjectAccountDaoImpl extends GenericDaoBase listAdministratedProjects(long adminAccountId) { + public List listAdministratedProjectIds(long adminAccountId) { SearchCriteria sc = AdminSearch.create(); sc.setParameters("role", ProjectAccount.Role.Admin); sc.setParameters("accountId", adminAccountId); @@ -138,5 +141,16 @@ public class ProjectAccountDaoImpl extends GenericDaoBase sc = AllFieldsSearch.create(); + sc.setParameters("accountId", accountId); + + int rowsRemoved = remove(sc); + if (rowsRemoved > 0) { + s_logger.debug("Removed account id=" + accountId + " from " + rowsRemoved + " projects"); + } + } } diff --git a/server/src/com/cloud/user/AccountManagerImpl.java b/server/src/com/cloud/user/AccountManagerImpl.java index a634c0ebcf4..9773fb5eb18 100755 --- a/server/src/com/cloud/user/AccountManagerImpl.java +++ b/server/src/com/cloud/user/AccountManagerImpl.java @@ -445,20 +445,15 @@ public class AccountManagerImpl implements AccountManager, AccountService, Manag @Override public boolean deleteAccount(AccountVO account, long callerUserId, Account caller) { long accountId = account.getId(); - + + //delete the account record if (!_accountDao.remove(accountId)) { s_logger.error("Unable to delete account " + accountId); return false; } - List users = _userDao.listByAccount(accountId); - - for (UserVO user : users) { - _userDao.remove(user.getId()); - } - if (s_logger.isDebugEnabled()) { - s_logger.debug("Remove account " + accountId); + s_logger.debug("Removed account " + accountId); } return cleanupAccount(account, callerUserId, caller); @@ -468,8 +463,20 @@ public class AccountManagerImpl implements AccountManager, AccountService, Manag public boolean cleanupAccount(AccountVO account, long callerUserId, Account caller) { long accountId = account.getId(); boolean accountCleanupNeeded = false; - + try { + //cleanup the users from the account + List users = _userDao.listByAccount(accountId); + for (UserVO user : users) { + if (!_userDao.remove(user.getId())) { + s_logger.error("Unable to delete user: " + user + " as a part of account " + account + " cleanup"); + accountCleanupNeeded = true; + } + } + + //delete the account from project accounts + _projectAccountDao.removeAccountFromProjects(accountId); + // delete all vm groups belonging to accont List groups = _vmGroupDao.listByAccountId(accountId); for (InstanceGroupVO group : groups) { @@ -582,7 +589,7 @@ public class AccountManagerImpl implements AccountManager, AccountService, Manag } // delete account specific Virtual vlans (belong to system Public Network) - only when networks are cleaned -// up + // up // successfully if (networksDeleted) { if (!_configMgr.deleteAccountSpecificVirtualRanges(accountId)) { @@ -1010,7 +1017,7 @@ public class AccountManagerImpl implements AccountManager, AccountService, Manag } // Account that manages project(s) can't be removed - List managedProjectIds = _projectAccountDao.listAdministratedProjects(accountId); + List managedProjectIds = _projectAccountDao.listAdministratedProjectIds(accountId); if (!managedProjectIds.isEmpty()) { StringBuilder projectIds = new StringBuilder(); for (Long projectId : managedProjectIds) {