Martin Mucha has uploaded a new change for review. Change subject: core: add updateAndReorderNics util class ......................................................................
core: add updateAndReorderNics util class Change-Id: Id6ca26b82f7a042a4ddfa6247d5fe2b995185c90 Signed-off-by: Martin Mucha <[email protected]> --- A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateAndReorderVmNics.java 1 file changed, 224 insertions(+), 0 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/31/40031/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateAndReorderVmNics.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateAndReorderVmNics.java new file mode 100644 index 0000000..70ae6cd --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateAndReorderVmNics.java @@ -0,0 +1,224 @@ +package org.ovirt.engine.core.bll; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +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.common.action.AddVmInterfaceParameters; +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.VdcReturnValueBase; +import org.ovirt.engine.core.common.action.VmManagementParametersBase; +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; +import org.ovirt.engine.core.compat.Version; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class UpdateAndReorderVmNics { + + private Logger log = LoggerFactory.getLogger(getClass()); + + private int osType; + private Version compatibilityVersion; + private Iterable<VmNetworkInterface> updatedVmNetworkInterfaces; + private Guid vmId; + + private final CommandBase<?> callerCommand; + + public UpdateAndReorderVmNics(VmManagementParametersBase parameters, CommandBase<?> callerCommand) { + this.osType = parameters.getVm().getStaticData().getOsId(); + this.compatibilityVersion = parameters.getVm().getVdsGroupCompatibilityVersion(); + this.updatedVmNetworkInterfaces = parameters.getUpdatedNetworkInterfaces(); + this.vmId = parameters.getVm().getId(); + this.callerCommand = callerCommand; + } + + public void updateAndReorder() { + updateNics(); + reorderNics(); + } + + public void reorderNics() { + VmOperationParameterBase reorderParams = new VmOperationParameterBase(vmId); + callerCommand.runInternalAction(VdcActionType.ReorderVmNics, reorderParams); + } + + public void updateNics() { + UpdateNicsVmInterfaceParametersFactory parametersFactory = getParametersFactory(); + invokeActionType(VdcActionType.AddVmInterface, parametersFactory.createCreateVnicParameters()); + invokeActionType(VdcActionType.UpdateVmInterface, parametersFactory.createUpdateVnicParameters()); + invokeActionType(VdcActionType.RemoveVmInterface, parametersFactory.createRemoveVnicParameters()); + } + + private void invokeActionType(VdcActionType actionType, List<VdcActionParametersBase> parameters) { + for (VdcActionParametersBase parameter : parameters) { + log.debug("calling {} with {}", actionType, Arrays.toString(parameters.toArray())); + VdcReturnValueBase result = + callerCommand.runInternalAction(actionType, parameter, callerCommand.getContext().clone()); + + if (!result.getSucceeded()) { + throw new IllegalStateException( + String.format("Commands of type %1$s with parameters %2$s was unsuccessful, cannot proceed.", + actionType, parameter)); + } + } + } + + private UpdateNicsVmInterfaceParametersFactory getParametersFactory() { + List<VmInterfaceType> supportedInterfaceTypes = getInterfaceTypes(); + return new UpdateNicsVmInterfaceParametersFactory(updatedVmNetworkInterfaces, + getDefaultNicType(supportedInterfaceTypes), + supportedInterfaceTypes, + vmId, + getExistingNics()); + } + + private List<VmNetworkInterface> getExistingNics() { + IdQueryParameters parameters = new IdQueryParameters(this.vmId); + VdcQueryReturnValue result = callerCommand.runInternalQuery(VdcQueryType.GetVmInterfacesByVmId, parameters); + + return result.getReturnValue(); + } + + private List<VmInterfaceType> getInterfaceTypes() { + OsQueryParameters.OsRepositoryVerb verb = OsQueryParameters.OsRepositoryVerb.GetNetworkDevices; + OsQueryParameters queryParams = new OsQueryParameters(verb, osType, compatibilityVersion); + + VdcQueryReturnValue result = callerCommand.runInternalQuery(VdcQueryType.OsRepository, queryParams); + + 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; + } + + private static class UpdateNicsVmInterfaceParametersFactory { + private final Iterable<VmNetworkInterface> existingVnics; + private final Iterable<VmNetworkInterface> vmNetworkInterfaces; + private final Collection<VmInterfaceType> supportedInterfaceTypes; + private final Guid vmId; + private final Integer defaultTypeValue; + + private final List<VdcActionParametersBase> createVnicParameters = new ArrayList<>(); + private final List<VdcActionParametersBase> updateVnicParameters = new ArrayList<>(); + private final List<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(); + + init(); + } + + private void init() { + 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<>(); + for (VmNetworkInterface vnic : existingVnics) { + existingVnicNameToVnicMap.put(vnic.getName(), vnic); + } + return existingVnicNameToVnicMap; + } + + public List<VdcActionParametersBase> createCreateVnicParameters() { + return createVnicParameters; + } + + public List<VdcActionParametersBase> createUpdateVnicParameters() { + return updateVnicParameters; + } + + public List<VdcActionParametersBase> createRemoveVnicParameters() { + return removeVnicParameters; + } + } +} -- To view, visit https://gerrit.ovirt.org/40031 To unsubscribe, visit https://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Id6ca26b82f7a042a4ddfa6247d5fe2b995185c90 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
