package org.ovirt.engine.ui.uicommonweb.models.storage; import org.ovirt.engine.core.common.businessentities.StorageDomainType; import org.ovirt.engine.core.common.businessentities.StoragePool; import org.ovirt.engine.core.common.businessentities.StoragePoolStatus; import org.ovirt.engine.ui.uicommonweb.dataprovider.AsyncDataProvider; import org.ovirt.engine.ui.uicommonweb.models.Model; public class NewEditStorageModelBehavior extends StorageModelBehavior { @Override public void updateItemsAvailability() { StoragePool dataCenter = getModel().getDataCenter().getSelectedItem(); if (dataCenter == null) { return; } // Allow Data storage type corresponding to the selected data-center type + ISO and Export that are NFS only: for (final IStorageModel item : getModel().getStorageModels()) { if (item.getRole() == StorageDomainType.ISO) { AsyncDataProvider.getInstance().getIsoDomainByDataCenterId(new AsyncQuery<>( returnValue -> { IStorageModel storageModelItem = item; postUpdateItemsAvailability(storageModelItem, returnValue == null); }), dataCenter.getId()); } else if (item.getRole() == StorageDomainType.ImportExport) { AsyncDataProvider.getInstance().getExportDomainByDataCenterId(new AsyncQuery<>( returnValue -> { IStorageModel storageModelItem = item; postUpdateItemsAvailability(storageModelItem, returnValue == null); }), dataCenter.getId()); } else { postUpdateItemsAvailability(item, false); } } } @Override public boolean isImport() { return false; } public void postUpdateItemsAvailability(IStorageModel item, boolean isNoExportOrIsoStorageAttached) { StoragePool dataCenter = getModel().getDataCenter().getSelectedItem(); checkCanItemBeSelected(item, dataCenter, isNoExportOrIsoStorageAttached); } private void checkCanItemBeSelected(final IStorageModel item, StoragePool dataCenter, boolean isNoExportOrIsoStorageAttached) { boolean isExistingStorage = getModel().getStorage() != null && item.getType() == getModel().getStorage().getStorageType(); // If we are in edit mode then the type of the entity edited should appear in the selection if (isExistingStorage) { updateItemSelectability(item, true); return; } boolean isExportDomain = item.getRole() == StorageDomainType.ImportExport; boolean isIsoDomain = item.getRole() == StorageDomainType.ISO; // Local types should not be selectable for shared data centers if (isLocalStorage(item) && !dataCenter.isLocal()) { updateItemSelectability(item, false); return; } boolean isNoneDataCenter = dataCenter.getId().equals(StorageModel.UnassignedDataCenterId); boolean isDataDomain = item.getRole() == StorageDomainType.Data; // For 'None' data center we allow all data types and no ISO/Export, no reason for further checks if (isNoneDataCenter) { updateItemSelectability(item, isDataDomain); return; } boolean canAttachExportDomain = isNoExportOrIsoStorageAttached && dataCenter.getStatus() != StoragePoolStatus.Uninitialized; boolean canAttachIsoDomain = isNoExportOrIsoStorageAttached && dataCenter.getStatus() != StoragePoolStatus.Uninitialized; // local storage should only be available in a local DC. boolean canAttachLocalStorage = !isLocalStorage(item) || dataCenter.isLocal(); if (((isExportDomain && canAttachExportDomain) || (isIsoDomain && canAttachIsoDomain)) && canAttachLocalStorage) { updateItemSelectability(item, true); return; } if (isDataDomain) { if (isLocalStorage(item)) { updateItemSelectability(item, true); return; } updateItemSelectability(item, true); return; } updateItemSelectability(item, false); } private void updateItemSelectability(IStorageModel item, boolean isSelectable) { Model model = (Model) item; model.setIsSelectable(isSelectable); onStorageModelUpdated(item); } }