package org.ovirt.engine.ui.uicommonweb.models.networks;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Comparator;
import java.util.List;
import org.ovirt.engine.core.common.VdcActionUtils;
import org.ovirt.engine.core.common.action.VdcActionType;
import org.ovirt.engine.core.common.businessentities.VM;
import org.ovirt.engine.core.common.businessentities.VMStatus;
import org.ovirt.engine.core.common.businessentities.network.NetworkView;
import org.ovirt.engine.core.common.businessentities.network.VmNetworkInterface;
import org.ovirt.engine.core.common.mode.ApplicationMode;
import org.ovirt.engine.core.common.queries.GetVmsAndNetworkInterfacesByNetworkIdParameters;
import org.ovirt.engine.core.common.queries.VdcQueryReturnValue;
import org.ovirt.engine.core.common.queries.VdcQueryType;
import org.ovirt.engine.core.common.utils.PairQueryable;
import org.ovirt.engine.ui.frontend.Frontend;
import org.ovirt.engine.ui.uicommonweb.UICommand;
import org.ovirt.engine.ui.uicommonweb.help.HelpTag;
import org.ovirt.engine.ui.uicommonweb.models.SearchableListModel;
import org.ovirt.engine.ui.uicommonweb.models.vms.RemoveVmInterfaceModel;
import org.ovirt.engine.ui.uicompat.ConstantsManager;
import org.ovirt.engine.ui.uicompat.PropertyChangedEventArgs;
public class NetworkVmListModel extends SearchableListModel<NetworkView, PairQueryable<VmNetworkInterface, VM>> {
private UICommand removeCommand;
private NetworkVmFilter viewFilterType;
public NetworkVmListModel() {
setTitle(ConstantsManager.getInstance().getConstants().virtualMachinesTitle());
setHelpTag(HelpTag.virtual_machines);
setHashName("virtual_machines"); //$NON-NLS-1$
setAvailableInModes(ApplicationMode.VirtOnly);
setComparator(
Comparator.comparing((PairQueryable<VmNetworkInterface, VM> p) -> p.getSecond().getClusterName())
.thenComparing(p -> p.getSecond().getName()));
setRemoveCommand(new UICommand("Remove", this)); //$NON-NLS-1$
updateActionAvailability();
}
public NetworkVmFilter getViewFilterType() {
return viewFilterType;
}
public void setViewFilterType(NetworkVmFilter viewFilterType) {
this.viewFilterType = viewFilterType;
search();
}
@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;
}
GetVmsAndNetworkInterfacesByNetworkIdParameters params =
new GetVmsAndNetworkInterfacesByNetworkIdParameters(getEntity().getId(),
NetworkVmFilter.running.equals(getViewFilterType()));
params.setRefresh(getIsQueryFirstTime());
final NetworkVmFilter filter = getViewFilterType();
Frontend.getInstance().runQuery(VdcQueryType.GetVmsAndNetworkInterfacesByNetworkId,
params,
new AsyncQuery<VdcQueryReturnValue>(returnValue -> {
if (filter.equals(getViewFilterType())) {
setItems((Collection<PairQueryable<VmNetworkInterface, VM>>) returnValue.getReturnValue());
}
}));
}
@Override
protected void entityPropertyChanged(Object sender, PropertyChangedEventArgs e) {
super.entityPropertyChanged(sender, e);
if (e.propertyName.equals("name")) { //$NON-NLS-1$ {
getSearchCommand().execute();
}
}
private void updateActionAvailability() {
ArrayList<VM> vms = new ArrayList<>();
Iterable<PairQueryable<VmNetworkInterface, VM>> selectedItems =
getSelectedItems() != null ? getSelectedItems() : new ArrayList();
for (PairQueryable<VmNetworkInterface, VM> item : selectedItems) {
vms.add(item.getSecond());
}
getRemoveCommand().setIsExecutionAllowed(VdcActionUtils.canExecute(vms,
VM.class,
VdcActionType.RemoveVmInterface) && getSelectedItems() != null && !getSelectedItems().isEmpty()
&& canRemoveVnics());
}
private boolean canRemoveVnics() {
Iterable<PairQueryable<VmNetworkInterface, VM>> selectedItems =
getSelectedItems() != null ? getSelectedItems() : new ArrayList();
for (PairQueryable<VmNetworkInterface, VM> pair : selectedItems) {
if (pair.getFirst().isPlugged()
&& !VMStatus.Down.equals(pair.getSecond().getStatus())) {
return false;
}
}
return true;
}
@Override
protected void onSelectedItemChanged() {
super.onSelectedItemChanged();
updateActionAvailability();
}
@Override
protected void selectedItemsChanged() {
super.selectedItemsChanged();
updateActionAvailability();
}
private void remove() {
if (getWindow() != null) {
return;
}
List<VmNetworkInterface> vnics = new ArrayList<>();
for (Object item : getSelectedItems()) {
PairQueryable<VmNetworkInterface, VM> pair = (PairQueryable<VmNetworkInterface, VM>) item;
vnics.add(pair.getFirst());
}
RemoveVmInterfaceModel model = new RemoveVmInterfaceModel(this, vnics, true);
setWindow(model);
}
@Override
public void executeCommand(UICommand command) {
super.executeCommand(command);
if (command == getRemoveCommand()) {
remove();
}
}
public UICommand getRemoveCommand() {
return removeCommand;
}
private void setRemoveCommand(UICommand value) {
removeCommand = value;
}
@Override
protected String getListName() {
return "NetworkVmListModel"; //$NON-NLS-1$
}
}