package org.ovirt.engine.core.bll.memory; import org.ovirt.engine.core.bll.Backend; import org.ovirt.engine.core.bll.CommandBase; import org.ovirt.engine.core.bll.interfaces.BackendInternal; import org.ovirt.engine.core.bll.utils.VmOverheadCalculator; import org.ovirt.engine.core.common.action.AddDiskParameters; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.action.VdcReturnValueBase; import org.ovirt.engine.core.common.businessentities.StoragePool; import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.common.businessentities.storage.DiskImage; import org.ovirt.engine.core.common.businessentities.storage.StorageType; import org.ovirt.engine.core.common.errors.EngineException; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dal.dbbroker.DbFacade; import org.ovirt.engine.core.dao.DiskDao; import org.ovirt.engine.core.dao.StorageDomainStaticDao; /** * This builder creates the memory images for live snapshots with memory operation */ public class LiveSnapshotMemoryImageBuilder implements MemoryImageBuilder { private Guid storageDomainId; private DiskImage memoryDisk; private DiskImage metadataDisk; private VM vm; private CommandBase<?> enclosingCommand; private StoragePool storagePool; private VmOverheadCalculator vmOverheadCalculator; public LiveSnapshotMemoryImageBuilder(VM vm, Guid storageDomainId, StoragePool storagePool, CommandBase<?> enclosingCommand, VmOverheadCalculator vmOverheadCalculator) { this.vm = vm; this.enclosingCommand = enclosingCommand; this.storageDomainId = storageDomainId; this.storagePool = storagePool; this.vmOverheadCalculator = vmOverheadCalculator; } @Override public void build() { Guid memoryDiskId = addMemoryDisk(); Guid metadataDiskId = addMetadataDisk(); // Have to query for the disks in order to get its imageId memoryDisk = getDisk(memoryDiskId); metadataDisk = getDisk(metadataDiskId); } private Guid addMemoryDisk() { DiskImage memoryDisk = MemoryUtils.createSnapshotMemoryDisk(vm, getStorageType(), vmOverheadCalculator); return addDisk(memoryDisk); } private Guid addMetadataDisk() { DiskImage metadataDisk = MemoryUtils.createSnapshotMetadataDisk(); return addDisk(metadataDisk); } private Guid addDisk(DiskImage disk) { VdcReturnValueBase returnValue = getBackend().runInternalAction( VdcActionType.AddDisk, buildAddDiskParameters(disk), enclosingCommand.getContext().clone()); if (!returnValue.getSucceeded()) { throw new EngineException(returnValue.getFault().getError(), String.format("Failed to create disk! %s", disk.getDiskAlias())); } return returnValue.getActionReturnValue(); } private DiskImage getDisk(Guid diskId) { return (DiskImage) getDiskDao().get(diskId); } protected DiskDao getDiskDao() { return DbFacade.getInstance().getDiskDao(); } private AddDiskParameters buildAddDiskParameters(DiskImage disk) { AddDiskParameters parameters = new AddDiskParameters(disk); parameters.setStorageDomainId(storageDomainId); parameters.setParentCommand(enclosingCommand.getActionType()); parameters.setParentParameters(enclosingCommand.getParameters()); parameters.setShouldBeLogged(false); return parameters; } private BackendInternal getBackend() { return Backend.getInstance(); } private StorageType getStorageType() { return getStorageDomainStaticDao().get(storageDomainId).getStorageType(); } protected StorageDomainStaticDao getStorageDomainStaticDao() { return DbFacade.getInstance().getStorageDomainStaticDao(); } @Override public String getVolumeStringRepresentation() { return MemoryUtils.createMemoryStateString( storageDomainId, storagePool.getId(), memoryDisk.getId(), memoryDisk.getImageId(), metadataDisk.getId(), metadataDisk.getImageId()); } @Override public boolean isCreateTasks() { return true; } @Override public Guid getMemoryDiskId() { return memoryDisk.getId(); } @Override public Guid getMetadataDiskId() { return metadataDisk.getId(); } }