Skip to content

Commit 3a31c16

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

File tree

9 files changed

+75
-5
lines changed

9 files changed

+75
-5
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: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,15 @@
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.GenericDaoBase;
23+
import com.cloud.utils.db.GenericSearchBuilder;
2124
import com.cloud.utils.db.SearchBuilder;
2225
import com.cloud.utils.db.SearchCriteria;
26+
27+
import org.apache.commons.collections.CollectionUtils;
2328
import org.springframework.stereotype.Component;
2429

2530
@Component
@@ -65,9 +70,26 @@ public UserDataVO findByName(long accountId, long domainId, String name) {
6570
}
6671

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

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);

server/src/test/java/com/cloud/template/TemplateManagerImplTest.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@
6363
import com.cloud.user.UserData;
6464
import com.cloud.user.UserVO;
6565
import com.cloud.user.dao.AccountDao;
66+
import com.cloud.user.dao.UserDataDao;
6667
import com.cloud.utils.component.ComponentContext;
6768
import com.cloud.utils.concurrency.NamedThreadFactory;
6869
import com.cloud.utils.exception.CloudRuntimeException;
@@ -203,14 +204,19 @@ public class TemplateManagerImplTest {
203204

204205
@Inject
205206
AccountManager _accountMgr;
207+
206208
@Inject
207209
VnfTemplateManager vnfTemplateManager;
210+
208211
@Inject
209212
SnapshotJoinDao snapshotJoinDao;
210213

211214
@Inject
212215
HeuristicRuleHelper heuristicRuleHelperMock;
213216

217+
@Inject
218+
UserDataDao userDataDao;
219+
214220
public class CustomThreadPoolExecutor extends ThreadPoolExecutor {
215221
AtomicInteger ai = new AtomicInteger(0);
216222
public CustomThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit,
@@ -978,11 +984,17 @@ public SecondaryStorageHeuristicDao secondaryStorageHeuristicDao() {
978984
public HeuristicRuleHelper heuristicRuleHelper() {
979985
return Mockito.mock(HeuristicRuleHelper.class);
980986
}
987+
981988
@Bean
982989
public SnapshotJoinDao snapshotJoinDao() {
983990
return Mockito.mock(SnapshotJoinDao.class);
984991
}
985992

993+
@Bean
994+
public UserDataDao userDataDao() {
995+
return Mockito.mock(UserDataDao.class);
996+
}
997+
986998

987999
public static class Library implements TypeFilter {
9881000
@Override

server/src/test/java/com/cloud/user/AccountManagerImplTest.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,6 @@ public void deleteUserAccount() {
200200
sshkeyList.add(sshkey);
201201
Mockito.when(_sshKeyPairDao.listKeyPairs(Mockito.anyLong(), Mockito.anyLong())).thenReturn(sshkeyList);
202202
Mockito.when(_sshKeyPairDao.remove(Mockito.anyLong())).thenReturn(true);
203-
Mockito.when(userDataDao.removeByAccountId(Mockito.anyLong())).thenReturn(222);
204203
Mockito.doNothing().when(accountManagerImpl).deleteWebhooksForAccount(Mockito.anyLong());
205204
Mockito.doNothing().when(accountManagerImpl).verifyCallerPrivilegeForUserOrAccountOperations((Account) any());
206205

0 commit comments

Comments
 (0)