package org.ovirt.engine.core.bll; import java.util.List; import org.ovirt.engine.core.bll.context.CommandContext; import org.ovirt.engine.core.bll.storage.disk.image.DisksFilter; import org.ovirt.engine.core.bll.storage.utils.VdsCommandsHelper; import org.ovirt.engine.core.bll.tasks.interfaces.CommandCallback; import org.ovirt.engine.core.common.action.SealVmTemplateParameters; import org.ovirt.engine.core.common.businessentities.HostJobInfo.HostJobStatus; import org.ovirt.engine.core.common.businessentities.storage.DiskImage; import org.ovirt.engine.core.common.errors.EngineError; import org.ovirt.engine.core.common.errors.EngineMessage; import org.ovirt.engine.core.common.vdscommands.SealDisksVDSCommandParameters; import org.ovirt.engine.core.common.vdscommands.VDSCommandType; import org.ovirt.engine.core.common.vdscommands.VDSReturnValue; import org.ovirt.engine.core.compat.CommandStatus; import org.ovirt.engine.core.compat.Guid; @NonTransactiveCommandAttribute(forceCompensation = true) @InternalCommandAttribute public class SealVmTemplateCommand<T extends SealVmTemplateParameters> extends VmTemplateCommand<T> implements HostJobCommand { private List<DiskImage> diskImages; public SealVmTemplateCommand(Guid commandId) { super(commandId); } public SealVmTemplateCommand(T parameters, CommandContext cmdContext) { super(parameters, cmdContext); if (getParameters().getHostJobId() == null) { getParameters().setHostJobId(Guid.newGuid()); } } private List<DiskImage> getDiskImages() { if (diskImages == null) { vmTemplateHandler.updateDisksFromDb(getVmTemplate()); diskImages = DisksFilter.filterImageDisks(getVmTemplate().getDiskTemplateMap().values(), DisksFilter.ONLY_NOT_SHAREABLE); } return diskImages; } @Override protected void executeCommand() { if (getDiskImages().isEmpty()) { setSucceeded(true); return; } VDSReturnValue vdsReturnValue = VdsCommandsHelper.runVdsCommandWithFailover( VDSCommandType.SealDisks, buildSealDisksVDSCommandParameters(), getDiskImages().get(0).getStoragePoolId(), this); if (!vdsReturnValue.getSucceeded()) { setCommandStatus(CommandStatus.FAILED); } setSucceeded(vdsReturnValue.getSucceeded()); } private SealDisksVDSCommandParameters buildSealDisksVDSCommandParameters() { SealDisksVDSCommandParameters parameters = new SealDisksVDSCommandParameters(); parameters.setTemplateId(getParameters().getVmTemplateId()); parameters.setJobId(getParameters().getHostJobId()); parameters.setStoragePoolId(getDiskImages().get(0).getStoragePoolId()); getDiskImages().forEach(parameters::addImage); return parameters; } @Override public HostJobStatus handleJobError(EngineError error) { return HostJobStatus.failed; } @Override public boolean failJobWithUndeterminedStatus() { return false; } @Override public CommandCallback getCallback() { return new VirtJobCallback(); } @Override protected void setActionMessageParameters() { addValidationMessage(EngineMessage.VAR__ACTION__SEAL); addValidationMessage(EngineMessage.VAR__TYPE__VM_TEMPLATE); } }