package org.ovirt.engine.ui.uicommonweb.models.quota;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.ovirt.engine.core.common.businessentities.Quota;
import org.ovirt.engine.core.common.businessentities.QuotaEnforcementTypeEnum;
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.DiskImageBase;
import org.ovirt.engine.core.common.queries.IdQueryParameters;
import org.ovirt.engine.core.common.queries.VdcQueryParametersBase;
import org.ovirt.engine.core.common.queries.VdcQueryReturnValue;
import org.ovirt.engine.core.common.queries.VdcQueryType;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.ui.frontend.Frontend;
import org.ovirt.engine.ui.uicommonweb.UICommand;
import org.ovirt.engine.ui.uicommonweb.models.ListModel;
import org.ovirt.engine.ui.uicommonweb.models.SystemTreeItemModel;
import org.ovirt.engine.ui.uicommonweb.models.SystemTreeItemType;
public class ChangeQuotaModel extends ListModel<ChangeQuotaItemModel> {
public void init(final ArrayList<DiskImage> disks) {
ArrayList<VdcQueryType> queryTypeList = new ArrayList<>();
ArrayList<VdcQueryParametersBase> queryParamsList = new ArrayList<>();
Set<Guid> storageDomainIdSet = new HashSet<>();
for (DiskImage diskImage : disks) {
for (Guid storageDomainId : diskImage.getStorageIds()) {
storageDomainIdSet.add(storageDomainId);
}
}
for (Guid storageDomainId : storageDomainIdSet) {
queryParamsList.add(new IdQueryParameters(storageDomainId));
queryTypeList.add(VdcQueryType.GetAllRelevantQuotasForStorage);
}
Frontend.getInstance().runMultipleQueries(queryTypeList, queryParamsList, result -> {
Map<Guid, List<Quota>> storageDomainIdMap = new HashMap<>();
for (int i = 0; i < result.getReturnValues().size(); i++) {
VdcQueryReturnValue retVal = result.getReturnValues().get(i);
Guid storageId =
((IdQueryParameters) result.getParameters().get(i)).getId();
storageDomainIdMap.put(storageId, (ArrayList<Quota>) retVal.getReturnValue());
}
ArrayList<ChangeQuotaItemModel> list = new ArrayList<>();
Guid storageDomainId;
for (DiskImage diskImage : disks) {
for (int i = 0; i < diskImage.getStorageIds().size(); i++) {
storageDomainId = diskImage.getStorageIds().get(i);
ChangeQuotaItemModel itemModel = new ChangeQuotaItemModel();
itemModel.setEntity(diskImage);
itemModel.getObject().setEntity(diskImage.getDiskAlias());
itemModel.getCurrentQuota().setEntity(diskImage.getQuotaNames() != null && diskImage.getQuotaNames().size() >= i+1 ? diskImage.getQuotaNames().get(i) : null);
itemModel.setStorageDomainId(storageDomainId);
itemModel.setStorageDomainName(diskImage.getStoragesNames().get(i));
itemModel.getQuota().setItems(storageDomainIdMap.get(storageDomainId));
for (Quota quota : itemModel.getQuota().getItems()) {
if (!quota.getId().equals(diskImage.getQuotaId())) {
itemModel.getQuota().setSelectedItem(quota);
break;
}
}
list.add(itemModel);
}
}
ChangeQuotaModel.this.setItems(list);
ChangeQuotaModel.this.stopProgress();
});
}
/**
* Static utility method for change quota command availability.
* the command is available when the selected item in the tree is DC
* and one of the disks (shown in the tab) has quota mode != QuotaEnforcementTypeEnum.DISABLED.
* The command is enabled (isExecutionAllowed == true) if it's available
* and all the selected disks quota mode != QuotaEnforcementTypeEnum.DISABLED.
* @param allDisks - model's disks (visible in page)
* @param selectedDisks - model's selected disks
*/
public static void updateChangeQuotaActionAvailability(Collection<? extends Disk> allDisks,
Collection<? extends Disk> selectedDisks,
SystemTreeItemModel systemTreeSelectedItem,
UICommand changeQuotaCommand) {
boolean isAvailable = true;
boolean isExecutionAllowed = true;
if (systemTreeSelectedItem != null
&& systemTreeSelectedItem.getType() == SystemTreeItemType.DataCenter) {
if (selectedDisks != null && !selectedDisks.isEmpty()) {
for (Disk diskItem : selectedDisks) {
if (!diskItem.getDiskStorageType().isInternal() ||
!(diskItem instanceof DiskImageBase) ||
((DiskImageBase) diskItem).getQuotaEnforcementType() == QuotaEnforcementTypeEnum.DISABLED) {
isExecutionAllowed = false;
break;
}
}
} else {
isExecutionAllowed = false;
}
} else {
isAvailable = false;
}
// show the button iff there are disks with quota mode != disabled
if (isAvailable && !isExecutionAllowed) {
boolean hasDisksWithQuotaMode = false;
if (allDisks != null && !allDisks.isEmpty()) {
for (Disk diskItem : allDisks) {
if (diskItem.getDiskStorageType().isInternal() &&
(diskItem instanceof DiskImageBase) &&
((DiskImageBase) diskItem).getQuotaEnforcementType() != QuotaEnforcementTypeEnum.DISABLED) {
hasDisksWithQuotaMode = true;
break;
}
}
}
isAvailable = hasDisksWithQuotaMode;
}
changeQuotaCommand.setIsAvailable(isAvailable);
if (isAvailable) {
changeQuotaCommand.setIsExecutionAllowed(isExecutionAllowed);
}
}
}