package org.ovirt.engine.core.bll;
import org.ovirt.engine.core.common.action.CreateCloneOfTemplateParameters;
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.CopyVolumeType;
import org.ovirt.engine.core.common.businessentities.DiskImage;
import org.ovirt.engine.core.common.businessentities.async_tasks;
import org.ovirt.engine.core.common.errors.VdcBLLException;
import org.ovirt.engine.core.common.errors.VdcBllErrors;
import org.ovirt.engine.core.common.vdscommands.CopyImageVDSCommandParameters;
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.compat.LogCompat;
import org.ovirt.engine.core.compat.LogFactoryCompat;
/**
* This command responsible to creating a copy of template image. Usually it
* will be called during Create Vm From Template.
*/
// C# TO JAVA CONVERTER TODO TASK: Java annotations will not correspond to .NET
// attributes:
@InternalCommandAttribute
public class CreateCloneOfTemplateCommand<T extends CreateCloneOfTemplateParameters> extends
CreateSnapshotFromTemplateCommand<T> {
public CreateCloneOfTemplateCommand(T parameters) {
super(parameters);
}
@Override
protected DiskImage CloneDiskImage(Guid newImageGuid) {
DiskImage returnValue = super.CloneDiskImage(newImageGuid);
returnValue.setstorage_id(getDestinationStorageDomainId());
// override to have no template
returnValue.setParentId(VmTemplateHandler.BlankVmTemplateId);
returnValue.setit_guid(VmTemplateHandler.BlankVmTemplateId);
if (getParameters().getDiskImageBase() != null) {
returnValue.setvolume_type(getParameters().getDiskImageBase().getvolume_type());
returnValue.setvolume_format(getParameters().getDiskImageBase().getvolume_format());
}
return returnValue;
}
@Override
protected void CheckImageValidity() {
// dont do nothing, overriding base to avoid this check
// fails when creating vm from template on domain that the template
// doesnt exist on
}
@Override
protected boolean CreateSnapshotInIrsServer() {
setDestinationImageId(Guid.NewGuid());
mNewCreatedDiskImage = CloneDiskImage(getDestinationImageId());
Guid storagePoolID = mNewCreatedDiskImage.getstorage_pool_id() != null ? mNewCreatedDiskImage
.getstorage_pool_id().getValue() : Guid.Empty;
try {
VDSReturnValue vdsReturnValue = Backend
.getInstance()
.getResourceManager()
.RunVdsCommand(
VDSCommandType.CopyImage,
new CopyImageVDSCommandParameters(storagePoolID, getDiskImage().getstorage_id().getValue(),
getVmTemplateId(), getDiskImage().getimage_group_id().getValue(), getImage()
.getId(), getImageGroupId(), getDestinationImageId(),
CalculateImageDescription(), getDestinationStorageDomainId(),
CopyVolumeType.LeafVol, mNewCreatedDiskImage.getvolume_format(),
mNewCreatedDiskImage.getvolume_type(), getDiskImage().getwipe_after_delete(),
false, getStoragePool().getcompatibility_version().toString()));
if (vdsReturnValue.getSucceeded()) {
getReturnValue().getInternalTaskIdList().add(
CreateTask(vdsReturnValue.getCreationInfo(), VdcActionType.AddVmFromTemplate));
} else {
return false;
}
} catch (java.lang.Exception e) {
log.errorFormat(
"CreateCloneOfTemplateCommand::CreateSnapshotInIrsServer::Failed creating snapshot from image id -'{0}'",
getImage().getId());
throw new VdcBLLException(VdcBllErrors.VolumeCreationError);
}
return true;
}
@Override
protected Guid ConcreteCreateTask(AsyncTaskCreationInfo asyncTaskCreationInfo, VdcActionType parentCommand) {
AsyncTaskParameters p = new AsyncTaskParameters(asyncTaskCreationInfo, new async_tasks(parentCommand,
AsyncTaskResultEnum.success, AsyncTaskStatusEnum.running, asyncTaskCreationInfo.getTaskID(),
getParameters()));
p.setEntityId(getParameters().getEntityId());
Guid ret = AsyncTaskManager.getInstance().CreateTask(AsyncTaskType.copyImage, p, false);
return ret;
}
private static LogCompat log = LogFactoryCompat.getLog(CreateCloneOfTemplateCommand.class);
}