package org.ovirt.engine.core.bll.storage.disk.image;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import org.ovirt.engine.core.bll.CommandBase;
import org.ovirt.engine.core.bll.InternalCommandAttribute;
import org.ovirt.engine.core.bll.NonTransactiveCommandAttribute;
import org.ovirt.engine.core.bll.context.CommandContext;
import org.ovirt.engine.core.bll.utils.PermissionSubject;
import org.ovirt.engine.core.common.VdcObjectType;
import org.ovirt.engine.core.common.action.CreateVolumeContainerCommandParameters;
import org.ovirt.engine.core.common.asynctasks.AsyncTaskType;
import org.ovirt.engine.core.common.businessentities.storage.VolumeFormat;
import org.ovirt.engine.core.common.businessentities.storage.VolumeType;
import org.ovirt.engine.core.common.job.StepSubjectEntity;
import org.ovirt.engine.core.common.vdscommands.CreateImageVDSCommandParameters;
import org.ovirt.engine.core.common.vdscommands.CreateSnapshotVDSCommandParameters;
import org.ovirt.engine.core.common.vdscommands.VDSCommandType;
import org.ovirt.engine.core.common.vdscommands.VDSReturnValue;
import org.ovirt.engine.core.compat.Guid;
@NonTransactiveCommandAttribute
@InternalCommandAttribute
public class CreateVolumeContainerCommand<T extends CreateVolumeContainerCommandParameters> extends
CommandBase<T> {
public CreateVolumeContainerCommand(T parameters, CommandContext cmdContext) {
super(parameters, cmdContext);
setStorageDomainId(getParameters().getStorageDomainId());
setStoragePoolId(getParameters().getStoragePoolId());
}
public CreateVolumeContainerCommand(T parameters) {
this(parameters, null);
}
@Override
protected AsyncTaskType getTaskType() {
return AsyncTaskType.createVolume;
}
@Override
public List<PermissionSubject> getPermissionCheckSubjects() {
return Collections.emptyList();
}
private CreateImageVDSCommandParameters getCreateVDSCommandParameters() {
CreateSnapshotVDSCommandParameters parameters =
new CreateSnapshotVDSCommandParameters(getParameters().getStoragePoolId(),
getParameters().getStorageDomainId(), getParameters().getImageGroupID(), getParameters()
.getSrcImageId(), getParameters().getSize(),
getType(), getParameters().getVolumeFormat(), getParameters().getSrcImageGroupId(),
getParameters().getImageId(),
getParameters().getDescription());
if (getType() != VolumeType.Preallocated &&
ImagesHandler.isImageInitialSizeSupported(getStorageDomain().getStorageType())) {
parameters.setImageInitialSizeInBytes(Optional.ofNullable(getParameters().getInitialSize()).orElse(0L));
}
return parameters;
}
private VolumeType getType() {
if (getStorageDomain().getStorageType().isBlockDomain() &&
getParameters().getVolumeFormat() == VolumeFormat.RAW) {
return VolumeType.Preallocated;
}
return VolumeType.Sparse;
}
@Override
protected void executeCommand() {
Guid taskId = persistAsyncTaskPlaceHolder(getParameters().getParentCommand());
VDSReturnValue vdsReturnValue = runVdsCommand(VDSCommandType.CreateSnapshot,
getCreateVDSCommandParameters());
if (vdsReturnValue.getSucceeded()) {
getParameters().setVdsmTaskIds(new ArrayList<>());
getParameters().getVdsmTaskIds().add(
createTask(taskId,
vdsReturnValue.getCreationInfo(),
getParameters().getParentCommand(),
VdcObjectType.Storage,
getParameters().getStorageDomainId()));
getTaskIdList().add(getParameters().getVdsmTaskIds().get(0));
setSucceeded(true);
}
}
@Override
public List<StepSubjectEntity> getCommandStepSubjectEntities() {
if (getParameters().getJobWeight() != null) {
return Collections.singletonList(new StepSubjectEntity(VdcObjectType.Disk,
getParameters().getImageGroupID(), getParameters().getJobWeight()));
}
return super.getCommandStepSubjectEntities();
}
}