package org.ovirt.engine.ui.uicommonweb.models.datacenters;
import java.util.ArrayList;
import java.util.List;
import org.ovirt.engine.core.common.action.AddExternalSubnetParameters;
import org.ovirt.engine.core.common.action.AddNetworkStoragePoolParameters;
import org.ovirt.engine.core.common.action.ManageNetworkClustersParameters;
import org.ovirt.engine.core.common.action.VdcActionType;
import org.ovirt.engine.core.common.action.VdcReturnValueBase;
import org.ovirt.engine.core.common.businessentities.Cluster;
import org.ovirt.engine.core.common.businessentities.Provider;
import org.ovirt.engine.core.common.businessentities.network.Network;
import org.ovirt.engine.core.common.businessentities.network.NetworkCluster;
import org.ovirt.engine.core.common.businessentities.network.ProviderNetwork;
import org.ovirt.engine.core.common.mode.ApplicationMode;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.ui.frontend.Frontend;
import org.ovirt.engine.ui.uicommonweb.Linq;
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.ListModel;
import org.ovirt.engine.ui.uicompat.ConstantsManager;
import org.ovirt.engine.ui.uicompat.IFrontendActionAsyncCallback;
public class NewNetworkModel extends NetworkModel {
private ListModel<NetworkClusterModel> privateNetworkClusterList;
public NewNetworkModel(ListModel sourceListModel) {
super(sourceListModel);
setNetworkClusterList(new ListModel());
init();
}
public ListModel<NetworkClusterModel> getNetworkClusterList() {
return privateNetworkClusterList;
}
public void setNetworkClusterList(ListModel<NetworkClusterModel> value) {
privateNetworkClusterList = value;
}
private void init() {
setTitle(ConstantsManager.getInstance().getConstants().newLogicalNetworkTitle());
setHelpTag(HelpTag.new_logical_network);
setHashName("new_logical_network"); //$NON-NLS-1$
initMtu();
}
@Override
public void syncWithBackend() {
super.syncWithBackend();
// Get dc- cluster list
AsyncDataProvider.getInstance().getClusterList(new AsyncQuery<>(
clusters -> onGetClusterList(clusters)), getSelectedDc().getId());
}
protected void onGetClusterList(List<Cluster> clusterList) {
// Cluster list
List<NetworkClusterModel> items = new ArrayList<>();
for (Cluster cluster : clusterList) {
items.add(createNetworkClusterModel(cluster));
}
getNetworkClusterList().setItems(items);
}
protected NetworkClusterModel createNetworkClusterModel(Cluster cluster) {
NetworkClusterModel networkClusterModel = new NetworkClusterModel(cluster);
networkClusterModel.setAttached(true);
networkClusterModel.setRequired(!getExport().getEntity());
return networkClusterModel;
}
@Override
protected void initMtu() {
getMtuSelector().setSelectedItem(MtuSelector.defaultMtu);
getMtu().setEntity(null);
}
@Override
protected void initIsVm() {
getIsVmNetwork().setEntity(ApplicationModeHelper.isModeSupported(ApplicationMode.VirtOnly));
}
@Override
protected void selectExternalProvider() {
getExternalProviders().setSelectedItem(Linq.firstOrNull(getExternalProviders().getItems()));
}
@Override
protected void onExportChanged() {
boolean externalNetwork = getExport().getEntity();
getExternalProviders().setIsChangeable(externalNetwork);
getIsVmNetwork().setIsChangeable(!externalNetwork && isSupportBridgesReportByVDSM()
&& ApplicationModeHelper.isModeSupported(ApplicationMode.VirtOnly));
if (externalNetwork) {
getIsVmNetwork().setEntity(true);
}
Iterable<NetworkClusterModel> networkClusters = getNetworkClusterList().getItems();
if (networkClusters != null) {
for (NetworkClusterModel networkCluster : networkClusters) {
networkCluster.setIsChangeable(true);
networkCluster.setAttached(true);
networkCluster.setRequired(!externalNetwork);
}
}
super.onExportChanged();
}
@Override
protected void executeSave() {
final AddNetworkStoragePoolParameters parameters =
new AddNetworkStoragePoolParameters(getSelectedDc().getId(), getNetwork());
parameters.setVnicProfileRequired(false);
// New network
if (getExport().getEntity()) {
Provider<?> externalProvider = getExternalProviders().getSelectedItem();
ProviderNetwork providerNetwork = new ProviderNetwork();
providerNetwork.setProviderId(externalProvider.getId());
getNetwork().setProvidedBy(providerNetwork);
Frontend.getInstance().runAction(VdcActionType.AddNetworkOnProvider,
parameters, addNetworkOnProviderCallback(), null);
} else {
Frontend.getInstance().runAction(VdcActionType.AddNetwork,
parameters, addNetworkCallback(), null);
}
}
private IFrontendActionAsyncCallback addNetworkCallback() {
return result -> postAddNetwork(result.getReturnValue());
}
private IFrontendActionAsyncCallback addNetworkOnProviderCallback() {
return result -> postAddNetworkOnProvider(result.getReturnValue());
}
private void postAddNetwork(VdcReturnValueBase retVal) {
if (isActionSucceeded(retVal)) {
postSaveAction((Guid) retVal.getActionReturnValue(), null);
} else {
failedPostSaveAction();
}
}
private void postAddNetworkOnProvider(VdcReturnValueBase retVal) {
if (isActionSucceeded(retVal)) {
Network network = (Network) retVal.getActionReturnValue();
postSaveAction(network.getId(), network.getProvidedBy());
} else {
failedPostSaveAction();
}
}
private boolean isActionSucceeded(VdcReturnValueBase retVal) {
return retVal != null && retVal.getSucceeded();
}
private void failedPostSaveAction() {
super.postSaveAction(null, false);
}
private void postSaveAction(Guid id, ProviderNetwork providedBy) {
super.postSaveAction(id, true);
attachNetworkToClusters(id);
if (getExport().getEntity() && getCreateSubnet().getEntity() && providedBy != null) {
getSubnetModel().setExternalNetwork(providedBy);
getSubnetModel().flush();
Frontend.getInstance().runAction(VdcActionType.AddSubnetToProvider,
new AddExternalSubnetParameters(getSubnetModel().getSubnet(), providedBy.getProviderId(), providedBy.getExternalId()));
}
}
private void attachNetworkToClusters(Guid networkGuid) {
final Guid networkId = getNetwork().getId() == null ? networkGuid : getNetwork().getId();
final List<NetworkCluster> networkAttachments = new ArrayList<>();
for (NetworkClusterModel networkClusterModel : getClustersToAttach()) {
// Init default NetworkCluster values (required, display, status)
NetworkCluster networkCluster = new NetworkCluster();
networkCluster.setNetworkId(networkId);
networkCluster.setClusterId(networkClusterModel.getEntity().getId());
networkCluster.setRequired(networkClusterModel.isRequired());
networkAttachments.add(networkCluster);
}
if (!networkAttachments.isEmpty()) {
Frontend.getInstance().runAction(
VdcActionType.ManageNetworkClusters,
new ManageNetworkClustersParameters(networkAttachments));
}
}
@Override
protected boolean isManagement() {
return false;
}
public ArrayList<NetworkClusterModel> getClustersToAttach() {
ArrayList<NetworkClusterModel> clusterToAttach = new ArrayList<>();
for (NetworkClusterModel networkClusterModel : getNetworkClusterList().getItems()) {
if (networkClusterModel.isAttached()) {
clusterToAttach.add(networkClusterModel);
}
}
return clusterToAttach;
}
}