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

Reply via email to