package io.cattle.platform.process.agent;
import io.cattle.platform.agent.util.AgentUtils;
import io.cattle.platform.core.constants.AgentConstants;
import io.cattle.platform.core.constants.StoragePoolConstants;
import io.cattle.platform.core.model.Account;
import io.cattle.platform.core.model.Agent;
import io.cattle.platform.core.model.StoragePool;
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.object.util.DataAccessor;
import io.cattle.platform.process.common.handler.AbstractObjectProcessHandler;
import io.github.ibuildthecloud.gdapi.factory.SchemaFactory;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Named;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Named
public class AgentRemove extends AbstractObjectProcessHandler {
private static final Logger log = LoggerFactory.getLogger(AgentRemove.class);
@Inject
@Named("CoreSchemaFactory")
SchemaFactory schemaFactory;
@Override
public String[] getProcessNames() {
return new String[] {"agent.remove"};
}
@Override
public HandlerResult handle(ProcessState state, ProcessInstance process) {
Agent agent = (Agent)state.getResource();
for (String type : AgentUtils.AGENT_RESOURCES.get()) {
Class<?> clz = schemaFactory.getSchemaClass(type);
if (clz == null) {
log.error("Failed to find class for [{}]", type);
continue;
}
for (Object obj : objectManager.children(agent, clz)) {
if (obj instanceof StoragePool) {
StoragePool sp = (StoragePool)obj;
if (StoragePoolConstants.TYPE.equals(sp.getKind())) {
// Don't automatically delete shared storage pools
continue;
}
}
deactivateThenScheduleRemove(obj, state.getData());
}
}
deactivateThenScheduleRemove(objectManager.loadResource(Account.class, agent.getAccountId()), state.getData());
List<Long> authedRoleAccountIds = DataAccessor.fieldLongList(agent, AgentConstants.FIELD_AUTHORIZED_ROLE_ACCOUNTS);
for (Long accountId : authedRoleAccountIds) {
deactivateThenScheduleRemove(objectManager.loadResource(Account.class, accountId), state.getData());
}
return null;
}
}