From 505faf72ebc0100d02a44be2086eb29b9dff825e Mon Sep 17 00:00:00 2001 From: nvazquez Date: Thu, 15 Jan 2026 13:15:31 -0300 Subject: [PATCH] Fix for Deleted userdata owned by a deleted account remains linked with the template --- .../java/com/cloud/user/dao/UserDataDao.java | 4 +++ .../com/cloud/user/dao/UserDataDaoImpl.java | 9 +++++++ .../com/cloud/user/AccountManagerImpl.java | 26 ++++++++++++++++++- 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/engine/schema/src/main/java/com/cloud/user/dao/UserDataDao.java b/engine/schema/src/main/java/com/cloud/user/dao/UserDataDao.java index 2733d8d2782f..7afb84a16c58 100644 --- a/engine/schema/src/main/java/com/cloud/user/dao/UserDataDao.java +++ b/engine/schema/src/main/java/com/cloud/user/dao/UserDataDao.java @@ -19,6 +19,8 @@ import com.cloud.user.UserDataVO; import com.cloud.utils.db.GenericDao; +import java.util.List; + public interface UserDataDao extends GenericDao { public UserDataVO findByUserData(long accountId, long domainId, String userData); @@ -27,4 +29,6 @@ public interface UserDataDao extends GenericDao { int removeByAccountId(long accountId); + List listByAccountId(long accountId); + } diff --git a/engine/schema/src/main/java/com/cloud/user/dao/UserDataDaoImpl.java b/engine/schema/src/main/java/com/cloud/user/dao/UserDataDaoImpl.java index ded0cd172da3..443a4af3009b 100644 --- a/engine/schema/src/main/java/com/cloud/user/dao/UserDataDaoImpl.java +++ b/engine/schema/src/main/java/com/cloud/user/dao/UserDataDaoImpl.java @@ -22,6 +22,8 @@ import com.cloud.utils.db.SearchCriteria; import org.springframework.stereotype.Component; +import java.util.List; + @Component public class UserDataDaoImpl extends GenericDaoBase implements UserDataDao { @@ -70,4 +72,11 @@ public int removeByAccountId(long accountId) { sc.setParameters("accountId", accountId); return remove(sc); } + + @Override + public List listByAccountId(long accountId) { + SearchCriteria sc = userdataSearch.create(); + sc.setParameters("accountId", accountId); + return listBy(sc); + } } diff --git a/server/src/main/java/com/cloud/user/AccountManagerImpl.java b/server/src/main/java/com/cloud/user/AccountManagerImpl.java index d4c23e8d62be..32e8891d42ff 100644 --- a/server/src/main/java/com/cloud/user/AccountManagerImpl.java +++ b/server/src/main/java/com/cloud/user/AccountManagerImpl.java @@ -1200,7 +1200,7 @@ public int compare(NetworkVO network1, NetworkVO network2) { } // Delete registered UserData - userDataDao.removeByAccountId(accountId); + cleanupAccountUserData(account); // Delete Webhooks deleteWebhooksForAccount(accountId); @@ -1221,6 +1221,30 @@ public int compare(NetworkVO network1, NetworkVO network2) { } } + private void cleanupAccountUserData(AccountVO account) { + long accountId = account.getId(); + List userData = userDataDao.listByAccountId(accountId); + if (CollectionUtils.isEmpty(userData)) { + return; + } + logger.info("Deleting {} registered UserData for Account {}", userData.size(), account); + for (UserDataVO userdata : userData) { + List templatesLinkedToUserdata = _templateDao.findTemplatesLinkedToUserdata(userdata.getId()); + if (CollectionUtils.isEmpty(templatesLinkedToUserdata)) { + continue; + } + for (VMTemplateVO template : templatesLinkedToUserdata) { + logger.debug("Unregistering UserData {} from Template {}", userdata, template); + template.setUserDataId(null); + template.setUserDataLinkPolicy(null); + _templateDao.update(template.getId(), template); + } + userDataDao.remove(userdata.getId()); + } + int userDataRemoved = userDataDao.removeByAccountId(accountId); + logger.info("Deleted {} registered UserData for Account {}", userDataRemoved, account); + } + @Override public boolean disableAccount(long accountId) throws ConcurrentOperationException, ResourceUnavailableException { boolean success = false;