Martin Mucha has uploaded a new change for review. Change subject: core: added command to update and reorder VmNics. ......................................................................
core: added command to update and reorder VmNics. UpdateAndReorderVmNicsCommand was added to move logic, which updates (add/remove/modify) nics and reorders them, from gui part to backend. This should improve responsibility and allow to call this from rest as well. Longer description using lines' length under 72 chars. With multiple paragraphs if necessary. Change-Id: I9b806fc849efacbb8019c4f0724a8f4a3b76e8d4 Bug-Url: https://bugzilla.redhat.com/?????? Signed-off-by: Martin Mucha <[email protected]> --- A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateAndReorderVmNicsCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/vm/GetVmInterfacesByVmIdQuery.java A backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/UpdateAndReorderVmNicsParam.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/VdcActionType.java 4 files changed, 238 insertions(+), 1 deletion(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/53/35053/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateAndReorderVmNicsCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateAndReorderVmNicsCommand.java new file mode 100644 index 0000000..db1b8d2 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateAndReorderVmNicsCommand.java @@ -0,0 +1,216 @@ +package org.ovirt.engine.core.bll; + +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.Set; + +import org.ovirt.engine.core.bll.utils.PermissionSubject; +import org.ovirt.engine.core.common.VdcObjectType; +import org.ovirt.engine.core.common.action.AddVmInterfaceParameters; +import org.ovirt.engine.core.common.action.RemoveVmInterfaceParameters; +import org.ovirt.engine.core.common.action.UpdateAndReorderVmNicsParam; +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.VmInterfaceType; +import org.ovirt.engine.core.common.businessentities.network.VmNetworkInterface; +import org.ovirt.engine.core.common.queries.IdQueryParameters; +import org.ovirt.engine.core.common.queries.OsQueryParameters; +import org.ovirt.engine.core.common.queries.VdcQueryReturnValue; +import org.ovirt.engine.core.common.queries.VdcQueryType; +import org.ovirt.engine.core.compat.Guid; + +public class UpdateAndReorderVmNicsCommand extends CommandBase<UpdateAndReorderVmNicsParam> { + + public UpdateAndReorderVmNicsCommand(UpdateAndReorderVmNicsParam parameters) { + super(parameters); + } + + @Override + protected void executeCommand() { + List<VmInterfaceType> supportedInterfaceTypes = getInterfaceTypes(); + VmInterfaceType defaultInterfaceType = getDefaultNicType(supportedInterfaceTypes); + + UpdateNicsVmInterfaceParametersFactory parameters = + calculateRequiredParameters(supportedInterfaceTypes, defaultInterfaceType); + + if (!parameters.createVnicParameters.isEmpty()) { + runInternalMultipleActions(VdcActionType.AddVmInterface, + parameters.createVnicParameters, + true, + true, + getContext().clone()); + } + + if (!parameters.updateVnicParameters.isEmpty()) { + runInternalMultipleActions(VdcActionType.UpdateVmInterface, parameters.updateVnicParameters, + true, + true, + getContext().clone()); + } + + if (!parameters.removeVnicParameters.isEmpty()) { + runInternalMultipleActions(VdcActionType.RemoveVmInterface, parameters.removeVnicParameters, + true, + true, + getContext().clone()); + } + + if (getParameters().reorderNics) { + VmOperationParameterBase reorderParams = new VmOperationParameterBase(getParameters().vmId); + runInternalAction(VdcActionType.ReorderVmNics, reorderParams); + } + + getReturnValue().setSucceeded(true); + } + + private UpdateNicsVmInterfaceParametersFactory calculateRequiredParameters(List<VmInterfaceType> supportedInterfaceTypes, + VmInterfaceType defaultInterfaceType) { + UpdateNicsVmInterfaceParametersFactory parameters = + new UpdateNicsVmInterfaceParametersFactory(getParameters().updatedVmNetworkInterfaces, + defaultInterfaceType, + supportedInterfaceTypes, + getParameters().vmId, + getExistingInterfacesForVm()); + + parameters.createParameters(); + return parameters; + } + + + private List<VmNetworkInterface> getExistingInterfacesForVm() { + VdcQueryReturnValue result = runInternalQuery(VdcQueryType.GetVmInterfacesByVmId, + new IdQueryParameters(getParameters().vmId)); + + return result.getReturnValue(); + } + + private List<VmInterfaceType> getInterfaceTypes() { + VdcQueryReturnValue result = runInternalQuery(VdcQueryType.OsRepository, + new OsQueryParameters(OsQueryParameters.OsRepositoryVerb.GetNetworkDevices, + getParameters().osType, + getParameters().version) + ); + + List<String> networkDevices = result.getReturnValue(); + return convertToInterfaceTypes(networkDevices); + } + + //TODO MM: duplicate with org.ovirt.engine.ui.uicommonweb.dataprovider.AsyncDataProvider.getDefaultNicType() + public VmInterfaceType getDefaultNicType(Collection<VmInterfaceType> items) { + if (items == null || items.isEmpty()) { + return null; + } else if (items.contains(VmInterfaceType.pv)) { + return VmInterfaceType.pv; + } else { + return items.iterator().next(); + } + } + + //TODO MM: duplicate with org.ovirt.engine.ui.uicommonweb.dataprovider.AsyncDataProvider.getNicTypeList() + //TODO MM: a) fix this duplicity only b) make generic util for all enums c) move this method to VmInterfaceType + private List<VmInterfaceType> convertToInterfaceTypes(List<String> networkDevices) { + List<VmInterfaceType> interfaceTypes = new ArrayList<>(); + for (String networkDevice : networkDevices) { + try { + interfaceTypes.add(VmInterfaceType.valueOf(networkDevice)); + } catch (IllegalArgumentException e) { + // ignore if we can't find the enum value. + } + } + return interfaceTypes; + } + + @Override + public List<PermissionSubject> getPermissionCheckSubjects() { + return Collections.singletonList( + new PermissionSubject(Guid.SYSTEM, VdcObjectType.System, getActionType().getActionGroup())); + } + + //TODO MM: this is a copy of class create by refactoring; apply refactoring to gui code to eliminate duplicity? + public static class UpdateNicsVmInterfaceParametersFactory { + protected final Iterable<VmNetworkInterface> existingVnics; + protected final Iterable<VmNetworkInterface> vmNetworkInterfaces; + protected final Collection<VmInterfaceType> supportedInterfaceTypes; + protected final Guid vmId; + protected final Integer defaultTypeValue; + + public final ArrayList<VdcActionParametersBase> createVnicParameters = new ArrayList<>(); + public final ArrayList<VdcActionParametersBase> updateVnicParameters = new ArrayList<>(); + public final ArrayList<VdcActionParametersBase> removeVnicParameters = new ArrayList<>(); + + public UpdateNicsVmInterfaceParametersFactory(Iterable<VmNetworkInterface> vmNetworkInterfaces, + VmInterfaceType defaultType, + Collection<VmInterfaceType> supportedInterfaceTypes, + Guid vmId, + Iterable<VmNetworkInterface> existingVnics) { + this.vmNetworkInterfaces = vmNetworkInterfaces; + this.supportedInterfaceTypes = supportedInterfaceTypes; + this.vmId = vmId; + this.existingVnics = existingVnics; + defaultTypeValue = defaultType == null ? null : defaultType.getValue(); + } + + public void createParameters() { + final Set<String> vnicsEncountered = new HashSet<>(); + Map<String, VmNetworkInterface> existingVnicsMap = mapVnicsNamesToVnic(existingVnics); + + // iterate over edited VNICs, see if any need to be added or have been assigned a different profile + for (VmNetworkInterface editedVnic : vmNetworkInterfaces) { + String vnicName = editedVnic.getName(); + VmNetworkInterface existingVnic = existingVnicsMap.get(vnicName); + if (existingVnic == null) { + editedVnic.setType(defaultTypeValue); + createVnicParameters.add(createAddInterfaceParameter(editedVnic)); + } else { + vnicsEncountered.add(vnicName); + Guid existingProfileId = existingVnic.getVnicProfileId(); + Guid editedProfileId = editedVnic.getVnicProfileId(); + if (supportedInterfaceTypes != null && !supportedInterfaceTypes.contains(VmInterfaceType.forValue( + existingVnic.getType()))) { + existingVnic.setType(defaultTypeValue); + } else if (supportedInterfaceTypes == null) { + existingVnic.setType(defaultTypeValue); + } + + if ((editedProfileId == null && existingProfileId != null) + || (editedProfileId != null && !editedProfileId.equals(existingProfileId))) { + existingVnic.setVnicProfileId(editedProfileId); + existingVnic.setNetworkName(editedVnic.getNetworkName()); + updateVnicParameters.add(createAddInterfaceParameter(existingVnic)); + } + } + } + + // iterate over existing VNICs, see if any have not been encountered and thus removed in editing + for (VmNetworkInterface existingVnic : existingVnics) { + if (!vnicsEncountered.contains(existingVnic.getName())) { + removeVnicParameters.add(createRemoveInterfaceParameter(existingVnic)); + } + } + } + + private VdcActionParametersBase createRemoveInterfaceParameter(VmNetworkInterface existingVnic) { + return new RemoveVmInterfaceParameters(vmId, existingVnic.getId()); + } + + private VdcActionParametersBase createAddInterfaceParameter(VmNetworkInterface editedVnic) { + editedVnic.setVmTemplateId(null); + return new AddVmInterfaceParameters(vmId, editedVnic); + } + + private Map<String, VmNetworkInterface> mapVnicsNamesToVnic(Iterable<VmNetworkInterface> existingVnics) { + Map<String, VmNetworkInterface> existingVnicNameToVnicMap = new HashMap<String, VmNetworkInterface>(); + for (VmNetworkInterface vnic : existingVnics) { + existingVnicNameToVnicMap.put(vnic.getName(), vnic); + } + return existingVnicNameToVnicMap; + } + + } +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/vm/GetVmInterfacesByVmIdQuery.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/vm/GetVmInterfacesByVmIdQuery.java index b98dc27..9622b20 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/vm/GetVmInterfacesByVmIdQuery.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/vm/GetVmInterfacesByVmIdQuery.java @@ -1,6 +1,7 @@ package org.ovirt.engine.core.bll.network.vm; import org.ovirt.engine.core.bll.QueriesCommandBase; +import org.ovirt.engine.core.bll.context.EngineContext; import org.ovirt.engine.core.common.queries.IdQueryParameters; public class GetVmInterfacesByVmIdQuery<P extends IdQueryParameters> extends QueriesCommandBase<P> { @@ -8,6 +9,11 @@ super(parameters); } + //TODO MM: separate patch + public GetVmInterfacesByVmIdQuery(P parameters, EngineContext engineContext) { + super(parameters, engineContext); + } + @Override protected void executeQueryCommand() { getQueryReturnValue().setReturnValue( diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/UpdateAndReorderVmNicsParam.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/UpdateAndReorderVmNicsParam.java new file mode 100644 index 0000000..0c984ec --- /dev/null +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/UpdateAndReorderVmNicsParam.java @@ -0,0 +1,13 @@ +package org.ovirt.engine.core.common.action; + +import org.ovirt.engine.core.common.businessentities.network.VmNetworkInterface; +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.compat.Version; + +public class UpdateAndReorderVmNicsParam extends VdcActionParametersBase{ + public int osType; + public Version version; + public Iterable<VmNetworkInterface> updatedVmNetworkInterfaces; + public Guid vmId; + public boolean reorderNics; +} 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 e99a0ee..84d7e91 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 @@ -386,7 +386,9 @@ // Mac Pool AddMacPool(3100, ActionGroup.CREATE_MAC_POOL, false, QuotaDependency.NONE), UpdateMacPool(3101, ActionGroup.EDIT_MAC_POOL, false, QuotaDependency.NONE), - RemoveMacPool(3102, ActionGroup.DELETE_MAC_POOL, false, QuotaDependency.NONE); + RemoveMacPool(3102, ActionGroup.DELETE_MAC_POOL, false, QuotaDependency.NONE), + + UpdateAndReorderVmNics(3200, ActionGroup.CREATE_VM, false, QuotaDependency.NONE); private int intValue; private ActionGroup actionGroup; -- To view, visit http://gerrit.ovirt.org/35053 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I9b806fc849efacbb8019c4f0724a8f4a3b76e8d4 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Martin Mucha <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
