package org.ovirt.engine.core.bll;
import org.ovirt.engine.core.common.action.AddVmFromTemplateParameters;
import org.ovirt.engine.core.common.action.CreateCloneOfTemplateParameters;
import org.ovirt.engine.core.common.action.VdcActionType;
import org.ovirt.engine.core.common.action.VdcReturnValueBase;
import org.ovirt.engine.core.common.businessentities.DiskImageBase;
import org.ovirt.engine.core.common.businessentities.DiskImageTemplate;
import org.ovirt.engine.core.common.businessentities.VMStatus;
import org.ovirt.engine.core.common.errors.VdcBLLException;
import org.ovirt.engine.core.common.errors.VdcBllErrors;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.compat.LogCompat;
import org.ovirt.engine.core.compat.LogFactoryCompat;
import org.ovirt.engine.core.dal.dbbroker.DbFacade;
public class AddVmFromTemplateCommand<T extends AddVmFromTemplateParameters> extends AddVmCommand<T> {
public AddVmFromTemplateCommand(T parameters) {
super(parameters);
parameters.setDontCheckTemplateImages(true);
}
protected AddVmFromTemplateCommand(Guid commandId) {
super(commandId);
}
@Override
protected void ExecuteVmCommand() {
super.ExecuteVmCommand();
// override template id to blank
getParameters().OriginalTemplate = getVm().getvmt_guid();
VmTemplateHandler.lockVmTemplateInTransaction(getParameters().OriginalTemplate, getCompensationContext());
getVm().setvmt_guid(VmTemplateHandler.BlankVmTemplateId);
DbFacade.getInstance().getVmStaticDAO().update(getVm().getStaticData());
}
@Override
protected boolean AddVmImages() {
if (getVmTemplate().getDiskMap().size() > 0) {
if (getVm().getstatus() != VMStatus.Down) {
log.error("Cannot add images. VM is not Down");
throw new VdcBLLException(VdcBllErrors.IRS_IMAGE_STATUS_ILLEGAL);
}
VmHandler.LockVm(getVm().getDynamicData(), getCompensationContext());
for (DiskImageTemplate dit : getVmTemplate().getDiskMap().values()) {
DiskImageBase diskInfo = null;
diskInfo = getParameters().getDiskInfoList().get(dit.getinternal_drive_mapping());
CreateCloneOfTemplateParameters tempVar = new CreateCloneOfTemplateParameters(dit.getit_guid(),
getParameters().getVmStaticData().getId(), diskInfo);
tempVar.setStorageDomainId(getStorageDomainId().getValue());
tempVar.setVmSnapshotId(getVmSnapshotId());
tempVar.setParentCommand(VdcActionType.AddVmFromTemplate);
tempVar.setEntityId(getParameters().getEntityId());
CreateCloneOfTemplateParameters p = tempVar;
VdcReturnValueBase result = Backend.getInstance().runInternalAction(
VdcActionType.CreateCloneOfTemplate, p);
getParameters().getImagesParameters().add(p);
/**
* if couldnt create snapshot then stop the transaction and the command
*/
if (!result.getSucceeded()) {
throw new VdcBLLException(VdcBllErrors.VolumeCreationError);
} else {
getTaskIdList().addAll(result.getInternalTaskIdList());
}
}
}
return true;
}
@Override
protected boolean canDoAction() {
boolean returnValue = super.canDoAction();
returnValue = returnValue
&& ImagesHandler.CheckImagesConfiguration(getStorageDomainId().getValue(),
new java.util.ArrayList<DiskImageBase>(getParameters().getDiskInfoList().values()),
getReturnValue().getCanDoActionMessages());
return returnValue;
}
@Override
protected int getNeededDiskSize() {
return (int)getVmTemplate().getActualDiskSize();
}
@Override
protected void EndSuccessfully() {
super.EndSuccessfully();
VmTemplateHandler.UnLockVmTemplate(getParameters().OriginalTemplate);
}
@Override
protected void EndWithFailure() {
super.EndWithFailure();
VmTemplateHandler.UnLockVmTemplate(getParameters().OriginalTemplate);
}
private static LogCompat log = LogFactoryCompat.getLog(AddVmFromTemplateCommand.class);
}