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.RestoreAllSnapshotsParameters; import org.ovirt.engine.core.common.action.VdcActionParametersBase; 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.businessentities.VMStatus; 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; public class RestoreAllSnapshotsCommand<T extends RestoreAllSnapshotsParameters> extends VmCommand<T> { /** * Constructor for command creation when compensation is applied on startup * * @param commandId */ protected RestoreAllSnapshotsCommand(Guid commandId) { super(commandId); } public RestoreAllSnapshotsCommand(T parameters) { super(parameters); super.setVmId(parameters.getVmId()); parameters.setEntityId(getVmId()); } @Override protected void ExecuteVmCommand() { if (getImagesList().size() > 0) { lockVmWithCompensationIfNeeded(); VdcReturnValueBase returnValue = null; for (DiskImage image : getImagesList()) { ImagesContainterParametersBase tempVar = new ImagesContainterParametersBase(image.getId(), image.getinternal_drive_mapping(), getVmId()); tempVar.setEntityId(getParameters().getEntityId()); VdcActionParametersBase p = tempVar; p.setParentCommand(getActionType()); p.setParentParemeters(getParameters()); returnValue = Backend.getInstance().runInternalAction( VdcActionType.RestoreFromSnapshot, p); getParameters().getImagesParameters().add(p); getTaskIdList().addAll(returnValue.getInternalTaskIdList()); } // We should have at least one task in the VDSM, to be sure that EndCommand will be called and the VM would // change its status from Image lock. if (getTaskIdList().size() == 0) { log.errorFormat("Can't restore snapshot for VM, since no destroyImage task could be established in the VDSM."); if (returnValue != null) { getReturnValue().setFault(returnValue.getFault()); } } else { setSucceeded(true); } } else { setSucceeded(true); } } @Override protected VdcActionType getChildActionType() { return VdcActionType.RestoreFromSnapshot; } private List<DiskImage> getImagesList() { if (getParameters().getImagesList() == null && !getParameters().getDstSnapshotId().equals(Guid.Empty)) { getParameters().setImagesList( DbFacade.getInstance() .getDiskImageDAO() .getAllSnapshotsForVmSnapshot(getParameters().getDstSnapshotId())); } return getParameters().getImagesList(); } @Override public AuditLogType getAuditLogTypeValue() { switch (getActionState()) { case EXECUTE: return getSucceeded() ? AuditLogType.USER_RESTORE_FROM_SNAPSHOT_START : AuditLogType.USER_FAILED_RESTORE_FROM_SNAPSHOT; default: return AuditLogType.USER_RESTORE_FROM_SNAPSHOT_FINISH_SUCCESS; } } @Override protected boolean canDoAction() { boolean result = false; if (getImagesList() == null || getImagesList().isEmpty()) { addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_VM_SNAPSHOT_DOES_NOT_EXIST); } else { result = ImagesHandler.PerformImagesChecks(getVmId(), getReturnValue().getCanDoActionMessages(), getVm() .getstorage_pool_id(), getImagesList().get(0).getstorage_id().getValue(), true, true, false, !isInternalExecution(), false, false, true); if (result && (getVm().getstatus() != VMStatus.Down)) { result = false; addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_VM_IS_NOT_DOWN); } } if (!result) { addCanDoActionMessage(VdcBllMessages.VAR__ACTION__REVERT_TO); addCanDoActionMessage(VdcBllMessages.VAR__TYPE__SNAPSHOT); } return result; } @Override protected void EndSuccessfully() { super.EndSuccessfully(); if (getImagesList() != null) { for (DiskImage image : getImagesList()) { DiskImage imageFromDb = DbFacade.getInstance().getDiskImageDAO().getSnapshotById(image.getId()); if (imageFromDb != null) { setVm(null); getVm().setapp_list(imageFromDb.getappList()); DbFacade.getInstance().getVmDynamicDAO().update(getVm().getDynamicData()); break; } } } } private static LogCompat log = LogFactoryCompat.getLog(RemoveAllVmImagesCommand.class); }