Skip to content

Commit c4f0078

Browse files
committed
cks: cleanup clusters on owner account cleanup
When the owner account of k8s clusters is deleted, while its node VMs get expunged, the cluster entry in DB remain present. This PR fixex the issue by cleaning up all clusters for the account deleted. Signed-off-by: Abhishek Kumar <[email protected]>
1 parent 95c2481 commit c4f0078

File tree

7 files changed

+54
-16
lines changed

7 files changed

+54
-16
lines changed

api/src/main/java/com/cloud/kubernetes/cluster/KubernetesServiceHelper.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,13 @@
1818

1919
import org.apache.cloudstack.acl.ControlledEntity;
2020

21+
import com.cloud.user.Account;
2122
import com.cloud.uservm.UserVm;
2223
import com.cloud.utils.component.Adapter;
2324

2425
public interface KubernetesServiceHelper extends Adapter {
2526

2627
ControlledEntity findByUuid(String uuid);
2728
void checkVmCanBeDestroyed(UserVm userVm);
29+
void cleanupForAccount(Account account);
2830
}

plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterManagerImpl.java

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1445,9 +1445,7 @@ public boolean deleteKubernetesCluster(DeleteKubernetesClusterCmd cmd) throws Cl
14451445
}
14461446
accountManager.checkAccess(CallContext.current().getCallingAccount(), SecurityChecker.AccessType.OperateEntry, false, cluster);
14471447
if (cluster.getClusterType() == KubernetesCluster.ClusterType.CloudManaged) {
1448-
KubernetesClusterDestroyWorker destroyWorker = new KubernetesClusterDestroyWorker(cluster, this);
1449-
destroyWorker = ComponentContext.inject(destroyWorker);
1450-
return destroyWorker.destroy();
1448+
return destroyKubernetesCluster(cluster);
14511449
} else {
14521450
boolean cleanup = cmd.getCleanup();
14531451
boolean expunge = cmd.getExpunge();
@@ -1730,6 +1728,30 @@ public List<RemoveVirtualMachinesFromKubernetesClusterResponse> removeVmsFromClu
17301728
return responseList;
17311729
}
17321730

