package org.ovirt.engine.ui.uicommonweb.models.templates; import java.util.ArrayList; 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.businessentities.StorageDomain; import org.ovirt.engine.core.common.businessentities.storage.Disk; import org.ovirt.engine.core.common.businessentities.storage.DiskImage; import org.ovirt.engine.core.common.businessentities.storage.DiskStorageType; import org.ovirt.engine.core.common.businessentities.storage.ImageOperation; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.compat.StringHelper; import org.ovirt.engine.ui.frontend.Frontend; import org.ovirt.engine.ui.uicommonweb.dataprovider.AsyncDataProvider; import org.ovirt.engine.ui.uicommonweb.models.storage.MoveOrCopyDiskModel; import org.ovirt.engine.ui.uicommonweb.models.vms.DiskModel; public class CopyDiskModel extends MoveOrCopyDiskModel { public CopyDiskModel() { super(); setIsSourceStorageDomainAvailable(true); } @Override public void init(ArrayList<DiskImage> disksImages) { if (disksImages.size() > 0) { setIsAliasChangable(!isTemplateDisk(disksImages.get(0))); } setDiskImages(disksImages); AsyncDataProvider.getInstance().getDiskList(new AsyncQuery<>(disks -> { onInitAllDisks((List) disks); onInitDisks(); })); } @Override protected void onInitDisks() { ArrayList<DiskModel> disks = new ArrayList<>(); for (DiskImage disk : getDiskImages()) { disks.add(DiskModel.diskToModel(disk)); } setDisks(disks); initStorageDomains(); } @Override protected void initStorageDomains() { Disk disk = getDisks().get(0).getDisk(); if (disk.getDiskStorageType() != DiskStorageType.IMAGE) { return; } AsyncDataProvider.getInstance().getStorageDomainList(new AsyncQuery<>(storageDomains -> onInitStorageDomains(storageDomains)), ((DiskImage) disk).getStoragePoolId()); } @Override protected VdcActionType getActionType() { return VdcActionType.MoveOrCopyDisk; } @Override protected String getWarning(List<String> disks) { return messages.cannotCopyDisks(StringHelper.join(", ", disks.toArray())); //$NON-NLS-1$ } @Override protected String getNoActiveSourceDomainMessage() { return constants.noActiveSourceStorageDomainAvailableMsg(); } @Override protected String getNoActiveTargetDomainMessage() { return constants.diskExistsOnAllActiveStorageDomainsMsg(); } @Override protected MoveOrCopyImageGroupParameters createParameters(Guid sourceStorageDomainGuid, Guid destStorageDomainGuid, DiskImage disk) { MoveOrCopyImageGroupParameters moveOrCopyImageGroupParameters = new MoveOrCopyImageGroupParameters(disk.getImageId(), sourceStorageDomainGuid, destStorageDomainGuid, ImageOperation.Copy); moveOrCopyImageGroupParameters.setImageGroupID(disk.getId()); return moveOrCopyImageGroupParameters; } @Override protected void doExecute() { super.doExecute(); ArrayList<VdcActionParametersBase> parameters = getParameters(); if (parameters.isEmpty()) { cancel(); return; } Frontend.getInstance().runMultipleAction(getActionType(), parameters, result -> { CopyDiskModel localModel = (CopyDiskModel) result.getState(); localModel.cancel(); }, this); } @Override protected boolean allowedStorageDomain(List<StorageDomain> sourceActiveStorageDomains, DiskImage diskImage, DiskModel templateDisk, StorageDomain sd) { // can not move template to the same storage domain boolean isTemplate = isTemplateDisk(diskImage); if (isTemplate && sourceActiveStorageDomains.contains(sd)) { return false; } return super.allowedStorageDomain(sourceActiveStorageDomains, diskImage, templateDisk, sd); } private boolean isTemplateDisk(DiskImage diskImage) { return diskImage.getVmEntityType() != null && diskImage.getVmEntityType().isTemplateType(); } }