package org.ovirt.engine.core.bll.storage.disk.image; import javax.inject.Inject; 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.storage.EntityPollingCommand; import org.ovirt.engine.core.bll.storage.StorageJobCommand; import org.ovirt.engine.core.bll.storage.utils.VdsCommandsHelper; import org.ovirt.engine.core.common.action.FenceVolumeJobCommandParameters; import org.ovirt.engine.core.common.action.UpdateVolumeCommandParameters; import org.ovirt.engine.core.common.action.VdcActionParametersBase; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.businessentities.HostJobInfo.HostJobStatus; import org.ovirt.engine.core.common.businessentities.VdsmImageLocationInfo; import org.ovirt.engine.core.common.businessentities.storage.DiskImage; import org.ovirt.engine.core.common.vdscommands.UpdateVolumeVDSCommandParameters; import org.ovirt.engine.core.common.vdscommands.VDSCommandType; @NonTransactiveCommandAttribute @InternalCommandAttribute public class UpdateVolumeCommand<T extends UpdateVolumeCommandParameters> extends StorageJobCommand<T> implements EntityPollingCommand { @Inject private VdsmImagePoller poller; public UpdateVolumeCommand(T parameters, CommandContext cmdContext) { super(parameters, cmdContext); } @Override protected void executeCommand() { completeGenerationInfo(); UpdateVolumeVDSCommandParameters parameters = new UpdateVolumeVDSCommandParameters(getParameters().getStorageJobId(), getParameters().getVolInfo()); parameters.setLegal(getParameters().getLegal()); parameters.setDescription(getParameters().getDescription()); parameters.setGeneration(getParameters().getGeneration()); parameters.setShared(getParameters().getShared()); VdsCommandsHelper.runVdsCommandWithoutFailover(VDSCommandType.UpdateVolume, parameters, getParameters().getStoragePoolId(), this); setSucceeded(true); } private void completeGenerationInfo() { VdsmImageLocationInfo info = getParameters().getVolInfo(); DiskImage image = ImagesHandler.getVolumeInfoFromVdsm(getParameters().getStoragePoolId(), info.getStorageDomainId(), info.getImageGroupId(), info.getImageId()); info.setGeneration(image.getImage().getGeneration()); persistCommandIfNeeded(); } @Override public HostJobStatus poll() { VdsmImageLocationInfo info = getParameters().getVolInfo(); return poller.pollImage(getParameters().getStoragePoolId(), info.getStorageDomainId(), info.getImageGroupId(), info.getImageId(), info.getGeneration(), getCommandId(), getActionType()); } @Override public void attemptToFenceJob() { log.info("Command {} id: '{}': attempting to fence job {}", getActionType(), getCommandId(), getJobId()); VdsmImageLocationInfo info = getParameters().getVolInfo(); FenceVolumeJobCommandParameters p = new FenceVolumeJobCommandParameters(info); p.setParentCommand(getActionType()); p.setParentParameters(getParameters()); p.setStoragePoolId(getParameters().getStoragePoolId()); p.setEndProcedure(VdcActionParametersBase.EndProcedure.COMMAND_MANAGED); runInternalActionWithTasksContext(VdcActionType.FenceVolumeJob, p); } }