package org.ovirt.engine.core.bll; import javax.inject.Inject; import org.ovirt.engine.core.bll.context.CommandContext; import org.ovirt.engine.core.common.VdcObjectType; import org.ovirt.engine.core.common.action.DetachUserFromVmFromPoolParameters; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.action.VmOperationParameterBase; import org.ovirt.engine.core.common.asynctasks.EntityInfo; import org.ovirt.engine.core.common.businessentities.Permission; import org.ovirt.engine.core.common.businessentities.Snapshot.SnapshotType; import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.compat.TransactionScopeOption; import org.ovirt.engine.core.dao.PermissionDao; import org.ovirt.engine.core.dao.SnapshotDao; import org.ovirt.engine.core.dao.VmDao; @DisableInPrepareMode public class DetachUserFromVmFromPoolCommand<T extends DetachUserFromVmFromPoolParameters> extends VmPoolUserCommandBase<T> { @Inject private PermissionDao permissionDao; @Inject private SnapshotDao snapshotDao; @Inject private VmDao vmDao; /** * Constructor for command creation when compensation is applied on startup */ protected DetachUserFromVmFromPoolCommand(Guid commandId) { super(commandId); } public DetachUserFromVmFromPoolCommand(T parameters, CommandContext commandContext) { super(parameters, commandContext); parameters.setEntityInfo(new EntityInfo(VdcObjectType.VM, getVmId())); } protected void detachVmFromUser() { Permission perm = permissionDao.getForRoleAndAdElementAndObject( PredefinedRoles.ENGINE_USER.getId(), getAdUserId(), getParameters().getVmId()); if (perm != null) { permissionDao.remove(perm.getId()); if (getParameters().getIsRestoreStateless()) { VM vm = vmDao.get(getParameters().getVmId()); if (vm != null) { restoreVmFromBaseSnapshot(vm); } } } } private void restoreVmFromBaseSnapshot(VM vm) { if (snapshotDao.exists(vm.getId(), SnapshotType.STATELESS)) { log.info("Deleting snapshots for stateless vm '{}'", vm.getId()); VmOperationParameterBase restoreParams = new VmOperationParameterBase(vm.getId()); // setting RestoreStatelessVm to run in new transaction so it could rollback internally if needed, // but still not affect this command, in order to keep permissions changes even on restore failure restoreParams.setTransactionScopeOption(TransactionScopeOption.RequiresNew); runInternalAction(VdcActionType.RestoreStatelessVm, restoreParams, getContext().withCompensationContext(null)); } } @Override protected void executeCommand() { if (getVmPoolId() != null) { detachVmFromUser(); } setSucceeded(true); } }