package org.ovirt.engine.ui.uicommonweb.models.datacenters;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import org.ovirt.engine.core.common.action.ReconstructMasterParameters;
import org.ovirt.engine.core.common.action.StoragePoolManagementParameter;
import org.ovirt.engine.core.common.action.StoragePoolParametersBase;
import org.ovirt.engine.core.common.action.VdcActionParametersBase;
import org.ovirt.engine.core.common.action.VdcActionType;
import org.ovirt.engine.core.common.action.VdcReturnValueBase;
import org.ovirt.engine.core.common.businessentities.Quota;
import org.ovirt.engine.core.common.businessentities.QuotaEnforcementTypeEnum;
import org.ovirt.engine.core.common.businessentities.StorageDomain;
import org.ovirt.engine.core.common.businessentities.StorageDomainSharedStatus;
import org.ovirt.engine.core.common.businessentities.StorageDomainType;
import org.ovirt.engine.core.common.businessentities.StorageFormatType;
import org.ovirt.engine.core.common.businessentities.StoragePool;
import org.ovirt.engine.core.common.businessentities.StoragePoolStatus;
import org.ovirt.engine.core.common.businessentities.StorageServerConnections;
import org.ovirt.engine.core.common.businessentities.storage.StorageType;
import org.ovirt.engine.core.common.interfaces.SearchType;
import org.ovirt.engine.core.common.mode.ApplicationMode;
import org.ovirt.engine.core.common.queries.IdQueryParameters;
import org.ovirt.engine.core.common.queries.NameQueryParameters;
import org.ovirt.engine.core.common.queries.SearchParameters;
import org.ovirt.engine.core.common.queries.VdcQueryReturnValue;
import org.ovirt.engine.core.common.queries.VdcQueryType;
import org.ovirt.engine.core.common.utils.VersionStorageFormatUtil;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.compat.Version;
import org.ovirt.engine.core.searchbackend.SearchObjects;
import org.ovirt.engine.ui.frontend.Frontend;
import org.ovirt.engine.ui.uicommonweb.Cloner;
import org.ovirt.engine.ui.uicommonweb.ICommandTarget;
import org.ovirt.engine.ui.uicommonweb.Linq;
import org.ovirt.engine.ui.uicommonweb.UICommand;
import org.ovirt.engine.ui.uicommonweb.dataprovider.AsyncDataProvider;
import org.ovirt.engine.ui.uicommonweb.help.HelpTag;
import org.ovirt.engine.ui.uicommonweb.models.CommonModel;
import org.ovirt.engine.ui.uicommonweb.models.ConfirmationModel;
import org.ovirt.engine.ui.uicommonweb.models.EntityModel;
import org.ovirt.engine.ui.uicommonweb.models.HasEntity;
import org.ovirt.engine.ui.uicommonweb.models.ISupportSystemTreeContext;
import org.ovirt.engine.ui.uicommonweb.models.ListWithSimpleDetailsModel;
import org.ovirt.engine.ui.uicommonweb.models.SystemTreeItemModel;
import org.ovirt.engine.ui.uicommonweb.models.SystemTreeItemType;
import org.ovirt.engine.ui.uicommonweb.models.TabName;
import org.ovirt.engine.ui.uicommonweb.models.configure.PermissionListModel;
import org.ovirt.engine.ui.uicommonweb.models.datacenters.qos.DataCenterCpuQosListModel;
import org.ovirt.engine.ui.uicommonweb.models.datacenters.qos.DataCenterHostNetworkQosListModel;
import org.ovirt.engine.ui.uicommonweb.models.datacenters.qos.DataCenterStorageQosListModel;
import org.ovirt.engine.ui.uicommonweb.place.WebAdminApplicationPlaces;
import org.ovirt.engine.ui.uicompat.ConstantsManager;
import org.ovirt.engine.ui.uicompat.NotifyCollectionChangedEventArgs;
import org.ovirt.engine.ui.uicompat.PropertyChangedEventArgs;
import org.ovirt.engine.ui.uicompat.UIConstants;
import com.google.inject.Inject;
import com.google.inject.Provider;
public class DataCenterListModel extends ListWithSimpleDetailsModel<Void, StoragePool> implements ISupportSystemTreeContext {
private UICommand privateNewCommand;
public UICommand getNewCommand() {
return privateNewCommand;
}
private void setNewCommand(UICommand value) {
privateNewCommand = value;
}
private UICommand privateEditCommand;
@Override
public UICommand getEditCommand() {
return privateEditCommand;
}
private void setEditCommand(UICommand value) {
privateEditCommand = value;
}
private UICommand privateRemoveCommand;
public UICommand getRemoveCommand() {
return privateRemoveCommand;
}
private void setRemoveCommand(UICommand value) {
privateRemoveCommand = value;
}
private UICommand privateForceRemoveCommand;
public UICommand getForceRemoveCommand() {
return privateForceRemoveCommand;
}
private void setForceRemoveCommand(UICommand value) {
privateForceRemoveCommand = value;
}
private UICommand privateGuideCommand;
public UICommand getGuideCommand() {
return privateGuideCommand;
}
private void setGuideCommand(UICommand value) {
privateGuideCommand = value;
}
private UICommand privateRecoveryStorageCommand;
public UICommand getRecoveryStorageCommand() {
return privateRecoveryStorageCommand;
}
private void setRecoveryStorageCommand(UICommand value) {
privateRecoveryStorageCommand = value;
}
protected Object[] getSelectedKeys() {
if (getSelectedItems() == null) {
return new Object[0];
}
else {
ArrayList<Object> objL = new ArrayList<>();
for (StoragePool a : getSelectedItems()) {
objL.add(a.getId());
}
return objL.toArray(new Object[] {});
}
}
private Object privateGuideContext;
public Object getGuideContext() {
return privateGuideContext;
}
public void setGuideContext(Object value) {
privateGuideContext = value;
}
final DataCenterQuotaListModel quotaListModel;
final DataCenterIscsiBondListModel iscsiBondListModel;
private final Provider<CommonModel> commonModelProvider;
@Inject
public DataCenterListModel(Provider<CommonModel> commonModelProvider,
final DataCenterIscsiBondListModel dataCenterIscsiBondListModel,
final DataCenterQuotaListModel dataCenterQuotaListModel,
final DataCenterStorageListModel dataCenterStorageListModel,
final DataCenterNetworkListModel dataCenterNetworkListModel,
final DataCenterClusterListModel dataCenterClusterListModel,
final DataCenterNetworkQoSListModel dataCenterNetworkQoSListModel,
final DataCenterHostNetworkQosListModel dataCenterHostNetworkQosListModel,
final DataCenterStorageQosListModel dataCenterStorageQosListModel,
final DataCenterCpuQosListModel dataCenterCpuQosListModel,
final PermissionListModel<StoragePool> permissionListModel,
final DataCenterEventListModel dataCenterEventListModel) {
this.commonModelProvider = commonModelProvider;
iscsiBondListModel = dataCenterIscsiBondListModel;
quotaListModel = dataCenterQuotaListModel;
setDetailList(dataCenterStorageListModel, dataCenterNetworkListModel, dataCenterClusterListModel,
dataCenterNetworkQoSListModel, dataCenterHostNetworkQosListModel, dataCenterStorageQosListModel,
dataCenterCpuQosListModel, permissionListModel, dataCenterEventListModel);
setTitle(ConstantsManager.getInstance().getConstants().dataCentersTitle());
setApplicationPlace(WebAdminApplicationPlaces.dataCenterMainTabPlace);
setDefaultSearchString("DataCenter:"); //$NON-NLS-1$
setSearchString(getDefaultSearchString());
setSearchObjects(new String[] { SearchObjects.VDC_STORAGE_POOL_OBJ_NAME });
setAvailableInModes(ApplicationMode.VirtOnly);
setNewCommand(new UICommand("New", this)); //$NON-NLS-1$
setEditCommand(new UICommand("Edit", this)); //$NON-NLS-1$
setRemoveCommand(new UICommand("Remove", this)); //$NON-NLS-1$
UICommand tempVar = new UICommand("ForceRemove", this); //$NON-NLS-1$
tempVar.setIsExecutionAllowed(true);
setForceRemoveCommand(tempVar);
setRecoveryStorageCommand(new UICommand("RecoveryStorage", this)); //$NON-NLS-1$
setGuideCommand(new UICommand("Guide", this)); //$NON-NLS-1$
updateActionAvailability();
getSearchNextPageCommand().setIsAvailable(true);
getSearchPreviousPageCommand().setIsAvailable(true);
}
public void guide() {
DataCenterGuideModel model = new DataCenterGuideModel();
setWindow(model);
model.setTitle(ConstantsManager.getInstance().getConstants().newDataCenterGuideMeTitle());
model.setHelpTag(HelpTag.new_data_center___guide_me);
model.setHashName("new_data_center_-_guide_me"); //$NON-NLS-1$
if (getGuideContext() == null) {
StoragePool dataCenter = getSelectedItem();
setGuideContext(dataCenter.getId());
}
AsyncDataProvider.getInstance().getDataCenterById(new AsyncQuery<>(
returnValue -> {
DataCenterGuideModel dataCenterGuideModel = (DataCenterGuideModel) getWindow();
dataCenterGuideModel.setEntity(returnValue);
UICommand tempVar = new UICommand("Cancel", DataCenterListModel.this); //$NON-NLS-1$
tempVar.setTitle(ConstantsManager.getInstance().getConstants().configureLaterTitle());
tempVar.setIsDefault(true);
tempVar.setIsCancel(true);
dataCenterGuideModel.getCommands().add(tempVar);
}), (Guid) getGuideContext());
}
private void setDetailList(final DataCenterStorageListModel dataCenterStorageListModel,
final DataCenterNetworkListModel dataCenterNetworkListModel,
final DataCenterClusterListModel dataCenterClusterListModel,
final DataCenterNetworkQoSListModel dataCenterNetworkQoSListModel,
final DataCenterHostNetworkQosListModel dataCenterHostNetworkQosListModel,
final DataCenterStorageQosListModel dataCenterStorageQosListModel,
final DataCenterCpuQosListModel dataCenterCpuQosListModel,
final PermissionListModel<StoragePool> permissionListModel,
final DataCenterEventListModel dataCenterEventListModel) {
List<HasEntity<StoragePool>> list = new ArrayList<>();
list.add(dataCenterStorageListModel);
list.add(iscsiBondListModel);
list.add(dataCenterNetworkListModel);
list.add(dataCenterClusterListModel);
quotaListModel.setIsAvailable(false);
list.add(quotaListModel);
list.add(dataCenterNetworkQoSListModel);
list.add(dataCenterHostNetworkQosListModel);
list.add(dataCenterStorageQosListModel);
list.add(dataCenterCpuQosListModel);
list.add(permissionListModel);
list.add(dataCenterEventListModel);
setDetailModels(list);
}
@Override
public boolean isSearchStringMatch(String searchString) {
return searchString.trim().toLowerCase().startsWith("datacenter"); //$NON-NLS-1$
}
@Override
protected void syncSearch() {
SearchParameters tempVar = new SearchParameters(applySortOptions(getSearchString()), SearchType.StoragePool,
isCaseSensitiveSearch());
tempVar.setMaxCount(getSearchPageSize());
super.syncSearch(VdcQueryType.Search, tempVar);
}
@Override
public boolean supportsServerSideSorting() {
return true;
}
public void newEntity() {
if (getWindow() != null) {
return;
}
DataCenterModel model = new DataCenterModel();
setWindow(model);
model.setTitle(ConstantsManager.getInstance().getConstants().newDataCenterTitle());
model.setHelpTag(HelpTag.new_data_center);
model.setHashName("new_data_center"); //$NON-NLS-1$
model.setIsNew(true);
UICommand tempVar = UICommand.createDefaultOkUiCommand("OnSave", this); //$NON-NLS-1$
model.getCommands().add(tempVar);
UICommand tempVar2 = UICommand.createCancelUiCommand("Cancel", this); //$NON-NLS-1$
model.getCommands().add(tempVar2);
}
public void edit() {
StoragePool dataCenter = getSelectedItem();
final UIConstants constants = ConstantsManager.getInstance().getConstants();
if (getWindow() != null) {
return;
}
final DataCenterModel model = new DataCenterModel();
setWindow(model);
model.setEntity(dataCenter);
model.setDataCenterId(dataCenter.getId());
model.setTitle(constants.editDataCenterTitle());
model.setHelpTag(HelpTag.edit_data_center);
model.setHashName("edit_data_center"); //$NON-NLS-1$
model.getName().setEntity(dataCenter.getName());
if (getSystemTreeSelectedItem() != null
&& getSystemTreeSelectedItem().getType() == SystemTreeItemType.DataCenter) {
model.getName().setIsChangeable(false);
model.getName().setChangeProhibitionReason(constants.cannotEditNameInTreeContext());
}
model.getDescription().setEntity(dataCenter.getdescription());
model.getComment().setEntity(dataCenter.getComment());
model.setOriginalName(dataCenter.getName());
model.getStoragePoolType().setSelectedItem(dataCenter.isLocal());
model.getQuotaEnforceTypeListModel().setSelectedItem(dataCenter.getQuotaEnforcementType());
UICommand tempVar = UICommand.createDefaultOkUiCommand("OnSave", this); //$NON-NLS-1$
model.getCommands().add(tempVar);
UICommand tempVar2 = UICommand.createCancelUiCommand("Cancel", this); //$NON-NLS-1$
model.getCommands().add(tempVar2);
}
public void remove() {
if (getWindow() != null) {
return;
}
boolean shouldAddressWarnning = false;
ConfirmationModel model = new ConfirmationModel();
setWindow(model);
model.setTitle(ConstantsManager.getInstance().getConstants().removeDataCenterTitle());
model.setHelpTag(HelpTag.remove_data_center);
model.setHashName("remove_data_center"); //$NON-NLS-1$
ArrayList<String> list = new ArrayList<>();
for (StoragePool a : getSelectedItems()) {
list.add(a.getName());
// If one of the Data Centers contain Storage Domain, show the warnning.
if (a.getStatus() != StoragePoolStatus.Uninitialized) {
shouldAddressWarnning = true;
}
}
model.setItems(list);
UICommand tempVar = UICommand.createDefaultOkUiCommand("OnRemove", this); //$NON-NLS-1$
model.getCommands().add(tempVar);
UICommand tempVar2 = UICommand.createCancelUiCommand("Cancel", this); //$NON-NLS-1$
model.getCommands().add(tempVar2);
if (shouldAddressWarnning) {
model.setNote(ConstantsManager.getInstance().getConstants().removeDataCenterWarnningNote());
}
}
public void forceRemove() {
ConfirmationModel model = new ConfirmationModel();
setWindow(model);
model.setTitle(ConstantsManager.getInstance().getConstants().forceRemoveDataCenterTitle());
model.setHelpTag(HelpTag.force_remove_data_center);
model.setHashName("force_remove_data_center"); //$NON-NLS-1$
model.getLatch().setIsAvailable(true);
model.getLatch().setIsChangeable(true);
ArrayList<String> list = new ArrayList<>();
for (StoragePool a : getSelectedItems()) {
list.add(a.getName());
}
model.setItems(list);
UICommand tempVar = UICommand.createDefaultOkUiCommand("OnForceRemove", this); //$NON-NLS-1$
model.getCommands().add(tempVar);
UICommand tempVar2 = UICommand.createCancelUiCommand("Cancel", this); //$NON-NLS-1$
model.getCommands().add(tempVar2);
}
public void recoveryStorage() {
final ConfirmationModel windowModel = new ConfirmationModel();
setWindow(windowModel);
windowModel.setTitle(ConstantsManager.getInstance().getConstants().dataCenterReInitializeTitle());
windowModel.setHelpTag(HelpTag.data_center_re_initialize);
windowModel.setHashName("data_center_re-initialize"); //$NON-NLS-1$
windowModel.getLatch().setIsAvailable(true);
windowModel.getLatch().setIsChangeable(true);
windowModel.startProgress();
AsyncDataProvider.getInstance().getStorageDomainList(new AsyncQuery<>(storageDomainList -> {
windowModel.stopProgress();
List<EntityModel> models = new ArrayList<>();
for (StorageDomain a : storageDomainList) {
if (a.getStorageDomainType() == StorageDomainType.Data
&& (a.getStorageDomainSharedStatus() == StorageDomainSharedStatus.Unattached)) {
EntityModel tempVar = new EntityModel();
tempVar.setEntity(a);
models.add(tempVar);
}
}
windowModel.setItems(models);
if (models.size() > 0) {
EntityModel entityModel = models.size() != 0 ? models.get(0) : null;
if (entityModel != null) {
entityModel.setIsSelected(true);
}
}
if (models.isEmpty()) {
windowModel.setMessage(ConstantsManager.getInstance()
.getConstants()
.thereAreNoCompatibleStorageDomainsAttachThisDcMsg());
windowModel.getLatch().setIsAvailable(false);
UICommand tempVar2 = new UICommand("Cancel", DataCenterListModel.this); //$NON-NLS-1$
tempVar2.setTitle(ConstantsManager.getInstance().getConstants().close());
tempVar2.setIsDefault(true);
tempVar2.setIsCancel(true);
windowModel.getCommands().add(tempVar2);
} else {
UICommand tempVar3 = UICommand.createDefaultOkUiCommand("OnRecover", DataCenterListModel.this); //$NON-NLS-1$
windowModel.getCommands().add(tempVar3);
UICommand tempVar4 = UICommand.createCancelUiCommand("Cancel", DataCenterListModel.this); //$NON-NLS-1$
windowModel.getCommands().add(tempVar4);
}
}));
}
public void onRecover() {
final ConfirmationModel windowModel = (ConfirmationModel) getWindow();
if (!windowModel.validate()) {
return;
}
AsyncDataProvider.getInstance().getStorageDomainList(new AsyncQuery<>(storageDomainList -> {
for (StorageDomain a : storageDomainList) {
if (a.getStorageDomainType() == StorageDomainType.Master) {
break;
}
}
List<StorageDomain> items = new ArrayList<>();
for (Object item : windowModel.getItems()) {
EntityModel<StorageDomain> a = (EntityModel<StorageDomain>) item;
if (a.getIsSelected()) {
items.add(a.getEntity());
}
}
if (items.size() > 0) {
if (windowModel.getProgress() != null) {
return;
}
ArrayList<VdcActionParametersBase> parameters =
new ArrayList<>();
for (StorageDomain a : items) {
parameters.add(new ReconstructMasterParameters(getSelectedItem().getId(),
a.getId()));
}
windowModel.startProgress();
Frontend.getInstance().runMultipleAction(VdcActionType.RecoveryStoragePool, parameters,
result -> {
ConfirmationModel localModel = (ConfirmationModel) result.getState();
localModel.stopProgress();
cancel();
}, windowModel);
}
else {
cancel();
}
}),
getSelectedItem().getId());
}
public void onRemove() {
ConfirmationModel model = (ConfirmationModel) getWindow();
if (model.getProgress() != null) {
return;
}
ArrayList<VdcActionParametersBase> parameters = new ArrayList<>();
for (StoragePool a : getSelectedItems()) {
parameters.add(new StoragePoolParametersBase(a.getId()));
}
model.startProgress();
Frontend.getInstance().runMultipleAction(VdcActionType.RemoveStoragePool, parameters,
result -> {
ConfirmationModel localModel = (ConfirmationModel) result.getState();
localModel.stopProgress();
cancel();
}, model);
}
public void onForceRemove() {
ConfirmationModel model = (ConfirmationModel) getWindow();
if (!model.validate()) {
return;
}
StoragePoolParametersBase tempVar = new StoragePoolParametersBase(getSelectedItem().getId());
tempVar.setForceDelete(true);
VdcActionParametersBase parametersBase = tempVar;
Frontend.getInstance().runAction(VdcActionType.RemoveStoragePool, parametersBase);
cancel();
}
public void cancel() {
cancelConfirmation();
setGuideContext(null);
setWindow(null);
updateActionAvailability();
}
public void cancelConfirmation() {
setConfirmWindow(null);
}
public void onSave() {
final DataCenterModel dcModel = (DataCenterModel) getWindow();
if (!dcModel.validate()) {
return;
}
if ((dcModel.getIsNew() || dcModel.getEntity() == null)
&& dcModel.getQuotaEnforceTypeListModel().getSelectedItem() == QuotaEnforcementTypeEnum.HARD_ENFORCEMENT) {
promptNoQuotaInDCMessage();
}
else if (!dcModel.getIsNew()
&& getSelectedItem() != null
&& !dcModel.getVersion().getSelectedItem().equals(getSelectedItem().getCompatibilityVersion())) {
final ConfirmationModel confirmModel = new ConfirmationModel();
setConfirmWindow(confirmModel);
confirmModel.setTitle(ConstantsManager.getInstance()
.getConstants()
.changeDataCenterCompatibilityVersionTitle());
confirmModel.setHelpTag(HelpTag.change_data_center_compatibility_version);
confirmModel.setHashName("change_data_center_compatibility_version"); //$NON-NLS-1$
final StoragePool sp = getSelectedItem();
startProgress();
IdQueryParameters params = new IdQueryParameters(sp.getId());
Frontend.getInstance().runQuery(VdcQueryType.GetStorageDomainsByStoragePoolId, params, new AsyncQuery<VdcQueryReturnValue>(
returnValue -> {
List<StorageDomain> storages = returnValue.getReturnValue();
StorageDomain storage = null;
for (StorageDomain sd : storages) {
if (sd.getStorageDomainType().isDataDomain()) {
storage = sd;
}
}
StorageFormatType newFormat = null;
StorageFormatType oldFormat = null;
if (storage != null) {
newFormat = VersionStorageFormatUtil.getForVersion(dcModel.getVersion().getSelectedItem());
oldFormat = VersionStorageFormatUtil.getForVersion(sp.getCompatibilityVersion());
}
if (newFormat == oldFormat) {
confirmModel.setMessage(ConstantsManager.getInstance()
.getConstants()
.youAreAboutChangeDcCompatibilityVersionMsg());
} else {
Version v = VersionStorageFormatUtil.getEarliestVersionSupported(newFormat);
confirmModel.setMessage(ConstantsManager.getInstance()
.getMessages()
.youAreAboutChangeDcCompatibilityVersionWithUpgradeMsg(v.getValue()));
}
stopProgress();
}));
UICommand tempVar = UICommand.createDefaultOkUiCommand("OnSaveInternal", this); //$NON-NLS-1$
confirmModel.getCommands().add(tempVar);
UICommand tempVar2 = UICommand.createCancelUiCommand("CancelConfirmation", this); //$NON-NLS-1$
confirmModel.getCommands().add(tempVar2);
} else if (getSelectedItem() != null
&& getSelectedItem().getQuotaEnforcementType() != QuotaEnforcementTypeEnum.HARD_ENFORCEMENT
&& dcModel.getQuotaEnforceTypeListModel().getSelectedItem() == QuotaEnforcementTypeEnum.HARD_ENFORCEMENT) {
checkForQuotaInDC(dcModel.getEntity(), this);
} else if (dcModel.getIsNew()) {
//New data center, check for name uniqueness.
validateDataCenterName(dcModel);
} else {
onSaveInternal();
}
}
private void validateDataCenterName(final DataCenterModel dataCenter) {
Frontend.getInstance().runQuery(VdcQueryType.GetStoragePoolByDatacenterName,
new NameQueryParameters(dataCenter.getName().getEntity()),
new AsyncQuery<VdcQueryReturnValue>(returnValue -> {
if (!((Collection<?>)returnValue.getReturnValue()).isEmpty()) {
dataCenter.getName().getInvalidityReasons().add(
ConstantsManager.getInstance().getConstants().nameMustBeUniqueInvalidReason());
dataCenter.getName().setIsValid(false);
dataCenter.setValidTab(TabName.GENERAL_TAB, false);
} else {
dataCenter.getName().getInvalidityReasons().clear();
dataCenter.getName().setIsValid(true);
dataCenter.setValidTab(TabName.GENERAL_TAB, true);
onSaveInternal();
}
}
));
}
private void checkForQuotaInDC(StoragePool storage_pool, final ICommandTarget commandTarget) {
IdQueryParameters parameters = new IdQueryParameters(storage_pool.getId());
Frontend.getInstance().runQuery(VdcQueryType.GetQuotaByStoragePoolId,
parameters,
new AsyncQuery<VdcQueryReturnValue>(returnValue -> {
if (((ArrayList<Quota>) returnValue.getReturnValue()).size() == 0) {
promptNoQuotaInDCMessage();
} else {
onSaveInternal();
}
}));
}
private void promptNoQuotaInDCMessage() {
ConfirmationModel confirmModel = new ConfirmationModel();
setConfirmWindow(confirmModel);
confirmModel.setTitle(ConstantsManager.getInstance()
.getConstants()
.changeDCQuotaEnforcementModeTitle());
confirmModel.setHelpTag(HelpTag.change_data_center_quota_enforcement_mode);
confirmModel.setHashName("change_data_center_quota_enforcement_mode"); //$NON-NLS-1$
confirmModel.setMessage(ConstantsManager.getInstance()
.getConstants()
.youAreAboutChangeDCQuotaEnforcementMsg());
UICommand tempVar = UICommand.createDefaultOkUiCommand("OnSaveInternal", this); //$NON-NLS-1$
getConfirmWindow().getCommands().add(tempVar);
UICommand tempVar2 = UICommand.createCancelUiCommand("CancelConfirmation", this); //$NON-NLS-1$
getConfirmWindow().getCommands().add(tempVar2);
}
public void onSaveInternal() {
DataCenterModel model = (DataCenterModel) getWindow();
if (model.getProgress() != null) {
return;
}
StoragePool dataCenter =
model.getIsNew() ? new StoragePool() : (StoragePool) Cloner.clone(getSelectedItem());
// cancel confirm window if there is
cancelConfirmation();
// Save changes.
dataCenter.setName(model.getName().getEntity());
dataCenter.setdescription(model.getDescription().getEntity());
dataCenter.setComment(model.getComment().getEntity());
dataCenter.setIsLocal(model.getStoragePoolType().getSelectedItem());
dataCenter.setCompatibilityVersion(model.getVersion().getSelectedItem());
dataCenter.setQuotaEnforcementType(model.getQuotaEnforceTypeListModel()
.getSelectedItem());
model.startProgress();
if (model.getIsNew()) {
// When adding a data center use sync action to be able present a Guide Me dialog afterwards.
Frontend.getInstance().runAction(VdcActionType.AddEmptyStoragePool,
new StoragePoolManagementParameter(dataCenter),
result -> {
DataCenterListModel localModel = (DataCenterListModel) result.getState();
localModel.postOnSaveInternal(result.getReturnValue());
},
this);
} else {
// Update the Quota at the corresponding DC object at the system tree.
// The DC Quota value from the tree is used at MainTabDiskView.
SystemTreeItemModel itemModel = commonModelProvider.get().getSystemTree().getItemById(dataCenter.getId());
itemModel.setEntity(dataCenter);
// Otherwise use async action in order to close dialog immediately.
Frontend.getInstance().runMultipleAction(VdcActionType.UpdateStoragePool,
new ArrayList<VdcActionParametersBase>(Arrays.asList(
new StoragePoolManagementParameter(dataCenter))
),
result -> {
DataCenterListModel localModel = (DataCenterListModel) result.getState();
localModel.postOnSaveInternal(result.getReturnValue().get(0));
},
this);
}
}
public void postOnSaveInternal(VdcReturnValueBase returnValue) {
DataCenterModel model = (DataCenterModel) getWindow();
model.stopProgress();
cancel();
if (model.getIsNew() && returnValue != null && returnValue.getSucceeded()) {
setGuideContext(returnValue.getActionReturnValue());
updateActionAvailability();
getGuideCommand().execute();
}
}
@Override
protected void onSelectedItemChanged() {
super.onSelectedItemChanged();
updateActionAvailability();
}
@Override
protected void selectedItemsChanged() {
super.selectedItemsChanged();
updateActionAvailability();
}
@Override
protected void itemsCollectionChanged(Object sender, NotifyCollectionChangedEventArgs e) {
super.itemsCollectionChanged(sender, e);
// Try to select an item corresponding to the system tree selection.
if (getSystemTreeSelectedItem() != null
&& getSystemTreeSelectedItem().getType() == SystemTreeItemType.DataCenter) {
StoragePool dataCenter = (StoragePool) getSystemTreeSelectedItem().getEntity();
setSelectedItem(Linq.firstOrNull(getItems(), new Linq.IdPredicate<>(dataCenter.getId())));
}
}
@Override
protected void selectedItemPropertyChanged(Object sender, PropertyChangedEventArgs e) {
super.selectedItemPropertyChanged(sender, e);
if (e.propertyName.equals("status")) { //$NON-NLS-1$
updateActionAvailability();
}
}
@Override
protected void updateDetailsAvailability() {
super.updateDetailsAvailability();
if (getSelectedItem() != null) {
StoragePool storagePool = getSelectedItem();
quotaListModel.setIsAvailable(storagePool.getQuotaEnforcementType() != QuotaEnforcementTypeEnum.DISABLED);
updateIscsiBondListAvailability(storagePool);
}
}
private void updateActionAvailability() {
ArrayList<StoragePool> items =
getSelectedItems() != null ? new ArrayList<>(getSelectedItems()) : new ArrayList<StoragePool>();
boolean isAllDown = true;
for (StoragePool item : items) {
if (item.getStatus() == StoragePoolStatus.Up || item.getStatus() == StoragePoolStatus.Contend) {
isAllDown = false;
break;
}
}
getEditCommand().setIsExecutionAllowed(getSelectedItem() != null && items.size() == 1);
getRemoveCommand().setIsExecutionAllowed(items.size() > 0 && isAllDown);
StoragePool storagePoolItem = getSelectedItem();
getForceRemoveCommand().setIsExecutionAllowed(storagePoolItem != null
&& items.size() == 1
&& storagePoolItem.getStatus() != StoragePoolStatus.Up);
getGuideCommand().setIsExecutionAllowed(getGuideContext() != null
|| (getSelectedItem() != null && getSelectedItems() != null && getSelectedItems().size() == 1));
getRecoveryStorageCommand().setIsExecutionAllowed(storagePoolItem != null && items.size() == 1
&& !storagePoolItem.isLocal() && storagePoolItem.getStatus() != StoragePoolStatus.Uninitialized
&& storagePoolItem.getStatus() != StoragePoolStatus.Up);
// System tree dependent actions.
boolean isAvailable =
!(getSystemTreeSelectedItem() != null && getSystemTreeSelectedItem().getType() == SystemTreeItemType.DataCenter);
getNewCommand().setIsAvailable(isAvailable);
getRemoveCommand().setIsAvailable(isAvailable);
getForceRemoveCommand().setIsAvailable(isAvailable);
}
private void updateIscsiBondListAvailability(StoragePool storagePool) {
AsyncDataProvider.getInstance().getStorageConnectionsByDataCenterIdAndStorageType(new AsyncQuery<>(connections -> {
boolean hasIscsiStorage = false;
for (StorageServerConnections connection : connections) {
if (connection.getStorageType() == StorageType.ISCSI) {
hasIscsiStorage = true;
break;
}
}
iscsiBondListModel.setIsAvailable(hasIscsiStorage);
}), storagePool.getId(), StorageType.ISCSI);
}
@Override
public void executeCommand(UICommand command) {
super.executeCommand(command);
if (command == getNewCommand()) {
newEntity();
}
else if (command == getEditCommand()) {
edit();
}
else if (command == getRemoveCommand()) {
remove();
}
else if (command == getForceRemoveCommand()) {
forceRemove();
}
else if (command == getGuideCommand()) {
guide();
}
else if (command == getRecoveryStorageCommand()) {
recoveryStorage();
}
else if ("OnSave".equals(command.getName())) { //$NON-NLS-1$
onSave();
}
else if ("Cancel".equals(command.getName())) { //$NON-NLS-1$
cancel();
}
else if ("OnRemove".equals(command.getName())) { //$NON-NLS-1$
onRemove();
}
else if ("OnForceRemove".equals(command.getName())) { //$NON-NLS-1$
onForceRemove();
}
else if ("OnSaveInternal".equals(command.getName())) { //$NON-NLS-1$
onSaveInternal();
}
else if ("CancelConfirmation".equals(command.getName())) { //$NON-NLS-1$
cancelConfirmation();
}
else if ("OnRecover".equals(command.getName())) { //$NON-NLS-1$
onRecover();
}
}
private SystemTreeItemModel systemTreeSelectedItem;
@Override
public SystemTreeItemModel getSystemTreeSelectedItem() {
return systemTreeSelectedItem;
}
@Override
public void setSystemTreeSelectedItem(SystemTreeItemModel value) {
if (systemTreeSelectedItem != value) {
systemTreeSelectedItem = value;
onSystemTreeSelectedItemChanged();
}
}
private void onSystemTreeSelectedItemChanged() {
updateActionAvailability();
}
@Override
protected String getListName() {
return "DataCenterListModel"; //$NON-NLS-1$
}
}