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

Reply via email to