package org.ovirt.engine.core.bll;
import org.ovirt.engine.core.common.AuditLogType;
import org.ovirt.engine.core.common.action.RemoveDisksFromVmParameters;
import org.ovirt.engine.core.common.action.RemoveImageParameters;
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.compat.Guid;
import org.ovirt.engine.core.dal.VdcBllMessages;
import org.ovirt.engine.core.dal.dbbroker.DbFacade;
import org.ovirt.engine.core.utils.transaction.TransactionMethod;
import org.ovirt.engine.core.utils.transaction.TransactionSupport;
@NonTransactiveCommandAttribute(forceCompensation = true)
public class RemoveDisksFromVmCommand<T extends RemoveDisksFromVmParameters> extends VmCommand<T> {
/**
* Constructor for command creation when compensation is applied on startup
*
* @param commandId
*/
protected RemoveDisksFromVmCommand(Guid commandId) {
super(commandId);
}
public RemoveDisksFromVmCommand(T parameters) {
super(parameters);
setVmId(parameters.getVmId());
parameters.setEntityId(getVmId());
}
@Override
protected boolean canDoAction() {
boolean retValue = true;
if (getVm() == null) {
retValue = false;
addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_VM_NOT_FOUND);
}
for (Guid imageId : getParameters().getImageIds()) {
DiskImage disk = DbFacade.getInstance().getDiskImageDAO().get(imageId);
if (disk == null) {
retValue = false;
addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_VM_IMAGE_DOES_NOT_EXIST);
break;
}
retValue = retValue
&& ImagesHandler.PerformImagesChecks(getVmId(), getReturnValue().getCanDoActionMessages(), getVm()
.getstorage_pool_id(), disk.getstorage_id().getValue(), false, true, false, false, true,
true, true);
if (!retValue) {
break;
}
}
if (!retValue) {
addCanDoActionMessage(VdcBllMessages.VAR__ACTION__REMOVE);
addCanDoActionMessage(VdcBllMessages.VAR__TYPE__VM_DISK);
}
return retValue;
}
@Override
protected void ExecuteVmCommand() {
VmHandler.LockVm(getVm().getDynamicData(), getCompensationContext());
TransactionSupport.executeInNewTransaction(new TransactionMethod<Void>() {
@Override
public Void runInTransaction() {
for (Guid imageId : getParameters().getImageIds()) {
RemoveImageParameters tempVar = new RemoveImageParameters(imageId, null, getVmId());
tempVar.setParentCommand(VdcActionType.RemoveDisksFromVm);
tempVar.setEntityId(getParameters().getEntityId());
RemoveImageParameters p = tempVar;
p.setParentParemeters(getParameters());
VdcReturnValueBase vdcReturnValue =
Backend.getInstance().runInternalAction(VdcActionType.RemoveImage, p);
getParameters().getImagesParameters().add(p);
getReturnValue().getTaskIdList().addAll(vdcReturnValue.getInternalTaskIdList());
if (!vdcReturnValue.getSucceeded()) {
setSucceeded(false);
break;
}
setSucceeded(vdcReturnValue.getSucceeded());
}
return null;
}
});
}
@Override
public AuditLogType getAuditLogTypeValue() {
return getSucceeded() ? AuditLogType.USER_REMOVE_DISK_FROM_VM : AuditLogType.USER_FAILED_REMOVE_DISK_FROM_VM;
}
@Override
protected void EndVmCommand() {
setCommandShouldBeLogged(false);
super.EndVmCommand();
}
@Override
protected VdcActionType getChildActionType() {
return VdcActionType.RemoveImage;
}
}