package org.ovirt.engine.core.bll.storage.disk.image; import java.util.Collections; import java.util.List; 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.SerialChildCommandsExecutionCallback; import org.ovirt.engine.core.bll.SerialChildExecutingCommand; import org.ovirt.engine.core.bll.context.CommandContext; import org.ovirt.engine.core.bll.tasks.interfaces.CommandCallback; import org.ovirt.engine.core.bll.utils.PermissionSubject; import org.ovirt.engine.core.common.action.AllocateImageGroupVolumeCommandParameters; import org.ovirt.engine.core.common.action.CreateVolumeContainerCommandParameters; import org.ovirt.engine.core.common.action.CreateVolumeParameters; import org.ovirt.engine.core.common.action.CreateVolumeParameters.CreationState; import org.ovirt.engine.core.common.action.VdcActionParametersBase.EndProcedure; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.businessentities.storage.VolumeType; @InternalCommandAttribute @NonTransactiveCommandAttribute public class CreateVolumeCommand<T extends CreateVolumeParameters> extends CommandBase<T> implements SerialChildExecutingCommand { public CreateVolumeCommand(T parameters, CommandContext cmdContext) { super(parameters, cmdContext); } private boolean preallocate() { return getParameters().getVolumeType() == VolumeType.Preallocated && getStorageDomain().getStorageType().isFileDomain(); } @Override protected void executeCommand() { createImage(); setSucceeded(true); } @Override public List<PermissionSubject> getPermissionCheckSubjects() { return Collections.emptyList(); } private void updateStage(CreationState stage) { getParameters().setCreationState(stage); persistCommand(getParameters().getParentCommand(), getCallback() != null); } @Override public CommandCallback getCallback() { return new SerialChildCommandsExecutionCallback(); } @Override public boolean performNextOperation(int completedChildCount) { if (getParameters().getCreationState() == CreationState.VOLUME_CREATION && preallocate()) { updateStage(CreationState.VOLUME_ALLOCATION); allocateImage(); return true; } return false; } private void allocateImage() { AllocateImageGroupVolumeCommandParameters parameters = new AllocateImageGroupVolumeCommandParameters (getParameters().getStoragePoolId(), getParameters() .getStorageDomainId(), getParameters().getNewImageGroupId(), getParameters().getNewImageId(), getParameters().getImageSizeInBytes()); parameters.setEndProcedure(EndProcedure.COMMAND_MANAGED); parameters.setParentCommand(getActionType()); parameters.setParentParameters(getParameters()); runInternalAction(VdcActionType.AllocateImageGroupVolume, parameters); } private void createImage() { CreateVolumeContainerCommandParameters parameters = new CreateVolumeContainerCommandParameters( getParameters().getStoragePoolId(), getParameters().getStorageDomainId(), getParameters().getSrcImageGroupId(), getParameters().getSrcImageId(), getParameters().getNewImageGroupId(), getParameters().getNewImageId(), getParameters().getVolumeFormat(), getParameters().getDescription(), getParameters().getImageSizeInBytes(), getParameters().getInitialSize()); parameters.setEndProcedure(EndProcedure.COMMAND_MANAGED); parameters.setParentCommand(getActionType()); parameters.setParentParameters(getParameters()); runInternalAction(VdcActionType.CreateVolumeContainer, parameters); } @Override public void handleFailure() { } }