1731+
protected boolean destroyKubernetesCluster(KubernetesCluster kubernetesCluster) {
1732+
KubernetesClusterDestroyWorker destroyWorker = new KubernetesClusterDestroyWorker(kubernetesCluster,
1733+
KubernetesClusterManagerImpl.this);
1734+
destroyWorker = ComponentContext.inject(destroyWorker);
1735+
return destroyWorker.destroy();
1736+
}
1737+
1738+
@Override
1739+
public void cleanupForAccount(Account account) {
1740+
List<KubernetesClusterVO> clusters = kubernetesClusterDao.listForCleanupByAccount(account.getId());
1741+
if (CollectionUtils.isEmpty(clusters)) {
1742+
return;
1743+
}
1744+
LOGGER.debug(String.format("Cleaning up %d Kubernetes cluster for %s", clusters.size(), account));
1745+
for (KubernetesClusterVO cluster : clusters) {
1746+
try {
1747+
destroyKubernetesCluster(cluster);
1748+
} catch (CloudRuntimeException e) {
1749+
LOGGER.warn(String.format("Failed to destroy Kubernetes cluster: %s during cleanup for %s",
1750+
cluster.getName(), account), e);
1751+
}
1752+
}
1753+
}
1754+
17331755
@Override
17341756
public List<Class<?>> getCommands() {
17351757
List<Class<?>> cmdList = new ArrayList<Class<?>>();
@@ -1781,9 +1803,7 @@ public void reallyRun() {
17811803
LOGGER.info(String.format("Running Kubernetes cluster garbage collector on Kubernetes cluster : %s", kubernetesCluster.getName()));
17821804
}
17831805
try {
1784-
KubernetesClusterDestroyWorker destroyWorker = new KubernetesClusterDestroyWorker(kubernetesCluster, KubernetesClusterManagerImpl.this);
1785-
destroyWorker = ComponentContext.inject(destroyWorker);
1786-
if (destroyWorker.destroy()) {
1806+
if (destroyKubernetesCluster(kubernetesCluster)) {
17871807
if (LOGGER.isInfoEnabled()) {
17881808
LOGGER.info(String.format("Garbage collection complete for Kubernetes cluster : %s", kubernetesCluster.getName()));
17891809
}
@@ -1909,9 +1929,7 @@ public void reallyRun() {
19091929
LOGGER.info(String.format("Running Kubernetes cluster state scanner on Kubernetes cluster : %s for state: %s", kubernetesCluster.getName(), KubernetesCluster.State.Destroying.toString()));
19101930
}
19111931
try {
1912-
KubernetesClusterDestroyWorker destroyWorker = new KubernetesClusterDestroyWorker(kubernetesCluster, KubernetesClusterManagerImpl.this);
1913-
destroyWorker = ComponentContext.inject(destroyWorker);
1914-
destroyWorker.destroy();
1932+
destroyKubernetesCluster(kubernetesCluster);
19151933
} catch (Exception e) {
19161934
LOGGER.warn(String.format("Failed to run Kubernetes cluster Destroying state scanner on Kubernetes cluster : %s status scanner", kubernetesCluster.getName()), e);
19171935
}

plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterService.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import org.apache.cloudstack.framework.config.ConfigKey;
3434
import org.apache.cloudstack.framework.config.Configurable;
3535

36+
import com.cloud.user.Account;
3637
import com.cloud.utils.component.PluggableService;
3738
import com.cloud.utils.exception.CloudRuntimeException;
3839

@@ -122,4 +123,6 @@ public interface KubernetesClusterService extends PluggableService, Configurable
122123
boolean addVmsToCluster(AddVirtualMachinesToKubernetesClusterCmd cmd);
123124

124125
List<RemoveVirtualMachinesFromKubernetesClusterResponse> removeVmsFromCluster(RemoveVirtualMachinesFromKubernetesClusterCmd cmd);
126+
127+
void cleanupForAccount(Account account);
125128
}

plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesServiceHelperImpl.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import com.cloud.kubernetes.cluster.dao.KubernetesClusterVmMapDao;
3535
import com.cloud.kubernetes.version.KubernetesSupportedVersion;
3636
import com.cloud.kubernetes.version.KubernetesVersionEventTypes;
37+
import com.cloud.user.Account;
3738
import com.cloud.uservm.UserVm;
3839
import com.cloud.utils.component.AdapterBase;
3940
import com.cloud.utils.exception.CloudRuntimeException;
@@ -47,6 +48,8 @@ public class KubernetesServiceHelperImpl extends AdapterBase implements Kubernet
4748
private KubernetesClusterDao kubernetesClusterDao;
4849
@Inject
4950
private KubernetesClusterVmMapDao kubernetesClusterVmMapDao;
51+
@Inject
52+
KubernetesClusterService kubernetesClusterService;
5053

5154
protected void setEventTypeEntityDetails(Class<?> eventTypeDefinedClass, Class<?> entityClass) {
5255
Field[] declaredFields = eventTypeDefinedClass.getDeclaredFields();
@@ -94,6 +97,11 @@ public void checkVmCanBeDestroyed(UserVm userVm) {
9497
throw new CloudRuntimeException(msg);
9598
}
9699

100+
@Override
101+
public void cleanupForAccount(Account account) {
102+
kubernetesClusterService.cleanupForAccount(account);
103+
}
104+
97105
@Override
98106
public String getConfigComponentName() {
99107
return KubernetesServiceHelper.class.getSimpleName();

plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/dao/KubernetesClusterDao.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
public interface KubernetesClusterDao extends GenericDao<KubernetesClusterVO, Long>,
2727
StateDao<KubernetesCluster.State, KubernetesCluster.Event, KubernetesCluster> {
2828

29-
List<KubernetesClusterVO> listByAccount(long accountId);
29+
List<KubernetesClusterVO> listForCleanupByAccount(long accountId);
3030
List<KubernetesClusterVO> findKubernetesClustersToGarbageCollect();
3131
List<KubernetesClusterVO> findManagedKubernetesClustersInState(KubernetesCluster.State state);
3232
List<KubernetesClusterVO> listByNetworkId(long networkId);

plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/dao/KubernetesClusterDaoImpl.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,16 +30,17 @@
3030
@Component
3131
public class KubernetesClusterDaoImpl extends GenericDaoBase<KubernetesClusterVO, Long> implements KubernetesClusterDao {
3232

33-
private final SearchBuilder<KubernetesClusterVO> AccountIdSearch;
33+
private final SearchBuilder<KubernetesClusterVO> CleanupAccountIdSearch;
3434
private final SearchBuilder<KubernetesClusterVO> GarbageCollectedSearch;
3535
private final SearchBuilder<KubernetesClusterVO> ManagedStateSearch;
3636
private final SearchBuilder<KubernetesClusterVO> SameNetworkSearch;
3737
private final SearchBuilder<KubernetesClusterVO> KubernetesVersionSearch;
3838

3939
public KubernetesClusterDaoImpl() {
40-
AccountIdSearch = createSearchBuilder();
41-
AccountIdSearch.and("account", AccountIdSearch.entity().getAccountId(), SearchCriteria.Op.EQ);
42-
AccountIdSearch.done();
40+
CleanupAccountIdSearch = createSearchBuilder();
41+
CleanupAccountIdSearch.and("account", CleanupAccountIdSearch.entity().getAccountId(), SearchCriteria.Op.EQ);
42+
CleanupAccountIdSearch.and("cluster_type", CleanupAccountIdSearch.entity().getClusterType(), SearchCriteria.Op.EQ);
43+
CleanupAccountIdSearch.done();
4344

4445
GarbageCollectedSearch = createSearchBuilder();
4546
GarbageCollectedSearch.and("gc", GarbageCollectedSearch.entity().isCheckForGc(), SearchCriteria.Op.EQ);
@@ -62,8 +63,9 @@ public KubernetesClusterDaoImpl() {
6263
}
6364

6465
@Override
65-
public List<KubernetesClusterVO> listByAccount(long accountId) {
66-
SearchCriteria<KubernetesClusterVO> sc = AccountIdSearch.create();
66+
public List<KubernetesClusterVO> listForCleanupByAccount(long accountId) {
67+
SearchCriteria<KubernetesClusterVO> sc = CleanupAccountIdSearch.create();
68+
sc.setParameters("cluster_type", KubernetesCluster.ClusterType.CloudManaged);
6769
sc.setParameters("account", accountId);
6870
return listBy(sc, null);
6971
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@
117117
import com.cloud.exception.OperationTimedoutException;
118118
import com.cloud.exception.PermissionDeniedException;
119119
import com.cloud.exception.ResourceUnavailableException;
120+
import com.cloud.kubernetes.cluster.KubernetesServiceHelper;
120121
import com.cloud.network.IpAddress;
121122
import com.cloud.network.IpAddressManager;
122123
import com.cloud.network.Network;
@@ -301,6 +302,8 @@ public class AccountManagerImpl extends ManagerBase implements AccountManager, M
301302
private UserDataDao userDataDao;
302303
@Inject
303304
private NetworkPermissionDao networkPermissionDao;
305+
@Inject
306+
KubernetesServiceHelper kubernetesServiceHelper;
304307

305308
private List<QuerySelector> _querySelectors;
306309

@@ -929,6 +932,8 @@ protected boolean cleanupAccount(AccountVO account, long callerUserId, Account c
929932
}
930933
}
931934

935+
kubernetesServiceHelper.cleanupForAccount(account);
936+
932937
// Destroy the account's VMs
933938
List<UserVmVO> vms = _userVmDao.listByAccountId(accountId);
934939
if (s_logger.isDebugEnabled()) {

0 commit comments

Comments
 (0)