Moti Asayag has uploaded a new change for review. Change subject: engine: Update network on hosts when label is changed ......................................................................
engine: Update network on hosts when label is changed When the network's label is being modifies, the change to the label should be reflected to the labeled hosts. There are 4 options in this regards: 1. Labeling a network - will add the network to any of labeled hosts which the network is assigned to their cluster. 2. Unlabeling a network - will remove the network from any of labeled hosts that the network is assigned to their cluster. 3. Changing the label - the network will be removed from all of the labelled hosts (by the previous label) and will be attached to all of the labelled host (according to the new label). 4. Label unchanged - only sync action will apply to hosts that the network is configured on. Change-Id: Id8b851d589db8ad6ef025d3b752c9596aa30aee2 Bug-Url: https://bugzilla.redhat.com/1040586 Signed-off-by: Moti Asayag <[email protected]> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/dc/UpdateNetworkCommand.java 1 file changed, 127 insertions(+), 5 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/72/22772/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/dc/UpdateNetworkCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/dc/UpdateNetworkCommand.java index 54dee99..066cfa4 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/dc/UpdateNetworkCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/dc/UpdateNetworkCommand.java @@ -1,9 +1,12 @@ package org.ovirt.engine.core.bll.network.dc; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; +import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.Set; @@ -12,7 +15,9 @@ import org.ovirt.engine.core.bll.NonTransactiveCommandAttribute; import org.ovirt.engine.core.bll.RenamedEntityInfoProvider; import org.ovirt.engine.core.bll.ValidationResult; +import org.ovirt.engine.core.bll.network.AddNetworkParametersBuilder; import org.ovirt.engine.core.bll.network.NetworkParametersBuilder; +import org.ovirt.engine.core.bll.network.RemoveNetworkParametersBuilder; import org.ovirt.engine.core.bll.network.cluster.NetworkClusterHelper; import org.ovirt.engine.core.bll.network.cluster.NetworkHelper; import org.ovirt.engine.core.bll.validator.NetworkValidator; @@ -76,7 +81,7 @@ private void applyNetworkChangesToHosts() { SyncNetworkParametersBuilder builder = new SyncNetworkParametersBuilder(); - ArrayList<VdcActionParametersBase> parameters = builder.buildParameters(getNetwork()); + ArrayList<VdcActionParametersBase> parameters = builder.buildParameters(getNetwork(), getOldNetwork()); if (!parameters.isEmpty()) { getBackend().runInternalMultipleActions(VdcActionType.PersistentSetupNetworks, parameters); @@ -266,12 +271,131 @@ } + private boolean labelChanged() { + return !Objects.equals(getNetwork().getLabel(), getOldNetwork().getLabel()); + } + + private boolean labelAdded() { + return getOldNetwork().getLabel() == null && getNetwork().getLabel() != null; + } + + private boolean labelRemoved() { + return getOldNetwork().getLabel() != null && getNetwork().getLabel() == null; + } + private class SyncNetworkParametersBuilder extends NetworkParametersBuilder{ - private ArrayList<VdcActionParametersBase> buildParameters(Network network) { + private ArrayList<VdcActionParametersBase> buildParameters(Network network, Network oldNetwork) { ArrayList<VdcActionParametersBase> parameters = new ArrayList<>(); List<VdsNetworkInterface> nics = - getDbFacade().getInterfaceDao().getVdsInterfacesByNetworkId(getNetwork().getId()); + getDbFacade().getInterfaceDao().getVdsInterfacesByNetworkId(network.getId()); + + // sync network on nics if the label wasn't changed + if (!labelChanged()) { + createSyncNetworkParameters(parameters, nics); + return parameters; + } + + // add network to labeled interfaces and sync network on the rest + if (labelAdded()) { + List<VdsNetworkInterface> labeledNics = getLabeledNics(network); + Map<Guid, VdsNetworkInterface> hostToNic = mapHostToNic(nics); + List<VdsNetworkInterface> nicsForAdd = new ArrayList<>(); + Set<VdsNetworkInterface> nicsForSync = new HashSet<>(); + + // nics to add network + for (VdsNetworkInterface labeledNic : labeledNics) { + VdsNetworkInterface nic = hostToNic.get(labeledNic.getVdsId()); + + // add network to labeled nic if network not configured on host + if (nic == null) { + nicsForAdd.add(labeledNic); + } else { + // sync the network + nicsForSync.add(nic); + } + } + + // add the unlabeled nics to be synced + for (VdsNetworkInterface nic : nics) { + if (!nicsForSync.contains(nic)) { + nicsForSync.add(nic); + } + } + + parameters.addAll(createAddNetworkParameters(nicsForAdd)); + createSyncNetworkParameters(parameters, nicsForSync); + return parameters; + } + + // remove network from labeled interfaces + if (labelRemoved()) { + List<VdsNetworkInterface> labeledNics = getLabeledNics(oldNetwork); + Map<Guid, VdsNetworkInterface> hostToNic = mapHostToNic(nics); + List<VdsNetworkInterface> nicsForRemove = new ArrayList<>(); + Set<VdsNetworkInterface> nicsForSync = new HashSet<>(); + + // nics to remove the network from + for (VdsNetworkInterface labeledNic : labeledNics) { + VdsNetworkInterface nic = hostToNic.get(labeledNic.getVdsId()); + + // sync the network if not labeled + if (nic == null) { + nicsForSync.add(nic); + } else { + // remove the network from labeled nic + nicsForRemove.add(labeledNic); + } + } + + // add the unlabeled nics to be synced + for (VdsNetworkInterface nic : nics) { + if (!nicsForSync.contains(nic)) { + nicsForSync.add(nic); + } + } + + parameters.addAll(createRemoveNetworkParameters(nicsForRemove)); + createSyncNetworkParameters(parameters, nicsForSync); + return parameters; + } + + // label is renamed therefore should be removed from all labeled nics and attached to nics with new label + // TODO: support this case... + + return parameters; + } + + private ArrayList<VdcActionParametersBase> createAddNetworkParameters(List<VdsNetworkInterface> nicsForAdd) { + AddNetworkParametersBuilder builder = new AddNetworkParametersBuilder(getNetwork()); + return builder.buildParameters(nicsForAdd); + } + + private ArrayList<VdcActionParametersBase> createRemoveNetworkParameters(List<VdsNetworkInterface> nicsForRemove) { + RemoveNetworkParametersBuilder builder = new RemoveNetworkParametersBuilder(getOldNetwork()); + return builder.buildParameters(nicsForRemove); + } + + private Map<Guid, VdsNetworkInterface> mapHostToNic(List<VdsNetworkInterface> nics) { + Map<Guid, VdsNetworkInterface> hostToNic = new HashMap<>(nics.size()); + for (VdsNetworkInterface nic : nics) { + hostToNic.put(nic.getVdsId(), nic); + } + return hostToNic; + } + + private List<VdsNetworkInterface> getLabeledNics(Network network) { + List<NetworkCluster> clusters = getNetworkClusterDAO().getAllForNetwork(network.getId()); + List<VdsNetworkInterface> labeledNics = new ArrayList<>(); + for (NetworkCluster networkCluster : clusters) { + labeledNics.addAll(getDbFacade().getInterfaceDao() + .getAllInterfacesByLabelForCluster(networkCluster.getClusterId(), network.getLabel())); + } + return labeledNics; + } + + private void createSyncNetworkParameters(ArrayList<VdcActionParametersBase> parameters, + Collection<VdsNetworkInterface> nics) { Set<Guid> hostIdsToSync = new HashSet<>(); for (VdsNetworkInterface nic : nics) { @@ -285,8 +409,6 @@ setupNetworkParams.setNetworksToSync(Collections.singletonList(getNetworkName())); parameters.add(setupNetworkParams); } - - return parameters; } } } -- To view, visit http://gerrit.ovirt.org/22772 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Id8b851d589db8ad6ef025d3b752c9596aa30aee2 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Moti Asayag <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
