package io.cattle.platform.iaas.api.filter.snapshot; import static io.cattle.platform.core.model.tables.SnapshotTable.*; import io.cattle.platform.core.model.Snapshot; import io.cattle.platform.iaas.api.filter.common.AbstractDefaultResourceManagerFilter; import io.cattle.platform.object.ObjectManager; import io.github.ibuildthecloud.gdapi.condition.Condition; import io.github.ibuildthecloud.gdapi.condition.ConditionType; import io.github.ibuildthecloud.gdapi.exception.ClientVisibleException; import io.github.ibuildthecloud.gdapi.request.ApiRequest; import io.github.ibuildthecloud.gdapi.request.resource.ResourceManager; import io.github.ibuildthecloud.gdapi.util.ResponseCodes; import io.github.ibuildthecloud.gdapi.validation.ValidationErrorCodes; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.inject.Inject; public class SnapshotValidationFilter extends AbstractDefaultResourceManagerFilter { @Inject ObjectManager objectManager; @Override public Class<?>[] getTypeClasses() { return new Class<?>[] { Snapshot.class }; } public Object resourceAction(String type, ApiRequest request, ResourceManager next) { if ("remove".equalsIgnoreCase(request.getAction())) { validateSnapshotRemove(request); } return super.resourceAction(type, request, next); } @Override public Object delete(String type, String id, ApiRequest request, ResourceManager next) { validateSnapshotRemove(request); return super.delete(type, id, request, next); } void validateSnapshotRemove(ApiRequest request) { Snapshot snapshot = objectManager.loadResource(Snapshot.class, request.getId()); Map<Object, Object> criteria = new HashMap<Object, Object>(); criteria.put(SNAPSHOT.VOLUME_ID, snapshot.getVolumeId()); criteria.put(SNAPSHOT.REMOVED, null); criteria.put(SNAPSHOT.ID, new Condition(ConditionType.GT, snapshot.getId())); List<Snapshot> snapshots = objectManager.find(Snapshot.class, criteria); if (snapshots.size() == 0) { throw new ClientVisibleException(ResponseCodes.BAD_REQUEST, ValidationErrorCodes.INVALID_STATE, "This snapshot cannot be removed because it is the latest one for the volume.", null); } } }