package org.ovirt.engine.ui.uicommonweb.models.clusters; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.List; import org.ovirt.engine.core.common.action.NetworkClusterParameters; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.businessentities.Cluster; import org.ovirt.engine.core.common.businessentities.comparators.LexoNumericComparator; import org.ovirt.engine.core.common.businessentities.network.Network; import org.ovirt.engine.core.common.businessentities.network.NetworkClusterId; import org.ovirt.engine.core.common.businessentities.network.NetworkStatus; import org.ovirt.engine.core.common.mode.ApplicationMode; import org.ovirt.engine.core.common.queries.IdQueryParameters; 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.AsyncCallback; import org.ovirt.engine.ui.frontend.Frontend; import org.ovirt.engine.ui.uicommonweb.Cloner; 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.ApplicationModeHelper; import org.ovirt.engine.ui.uicommonweb.models.SearchableListModel; import org.ovirt.engine.ui.uicommonweb.models.datacenters.ClusterNewNetworkModel; import org.ovirt.engine.ui.uicompat.ConstantsManager; public class ClusterNetworkListModel extends SearchableListModel<Cluster, Network> { private UICommand privateNewNetworkCommand; public UICommand getNewNetworkCommand() { return privateNewNetworkCommand; } private void setNewNetworkCommand(UICommand value) { privateNewNetworkCommand = value; } private UICommand privateManageCommand; public UICommand getManageCommand() { return privateManageCommand; } private void setManageCommand(UICommand value) { privateManageCommand = value; } private UICommand privateSetAsDisplayCommand; public UICommand getSetAsDisplayCommand() { return privateSetAsDisplayCommand; } private void setSetAsDisplayCommand(UICommand value) { privateSetAsDisplayCommand = value; } public ClusterNetworkListModel() { setTitle(ConstantsManager.getInstance().getConstants().logicalNetworksTitle()); setHelpTag(HelpTag.logical_networks); setHashName("logical_networks"); //$NON-NLS-1$ setManageCommand(new UICommand("Manage", this)); //$NON-NLS-1$ setSetAsDisplayCommand(new UICommand("SetAsDisplay", this)); //$NON-NLS-1$ setNewNetworkCommand(new UICommand("New", this)); //$NON-NLS-1$ getSetAsDisplayCommand().setIsAvailable(ApplicationModeHelper.isModeSupported(ApplicationMode.VirtOnly)); updateActionAvailability(); } @Override protected void onEntityChanged() { super.onEntityChanged(); getSearchCommand().execute(); } @Override public void search() { if (getEntity() != null) { super.search(); } } @Override protected void syncSearch() { if (getEntity() == null) { return; } super.syncSearch(); IdQueryParameters tempVar = new IdQueryParameters(getEntity().getId()); tempVar.setRefresh(getIsQueryFirstTime()); Frontend.getInstance().runQuery(VdcQueryType.GetAllNetworksByClusterId, tempVar, new AsyncQuery<>((AsyncCallback<VdcQueryReturnValue>) returnValue -> { final List<Network> newItems = returnValue.getReturnValue(); Collections.sort(newItems, Comparator.comparing((Network n) -> n.getCluster().isManagement()).reversed() .thenComparing(Network::getName, new LexoNumericComparator()) ); for (Network network : newItems) { network.getCluster().setId(new NetworkClusterId(getEntity().getId(), network.getId())); } setItems(newItems); })); } public void setAsDisplay() { final Network network = (Network) Cloner.clone(getSelectedItem()); network.getCluster().setDisplay(true); final NetworkClusterParameters networkClusterParameters = new NetworkClusterParameters(network.getCluster()); Frontend.getInstance().runAction(VdcActionType.UpdateNetworkOnCluster, networkClusterParameters); } public void manage() { if (getWindow() != null) { return; } Guid storagePoolId = (getEntity().getStoragePoolId() != null) ? getEntity().getStoragePoolId() : Guid.Empty; // fetch the list of DC Networks AsyncDataProvider.getInstance().getNetworkList(new AsyncQuery<>(dcNetworks -> { ClusterNetworkManageModel networkToManage = createNetworkList(dcNetworks); setWindow(networkToManage); networkToManage.setTitle(ConstantsManager.getInstance().getConstants().assignDetachNetworksTitle()); networkToManage.setHelpTag(HelpTag.assign_networks); networkToManage.setHashName("assign_networks"); //$NON-NLS-1$ }), storagePoolId); } private ClusterNetworkManageModel createNetworkList(List<Network> dcNetworks) { final List<ClusterNetworkModel> networkList = new ArrayList<>(); final List<Network> clusterNetworks = new ArrayList<>(getItems()); for (Network network : dcNetworks) { ClusterNetworkModel networkManageModel; int index = clusterNetworks.indexOf(network); if (index >= 0) { Network clusterNetwork = clusterNetworks.get(index); networkManageModel = new ClusterNetworkModel((Network) Cloner.clone(clusterNetwork)); } else { networkManageModel = new ClusterNetworkModel((Network) Cloner.clone(network)); } networkManageModel.setCluster((Cluster) Cloner.clone(getEntity())); networkList.add(networkManageModel); } Collections.sort(networkList, Comparator.comparing(ClusterNetworkModel::isManagement).reversed() .thenComparing(ClusterNetworkModel::getNetworkName, new LexoNumericComparator())); ClusterNetworkManageModel listModel = new ClusterNetworkManageModel(this); listModel.setItems(networkList); return listModel; } public void cancel() { setWindow(null); } @Override protected void entityChanging(Cluster newValue, Cluster oldValue) { getNewNetworkCommand().setIsExecutionAllowed(!isClusterDetached(newValue)); getManageCommand().setIsExecutionAllowed(!isClusterDetached(newValue)); } private boolean isClusterDetached(Cluster cluster) { return cluster == null || cluster.getStoragePoolId() == null; } @Override protected void onSelectedItemChanged() { super.onSelectedItemChanged(); updateActionAvailability(); } @Override protected void selectedItemsChanged() { super.selectedItemsChanged(); updateActionAvailability(); } private void updateActionAvailability() { Network network = getSelectedItem(); // CanRemove = SelectedItems != null && SelectedItems.Count > 0; getSetAsDisplayCommand().setIsExecutionAllowed(getSelectedItems() != null && getSelectedItems().size() == 1 && network != null && !network.getCluster().isDisplay() && network.getCluster().getStatus() != NetworkStatus.NON_OPERATIONAL); } public void newEntity() { if (getWindow() != null) { return; } final ClusterNewNetworkModel networkModel = new ClusterNewNetworkModel(this, getEntity()); setWindow(networkModel); // Set selected dc if (getEntity().getStoragePoolId() != null) { AsyncDataProvider.getInstance().getDataCenterById(networkModel.asyncQuery(dataCenter -> { networkModel.getDataCenters().setItems(Arrays.asList(dataCenter)); networkModel.getDataCenters().setSelectedItem(dataCenter); }), getEntity().getStoragePoolId()); } } @Override public void executeCommand(UICommand command) { super.executeCommand(command); if (command == getManageCommand()) { manage(); } else if (command == getSetAsDisplayCommand()) { setAsDisplay(); } else if ("New".equals(command.getName())) { //$NON-NLS-1$ newEntity(); } else if ("Cancel".equals(command.getName())) { //$NON-NLS-1$ cancel(); } } @Override protected String getListName() { return "ClusterNetworkListModel"; //$NON-NLS-1$ } }