package org.ovirt.engine.ui.uicommonweb.models.clusters;
import java.util.ArrayList;
import java.util.List;
import org.ovirt.engine.core.common.action.ManageNetworkClustersParameters;
import org.ovirt.engine.core.common.action.VdcActionType;
import org.ovirt.engine.core.common.businessentities.network.NetworkCluster;
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.SearchableListModel;
public class ClusterNetworkManageModel extends ListModel<ClusterNetworkModel> {
private final SearchableListModel<?, ?> sourceListModel;
private final UICommand okCommand;
private final UICommand cancelCommand;
private ClusterNetworkModel managementNetwork;
private ClusterNetworkModel glusterNetwork;
private ClusterNetworkModel defaultRouteNetwork;
private boolean needsAnyChange;
public ClusterNetworkManageModel(SearchableListModel<?, ?> sourceListModel) {
this.sourceListModel = sourceListModel;
cancelCommand = UICommand.createCancelUiCommand("Cancel", this); //$NON-NLS-1$
getCommands().add(cancelCommand);
okCommand = UICommand.createDefaultOkUiCommand("OnManage", this); //$NON-NLS-1$
getCommands().add(0, okCommand);
getItemsChangedEvent().addListener((ev, sender, args) -> {
for (ClusterNetworkModel model : getItems()) {
if (model.isManagement()) {
managementNetwork = model;
}
if (model.isGlusterNetwork()) {
glusterNetwork = model;
}
if (model.isDefaultRouteNetwork()) {
defaultRouteNetwork = model;
}
}
});
}
public boolean isMultiCluster() {
return false;
}
private ClusterNetworkModel getDisplayNetwork() {
if (!isMultiCluster()){
for (ClusterNetworkModel clusterNetworkManageModel : getItems()) {
if (clusterNetworkManageModel.isDisplayNetwork()) {
return clusterNetworkManageModel;
}
}
}
return null;
}
public void setDisplayNetwork(ClusterNetworkModel model, boolean value) {
if (!isMultiCluster()) {
if (value) {
// Reset the old display
if (getDisplayNetwork() != null) {
getDisplayNetwork().setDisplayNetwork(false);
}
} else {
// Set the management network as display
getManagementNetwork().setDisplayNetwork(true);
}
}
model.setDisplayNetwork(value);
}
private ClusterNetworkModel getMigrationNetwork() {
if (!isMultiCluster()) {
for (ClusterNetworkModel clusterNetworkManageModel : getItems()) {
if (clusterNetworkManageModel.isMigrationNetwork()) {
return clusterNetworkManageModel;
}
}
}
return null;
}
public void setMigrationNetwork(ClusterNetworkModel model, boolean value) {
if (!isMultiCluster()) {
if (value) {
// Reset the old migration
if (getMigrationNetwork() != null) {
getMigrationNetwork().setMigrationNetwork(false);
}
} else {
// Set the management network as migration
getManagementNetwork().setMigrationNetwork(true);
}
}
model.setMigrationNetwork(value);
}
private ClusterNetworkModel getManagementNetwork() {
return managementNetwork;
}
public void setManagementNetwork(ClusterNetworkModel model, boolean value) {
if (!isMultiCluster()) {
if (value) {
// Unset the old management network
if (getManagementNetwork() != null) {
getManagementNetwork().setManagement(false);
}
managementNetwork = model;
}
}
model.setManagement(value);
}
private ClusterNetworkModel getGlusterNetwork() {
return glusterNetwork;
}
public void setGlusterNetwork(ClusterNetworkModel model, boolean value) {
if (!isMultiCluster()) {
if (value) {
// Reset the old gluster network
if (getGlusterNetwork() != null) {
getGlusterNetwork().setGlusterNetwork(false);
}
glusterNetwork = model;
}
}
model.setGlusterNetwork(value);
}
public ClusterNetworkModel getDefaultRouteNetwork() {
return defaultRouteNetwork;
}
public void setDefaultRouteNetwork(ClusterNetworkModel model, boolean value) {
if (!isMultiCluster()) {
if (value) {
// Reset the old default route network
ClusterNetworkModel defaultRouteNetwork = getDefaultRouteNetwork();
if (defaultRouteNetwork != null) {
defaultRouteNetwork.setDefaultRouteNetwork(false);
}
this.defaultRouteNetwork = model;
}
}
model.setDefaultRouteNetwork(value);
}
private void onManage() {
Iterable<ClusterNetworkModel> manageList = getItems();
final List<NetworkCluster> toAttach = new ArrayList<>();
final List<NetworkCluster> toDetach = new ArrayList<>();
final List<NetworkCluster> toUpdate = new ArrayList<>();
for (ClusterNetworkModel manageModel : manageList) {
NetworkCluster networkCluster = manageModel.getOriginalNetworkCluster();
boolean wasAttached = networkCluster != null;
boolean needsAttach = manageModel.isAttached() && !wasAttached;
boolean needsDetach = !manageModel.isAttached() && wasAttached;
boolean needsUpdate = false;
// Attachment wasn't changed- check if needs update
if (wasAttached && !needsDetach) {
if ((manageModel.isRequired() != networkCluster.isRequired())
|| manageModel.isDisplayNetwork() != networkCluster.isDisplay()
|| manageModel.isMigrationNetwork() != networkCluster.isMigration()
|| manageModel.isManagement() != networkCluster.isManagement()
|| manageModel.isDefaultRouteNetwork() != networkCluster.isDefaultRoute()
|| manageModel.isGlusterNetwork() != networkCluster.isGluster()) {
needsUpdate = true;
copyRoles(manageModel, networkCluster);
}
}
if (needsAttach) {
toAttach.add(createNetworkCluster(manageModel));
}
if (needsDetach) {
toDetach.add(networkCluster);
}
if (needsUpdate) {
toUpdate.add(networkCluster);
}
}
startProgress();
needsAnyChange = !(toAttach.isEmpty() && toDetach.isEmpty() && toUpdate.isEmpty());
if (needsAnyChange) {
Frontend.getInstance()
.runAction(VdcActionType.ManageNetworkClusters,
new ManageNetworkClustersParameters(toAttach, toDetach, toUpdate),
result -> {
needsAnyChange = false;
doFinish();
});
}
doFinish();
}
private void copyRoles(ClusterNetworkModel manageModel, NetworkCluster networkCluster) {
networkCluster.setRequired(manageModel.isRequired());
networkCluster.setDisplay(manageModel.isDisplayNetwork());
networkCluster.setMigration(manageModel.isMigrationNetwork());
networkCluster.setManagement(manageModel.isManagement());
networkCluster.setDefaultRoute(manageModel.isDefaultRouteNetwork());
networkCluster.setGluster(manageModel.isGlusterNetwork());
}
private NetworkCluster createNetworkCluster(ClusterNetworkModel manageModel) {
final NetworkCluster networkCluster = new NetworkCluster();
networkCluster.setClusterId(manageModel.getCluster().getId());
networkCluster.setNetworkId(manageModel.getEntity().getId());
copyRoles(manageModel, networkCluster);
return networkCluster;
}
private void doFinish() {
if (needsAnyChange) {
return;
}
stopProgress();
cancel();
sourceListModel.forceRefresh();
}
private void cancel() {
sourceListModel.setWindow(null);
}
@Override
public void executeCommand(UICommand command) {
super.executeCommand(command);
if (command == okCommand) {
onManage();
} else if (command == cancelCommand) {
cancel();
}
}
}