package org.ovirt.engine.core.bll;
import java.util.ArrayList;
import java.util.Arrays;
import javax.inject.Inject;
import org.ovirt.engine.core.bll.context.CommandContext;
import org.ovirt.engine.core.bll.snapshots.CreateSnapshotFromTemplateCommand;
import org.ovirt.engine.core.bll.storage.domain.PostDeleteActionHandler;
import org.ovirt.engine.core.bll.tasks.interfaces.CommandCallback;
import org.ovirt.engine.core.common.VdcObjectType;
import org.ovirt.engine.core.common.action.CopyImageGroupWithDataCommandParameters;
import org.ovirt.engine.core.common.action.CreateCloneOfTemplateParameters;
import org.ovirt.engine.core.common.action.VdcActionParametersBase;
import org.ovirt.engine.core.common.action.VdcActionType;
import org.ovirt.engine.core.common.asynctasks.AsyncTaskType;
import org.ovirt.engine.core.common.businessentities.storage.CopyVolumeType;
import org.ovirt.engine.core.common.businessentities.storage.DiskImage;
import org.ovirt.engine.core.common.errors.EngineException;
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.dao.StorageDomainDao;
/**
* This command responsible to creating a copy of template image. Usually it
* will be called during Add Vm From Template.
*/
@InternalCommandAttribute
public class CreateCloneOfTemplateCommand<T extends CreateCloneOfTemplateParameters> extends
CreateSnapshotFromTemplateCommand<T> {
@Inject
private PostDeleteActionHandler postDeleteActionHandler;
@Inject
private StorageDomainDao storageDomainDao;
public CreateCloneOfTemplateCommand(T parameters, CommandContext cmdContext) {
super(parameters, cmdContext);
}
@Override
protected DiskImage cloneDiskImage(Guid newImageGuid) {
DiskImage returnValue = super.cloneDiskImage(newImageGuid);
returnValue.setStorageIds(new ArrayList<>(Arrays.asList(getDestinationStorageDomainId())));
returnValue.setQuotaId(getParameters().getQuotaId());
returnValue.setDiskProfileId(getParameters().getDiskProfileId());
// override to have no template
returnValue.setParentId(VmTemplateHandler.BLANK_VM_TEMPLATE_ID);
returnValue.setImageTemplateId(VmTemplateHandler.BLANK_VM_TEMPLATE_ID);
if (getParameters().getDiskImageBase() != null) {
returnValue.setVolumeType(getParameters().getDiskImageBase().getVolumeType());
returnValue.setVolumeFormat(getParameters().getDiskImageBase().getVolumeFormat());
}
return returnValue;
}
@Override
protected boolean performImageVdsmOperation() {
setDestinationImageId(Guid.newGuid());
persistCommandIfNeeded();
newDiskImage = cloneDiskImage(getDestinationImageId());
newDiskImage.setId(Guid.newGuid());
Guid storagePoolID = newDiskImage.getStoragePoolId() != null ? newDiskImage
.getStoragePoolId() : Guid.Empty;
if (isDataOperationsByHSM()) {
CopyImageGroupWithDataCommandParameters p = new CopyImageGroupWithDataCommandParameters(
storagePoolID,
getParameters().getStorageDomainId(),
getDestinationStorageDomainId(),
getDiskImage().getId(),
getImage().getImageId(),
newDiskImage.getId(),
getDestinationImageId(),
newDiskImage.getVolumeFormat(),
true);
p.setParentParameters(getParameters());
p.setParentCommand(getActionType());
p.setEndProcedure(VdcActionParametersBase.EndProcedure.COMMAND_MANAGED);
runInternalAction(VdcActionType.CopyImageGroupWithData, p);
return true;
} else {
Guid taskId = persistAsyncTaskPlaceHolder(VdcActionType.AddVmFromTemplate);
VDSReturnValue vdsReturnValue;
try {
vdsReturnValue = runVdsCommand(VDSCommandType.CopyImage,
postDeleteActionHandler.fixParameters(
new CopyImageVDSCommandParameters(storagePoolID, getParameters().getStorageDomainId(),
getVmTemplateId(), getDiskImage().getId(), getImage().getImageId(),
newDiskImage.getId(), getDestinationImageId(),
"", getDestinationStorageDomainId(), CopyVolumeType.LeafVol,
newDiskImage.getVolumeFormat(), newDiskImage.getVolumeType(),
getDiskImage().isWipeAfterDelete(),
storageDomainDao.get(getDestinationStorageDomainId()).isDiscardAfterDelete(),
false)));
} catch (EngineException e) {
log.error("Failed creating snapshot from image id '{}'", getImage().getImageId());
throw e;
}
if (vdsReturnValue.getSucceeded()) {
getTaskIdList().add(
createTask(taskId,
vdsReturnValue.getCreationInfo(),
VdcActionType.AddVmFromTemplate,
VdcObjectType.Storage,
getParameters().getStorageDomainId(),
getDestinationStorageDomainId()));
}
return vdsReturnValue.getSucceeded();
}
}
@Override
protected AsyncTaskType getTaskType() {
return isDataOperationsByHSM() ? AsyncTaskType.notSupported : AsyncTaskType.copyImage;
}
@Override
public CommandCallback getCallback() {
return isDataOperationsByHSM() ? new ConcurrentChildCommandsExecutionCallback() : null;
}
}