package org.ovirt.engine.core.bll; import java.util.List; import org.ovirt.engine.core.common.AuditLogType; import org.ovirt.engine.core.common.action.UpdateVmDiskParameters; import org.ovirt.engine.core.common.businessentities.DiskImage; import org.ovirt.engine.core.common.businessentities.DiskImageBase; import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.common.businessentities.VmNetworkInterface; import org.ovirt.engine.core.common.businessentities.image_vm_map; 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; public class UpdateVmDiskCommand<T extends UpdateVmDiskParameters> extends VmCommand<T> { public UpdateVmDiskCommand(T parameters) { super(parameters); setVmId(parameters.getVmId()); } private DiskImage _oldDisk; @Override protected void ExecuteVmCommand() { _oldDisk.setboot(getParameters().getDiskInfo().getboot()); _oldDisk.setdisk_interface(getParameters().getDiskInfo().getdisk_interface()); _oldDisk.setpropagate_errors(getParameters().getDiskInfo().getpropagate_errors()); _oldDisk.setwipe_after_delete(getParameters().getDiskInfo().getwipe_after_delete()); DbFacade.getInstance().getDiskImageDAO().update(_oldDisk); setSucceeded(UpdateVmInSpm(getVm().getstorage_pool_id(), new java.util.ArrayList<VM>(java.util.Arrays.asList(new VM[] { getVm() })))); } @Override protected boolean canDoAction() { boolean retValue = true; if (getVm() == null) { retValue = false; addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_VM_NOT_FOUND); } else if (VM.isStatusUpOrPausedOrSuspended(getVm().getstatus())) { retValue = false; addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_VM_STATUS_ILLEGAL); } else { image_vm_map map = DbFacade.getInstance().getImageVmMapDAO().getByImageId(getParameters().getImageId()); _oldDisk = DbFacade.getInstance().getDiskImageDAO().get(getParameters().getImageId()); if (map == null || !getVmId().equals(map.getvm_id()) || _oldDisk == null) { retValue = false; addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_VM_IMAGE_DOES_NOT_EXIST); } else if (_oldDisk.getdisk_interface() != getParameters().getDiskInfo().getdisk_interface()) { List<VmNetworkInterface> allVmInterfaces = DbFacade.getInstance() .getVmNetworkInterfaceDAO().getAllForVm(getVmId()); // LINQ 29456 // List<DiskImageBase> allVmDisks = // DbFacade.Instance.GetImagesByVmGuid(VmId).Select(a => // (DiskImageBase)a).ToList(); // allVmDisks.RemoveAll(a => a.internal_drive_mapping == // _oldDisk.internal_drive_mapping); // allVmDisks.Add(UpdateParameters.DiskInfo); // if (!CheckPCIAndIDELimit(Vm.num_of_monitors, allVmInterfaces, // allVmDisks)) List allVmDisks = DbFacade.getInstance().getDiskImageDAO().getAllForVm(getVmId()); allVmDisks.removeAll(LinqUtils.filter(allVmDisks, new Predicate() { @Override public boolean eval(Object o) { return ((DiskImageBase) o).getinternal_drive_mapping().equals( _oldDisk.getinternal_drive_mapping()); } })); allVmDisks.add(getParameters().getDiskInfo()); if (!CheckPCIAndIDELimit(getVm().getnum_of_monitors(), allVmInterfaces, allVmDisks, getReturnValue().getCanDoActionMessages())) { retValue = false; } } } if (retValue && getParameters().getDiskInfo().getboot()) { VmHandler.updateDisksFromDb(getVm()); for (DiskImage disk : getVm().getDiskMap().values()) { if (disk.getboot() && !getParameters().getImageId().equals(disk.getId())) { retValue = false; addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_DISK_BOOT_IN_USE); getReturnValue().getCanDoActionMessages().add( String.format("$DiskName %1$s", disk.getinternal_drive_mapping())); break; } } } if (!retValue) { addCanDoActionMessage(VdcBllMessages.VAR__ACTION__UPDATE); addCanDoActionMessage(VdcBllMessages.VAR__TYPE__VM_DISK); } return retValue; } @Override public AuditLogType getAuditLogTypeValue() { return getSucceeded() ? AuditLogType.USER_UPDATE_VM_DISK : AuditLogType.USER_FAILED_UPDATE_VM_DISK; } }