From fa51e65485dfad91dcec0eb7fcb62bc8409cb49d Mon Sep 17 00:00:00 2001 From: Stepan Ermakov Date: Mon, 19 Feb 2024 09:27:32 +0300 Subject: [PATCH] Correct Data Center for the "Upload Image" dialog Signed-off-by: Stepan Ermakov This PR fixes the following issue: incorrect Data Center is displayed when uploading a disk image from "Storage Domain Disks" UI. Steps to reproduce: 1. Create a Storage Domain at non-Default Data Center. 2. Open the Storage -> Domains -> -> Disks page. 3. Select the Upload -> Start menu item. The "Upload image" dialog is displayed. Expected behavior: The Data Center filed is disabled and displays the name of the non-Default Data Center. Current behavior: The Data Center field is disabled and display the name of the Default Data Center. Fixed in the following way: when "Upload image" dialog is displayed then query the Storage Domain details with information about its Data Center and select the Storage Domain's Data Center in the "Data Center" field --- .../models/storage/UploadImageModel.java | 53 ++++++++++++++++--- 1 file changed, 47 insertions(+), 6 deletions(-) diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/UploadImageModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/UploadImageModel.java index b95a142ab19..1dbaf0bc094 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/UploadImageModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/storage/UploadImageModel.java @@ -1,8 +1,8 @@ package org.ovirt.engine.ui.uicommonweb.models.storage; import java.util.ArrayList; -import java.util.Collections; import java.util.List; +import java.util.Optional; import java.util.logging.Logger; import org.ovirt.engine.core.common.action.ActionParametersBase; @@ -10,6 +10,7 @@ import org.ovirt.engine.core.common.action.AddDiskParameters; import org.ovirt.engine.core.common.action.TransferDiskImageParameters; import org.ovirt.engine.core.common.action.TransferImageStatusParameters; +import org.ovirt.engine.core.common.businessentities.StorageDomain; import org.ovirt.engine.core.common.businessentities.StorageFormatType; import org.ovirt.engine.core.common.businessentities.StoragePool; import org.ovirt.engine.core.common.businessentities.storage.Disk; @@ -21,6 +22,9 @@ import org.ovirt.engine.core.common.businessentities.storage.TransferClientType; import org.ovirt.engine.core.common.businessentities.storage.TransferType; import org.ovirt.engine.core.common.businessentities.storage.VolumeFormat; +import org.ovirt.engine.core.common.queries.IdQueryParameters; +import org.ovirt.engine.core.common.queries.QueryReturnValue; +import org.ovirt.engine.core.common.queries.QueryType; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.compat.StringHelper; import org.ovirt.engine.ui.frontend.Frontend; @@ -30,6 +34,7 @@ import org.ovirt.engine.ui.uicommonweb.help.HelpTag; import org.ovirt.engine.ui.uicommonweb.models.ConfirmationModel; import org.ovirt.engine.ui.uicommonweb.models.EntityModel; +import org.ovirt.engine.ui.uicommonweb.models.ListModel; import org.ovirt.engine.ui.uicommonweb.models.Model; import org.ovirt.engine.ui.uicommonweb.models.vms.AbstractDiskModel; import org.ovirt.engine.ui.uicommonweb.models.vms.NewDiskModel; @@ -169,11 +174,30 @@ public void initialize() { getDataCenter().setIsChangeable(isChangeable); if (!isChangeable) { - // Set the selected item on the storage domains list. - AsyncDataProvider.getInstance().getStorageDomainById( - new AsyncQuery<>(storageDomain -> { - getStorageDomain().setItems(Collections.singletonList(storageDomain)); - }), limitToStorageDomainId); + // Set the selected item on the storage domains and data centers lists. + Frontend.getInstance().runQuery( + QueryType.GetStorageDomainListById, + new IdQueryParameters(limitToStorageDomainId), + new AsyncQuery(returnValue -> { + ArrayList domains = returnValue.getReturnValue(); + if (!domains.isEmpty()) { + StorageDomain storageDomain = domains.get(0); + // Set the selected item on the storage domains list. + List availableDomains = new ArrayList<>(); + availableDomains.add(storageDomain); + getStorageDomain().setItems(availableDomains); + Guid dcId = storageDomain.getStoragePoolId(); + if (!Guid.isNullOrEmpty(dcId)) { + // Set selected data center if the list of data centers is populated. + if (!selectDataCenter(dcId)) { + // If the data center is not there then need to listen to the data centers list + // change to update the selected data center. + getDataCenter().getItemsChangedEvent() + .addListener((ev, sender, args) -> selectDataCenter(dcId)); + } + } + } + })); } getStorageDomain().setIsChangeable(isChangeable); getStorageType().setIsChangeable(false); @@ -196,6 +220,23 @@ public int getMinimumDiskSize() { protected boolean performUpdateHosts() { return true; } + + private boolean selectDataCenter(Guid dcId) { + ListModel dcList = getDataCenter(); + // Find a data center with the desired Id + Optional dataCenter = dcList.getItems() + .stream() + .filter(dc -> dcId.equals(dc.getId())) + .findFirst(); + if (dataCenter.isPresent()) { + // Activate this data center in the data center dropdown list + dcList.setSelectedItem(dataCenter.get()); + return true; + } + // Since we populate data centers asynchronously, we may have a situation when the needed + // data center is still not there. So, need to wait... + return false; + } }); } else { setDiskModel(new ReadOnlyDiskModel() {