package org.ovirt.engine.core.bll;
import static java.util.stream.Collectors.toList;
import java.util.Collections;
import java.util.List;
import org.ovirt.engine.core.bll.context.CommandContext;
import org.ovirt.engine.core.bll.utils.PermissionSubject;
import org.ovirt.engine.core.common.VdcObjectType;
import org.ovirt.engine.core.common.action.DestroyImageParameters;
import org.ovirt.engine.core.common.asynctasks.EntityInfo;
import org.ovirt.engine.core.common.errors.EngineError;
import org.ovirt.engine.core.common.errors.EngineException;
import org.ovirt.engine.core.common.vdscommands.SPMGetVolumeInfoVDSCommandParameters;
import org.ovirt.engine.core.common.vdscommands.VDSCommandType;
import org.ovirt.engine.core.compat.Guid;
@InternalCommandAttribute
@NonTransactiveCommandAttribute
public class DestroyImageCheckCommand<T extends DestroyImageParameters>
extends CommandBase<T> {
public DestroyImageCheckCommand(T parameters, CommandContext cmdContext) {
super(parameters, cmdContext);
}
@Override
protected void executeCommand() {
getParameters().setEntityInfo(new EntityInfo(VdcObjectType.Disk, getParameters().getImageGroupId()));
List<Guid> failedGuids = getFailedVolumeIds();
if (failedGuids.isEmpty()) {
log.info("Requested images were successfully removed");
setSucceeded(true);
persistCommand(getParameters().getParentCommand());
} else {
log.error("The following images were not removed: {}", failedGuids);
}
}
protected List<Guid> getFailedVolumeIds() {
return getParameters().getImageList().stream().filter(this::volumeExists).collect(toList());
}
private boolean volumeExists(Guid volumeId) {
log.debug("Checking for the existence of volume '{}' using GetVolumeInfo", volumeId);
SPMGetVolumeInfoVDSCommandParameters params = new SPMGetVolumeInfoVDSCommandParameters(
getParameters().getStoragePoolId(),
getParameters().getStorageDomainId(),
getParameters().getImageGroupId(),
volumeId);
params.setExpectedEngineErrors(Collections.singleton(EngineError.VolumeDoesNotExist));
try {
runVdsCommand(VDSCommandType.SPMGetVolumeInfo, params);
} catch (EngineException e) {
if (e.getVdsError().getCode() == EngineError.VolumeDoesNotExist) {
return false;
}
// We can't assume the volume is gone; return true so that Live Merge fails
log.error("Failed to determine volume '{}' existence using GetVolumeInfo", volumeId, e);
}
return true;
}
@Override
public List<PermissionSubject> getPermissionCheckSubjects() {
return Collections.emptyList();
}
}