package io.cattle.platform.process.account; import io.cattle.platform.core.constants.CommonStatesConstants; import io.cattle.platform.core.constants.InstanceConstants; import io.cattle.platform.core.dao.AccountDao; import io.cattle.platform.core.dao.InstanceDao; import io.cattle.platform.core.model.Account; import io.cattle.platform.core.model.Agent; import io.cattle.platform.core.model.Certificate; import io.cattle.platform.core.model.Credential; import io.cattle.platform.core.model.GenericObject; import io.cattle.platform.core.model.Host; import io.cattle.platform.core.model.Instance; import io.cattle.platform.core.model.Network; import io.cattle.platform.core.model.PhysicalHost; import io.cattle.platform.core.model.Stack; import io.cattle.platform.core.model.StoragePool; import io.cattle.platform.core.model.UserPreference; import io.cattle.platform.core.model.Volume; import io.cattle.platform.engine.handler.HandlerResult; import io.cattle.platform.engine.process.ProcessInstance; import io.cattle.platform.engine.process.ProcessState; import io.cattle.platform.engine.process.impl.ProcessCancelException; import io.cattle.platform.object.meta.ObjectMetaDataManager; import io.cattle.platform.object.process.StandardProcess; import io.cattle.platform.process.base.AbstractDefaultProcessHandler; import io.cattle.platform.util.type.CollectionUtils; import io.github.ibuildthecloud.gdapi.condition.Condition; import io.github.ibuildthecloud.gdapi.condition.ConditionType; import java.util.List; import java.util.Map; import javax.inject.Inject; import javax.inject.Named; @Named public class AccountPurge extends AbstractDefaultProcessHandler { @Inject InstanceDao instanceDao; @Inject AccountDao accountDao; @Override public HandlerResult handle(ProcessState state, ProcessInstance process) { Account account = (Account) state.getResource(); for (Agent agent : list(account, Agent.class)) { if (agent.getRemoved() != null) { continue; } deactivateThenRemove(agent, state.getData()); } for (Host host : hostList(account, Host.class)) { try { deactivateThenRemove(host, state.getData()); } catch (ProcessCancelException e) { // ignore } purge(host, null); } for (Certificate cert : list(account, Certificate.class)) { if (cert.getRemoved() != null) { continue; } deactivateThenRemove(cert, state.getData()); } for (Credential cred : list(account, Credential.class)) { if (cred.getRemoved() != null) { continue; } deactivateThenRemove(cred, state.getData()); } for (Stack env : list(account, Stack.class)) { if (env.getRemoved() != null) { continue; } objectProcessManager.scheduleStandardProcessAsync(StandardProcess.REMOVE, env, null); } for (Instance instance : instanceDao.listNonRemovedInstances(account, false)) { deleteAgentAccount(instance.getAgentId(), state.getData()); try { objectProcessManager.scheduleStandardProcess(StandardProcess.REMOVE, instance, null); } catch (ProcessCancelException e) { objectProcessManager.scheduleProcessInstance(InstanceConstants.PROCESS_STOP, instance, CollectionUtils.asMap(InstanceConstants.REMOVE_OPTION, true)); } } for (PhysicalHost host : list(account, PhysicalHost.class)) { try { getObjectProcessManager().executeStandardProcess(StandardProcess.REMOVE, host, null); } catch (ProcessCancelException e) { // ignore } } for (StoragePool pool : list(account, StoragePool.class)) { if (pool.getRemoved() != null) { continue; } deactivateThenRemove(pool, state.getData()); } for (Volume volume : list(account, Volume.class)) { if (volume.getRemoved() != null) { continue; } deactivateThenRemove(volume, state.getData()); } for (Network network : list(account, Network.class)) { if (network.getRemoved() != null) { continue; } deactivateThenRemove(network, state.getData()); } for (GenericObject gobject : list(account, GenericObject.class)) { if (gobject.getRemoved() != null) { continue; } deactivateThenRemove(gobject, state.getData()); } for (UserPreference userPreference : list(account, UserPreference.class)) { if (userPreference.getRemoved() != null) { continue; } deactivateThenRemove(userPreference, state.getData()); } accountDao.deleteProjectMemberEntries(account); return null; } protected <T> List<T> list(Account account, Class<T> type) { return objectManager.find(type, ObjectMetaDataManager.REMOVED_FIELD, null, ObjectMetaDataManager.ACCOUNT_FIELD, account.getId()); } protected <T> List<T> hostList(Account account, Class<T> type) { return objectManager.find(type, ObjectMetaDataManager.STATE_FIELD, new Condition(ConditionType.NE, CommonStatesConstants.PURGED), ObjectMetaDataManager.ACCOUNT_FIELD, account.getId()); } protected void deleteAgentAccount(Long agentId, Map<String, Object> data) { if (agentId == null) { return; } Agent agent = getObjectManager().loadResource(Agent.class, agentId); Account account = getObjectManager().loadResource(Account.class, agent.getAccountId()); if (account == null) { return; } deactivateThenScheduleRemove(account, data); } }