package io.cattle.platform.process.host;
import io.cattle.platform.core.constants.InstanceConstants;
import io.cattle.platform.core.dao.InstanceDao;
import io.cattle.platform.core.model.Host;
import io.cattle.platform.core.model.HostIpAddressMap;
import io.cattle.platform.core.model.Instance;
import io.cattle.platform.core.model.IpAddress;
import io.cattle.platform.core.model.PhysicalHost;
import io.cattle.platform.core.model.StoragePool;
import io.cattle.platform.core.model.StoragePoolHostMap;
import io.cattle.platform.docker.constants.DockerHostConstants;
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.process.StandardProcess;
import io.cattle.platform.process.base.AbstractDefaultProcessHandler;
import io.cattle.platform.util.type.CollectionUtils;
import javax.inject.Inject;
import javax.inject.Named;
@Named
public class HostRemove extends AbstractDefaultProcessHandler {
@Inject
InstanceDao instanceDao;
@Override
public HandlerResult handle(final ProcessState state, ProcessInstance process) {
final Host host = (Host) state.getResource();
removeInstances(host);
removeIps(host);
removePools(host);
PhysicalHost physHost = objectManager.loadResource(PhysicalHost.class, host.getPhysicalHostId());
if (physHost != null) {
deactivateThenScheduleRemove(physHost, null);
}
return null;
}
protected void removePools(Host host) {
for (StoragePoolHostMap map : objectManager.children(host, StoragePoolHostMap.class)) {
StoragePool pool = objectManager.loadResource(StoragePool.class, map.getStoragePoolId());
if (DockerHostConstants.KIND_DOCKER.equals(pool.getKind())) {
deactivateThenRemove(pool, null);
}
deactivateThenRemove(map, null);
}
}
protected void removeIps(Host host) {
for (HostIpAddressMap map : objectManager.children(host, HostIpAddressMap.class)) {
IpAddress ipAddress = objectManager.loadResource(IpAddress.class, map.getIpAddressId());
deactivateThenRemove(ipAddress, null);
}
}
protected void removeInstances(Host host) {
for (Instance instance : instanceDao.getNonRemovedInstanceOn(host.getId())) {
try {
objectProcessManager.scheduleStandardProcess(StandardProcess.REMOVE, instance, null);
} catch (ProcessCancelException e) {
objectProcessManager.scheduleProcessInstance(InstanceConstants.PROCESS_STOP, instance,
CollectionUtils.asMap(InstanceConstants.REMOVE_OPTION, true));
}
}
}
}