package org.ovirt.engine.core.bll; import java.util.List; import org.ovirt.engine.core.common.action.MoveOrCopyImageGroupParameters; import org.ovirt.engine.core.common.action.VdcActionParametersBase; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.asynctasks.AsyncTaskCreationInfo; import org.ovirt.engine.core.common.asynctasks.AsyncTaskParameters; import org.ovirt.engine.core.common.asynctasks.AsyncTaskType; import org.ovirt.engine.core.common.businessentities.AsyncTaskResultEnum; import org.ovirt.engine.core.common.businessentities.AsyncTaskStatusEnum; import org.ovirt.engine.core.common.businessentities.DiskImage; import org.ovirt.engine.core.common.businessentities.DiskImageTemplate; import org.ovirt.engine.core.common.businessentities.IImage; import org.ovirt.engine.core.common.businessentities.ImageOperation; import org.ovirt.engine.core.common.businessentities.async_tasks; import org.ovirt.engine.core.common.businessentities.image_group_storage_domain_map; import org.ovirt.engine.core.common.vdscommands.CopyImageVDSCommandParameters; import org.ovirt.engine.core.common.vdscommands.MoveImageGroupVDSCommandParameters; import org.ovirt.engine.core.common.vdscommands.VDSCommandType; import org.ovirt.engine.core.common.vdscommands.VDSReturnValue; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dal.dbbroker.DbFacade; import org.ovirt.engine.core.utils.linq.Function; import org.ovirt.engine.core.utils.linq.LinqUtils; import org.ovirt.engine.core.utils.linq.Predicate; //VB & C# TO JAVA CONVERTER TODO TASK: Java annotations will not correspond to .NET attributes: @InternalCommandAttribute public class MoveOrCopyImageGroupCommand<T extends MoveOrCopyImageGroupParameters> extends BaseImagesCommand<T> { public MoveOrCopyImageGroupCommand(T parameters) { super(parameters); } private DiskImage _diskImage; @Override protected IImage getImage() { switch (getActionState()) { case END_SUCCESS: case END_FAILURE: if (_diskImage == null) { if (getVm() != null) { VmHandler.updateDisksFromDb(getVm()); // LINQ 29456 // _diskImage = Vm.DiskMap.Values.First(a => // a.image_group_id == MoveParameters.ImageGroupID); _diskImage = LinqUtils.firstOrNull(getVm().getDiskMap().values(), new Predicate<DiskImage>() { @Override public boolean eval(DiskImage a) { return a.getimage_group_id().equals(getImageGroupId()); } }); } else if (getVmTemplate() != null) { VmTemplateHandler.UpdateDisksFromDb(getVmTemplate()); // LINQ 29456 // List<DiskImage> templateDisks = // VmTemplate.DiskMap.Values.Select(a => // DbFacade.Instance.GetSnapshotById(a.image_guid)).ToList(); // _diskImage = templateDisks.First(a => // a.image_group_id == MoveParameters.ImageGroupID); List<DiskImage> templateDisks = LinqUtils.foreach(getVmTemplate().getDiskMap().values(), new Function<DiskImageTemplate, DiskImage>() { @Override public DiskImage eval(DiskImageTemplate a) { return DbFacade.getInstance().getDiskImageDAO().getSnapshotById(a.getId()); } }); _diskImage = LinqUtils.firstOrNull(templateDisks, new Predicate<DiskImage>() { @Override public boolean eval(DiskImage a) { return a.getimage_group_id().equals(getImageGroupId()); } }); } } return _diskImage; default: return super.getImage(); } } @Override protected Guid getImageContainerId() { return getParameters() != null ? getParameters().getContainerId() : super.getImageContainerId(); } protected ImageOperation getMoveOrCopyImageOperation() { return getParameters().getOperation(); } @Override protected void executeCommand() { LockImage(); List<DiskImage> snapshots = DbFacade.getInstance().getDiskImageDAO() .getAllSnapshotsForImageGroup(getParameters().getImageGroupID()); VDSReturnValue vdsReturnValue = null; if (getParameters().getUseCopyCollapse()) { vdsReturnValue = Backend .getInstance() .getResourceManager() .RunVdsCommand( VDSCommandType.CopyImage, new CopyImageVDSCommandParameters(getDiskImage().getstorage_pool_id().getValue(), getParameters().getSourceDomainId() != null ? getParameters().getSourceDomainId() .getValue() : snapshots.get(0).getstorage_id().getValue(), getParameters() .getContainerId(), getParameters().getImageGroupID(), getImage() .getId(), getImageGroupId(), getImage().getId(), getImage() .getdescription(), getParameters().getStorageDomainId(), getParameters() .getCopyVolumeType(), getParameters().getVolumeFormat(), getParameters() .getVolumeType(), getParameters().getPostZero(), getParameters() .getForceOverride(), getStoragePool().getcompatibility_version().toString())); } else { vdsReturnValue = Backend .getInstance() .getResourceManager() .RunVdsCommand( VDSCommandType.MoveImageGroup, new MoveImageGroupVDSCommandParameters(snapshots.get(0).getstorage_pool_id().getValue(), getParameters().getSourceDomainId() != null ? getParameters().getSourceDomainId() .getValue() : snapshots.get(0).getstorage_id().getValue(), snapshots.get(0) .getimage_group_id().getValue(), getParameters().getStorageDomainId(), getParameters().getContainerId(), getParameters().getOperation(), getParameters() .getPostZero(), getParameters().getForceOverride(), getStoragePool() .getcompatibility_version().toString())); } if (vdsReturnValue.getSucceeded()) { AsyncTaskCreationInfo taskCreationInfo = vdsReturnValue.getCreationInfo(); getReturnValue().getInternalTaskIdList().add( CreateTask(taskCreationInfo, getParameters().getParentCommand())); // change storage domain in db only if object moved if (getParameters().getOperation() == ImageOperation.Move || getParameters().getParentCommand() == VdcActionType.ImportVm || getParameters().getParentCommand() == VdcActionType.ImportVmTemplate) { for (DiskImage snapshot : snapshots) { snapshot.setstorage_id(getParameters().getStorageDomainId()); DbFacade.getInstance().getDiskImageDAO().update(snapshot); } } if (getParameters().getAddImageDomainMapping()) { DbFacade.getInstance().getStorageDomainDAO().addImageGroupStorageDomainMap( new image_group_storage_domain_map(getParameters().getImageGroupID(), getParameters() .getStorageDomainId())); } setSucceeded(true); } } @Override protected Guid ConcreteCreateTask(AsyncTaskCreationInfo asyncTaskCreationInfo, VdcActionType parentCommand) { VdcActionParametersBase commandParams = getParametersForTask(parentCommand, getParameters()); AsyncTaskParameters p = new AsyncTaskParameters(asyncTaskCreationInfo, new async_tasks(parentCommand, AsyncTaskResultEnum.success, AsyncTaskStatusEnum.running, asyncTaskCreationInfo.getTaskID(), commandParams)); p.setEntityId(getParameters().getEntityId()); Guid ret = AsyncTaskManager.getInstance().CreateTask(AsyncTaskType.moveImage, p, false); return ret; } @Override protected void EndWithFailure() { if (getMoveOrCopyImageOperation() == ImageOperation.Copy) { UnLockImage(); // remove iamge-storage mapping DbFacade.getInstance().getStorageDomainDAO().removeImageGroupStorageDomainMap( new image_group_storage_domain_map(getParameters().getImageGroupID(), getParameters() .getStorageDomainId())); } else { MarkImageAsIllegal(); } setSucceeded(true); } }