package org.ovirt.engine.ui.uicommonweb.models.storage;
import java.util.List;
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.Linq;
import org.ovirt.engine.ui.uicommonweb.dataprovider.AsyncDataProvider;
import org.ovirt.engine.ui.uicommonweb.models.Model;
import org.ovirt.engine.ui.uicompat.ConstantsManager;
public class ImportStorageModelBehavior extends StorageModelBehavior {
@Override
public List<StoragePool> filterDataCenter(List<StoragePool> source) {
return Linq.where(source, new Linq.DataCenterStatusPredicate(StoragePoolStatus.Up));
}
@Override
public void initialize() {
super.initialize();
getModel().getActivateDomain().setEntity(false);
initializeItems();
}
private void initializeItems() {
List<IStorageModel> items = AsyncDataProvider.getInstance().getFileDataStorageModels();
items.addAll(AsyncDataProvider.getInstance().getImportBlockDataStorageModels());
items.addAll(AsyncDataProvider.getInstance().getIsoStorageModels());
items.addAll(AsyncDataProvider.getInstance().getExportStorageModels());
getModel().setStorageModels(items);
}
@Override
public void updateItemsAvailability() {
StoragePool dataCenter = getModel().getDataCenter().getSelectedItem();
updateAvailabilityByDatacenter(dataCenter);
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);
}
}
}
private void updateAvailabilityByDatacenter(StoragePool datacenter) {
getModel().getActivateDomain().setIsAvailable(!StorageModel.UnassignedDataCenterId.equals(datacenter.getId()));
}
public void postUpdateItemsAvailability(IStorageModel item, boolean isNoStorageAttached) {
Model model = (Model) item;
StoragePool dataCenter = getModel().getDataCenter().getSelectedItem();
boolean isItemSelectable = isItemSelectable(item, dataCenter, isNoStorageAttached);
model.setIsSelectable(isItemSelectable);
onStorageModelUpdated(item);
}
@Override
public void setStorageTypeItems() {
super.setStorageTypeItems();
if (getSelectableModels().isEmpty()) {
getModel().getDataCenterAlert().setIsAvailable(true);
getModel().getDataCenterAlert().setEntity(ConstantsManager.getInstance().getConstants().noStoragesToImport());
}
}
@Override
public boolean isImport() {
return true;
}
private boolean isItemSelectable(IStorageModel item, StoragePool dataCenter, boolean isNoStorageAttached) {
// Local SD can be attached to a local DC only
if (isLocalStorage(item) && !dataCenter.isLocal()) {
return false;
}
// All storage domains can be attached to Unassigned DC
if (StorageModel.UnassignedDataCenterId.equals(dataCenter.getId())) {
return true;
}
// Local and ISO domains can be attached to DC if it doesn't have
// an attached domain of the same type already
if (isNoStorageAttached &&
(item.getRole() == StorageDomainType.ISO || item.getRole() == StorageDomainType.ImportExport)) {
return true;
}
if (item.getRole() == StorageDomainType.Data) {
return true;
}
return false;
}
}