package org.ovirt.engine.ui.uicommonweb.models.datacenters;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import org.ovirt.engine.core.common.action.AddIscsiBondParameters;
import org.ovirt.engine.core.common.action.EditIscsiBondParameters;
import org.ovirt.engine.core.common.action.VdcActionType;
import org.ovirt.engine.core.common.businessentities.IscsiBond;
import org.ovirt.engine.core.common.businessentities.StoragePool;
import org.ovirt.engine.core.common.businessentities.StorageServerConnections;
import org.ovirt.engine.core.common.businessentities.network.Network;
import org.ovirt.engine.core.common.businessentities.storage.StorageType;
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.dataprovider.AsyncDataProvider;
import org.ovirt.engine.ui.uicommonweb.models.EntityModel;
import org.ovirt.engine.ui.uicommonweb.models.ListModel;
import org.ovirt.engine.ui.uicommonweb.models.Model;
import org.ovirt.engine.ui.uicommonweb.validation.I18NNameValidation;
import org.ovirt.engine.ui.uicommonweb.validation.IValidation;
import org.ovirt.engine.ui.uicommonweb.validation.LengthValidation;
import org.ovirt.engine.ui.uicommonweb.validation.NotEmptyValidation;
import org.ovirt.engine.ui.uicommonweb.validation.SpecialAsciiI18NOrNoneValidation;
import org.ovirt.engine.ui.uicompat.ConstantsManager;
import org.ovirt.engine.ui.uicompat.UIConstants;
public class IscsiBondModel extends Model {
private static final UIConstants constants = ConstantsManager.getInstance().getConstants();
private EntityModel<String> name;
private EntityModel<String> description;
private ListModel<Network> networks;
private ListModel<StorageServerConnections> storageTargets;
private IscsiBond iscsiBond;
private StoragePool storagePool;
private UICommand cancelCommand;
public IscsiBondModel() {
setName(new EntityModel<String>());
setDescription(new EntityModel<String>());
setNetworks(new ListModel<Network>());
setStorageTargets(new ListModel<StorageServerConnections>());
createSaveButon();
}
@Override
public void initialize() {
if (getIscsiBond() != null) {
getName().setEntity(getIscsiBond().getName());
getDescription().setEntity(getIscsiBond().getDescription());
}
initializeNetworkList();
initializeStorageTargetsList();
}
private void initializeNetworkList() {
AsyncDataProvider.getInstance().getAllDataCenterNetworks(new AsyncQuery<>(networks -> {
List<Network> selected = new ArrayList<>();
Set<Guid> iscsiBonded = isBondExist() ?
new HashSet<>(getIscsiBond().getNetworkIds()) : Collections.<Guid>emptySet();
for (Network network : networks) {
if (iscsiBonded.contains(network.getId())) {
selected.add(network);
}
}
getNetworks().setItems(networks);
getNetworks().setSelectedItems(selected);
}), getStoragePool().getId());
}
private void initializeStorageTargetsList() {
AsyncDataProvider.getInstance().getStorageConnectionsByDataCenterIdAndStorageType(new AsyncQuery<>(conns -> {
ArrayList<StorageServerConnections> selected = new ArrayList<>();
Set<String> iscsiBonded = isBondExist() ?
new HashSet<>(getIscsiBond().getStorageConnectionIds()) : Collections.<String>emptySet();
for (StorageServerConnections conn : conns) {
if (iscsiBonded.contains(conn.getId())) {
selected.add(conn);
}
}
getStorageTargets().setItems(conns);
getStorageTargets().setSelectedItems(selected);
}), getStoragePool().getId(), StorageType.ISCSI);
}
@Override
public void executeCommand(UICommand command) {
super.executeCommand(command);
if ("OnSave".equalsIgnoreCase(command.getName())) { //$NON-NLS-1$
onSave();
}
}
private void createSaveButon() {
UICommand onSaveCommand = new UICommand("OnSave", this); //$NON-NLS-1$
onSaveCommand.setTitle(constants.ok());
onSaveCommand.setIsDefault(true);
getCommands().add(onSaveCommand);
}
private void onSave() {
if (!validate()) {
return;
}
if (isBondExist()) {
updateBond();
} else {
addBond();
}
}
private boolean isBondExist() {
return getIscsiBond() != null;
}
private void addBond() {
AddIscsiBondParameters params = new AddIscsiBondParameters(createIscsiBond());
startProgress();
Frontend.getInstance().runAction(VdcActionType.AddIscsiBond, params, result -> {
IscsiBondModel model = (IscsiBondModel) result.getState();
model.stopProgress();
model.cancel();
}, this);
}
private void updateBond() {
IscsiBond newIscsiBond = createIscsiBond();
newIscsiBond.setId(getIscsiBond().getId());
EditIscsiBondParameters params = new EditIscsiBondParameters(newIscsiBond);
startProgress();
Frontend.getInstance().runAction(VdcActionType.EditIscsiBond, params, result -> {
IscsiBondModel model = (IscsiBondModel) result.getState();
model.stopProgress();
model.cancel();
}, this);
}
private List<Guid> getSelectedNetworks() {
List<Guid> selectedNetworks = new LinkedList<>();
for (Network model : getNetworks().getSelectedItems()) {
selectedNetworks.add(model.getId());
}
return selectedNetworks;
}
private List<String> getSelectedConnections() {
List<String> selectedConnections = new ArrayList<>();
for (StorageServerConnections conn : getStorageTargets().getSelectedItems()) {
selectedConnections.add(conn.getId());
}
return selectedConnections;
}
private boolean validate() {
getName().validateEntity(new IValidation[] { new NotEmptyValidation(), new I18NNameValidation(), new LengthValidation(50) });
getDescription().validateEntity(new IValidation[] { new SpecialAsciiI18NOrNoneValidation(), new LengthValidation(4000) });
if (getNetworks().getSelectedItems() == null || getNetworks().getSelectedItems().isEmpty()) {
getInvalidityReasons().add(constants.noNetworksSelected());
setIsValid(false);
} else {
setIsValid(true);
}
return getName().getIsValid() && getDescription().getIsValid() && getIsValid();
}
public EntityModel<String> getName() {
return name;
}
public void setName(EntityModel<String> name) {
this.name = name;
}
public EntityModel<String> getDescription() {
return description;
}
public void setDescription(EntityModel<String> description) {
this.description = description;
}
public ListModel<Network> getNetworks() {
return networks;
}
public void setNetworks(ListModel<Network> networks) {
this.networks = networks;
}
public ListModel<StorageServerConnections> getStorageTargets() {
return storageTargets;
}
public void setStorageTargets(ListModel<StorageServerConnections> storageTargets) {
this.storageTargets = storageTargets;
}
public StoragePool getStoragePool() {
return storagePool;
}
public void setStoragePool(StoragePool sp) {
storagePool = sp;
}
public UICommand getCancelCommand() {
return cancelCommand;
}
public void setCancelCommand(UICommand cancelCommand) {
this.cancelCommand = cancelCommand;
getCommands().add(cancelCommand);
}
public IscsiBond getIscsiBond() {
return iscsiBond;
}
public void setIscsiBond(IscsiBond iscsiBond) {
this.iscsiBond = iscsiBond;
}
protected void cancel() {
getCancelCommand().execute();
}
private IscsiBond createIscsiBond() {
IscsiBond newIscsiBond = new IscsiBond();
newIscsiBond.setStoragePoolId(getStoragePool().getId());
newIscsiBond.setName(getName().getEntity());
newIscsiBond.setDescription(getDescription().getEntity());
newIscsiBond.setNetworkIds(getSelectedNetworks());
newIscsiBond.setStorageConnectionIds(getSelectedConnections());
return newIscsiBond;
}
}