package org.ovirt.engine.core.bll;
import java.util.List;
import org.ovirt.engine.core.common.VdcObjectType;
import org.ovirt.engine.core.common.action.RestoreAllSnapshotsParameters;
import org.ovirt.engine.core.common.action.VdcActionType;
import org.ovirt.engine.core.common.action.VmPoolSimpleUserParameters;
import org.ovirt.engine.core.common.businessentities.ActionGroup;
import org.ovirt.engine.core.common.businessentities.DiskImage;
import org.ovirt.engine.core.common.businessentities.VM;
import org.ovirt.engine.core.common.businessentities.image_vm_pool_map;
import org.ovirt.engine.core.common.businessentities.permissions;
import org.ovirt.engine.core.compat.Guid;
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 DetachUserFromVmFromPoolCommand<T extends VmPoolSimpleUserParameters> extends
VmPoolSimpleUserCommandBase<T> {
/**
* Constructor for command creation when compensation is applied on startup
*
* @param commandId
*/
protected DetachUserFromVmFromPoolCommand(Guid commandId) {
super(commandId);
}
public DetachUserFromVmFromPoolCommand(T parameters) {
super(parameters);
parameters.setEntityId(getVmId());
}
protected boolean IsUserAttachedToPool() {
// Check first if user attached to pool directly
boolean attached = getVmPoolId() != null
&& DbFacade.getInstance().getEntityPermissions(getAdUserId(), ActionGroup.VM_POOL_BASIC_OPERATIONS,
getVmPoolId().getValue(), VdcObjectType.VmPool) != null;
return attached;
}
protected void DetachAllVmsFromUser() {
List<VM> vms = DbFacade.getInstance().getVmDAO().getAllForUser(getAdUserId());
for (VM vm : vms) {
if (getVmPoolId() != null && getVmPoolId().equals(vm.getVmPoolId())) {
permissions perm = DbFacade
.getInstance()
.getPermissionDAO()
.getForRoleAndAdElementAndObject(
PredefinedRoles.ENGINE_USER.getId(),
getAdUserId(), vm.getvm_guid());
if (perm != null) {
DbFacade.getInstance().getPermissionDAO().remove(perm.getId());
RestoreVmFromBaseSnapshot(vm);
}
}
}
}
private void RestoreVmFromBaseSnapshot(VM vm) {
List<image_vm_pool_map> list = DbFacade.getInstance().getDiskImageDAO().getImageVmPoolMapByVmId(vm.getvm_guid());
// java.util.ArrayList<DiskImage> imagesList = null; // LINQ 32934
// list.Select(a =>
// DbFacade.Instance.GetSnapshotById(a.image_guid)).ToList();
List<DiskImage> imagesList = LinqUtils.foreach(list, new Function<image_vm_pool_map, DiskImage>() {
@Override
public DiskImage eval(image_vm_pool_map a) {
return DbFacade.getInstance().getDiskImageDAO().getSnapshotById(a.getimage_guid());
}
});
if (imagesList.size() > 0) {
/**
* restore all snapshots
*/
RestoreAllSnapshotsParameters tempVar = new RestoreAllSnapshotsParameters(vm.getvm_guid(), Guid.Empty);
tempVar.setShouldBeLogged(false);
tempVar.setImagesList(imagesList);
Backend.getInstance().runInternalAction(VdcActionType.RestoreAllSnapshots, tempVar);
}
}
@Override
protected void executeCommand() {
if (IsUserAttachedToPool()) {
DetachAllVmsFromUser();
}
setSucceeded(true);
}
}