Moti Asayag has uploaded a new change for review. Change subject: engine: Edit Network and apply to hosts at once ......................................................................
engine: Edit Network and apply to hosts at once Editing a network and applying its changes to all of the eligible hosts via a single action is enabled. Two scenarios are supported: 1. Sync-ing the network on the hosts (if the network wasn't renamed) 2. Recreating the network on the hosts (if the network was renamed) See: http://www.ovirt.org/Features/EditProvisionedNetwork Change-Id: Iec04c7fb0c29ba6f61b7d788a9c3917f5d46554e Signed-off-by: Moti Asayag <[email protected]> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/dc/UpdateNetworkCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/NetworkValidator.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/AddNetworkStoragePoolParameters.java 3 files changed, 179 insertions(+), 6 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/53/22053/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 0ae2b94..0373457 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,21 +1,37 @@ package org.ovirt.engine.core.bll.network.dc; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; import java.util.List; import java.util.Objects; +import java.util.Set; import org.apache.commons.lang.ObjectUtils; +import org.apache.commons.lang.StringUtils; 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.NetworkConfigurator; import org.ovirt.engine.core.bll.network.cluster.NetworkClusterHelper; import org.ovirt.engine.core.bll.validator.NetworkValidator; import org.ovirt.engine.core.common.AuditLogType; import org.ovirt.engine.core.common.VdcObjectType; import org.ovirt.engine.core.common.action.AddNetworkStoragePoolParameters; +import org.ovirt.engine.core.common.action.SetupNetworksParameters; +import org.ovirt.engine.core.common.action.VdcActionParametersBase; +import org.ovirt.engine.core.common.action.VdcActionType; +import org.ovirt.engine.core.common.businessentities.ActionVersionMap; +import org.ovirt.engine.core.common.businessentities.VDS; +import org.ovirt.engine.core.common.businessentities.VM; +import org.ovirt.engine.core.common.businessentities.VMStatus; 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.VdsNetworkInterface; import org.ovirt.engine.core.common.errors.VdcBllMessages; import org.ovirt.engine.core.common.validation.group.UpdateEntity; +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.compat.Version; import org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogableBase; import org.ovirt.engine.core.utils.NetworkUtils; import org.ovirt.engine.core.utils.transaction.TransactionMethod; @@ -49,7 +65,25 @@ } }); + if (getParameters().configureHosts() && !getNetwork().isExternal()) { + applyNetworkChangesToHosts(); + } + setSucceeded(true); + } + + private void applyNetworkChangesToHosts() { + SetupNetworksParametersBuilder builder; + if (StringUtils.equals(getNetworkName(), getOldNetwork().getName())) { + builder = new SyncNetworkParametersBuilder(); + } else { + builder = new RenameNetworkParametersBuilder(); + } + + builder.buildParameters(getNetwork()); + if (!builder.getParameters().isEmpty()) { + getBackend().runInternalMultipleActions(VdcActionType.PersistentSetupNetworks, builder.getParameters()); + } } private boolean networkChangedToNonVmNetwork() { @@ -64,7 +98,7 @@ @Override protected boolean canDoAction() { - if (onlyPermittedFieldsChanged()) { + if (onlyPermittedFieldsChanged() && !getParameters().configureHosts()) { return true; } @@ -79,8 +113,9 @@ && validate(validatorOld.networkIsSet()) && validate(validatorOld.notRenamingManagementNetwork(getNetwork())) && validate(validatorNew.networkNameNotUsed()) - && validate(validatorOld.networkNotUsedByVms()) - && validate(validatorOld.networkNotUsedByTemplates()) + && validate(validatorOld.networkNotUsedByRunningVms()) + && validate(validatorOld.nonVmNetworkNotUsedByVms(getNetwork())) + && validate(validatorOld.nonVmNetworkNotUsedByTemplates(getNetwork())) && (oldAndNewNetworkIsNotExternal() || validate(validatorOld.externalNetworkDetailsUnchanged(getNetwork()))); } @@ -135,6 +170,41 @@ super(network); } + public ValidationResult nonVmNetworkNotUsedByVms(Network updatedNetwork) { + if (networkChangedToNonVmNetwork(updatedNetwork)) { + networkNotUsed(getVms(), VdcBllMessages.VAR__ENTITIES__VMS); + } + + return ValidationResult.VALID; + } + + private boolean networkChangedToNonVmNetwork(Network updatedNetwork) { + return network.isVmNetwork() && !updatedNetwork.isVmNetwork(); + } + + /** + * @return An error iff the network is in use by any VMs. + */ + public ValidationResult networkNotUsedByRunningVms() { + List<VM> runningVms = new ArrayList<>(); + + for (VM vm : getVms()) { + if (vm.getStatus() != VMStatus.Down) { + runningVms.add(vm); + } + } + + return networkNotUsed(runningVms, VdcBllMessages.VAR__ENTITIES__VMS); + } + + public ValidationResult nonVmNetworkNotUsedByTemplates(Network updatedNetwork) { + if (networkChangedToNonVmNetwork(updatedNetwork)) { + networkNotUsed(getTemplates(), VdcBllMessages.VAR__ENTITIES__VMS); + } + + return ValidationResult.VALID; + } + public ValidationResult notRenamingManagementNetwork(Network newNetwork) { String managementNetwork = NetworkUtils.getEngineNetwork(); return network.getName().equals(managementNetwork) && @@ -182,4 +252,84 @@ public void setEntityId(AuditLogableBase logable) { } + + private abstract class SetupNetworksParametersBuilder { + private ArrayList<VdcActionParametersBase> parameters = new ArrayList<>(); + + protected abstract void buildParameters(Network network); + + protected boolean setupNetworkSupported(VDS host) { + ActionVersionMap actionVersions = + getDbFacade().getActionGroupDao().getActionVersionMapByActionType(VdcActionType.SetupNetworks); + + return host.getVdsGroupCompatibilityVersion() + .compareTo(new Version(actionVersions.getcluster_minimal_version())) >= 0; + } + + protected SetupNetworksParameters createSetupNetworksParameters(VDS host) { + NetworkConfigurator configurator = new NetworkConfigurator(host); + List<VdsNetworkInterface> nics = configurator.filterBondsWithoutSlaves(getHostNics(host)); + SetupNetworksParameters parameters = configurator.createSetupNetworkParams(nics); + parameters.setShouldBeLogged(true); + return parameters; + } + + protected List<VdsNetworkInterface> getHostNics(VDS host) { + return getDbFacade().getInterfaceDao().getAllInterfacesForVds(host.getId()); + } + + public ArrayList<VdcActionParametersBase> getParameters() { + return parameters; + } + } + + private class SyncNetworkParametersBuilder extends SetupNetworksParametersBuilder { + + @Override + protected void buildParameters(Network network) { + + List<VdsNetworkInterface> nics = + getDbFacade().getInterfaceDao().getVdsInterfacesByNetworkId(getNetwork().getId()); + + Set<Guid> hostIdsToSync = new HashSet<>(); + for (VdsNetworkInterface nic : nics) { + if (!NetworkUtils.isNetworkInSync(nic, getNetwork())) { + hostIdsToSync.add(nic.getVdsId()); + } + } + + for (Guid hostId : hostIdsToSync) { + VDS host = getVdsDAO().get(hostId); + if (setupNetworkSupported(host)) { + SetupNetworksParameters setupNetworkParams = createSetupNetworksParameters(host); + setupNetworkParams.setNetworksToSync(Collections.singletonList(getNetworkName())); + getParameters().add(setupNetworkParams); + } + } + } + } + + private class RenameNetworkParametersBuilder extends SetupNetworksParametersBuilder { + + @Override + protected void buildParameters(Network network) { + List<VDS> hosts = getVdsDAO().getAllForNetwork(network.getId()); + for (VDS host : hosts) { + if (!setupNetworkSupported(host)) { + continue; + } + + SetupNetworksParameters setupNetworkParams = createSetupNetworksParameters(host); + List<VdsNetworkInterface> nics = setupNetworkParams.getInterfaces(); + for (VdsNetworkInterface nic : nics) { + if (StringUtils.equals(nic.getNetworkName(), getOldNetwork().getName())) { + nic.setNetworkName(network.getName()); + break; + } + } + + getParameters().add(setupNetworkParams); + } + } + } } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/NetworkValidator.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/NetworkValidator.java index 0706ab8..fe64367 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/NetworkValidator.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/NetworkValidator.java @@ -7,6 +7,8 @@ import org.ovirt.engine.core.common.FeatureSupported; import org.ovirt.engine.core.common.businessentities.Nameable; import org.ovirt.engine.core.common.businessentities.StoragePool; +import org.ovirt.engine.core.common.businessentities.VM; +import org.ovirt.engine.core.common.businessentities.VmTemplate; import org.ovirt.engine.core.common.businessentities.network.Network; import org.ovirt.engine.core.common.errors.VdcBllMessages; import org.ovirt.engine.core.dal.dbbroker.DbFacade; @@ -24,6 +26,7 @@ private StoragePool dataCenter; private List<Network> networks; + private List<VM> vms; public NetworkValidator(Network network) { this.network = network; @@ -156,8 +159,7 @@ * @return An error iff the network is in use by any VMs. */ public ValidationResult networkNotUsedByVms() { - return networkNotUsed(getDbFacade().getVmDao().getAllForNetwork(network.getId()), - VdcBllMessages.VAR__ENTITIES__VMS); + return networkNotUsed(getVms(), VdcBllMessages.VAR__ENTITIES__VMS); } /** @@ -172,7 +174,19 @@ * @return An error iff the network is in use by any templates. */ public ValidationResult networkNotUsedByTemplates() { - return networkNotUsed(getDbFacade().getVmTemplateDao().getAllForNetwork(network.getId()), + return networkNotUsed(getTemplates(), VdcBllMessages.VAR__ENTITIES__VM_TEMPLATES); } + + protected List<VM> getVms() { + if (vms == null) { + vms = getDbFacade().getVmDao().getAllForNetwork(network.getId()); + } + + return vms; + } + + protected List<VmTemplate> getTemplates() { + return getDbFacade().getVmTemplateDao().getAllForNetwork(network.getId()); + } } diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/AddNetworkStoragePoolParameters.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/AddNetworkStoragePoolParameters.java index 6dce939..13a35a8 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/AddNetworkStoragePoolParameters.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/AddNetworkStoragePoolParameters.java @@ -14,6 +14,7 @@ private Network network; private boolean vnicProfileRequired; + private boolean configureHosts; public AddNetworkStoragePoolParameters() { vnicProfileRequired = true; @@ -36,4 +37,12 @@ public void setVnicProfileRequired(boolean vnicProfileRequired) { this.vnicProfileRequired = vnicProfileRequired; } + + public boolean configureHosts() { + return configureHosts; + } + + public void setConfigureHosts(boolean configureHosts) { + this.configureHosts = configureHosts; + } } -- To view, visit http://gerrit.ovirt.org/22053 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Iec04c7fb0c29ba6f61b7d788a9c3917f5d46554e 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
