package org.ovirt.engine.core.bll; import org.ovirt.engine.core.common.action.AddImageFromScratchParameters; import org.ovirt.engine.core.common.action.VdcActionParametersBase; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.asynctasks.AsyncTaskCreationInfo; import org.ovirt.engine.core.common.asynctasks.AsyncTaskParameters; import org.ovirt.engine.core.common.asynctasks.AsyncTaskType; import org.ovirt.engine.core.common.businessentities.AsyncTaskResultEnum; import org.ovirt.engine.core.common.businessentities.AsyncTaskStatusEnum; import org.ovirt.engine.core.common.businessentities.DiskImage; import org.ovirt.engine.core.common.businessentities.DiskImageTemplate; import org.ovirt.engine.core.common.businessentities.IImage; import org.ovirt.engine.core.common.businessentities.ImageStatus; import org.ovirt.engine.core.common.businessentities.async_tasks; import org.ovirt.engine.core.common.vdscommands.CreateImageVDSCommandParameters; import org.ovirt.engine.core.common.vdscommands.VDSCommandType; import org.ovirt.engine.core.common.vdscommands.VDSReturnValue; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dal.dbbroker.DbFacade; @InternalCommandAttribute public class AddImageFromScratchCommand<T extends AddImageFromScratchParameters> extends CreateSnapshotCommand<T> { private DiskImageTemplate mTemplate; public AddImageFromScratchCommand(T parameters) { super(parameters); super.setVmId(parameters.getMasterVmId()); } @Override protected void executeCommand() { setImageContainerId(getVm().getvmt_guid()); setImageGroupId(Guid.NewGuid()); if (ProcessImageInIrs()) { mNewCreatedDiskImage = new DiskImage(); mNewCreatedDiskImage.setId(getDestinationImageId()); mNewCreatedDiskImage.setinternal_drive_mapping(getParameters().getDiskInfo().getinternal_drive_mapping()); mNewCreatedDiskImage.setboot(getParameters().getDiskInfo().getboot()); mNewCreatedDiskImage.setdisk_interface(getParameters().getDiskInfo().getdisk_interface()); mNewCreatedDiskImage.setpropagate_errors(getParameters().getDiskInfo().getpropagate_errors()); mNewCreatedDiskImage.setwipe_after_delete(getParameters().getDiskInfo().getwipe_after_delete()); mNewCreatedDiskImage.setvm_guid(getVmId()); mNewCreatedDiskImage.setimage_group_id(getImageGroupId()); mNewCreatedDiskImage.setstorage_pool_id(getVm().getstorage_pool_id()); mNewCreatedDiskImage.setstorage_id(getParameters().getStorageDomainId()); mNewCreatedDiskImage.setsize(getParameters().getDiskInfo().getsize()); mNewCreatedDiskImage.setvolume_type(getParameters().getDiskInfo().getvolume_type()); mNewCreatedDiskImage.setvolume_format(getParameters().getDiskInfo().getvolume_format()); mNewCreatedDiskImage.setdisk_type(getParameters().getDiskInfo().getdisk_type()); mNewCreatedDiskImage.setdescription(CalculateImageDescription()); mNewCreatedDiskImage.setcreation_date(getNow()); mNewCreatedDiskImage.setlastModified(getNow()); mNewCreatedDiskImage.setactive(true); mNewCreatedDiskImage.setimageStatus(ImageStatus.LOCKED); mNewCreatedDiskImage.setvm_snapshot_id(getParameters().getVmSnapshotId()); AddDiskImageToDb(mNewCreatedDiskImage); getReturnValue().setActionReturnValue(mNewCreatedDiskImage.getId()); setSucceeded(true); } } protected boolean ProcessImageInIrs() { setDestinationImageId(Guid.NewGuid()); VDSReturnValue vdsReturnValue = Backend .getInstance() .getResourceManager() .RunVdsCommand( VDSCommandType.CreateImage, new CreateImageVDSCommandParameters(getVm().getstorage_pool_id(), getParameters() .getStorageDomainId(), getImageGroupId(), getParameters().getDiskInfo().getsize(), getParameters().getDiskInfo().getvolume_type(), getParameters().getDiskInfo() .getvolume_format(), getParameters().getDiskInfo().getdisk_type(), getDestinationImageId(), CalculateImageDescription(), getStoragePool() .getcompatibility_version().toString())); if (vdsReturnValue.getSucceeded()) { getParameters().setTaskIds(new java.util.ArrayList<Guid>()); getParameters().getTaskIds().add( CreateTask(vdsReturnValue.getCreationInfo(), getParameters().getParentCommand())); getReturnValue().getInternalTaskIdList().add(getParameters().getTaskIds().get(0)); return true; } return false; } @Override protected Guid ConcreteCreateTask(AsyncTaskCreationInfo asyncTaskCreationInfo, VdcActionType parentCommand) { VdcActionParametersBase parametersForTask = getParametersForTask(parentCommand, getParameters()); AsyncTaskParameters p = new AsyncTaskParameters(asyncTaskCreationInfo, new async_tasks(parentCommand, AsyncTaskResultEnum.success, AsyncTaskStatusEnum.running, asyncTaskCreationInfo.getTaskID(), parametersForTask)); p.setEntityId(getParameters().getEntityId()); Guid ret = AsyncTaskManager.getInstance().CreateTask(AsyncTaskType.createVolume, p, false); return ret; } @Override protected IImage getImage() { if (mTemplate == null) { // use blank id for template because we create image from scratch mTemplate = DbFacade.getInstance() .getDiskImageTemplateDAO() .getByVmTemplateAndId(ImagesHandler.BlankImageTemplateId, getImageId()); } return mTemplate; } @Override protected void EndWithFailure() { if (getDestinationDiskImage() != null) { if (DbFacade.getInstance().getDiskImageDynamicDAO().get(getDestinationDiskImage().getId()) != null) { DbFacade.getInstance().getDiskImageDynamicDAO().remove(getDestinationDiskImage().getId()); } } RevertTasks(); super.EndWithFailure(); } }