package org.ovirt.engine.core.bll; import java.util.List; import org.ovirt.engine.core.common.AuditLogType; import org.ovirt.engine.core.common.action.CreateAllSnapshotsFromVmParameters; import org.ovirt.engine.core.common.action.ImagesActionsParametersBase; 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.validation.group.CreateEntity; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dal.VdcBllMessages; import org.ovirt.engine.core.dal.dbbroker.DbFacade; import org.ovirt.engine.core.utils.linq.LinqUtils; import org.ovirt.engine.core.utils.linq.Predicate; @LockIdNameAttribute(fieldName = "VmId") public class CreateAllSnapshotsFromVmCommand<T extends CreateAllSnapshotsFromVmParameters> extends VmCommand<T> { protected CreateAllSnapshotsFromVmCommand(Guid commandId) { super(commandId); } public CreateAllSnapshotsFromVmCommand(T parameters) { super(parameters); super.setVmId(parameters.getVmId()); parameters.setEntityId(getVmId()); setSnapshotName(parameters.getDescription()); } private List<DiskImage> getDisksList() { // // if no disk sent or found create snapshot for all vm disks // return (selectedDisks.Count > 0) ? selectedDisks : allVmDisks; List<DiskImage> allVmDisks = DbFacade.getInstance().getDiskImageDAO().getAllForVm(getVmId()); List<DiskImage> selectedDisks = LinqUtils.filter(allVmDisks, new Predicate<DiskImage>() { @Override public boolean eval(DiskImage d) { return getParameters().getDisksList().contains(d.getinternal_drive_mapping()); } }); // if no disk sent or found create snapshot for all vm disks return (selectedDisks.size() > 0) ? selectedDisks : allVmDisks; } @Override protected void ExecuteVmCommand() { if (getDisksList().size() > 0) { if (getParameters().getParentCommand() != VdcActionType.RunVm) { lockVmWithCompensationIfNeeded(); freeLock(); } Guid vmSnapshotId = Guid.NewGuid(); for (DiskImage image : getDisksList()) { ImagesActionsParametersBase tempVar = new ImagesActionsParametersBase(image.getId()); tempVar.setDescription(getParameters().getDescription()); tempVar.setSessionId(getParameters().getSessionId()); tempVar.setVmSnapshotId(vmSnapshotId); tempVar.setEntityId(getParameters().getEntityId()); tempVar.setParentCommand(getParameters().getParentCommand() != VdcActionType.Unknown ? getParameters() .getParentCommand() : VdcActionType.CreateAllSnapshotsFromVm); ImagesActionsParametersBase p = tempVar; // ParametersCurrentUser = CurrentUser, getParameters().getImagesParameters().add(p); p.setParentParemeters(getParameters()); VdcReturnValueBase vdcReturnValue = Backend.getInstance().runInternalAction( VdcActionType.CreateSnapshot, p); if (vdcReturnValue.getSucceeded()) { getTaskIdList().addAll(vdcReturnValue.getInternalTaskIdList()); } else { throw new VdcBLLException(vdcReturnValue.getFault().getError(), "CreateAllSnapshotsFromVmCommand::ExecuteVmCommand: Failed to create snapshot!"); } } } setSucceeded(true); } @Override public AuditLogType getAuditLogTypeValue() { switch (getActionState()) { case EXECUTE: return getSucceeded() ? AuditLogType.USER_CREATE_SNAPSHOT : AuditLogType.USER_FAILED_CREATE_SNAPSHOT; case END_SUCCESS: return getSucceeded() ? AuditLogType.USER_CREATE_SNAPSHOT_FINISHED_SUCCESS : AuditLogType.USER_CREATE_SNAPSHOT_FINISHED_FAILURE; default: return AuditLogType.USER_CREATE_SNAPSHOT_FINISHED_FAILURE; } } @Override protected boolean canDoAction() { boolean result = true; if (getDisksList().size() > 0) { result = ImagesHandler.PerformImagesChecks(getVmId(), getReturnValue().getCanDoActionMessages(), getVm().getstorage_pool_id(), getDisksList().get(0).getstorage_id().getValue(), true, getParameters().getParentCommand() != VdcActionType.RunVm, true, true, true, getParameters().getParentCommand() != VdcActionType.RunVm, true); } if (!result) { addCanDoActionMessage(VdcBllMessages.VAR__ACTION__CREATE); addCanDoActionMessage(VdcBllMessages.VAR__TYPE__SNAPSHOT); } return result; } @Override protected VdcActionType getChildActionType() { return VdcActionType.CreateSnapshot; } @Override protected List<Class<?>> getValidationGroups() { addValidationGroup(CreateEntity.class); return super.getValidationGroups(); } }