Oved Ourfali has uploaded a new change for review. Change subject: core+webadmin: reordering VM NICs ......................................................................
core+webadmin: reordering VM NICs This patch adds a reordering functionality to the VM interfaces. The logic is as follows: 1. All templated NICs that have a PCI address are left as is. 2. All the remaining NICs are given MAC addresses with the same NIC name ordering. Change-Id: I7d02e3eff9466d9094bc16cd489503d25c9f4bef Bug-Url: https://bugzilla.redhat.com/1040630 Signed-off-by: Oved Ourfali <oourf...@redhat.com> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/vm/RemoveVmInterfaceCommand.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/vm/ReorderVmNicsCommand.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java M frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/Frontend.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/userportal/UserPortalListModel.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/UnitVmModelNetworkAsyncCallback.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmInterfaceCreatingManager.java M frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmListModel.java 8 files changed, 145 insertions(+), 35 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/12/22512/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/vm/RemoveVmInterfaceCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/vm/RemoveVmInterfaceCommand.java index e96c776..d3f7bb0 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/vm/RemoveVmInterfaceCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/vm/RemoveVmInterfaceCommand.java @@ -72,7 +72,7 @@ } VmDynamic vm = getVmDynamicDao().get(getParameters().getVmId()); - if (vm.getStatus() != VMStatus.Down + if (vm.getStatus() != VMStatus.Down && vm.getStatus() != VMStatus.ImageLocked && getDbFacade().getVmDeviceDao() .get(new VmDeviceId(getParameters().getInterfaceId(), getParameters().getVmId())) .getIsPlugged()) { diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/vm/ReorderVmNicsCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/vm/ReorderVmNicsCommand.java new file mode 100644 index 0000000..7097b41 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/vm/ReorderVmNicsCommand.java @@ -0,0 +1,88 @@ +package org.ovirt.engine.core.bll.network.vm; + +import org.apache.commons.lang.StringUtils; +import org.ovirt.engine.core.bll.VmCommand; +import org.ovirt.engine.core.common.action.VmOperationParameterBase; +import org.ovirt.engine.core.common.businessentities.VmDevice; +import org.ovirt.engine.core.common.businessentities.VmDeviceGeneralType; +import org.ovirt.engine.core.common.businessentities.VmStatic; +import org.ovirt.engine.core.common.businessentities.network.VmNic; +import org.ovirt.engine.core.common.errors.VdcBllMessages; +import org.ovirt.engine.core.compat.Guid; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class ReorderVmNicsCommand<T extends VmOperationParameterBase> extends VmCommand<T> { + + public ReorderVmNicsCommand(T parameters) { + super(parameters); + } + + @Override + protected boolean canDoAction() { + VmStatic vm = getVm().getStaticData(); + if (vm == null) { + addCanDoActionMessage(VdcBllMessages.ACTION_TYPE_FAILED_VM_NOT_EXIST); + return false; + } + + if (!canRunActionOnNonManagedVm()) { + return false; + } + + return true; + } + + @Override + protected void executeVmCommand() { + reorderNics(); + setSucceeded(true); + } + + private Map<Guid, VmDevice> getVmInterfaceDevices() { + List<VmDevice> vmInterfaceDevicesList = getVmDeviceDao().getVmDeviceByVmIdAndType(getParameters().getVmId(), VmDeviceGeneralType.INTERFACE); + Map<Guid, VmDevice> vmInterfaceDevices = new HashMap(); + for (VmDevice device : vmInterfaceDevicesList) { + vmInterfaceDevices.put(device.getDeviceId(), device); + } + return vmInterfaceDevices; + } + + private void reorderNics() { + Map<Guid, VmDevice> vmInterfaceDevices = getVmInterfaceDevices(); + List<VmNic> nics = getVmNicDao().getAllForVm(getParameters().getVmId()); + List<VmNic> nicsToReorder = new ArrayList<VmNic>(); + List<String> macsToReorder = new ArrayList<String>(); + + for (VmNic nic : nics) { + VmDevice nicDevice = vmInterfaceDevices.get(nic.getId()); + // If there is not device, or the PCI address is empty + if (nicDevice == null || StringUtils.isEmpty(nicDevice.getAddress())) { + nicsToReorder.add(nic); + // We know that all the NICs have a MAC address + macsToReorder.add(nic.getMacAddress()); + } + } + // Sorting the NICs to reorder by name + Collections.sort(nicsToReorder, new Comparator<VmNic>() { + @Override + public int compare(VmNic nic1, VmNic nic2) { + return nic1.getName().compareTo(nic2.getName()); + } + }); + + // Sorting the MAC addresses to reorder + Collections.sort(macsToReorder); + for (int i = 0; i < nicsToReorder.size(); ++i) { + VmNic nic = nicsToReorder.get(i); + nic.setMacAddress(macsToReorder.get(i)); + getVmNicDao().update(nic); + } + } +} + diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java index 0f990b8..b33033b 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java @@ -30,6 +30,7 @@ AddVmInterface(28, ActionGroup.CONFIGURE_VM_NETWORK, false, QuotaDependency.NONE), RemoveVmInterface(29, ActionGroup.CONFIGURE_VM_NETWORK, false, QuotaDependency.NONE), UpdateVmInterface(30, ActionGroup.CONFIGURE_VM_NETWORK, false, QuotaDependency.NONE), + ReorderVmNics(128, ActionGroup.CONFIGURE_VM_NETWORK, false, QuotaDependency.NONE), AddDisk(31, ActionGroup.CONFIGURE_VM_STORAGE, QuotaDependency.STORAGE), RegisterDisk(32, ActionGroup.CONFIGURE_VM_STORAGE, QuotaDependency.STORAGE), @Deprecated diff --git a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/Frontend.java b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/Frontend.java index 01836d4..c6d9a78 100644 --- a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/Frontend.java +++ b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/Frontend.java @@ -585,12 +585,20 @@ * @param parameters The parameters of each action. * @param successCallback The callback to be executed when all actions have succeeded. * @param state State object + * @param runCallbacksOnEmptyRun Whether to run the callback or not even if no commands were run */ public void runMultipleActions(final VdcActionType actionType, final List<VdcActionParametersBase> parameters, final IFrontendActionAsyncCallback successCallback, - final Object state) { + final Object state, + final boolean runCallbacksOnEmptyRun) { if (parameters == null || parameters.isEmpty()) { + if (runCallbacksOnEmptyRun && successCallback != null) { + VdcReturnValueBase emptyResult = new VdcReturnValueBase(); + VdcActionParametersBase emptyParams = new VdcActionParametersBase(); + successCallback.executed(new FrontendActionAsyncResult(actionType, + emptyParams, emptyResult, state)); + } return; } @@ -603,7 +611,7 @@ } /** - * Overloaded method for {@link #runMultipleActions(VdcActionType, List, IFrontendActionAsyncCallback, Object)} with + * Overloaded method for {@link #runMultipleActions(VdcActionType, List, IFrontendActionAsyncCallback, Object, boolean)} with * state = null. * @param actionType The action type of the actions. * @param parameters A list of parameters, once for each action. @@ -612,7 +620,7 @@ public void runMultipleActions(final VdcActionType actionType, final List<VdcActionParametersBase> parameters, final IFrontendActionAsyncCallback successCallback) { - runMultipleActions(actionType, parameters, successCallback, null); + runMultipleActions(actionType, parameters, successCallback, null, false); } /** diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/userportal/UserPortalListModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/userportal/UserPortalListModel.java index 929cc0d..2aee061 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/userportal/UserPortalListModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/userportal/UserPortalListModel.java @@ -828,7 +828,7 @@ cancel(); } }, - this); + this, false); } @@ -1089,7 +1089,7 @@ parameters.setMakeCreatorExplicitOwner(true); parameters.setSoundDeviceEnabled(model.getIsSoundcardEnabled().getEntity()); parameters.setConsoleEnabled(model.getIsConsoleDeviceEnabled().getEntity()); - Frontend.getInstance().runAction(VdcActionType.AddVmFromScratch, parameters, new UnitVmModelNetworkAsyncCallback(model, defaultNetworkCreatingManager), this); + Frontend.getInstance().runAction(VdcActionType.AddVmFromScratch, parameters, new UnitVmModelNetworkAsyncCallback(model, defaultNetworkCreatingManager, true), this); } else { @@ -1114,7 +1114,7 @@ param.setSoundDeviceEnabled(unitVmModel.getIsSoundcardEnabled().getEntity()); param.setConsoleEnabled(unitVmModel.getIsConsoleDeviceEnabled().getEntity()); - Frontend.getInstance().runAction(VdcActionType.AddVmFromTemplate, param, new UnitVmModelNetworkAsyncCallback(unitVmModel, defaultNetworkCreatingManager), this); + Frontend.getInstance().runAction(VdcActionType.AddVmFromTemplate, param, new UnitVmModelNetworkAsyncCallback(unitVmModel, defaultNetworkCreatingManager, true), this); } }; AsyncDataProvider.getTemplateDiskList(_asyncQuery, template.getId()); @@ -1128,7 +1128,7 @@ param.setSoundDeviceEnabled(model.getIsSoundcardEnabled().getEntity()); param.setConsoleEnabled(model.getIsConsoleDeviceEnabled().getEntity()); - Frontend.getInstance().runAction(VdcActionType.AddVm, param, new UnitVmModelNetworkAsyncCallback(model, defaultNetworkCreatingManager), this); + Frontend.getInstance().runAction(VdcActionType.AddVm, param, new UnitVmModelNetworkAsyncCallback(model, defaultNetworkCreatingManager, true), this); } } } @@ -1146,7 +1146,7 @@ param.setSoundDeviceEnabled(model.getIsSoundcardEnabled().getEntity()); param.setConsoleEnabled(model.getIsConsoleDeviceEnabled().getEntity()); - Frontend.getInstance().runAction(VdcActionType.UpdateVm, param, new UnitVmModelNetworkAsyncCallback(model, defaultNetworkCreatingManager, gettempVm().getId()), this); + Frontend.getInstance().runAction(VdcActionType.UpdateVm, param, new UnitVmModelNetworkAsyncCallback(model, defaultNetworkCreatingManager, gettempVm().getId(), false), this); } }, this); } @@ -1155,7 +1155,7 @@ VmManagementParametersBase param = new VmManagementParametersBase(gettempVm()); param.setSoundDeviceEnabled(model.getIsSoundcardEnabled().getEntity()); param.setConsoleEnabled(model.getIsConsoleDeviceEnabled().getEntity()); - Frontend.getInstance().runAction(VdcActionType.UpdateVm, param, new UnitVmModelNetworkAsyncCallback(model, defaultNetworkCreatingManager, gettempVm().getId()), this); + Frontend.getInstance().runAction(VdcActionType.UpdateVm, param, new UnitVmModelNetworkAsyncCallback(model, defaultNetworkCreatingManager, gettempVm().getId(), false), this); } } } diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/UnitVmModelNetworkAsyncCallback.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/UnitVmModelNetworkAsyncCallback.java index 7b81ab7..9036ccd 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/UnitVmModelNetworkAsyncCallback.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/UnitVmModelNetworkAsyncCallback.java @@ -10,20 +10,23 @@ private final UnitVmModel unitVmModel; private final VmInterfaceCreatingManager networkCreatingManager; private final Guid idToUpdate; + private final boolean isAddingNewVm; public UnitVmModelNetworkAsyncCallback(final UnitVmModel unitVmModel, - final VmInterfaceCreatingManager networkCreatingManager) { + final VmInterfaceCreatingManager networkCreatingManager, boolean isAddingNewVm) { - this(unitVmModel, networkCreatingManager, null); + this(unitVmModel, networkCreatingManager, null, isAddingNewVm); } public UnitVmModelNetworkAsyncCallback(final UnitVmModel unitVmModel, final VmInterfaceCreatingManager networkCreatingManager, - final Guid idToUpdate) { + final Guid idToUpdate, + boolean isAddingNewVm) { this.unitVmModel = unitVmModel; this.networkCreatingManager = networkCreatingManager; this.idToUpdate = idToUpdate; + this.isAddingNewVm = isAddingNewVm; } @Override @@ -31,7 +34,7 @@ VdcReturnValueBase returnValue = result.getReturnValue(); if (returnValue != null && returnValue.getSucceeded()) { networkCreatingManager.updateVnics((idToUpdate == null) ? (Guid) returnValue.getActionReturnValue() - : idToUpdate, unitVmModel.getNicsWithLogicalNetworks().getItems()); + : idToUpdate, unitVmModel.getNicsWithLogicalNetworks().getItems(), isAddingNewVm); } else { networkCreatingManager.getCallback().queryFailed(); } diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmInterfaceCreatingManager.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmInterfaceCreatingManager.java index a3391c6..babb854 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmInterfaceCreatingManager.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmInterfaceCreatingManager.java @@ -10,14 +10,15 @@ import org.ovirt.engine.core.common.action.RemoveVmInterfaceParameters; import org.ovirt.engine.core.common.action.VdcActionParametersBase; import org.ovirt.engine.core.common.action.VdcActionType; +import org.ovirt.engine.core.common.action.VmOperationParameterBase; import org.ovirt.engine.core.common.businessentities.network.VmNetworkInterface; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.ui.frontend.AsyncQuery; import org.ovirt.engine.ui.frontend.Frontend; import org.ovirt.engine.ui.frontend.INewAsyncCallback; import org.ovirt.engine.ui.uicommonweb.dataprovider.AsyncDataProvider; -import org.ovirt.engine.ui.uicompat.FrontendMultipleActionAsyncResult; -import org.ovirt.engine.ui.uicompat.IFrontendMultipleActionAsyncCallback; +import org.ovirt.engine.ui.uicompat.FrontendActionAsyncResult; +import org.ovirt.engine.ui.uicompat.IFrontendActionAsyncCallback; public class VmInterfaceCreatingManager { @@ -37,7 +38,7 @@ void queryFailed(); } - public void updateVnics(final Guid vmId, final Iterable<VnicInstanceType> vnicsWithProfiles) { + public void updateVnics(final Guid vmId, final Iterable<VnicInstanceType> vnicsWithProfiles, final boolean isAddingNewVm) { AsyncQuery getVmNicsQuery = new AsyncQuery(); getVmNicsQuery.asyncCallback = new INewAsyncCallback() { @Override @@ -87,31 +88,40 @@ } } - Frontend.getInstance().runMultipleAction(VdcActionType.AddVmInterface, + Frontend.getInstance().runMultipleActions(VdcActionType.AddVmInterface, createVnicParameters, - new IFrontendMultipleActionAsyncCallback() { + new IFrontendActionAsyncCallback() { @Override - public void executed(FrontendMultipleActionAsyncResult result) { - Frontend.getInstance().runMultipleAction(VdcActionType.UpdateVmInterface, + public void executed(FrontendActionAsyncResult result) { + Frontend.getInstance().runMultipleActions(VdcActionType.UpdateVmInterface, updateVnicParameters, - new IFrontendMultipleActionAsyncCallback() { + new IFrontendActionAsyncCallback() { @Override - public void executed(FrontendMultipleActionAsyncResult result) { - Frontend.getInstance().runMultipleAction(VdcActionType.RemoveVmInterface, + public void executed(FrontendActionAsyncResult result) { + Frontend.getInstance().runMultipleActions(VdcActionType.RemoveVmInterface, removeVnicParameters, - new IFrontendMultipleActionAsyncCallback() { + new IFrontendActionAsyncCallback() { @Override - public void executed(FrontendMultipleActionAsyncResult result) { - callback.vnicCreated(vmId); + public void executed(FrontendActionAsyncResult result) { + if (isAddingNewVm) { + VmOperationParameterBase reorderParams = new VmOperationParameterBase(vmId); + Frontend.getInstance().runAction(VdcActionType.ReorderVmNics, reorderParams, new IFrontendActionAsyncCallback() { + public void executed(FrontendActionAsyncResult result) { + callback.vnicCreated(vmId); + } + }); + } else { + callback.vnicCreated(vmId); + } } - }, this); + }, this, true); } - }, this); + }, this, true); } - }, this); + }, this, true); } }; AsyncDataProvider.getVmNicList(getVmNicsQuery, vmId); diff --git a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmListModel.java b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmListModel.java index 446beeb..871571c 100644 --- a/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmListModel.java +++ b/frontend/webadmin/modules/uicommonweb/src/main/java/org/ovirt/engine/ui/uicommonweb/models/vms/VmListModel.java @@ -1985,7 +1985,7 @@ setVmWatchdogToParams(model, parameters); - Frontend.getInstance().runAction(VdcActionType.AddVmFromScratch, parameters, new UnitVmModelNetworkAsyncCallback(model, addVmFromScratchNetworkManager), this); + Frontend.getInstance().runAction(VdcActionType.AddVmFromScratch, parameters, new UnitVmModelNetworkAsyncCallback(model, addVmFromScratchNetworkManager, true), this); } else { @@ -2017,7 +2017,7 @@ param.setBalloonEnabled(balloonEnabled(model)); param.setCopyTemplatePermissions(model.getCopyPermissions().getEntity()); - Frontend.getInstance().runAction(VdcActionType.AddVmFromTemplate, param, new UnitVmModelNetworkAsyncCallback(model, defaultNetworkCreatingManager), vmListModel); + Frontend.getInstance().runAction(VdcActionType.AddVmFromTemplate, param, new UnitVmModelNetworkAsyncCallback(model, defaultNetworkCreatingManager, true), vmListModel); } }; AsyncDataProvider.getTemplateDiskList(_asyncQuery, template.getId()); @@ -2043,7 +2043,7 @@ params.setVirtioScsiEnabled(model.getIsVirtioScsiEnabled().getEntity()); setVmWatchdogToParams(model, params); - Frontend.getInstance().runAction(VdcActionType.AddVm, params, new UnitVmModelNetworkAsyncCallback(model, defaultNetworkCreatingManager), this); + Frontend.getInstance().runAction(VdcActionType.AddVm, params, new UnitVmModelNetworkAsyncCallback(model, defaultNetworkCreatingManager, true), this); } } } @@ -2085,7 +2085,7 @@ updateVmParams.setVirtioScsiEnabled(model.getIsVirtioScsiEnabled().getEntity()); Frontend.getInstance().runAction(VdcActionType.UpdateVm, - updateVmParams, new UnitVmModelNetworkAsyncCallback(model, defaultNetworkCreatingManager, vmListModel.getcurrentVm().getId()), vmListModel); + updateVmParams, new UnitVmModelNetworkAsyncCallback(model, defaultNetworkCreatingManager, vmListModel.getcurrentVm().getId(), false), vmListModel); } else { @@ -2111,7 +2111,7 @@ updateVmParams.setConsoleEnabled(model.getIsConsoleDeviceEnabled().getEntity()); updateVmParams.setBalloonEnabled(balloonEnabled(model)); updateVmParams.setVirtioScsiEnabled(model.getIsVirtioScsiEnabled().getEntity()); - Frontend.getInstance().runAction(VdcActionType.UpdateVm, updateVmParams, new UnitVmModelNetworkAsyncCallback(model, defaultNetworkCreatingManager, getcurrentVm().getId()), this); + Frontend.getInstance().runAction(VdcActionType.UpdateVm, updateVmParams, new UnitVmModelNetworkAsyncCallback(model, defaultNetworkCreatingManager, getcurrentVm().getId(), false), this); } } } -- To view, visit http://gerrit.ovirt.org/22512 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I7d02e3eff9466d9094bc16cd489503d25c9f4bef Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Oved Ourfali <oourf...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches