package io.cattle.platform.process.volume; import static io.cattle.platform.core.model.tables.SnapshotTable.*; import io.cattle.platform.core.constants.VolumeConstants; import io.cattle.platform.core.model.Snapshot; import io.cattle.platform.core.model.Volume; import io.cattle.platform.engine.handler.HandlerResult; import io.cattle.platform.engine.handler.ProcessPostListener; import io.cattle.platform.engine.process.ProcessInstance; import io.cattle.platform.engine.process.ProcessState; import io.cattle.platform.object.process.StandardProcess; import io.cattle.platform.process.common.handler.AbstractObjectProcessLogic; import io.cattle.platform.util.type.Priority; import io.github.ibuildthecloud.gdapi.condition.Condition; import io.github.ibuildthecloud.gdapi.condition.ConditionType; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.inject.Named; @Named public class VolumePostRevertRestore extends AbstractObjectProcessLogic implements ProcessPostListener, Priority { @Override public String[] getProcessNames() { return new String[] { VolumeConstants.PROCESS_REVERT, VolumeConstants.PROCESS_RESTORE_FROM_BACKUP }; } @Override public HandlerResult handle(ProcessState state, ProcessInstance process) { Volume volume = (Volume)state.getResource(); List<Snapshot> snapshots = null; if (VolumeConstants.PROCESS_RESTORE_FROM_BACKUP.equalsIgnoreCase(process.getName())) { snapshots = objectManager.children(volume, Snapshot.class); } else if (VolumeConstants.PROCESS_REVERT.equalsIgnoreCase(process.getName())) { Snapshot snapshot = objectManager.loadResource(Snapshot.class, state.getData().get("snapshotId").toString()); Map<Object, Object> criteria = new HashMap<Object, Object>(); criteria.put(SNAPSHOT.VOLUME_ID, volume.getId()); criteria.put(SNAPSHOT.REMOVED, null); criteria.put(SNAPSHOT.ID, new Condition(ConditionType.GT, snapshot.getId())); snapshots = objectManager.find(Snapshot.class, criteria); } else { throw new IllegalStateException("Unknown process: " + process.getName()); } for (Snapshot s : snapshots) { if (s.getRemoved() == null) { objectProcessManager.scheduleStandardProcess(StandardProcess.REMOVE, s, null); } } return null; } @Override public int getPriority() { return Priority.DEFAULT; } }