package io.cattle.platform.process.mount;
import static io.cattle.platform.core.model.tables.MountTable.*;
import io.cattle.platform.core.constants.CommonStatesConstants;
import io.cattle.platform.core.model.Mount;
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.lock.LockCallbackNoReturn;
import io.cattle.platform.lock.LockManager;
import io.cattle.platform.object.process.StandardProcess;
import io.cattle.platform.process.base.AbstractDefaultProcessHandler;
import io.cattle.platform.process.common.lock.MountVolumeLock;
import io.github.ibuildthecloud.gdapi.condition.Condition;
import io.github.ibuildthecloud.gdapi.condition.ConditionType;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
import javax.inject.Named;
@Named
public class MountDeactivate extends AbstractDefaultProcessHandler {
public static final List<Object> MOUNT_STATES = Arrays.asList(new Object[] { CommonStatesConstants.INACTIVE, CommonStatesConstants.DEACTIVATING,
CommonStatesConstants.REMOVED, CommonStatesConstants.REMOVING });
@Inject
LockManager lockManager;
@Override
public HandlerResult handle(final ProcessState state, ProcessInstance process) {
final Mount mount = (Mount)state.getResource();
lockManager.lock(new MountVolumeLock(mount.getVolumeId()), new LockCallbackNoReturn() {
@Override
public void doWithLockNoResult() {
Map<Object, Object> criteria = new HashMap<Object, Object>();
criteria.put(MOUNT.ID, new Condition(ConditionType.NE, mount.getId()));
criteria.put(MOUNT.STATE, new Condition(ConditionType.NOTIN, MOUNT_STATES));
criteria.put(MOUNT.VOLUME_ID, mount.getVolumeId());
Mount mount2 = objectManager.findAny(Mount.class, criteria);
if (mount2 == null) {
Volume vol = objectManager.loadResource(Volume.class, mount.getVolumeId());
if (CommonStatesConstants.ACTIVE.equals(vol.getState()) || CommonStatesConstants.ACTIVATING.equals(vol.getState())) {
objectProcessManager.scheduleStandardProcess(StandardProcess.DEACTIVATE, vol, null);
}
}
}
});
return null;
}
}