package org.ovirt.engine.core.bll;
import java.util.List;
import org.ovirt.engine.core.common.AuditLogType;
import org.ovirt.engine.core.common.action.ImagesContainterParametersBase;
import org.ovirt.engine.core.common.action.TryBackToAllSnapshotsOfVmParameters;
import org.ovirt.engine.core.common.action.VdcActionType;
import org.ovirt.engine.core.common.action.VdcReturnValueBase;
import org.ovirt.engine.core.common.businessentities.DiskImage;
import org.ovirt.engine.core.common.errors.VdcBLLException;
import org.ovirt.engine.core.common.errors.VdcBllErrors;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.compat.LogCompat;
import org.ovirt.engine.core.compat.LogFactoryCompat;
import org.ovirt.engine.core.dal.VdcBllMessages;
import org.ovirt.engine.core.dal.dbbroker.DbFacade;
import org.ovirt.engine.core.utils.linq.Function;
import org.ovirt.engine.core.utils.linq.LinqUtils;
public class TryBackToAllSnapshotsOfVmCommand<T extends TryBackToAllSnapshotsOfVmParameters> extends VmCommand<T> {
public TryBackToAllSnapshotsOfVmCommand(T parameters) {
super(parameters);
super.setVmId(parameters.getVmId());
parameters.setEntityId(getVmId());
}
@Override
protected void EndSuccessfully() {
super.EndSuccessfully();
List<DiskImage> images = DbFacade
.getInstance()
.getDiskImageDAO()
.getAllSnapshotsForVmSnapshot(getParameters().getDstSnapshotId());
if (images.size() != 0) {
setVm(null);
getVm().setapp_list(images.get(0).getappList());
DbFacade.getInstance().getVmDynamicDAO().update(getVm().getDynamicData());
}
}
@Override
protected void ExecuteVmCommand() {
List<DiskImage> images = DbFacade
.getInstance()
.getDiskImageDAO()
.getAllSnapshotsForVmSnapshot(getParameters().getDstSnapshotId());
Guid vmSnapshotId = Guid.NewGuid();
VmHandler.checkStatusAndLockVm(getVmId(), getCompensationContext());
if (images.size() > 0) {
for (DiskImage image : images) {
ImagesContainterParametersBase tempVar = new ImagesContainterParametersBase(image.getId(),
image.getinternal_drive_mapping(), getVmId());
tempVar.setParentCommand(VdcActionType.TryBackToAllSnapshotsOfVm);
tempVar.setVmSnapshotId(vmSnapshotId);
tempVar.setEntityId(getParameters().getEntityId());
tempVar.setParentParemeters(getParameters());
ImagesContainterParametersBase p = tempVar;
VdcReturnValueBase vdcReturnValue = Backend.getInstance().runInternalAction(
VdcActionType.TryBackToSnapshot, p);
getParameters().getImagesParameters().add(p);
if (vdcReturnValue.getSucceeded()) {
getTaskIdList().addAll(vdcReturnValue.getInternalTaskIdList());
} else if (vdcReturnValue.getFault() != null) {
// if we have a fault, forward it to the user
throw new VdcBLLException(vdcReturnValue.getFault().getError(), vdcReturnValue.getFault()
.getMessage());
} else {
log.error("Cannot create snapshot");
throw new VdcBLLException(VdcBllErrors.IRS_IMAGE_STATUS_ILLEGAL);
}
}
}
setSucceeded(true);
}
@Override
public AuditLogType getAuditLogTypeValue() {
switch (getActionState()) {
case EXECUTE:
return getSucceeded() ? AuditLogType.USER_TRY_BACK_TO_SNAPSHOT
: AuditLogType.USER_FAILED_TRY_BACK_TO_SNAPSHOT;
case END_SUCCESS:
return getSucceeded() ? AuditLogType.USER_TRY_BACK_TO_SNAPSHOT_FINISH_SUCCESS
: AuditLogType.USER_TRY_BACK_TO_SNAPSHOT_FINISH_FAILURE;
default:
return AuditLogType.USER_TRY_BACK_TO_SNAPSHOT_FINISH_FAILURE;
}
}
@Override
protected boolean canDoAction() {
VmHandler.updateDisksFromDb(getVm());
// DiskImage vmDisk = null; // LINQ 32934 Vm.DiskMap.Select(a =>
// a.Value).FirstOrDefault();
DiskImage vmDisk = LinqUtils.first(getVm().getDiskMap().values());
boolean result = true;
if (vmDisk != null) {
result = ImagesHandler.PerformImagesChecks(getVmId(), getReturnValue().getCanDoActionMessages(), getVm()
.getstorage_pool_id(), vmDisk.getstorage_id().getValue(), true, true, false, false, true, true,
true);
}
// check that not trying to preview current images (leaf)
// LINQ 29456
// if (result && Vm.DiskMap.Values.Select(disk =>
// disk.vm_snapshot_id.Value).
// Contains(TryParameters.DstSnapshotId))
if (result && LinqUtils.foreach(getVm().getDiskMap().values(), new Function<DiskImage, Guid>() {
@Override
public Guid eval(DiskImage disk) {
return disk.getvm_snapshot_id().getValue();
}
}).contains(getParameters().getDstSnapshotId())) {
result = false;
addCanDoActionMessage(VdcBllMessages.CANNOT_PREIEW_CURRENT_IMAGE);
}
if (!result) {
addCanDoActionMessage(VdcBllMessages.VAR__ACTION__PREVIEW);
addCanDoActionMessage(VdcBllMessages.VAR__TYPE__SNAPSHOT);
}
return result;
}
@Override
protected VdcActionType getChildActionType() {
return VdcActionType.TryBackToSnapshot;
}
private static LogCompat log = LogFactoryCompat.getLog(TryBackToAllSnapshotsOfVmCommand.class);
}