Skip to content

Commit 3c7e877

Browse files
committed
server,engine-schema: unlink userdata during acount cleanup
Fixes #9497 Signed-off-by: Abhishek Kumar <[email protected]>
1 parent 3ddd802 commit 3c7e877

File tree

7 files changed

+64
-4
lines changed

7 files changed

+64
-4
lines changed

engine/components-api/src/main/java/com/cloud/template/TemplateManager.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,4 +149,6 @@ public interface TemplateManager {
149149
static Boolean getValidateUrlIsResolvableBeforeRegisteringTemplateValue() {
150150
return ValidateUrlIsResolvableBeforeRegisteringTemplate.value();
151151
}
152+
153+
void unlinkAllAndCleanupUserDataFromAccount(long accountId);
152154
}

engine/schema/src/main/java/com/cloud/storage/dao/VMTemplateDao.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,4 +103,6 @@ public interface VMTemplateDao extends GenericDao<VMTemplateVO, Long>, StateDao<
103103
List<Long> listIdsByTemplateTag(String tag);
104104

105105
List<Long> listIdsByExtensionId(long extensionId);
106+
107+
void unlinkUserdataFromTemplate(List<Long> userdataIds);
106108
}

engine/schema/src/main/java/com/cloud/storage/dao/VMTemplateDaoImpl.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -917,4 +917,20 @@ public boolean updateState(
917917
}
918918
return rows > 0;
919919
}
920+
921+
@Override
922+
public void unlinkUserdataFromTemplate(List<Long> userdataIds) {
923+
if (CollectionUtils.isEmpty(userdataIds)) {
924+
return;
925+
}
926+
SearchBuilder<VMTemplateVO> sb = createSearchBuilder();
927+
sb.and("userDataId", sb.entity().getUserDataId(), SearchCriteria.Op.IN);
928+
sb.done();
929+
SearchCriteria<VMTemplateVO> sc = sb.create();
930+
sc.setParameters("userDataId", userdataIds.toArray());
931+
VMTemplateVO vo = createForUpdate();
932+
vo.setUserDataId(null);
933+
vo.setUserDataLinkPolicy(null);
934+
update(vo, sc);
935+
}
920936
}

engine/schema/src/main/java/com/cloud/user/dao/UserDataDao.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
// under the License.
1717
package com.cloud.user.dao;
1818

19+
import java.util.List;
20+
1921
import com.cloud.user.UserDataVO;
2022
import com.cloud.utils.db.GenericDao;
2123

@@ -25,6 +27,8 @@ public interface UserDataDao extends GenericDao<UserDataVO, Long> {
2527

2628
public UserDataVO findByName(long accountId, long domainId, String name);
2729

28-
int removeByAccountId(long accountId);
30+
List<Long> listIdsByAccountId(long accountId);
31+
32+
int removeAllIds(List<Long> ids);
2933

3034
}

engine/schema/src/main/java/com/cloud/user/dao/UserDataDaoImpl.java

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,16 @@
1616
// under the License.
1717
package com.cloud.user.dao;
1818

19+
import java.util.List;
20+
21+
import com.cloud.service.ServiceOfferingVO;
1922
import com.cloud.user.UserDataVO;
2023
import com.cloud.utils.db.GenericDaoBase;
24+
import com.cloud.utils.db.GenericSearchBuilder;
2125
import com.cloud.utils.db.SearchBuilder;
2226
import com.cloud.utils.db.SearchCriteria;
27+
28+
import org.apache.commons.collections.CollectionUtils;
2329
import org.springframework.stereotype.Component;
2430

2531
@Component
@@ -65,9 +71,26 @@ public UserDataVO findByName(long accountId, long domainId, String name) {
6571
}
6672

6773
@Override
68-
public int removeByAccountId(long accountId) {
69-
SearchCriteria<UserDataVO> sc = userdataSearch.create();
74+
public List<Long> listIdsByAccountId(long accountId) {
75+
GenericSearchBuilder<UserDataVO, Long> sb = createSearchBuilder(Long.class);
76+
sb.selectFields(sb.entity().getId());
77+
sb.and("accountId", sb.entity().getAccountId(), SearchCriteria.Op.EQ);
78+
sb.done();
79+
SearchCriteria<Long> sc = sb.create();
7080
sc.setParameters("accountId", accountId);
81+
return customSearch(sc, null);
82+
}
83+
84+
@Override
85+
public int removeAllIds(List<Long> ids) {
86+
if (CollectionUtils.isEmpty(ids)) {
87+
return 0;
88+
}
89+
SearchBuilder<UserDataVO> sb = createSearchBuilder();
90+
sb.and("idIn", sb.entity().getId(), SearchCriteria.Op.IN);
91+
sb.done();
92+
SearchCriteria<UserDataVO> sc = sb.create();
93+
sc.setParameters("idIn", ids.toArray());
7194
return remove(sc);
7295
}
7396
}

server/src/main/java/com/cloud/template/TemplateManagerImpl.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,7 @@
193193
import com.cloud.user.User;
194194
import com.cloud.user.UserData;
195195
import com.cloud.user.dao.AccountDao;
196+
import com.cloud.user.dao.UserDataDao;
196197
import com.cloud.uservm.UserVm;
197198
import com.cloud.utils.DateUtil;
198199
import com.cloud.utils.EncryptionUtil;
@@ -301,6 +302,8 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager,
301302
private VMTemplateDetailsDao _tmpltDetailsDao;
302303
@Inject
303304
private HypervisorGuruManager _hvGuruMgr;
305+
@Inject
306+
UserDataDao userDataDao;
304307

305308
private List<TemplateAdapter> _adapters;
306309

@@ -2495,4 +2498,14 @@ public VirtualMachineTemplate linkUserDataToTemplate(LinkUserDataToTemplateCmd c
24952498

24962499
return _tmpltDao.findById(template.getId());
24972500
}
2501+
2502+
@Override
2503+
public void unlinkAllAndCleanupUserDataFromAccount(long accountId) {
2504+
List<Long> userDataIds = userDataDao.listIdsByAccountId(accountId);
2505+
if (CollectionUtils.isEmpty(userDataIds)) {
2506+
return;
2507+
}
2508+
_tmpltDao.unlinkUserdataFromTemplate(userDataIds);
2509+
userDataDao.removeAllIds(userDataIds);
2510+
}
24982511
}

server/src/main/java/com/cloud/user/AccountManagerImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1201,7 +1201,7 @@ public int compare(NetworkVO network1, NetworkVO network2) {
12011201
}
12021202

12031203
// Delete registered UserData
1204-
userDataDao.removeByAccountId(accountId);
1204+
_tmpltMgr.unlinkAllAndCleanupUserDataFromAccount(accountId);
12051205

12061206
// Delete Webhooks
12071207
deleteWebhooksForAccount(accountId);

0 commit comments

Comments
 (0)