package io.cattle.platform.process.volume;
import io.cattle.platform.core.constants.VolumeConstants;
import io.cattle.platform.core.dao.GenericMapDao;
import io.cattle.platform.core.model.Host;
import io.cattle.platform.core.model.Image;
import io.cattle.platform.core.model.Mount;
import io.cattle.platform.core.model.Volume;
import io.cattle.platform.core.model.VolumeStoragePoolMap;
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.process.instance.IgnoreReconnectionAgentHandler;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Named;
@Named
public class VolumeRemove extends IgnoreReconnectionAgentHandler {
@Inject
GenericMapDao mapDao;
public VolumeRemove() {
setProcessNames(new String[] { VolumeConstants.PROCESS_REMOVE });
}
@Override
protected Object getAgentResource(ProcessState state, ProcessInstance process, Object dataResource) {
Volume v = (Volume)state.getResource();
return objectManager.loadResource(Host.class, v.getHostId());
}
@Override
protected Object getEventResource(ProcessState state, ProcessInstance process) {
return getDataResource(state, process);
}
@Override
protected Object getDataResource(ProcessState state, ProcessInstance process) {
Volume v = (Volume)state.getResource();
List<? extends VolumeStoragePoolMap> maps = objectManager.children(v, VolumeStoragePoolMap.class);
return maps.size() > 0 ? maps.get(0) : null;
}
@Override
public HandlerResult handle(ProcessState state, ProcessInstance process) {
Volume volume = (Volume)state.getResource();
deallocate(volume, state.getData());
boolean maps = false;
boolean mounts = false;
for (VolumeStoragePoolMap map : mapDao.findToRemove(VolumeStoragePoolMap.class, Volume.class, volume.getId())) {
maps = true;
deactivateThenScheduleRemove(map, null);
}
for (Mount mount : mapDao.findToRemove(Mount.class, Volume.class, volume.getId())) {
mounts = true;
deactivateThenRemove(mount, null);
}
Image image = objectManager.loadResource(Image.class, volume.getImageId());
if (image != null) {
remove(image, null);
}
if (maps && !mounts && volume.getHostId() != null) {
/* HostId != null means this volume was created from a host, but no mounts also means it won't be deleted,
* so we delete.
*/
return super.handle(state, process);
}
return new HandlerResult();
}
}