Muli Salem has uploaded a new change for review.

Change subject: engine: Validate Dup MAC Addresses upon Iface Plug
......................................................................

engine: Validate Dup MAC Addresses upon Iface Plug

This patch validates that there are no plugged network interfaces
with the same MAC address as the network interface that
is being plugged.

This validation is needed, since when importing or taking a
snapshot of VM with a network interface that has a duplicate
MAC address, we unplug the network interface and do not fail
the action.

Change-Id: If1476e8bec112c0c592e5cc16deefcf67076f5dc
Bug-Url: https://bugzilla.redhat.com/873338
Signed-off-by: Muli Salem <msa...@redhat.com>
---
M backend/manager/dbscripts/network_sp.sql
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/vm/ActivateDeactivateVmNicCommand.java
M 
backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/network/VmNetworkInterfaceDao.java
M 
backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/network/VmNetworkInterfaceDaoDbFacadeImpl.java
M 
backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/FixturesTool.java
M 
backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/network/VmNetworkInterfaceDaoTest.java
6 files changed, 70 insertions(+), 1 deletion(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/42/12242/1

diff --git a/backend/manager/dbscripts/network_sp.sql 
b/backend/manager/dbscripts/network_sp.sql
index 6f0ac8d..2aafa8e 100644
--- a/backend/manager/dbscripts/network_sp.sql
+++ b/backend/manager/dbscripts/network_sp.sql
@@ -517,7 +517,15 @@
 
 
 
-
+Create or replace FUNCTION GetVmInterfacesByMacAddress(v_mac_address 
VARCHAR(20))
+RETURNS SETOF vm_interface_view
+   AS $procedure$
+BEGIN
+   RETURN QUERY SELECT *
+   FROM vm_interface_view
+   WHERE mac_addr = v_mac_address;
+END; $procedure$
+LANGUAGE plpgsql;
 
 
 ----------------------------------------------------------------
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/vm/ActivateDeactivateVmNicCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/vm/ActivateDeactivateVmNicCommand.java
index 3036a58..84e06dbb 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/vm/ActivateDeactivateVmNicCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/vm/ActivateDeactivateVmNicCommand.java
@@ -3,6 +3,7 @@
 import java.util.List;
 
 import org.ovirt.engine.core.bll.NonTransactiveCommandAttribute;
+import org.ovirt.engine.core.bll.ValidationResult;
 import org.ovirt.engine.core.bll.VmCommand;
 import org.ovirt.engine.core.bll.utils.VmDeviceUtils;
 import org.ovirt.engine.core.common.AuditLogType;
@@ -14,6 +15,8 @@
 import 
org.ovirt.engine.core.common.businessentities.network.VdsNetworkInterface;
 import org.ovirt.engine.core.common.businessentities.network.VmInterfaceType;
 import 
org.ovirt.engine.core.common.businessentities.network.VmNetworkInterface;
+import org.ovirt.engine.core.common.config.Config;
+import org.ovirt.engine.core.common.config.ConfigValues;
 import org.ovirt.engine.core.common.vdscommands.VmNicDeviceVDSParameters;
 import org.ovirt.engine.core.compat.Guid;
 import org.ovirt.engine.core.dal.VdcBllMessages;
@@ -61,6 +64,10 @@
         vmNetworkInterface = 
getVmNetworkInterfaceDao().get(getParameters().getNicId());
         if (vmDevice == null || vmNetworkInterface == null) {
             addCanDoActionMessage(VdcBllMessages.VM_INTERFACE_NOT_EXIST);
+            return false;
+        }
+
+        if (getParameters().getAction() == PlugAction.PLUG && 
!validate(macAvailable())) {
             return false;
         }
 
@@ -147,4 +154,24 @@
     private boolean hotPlugVmNicRequired(VMStatus vmStatus) {
         return vmStatus == VMStatus.Up;
     }
+
+    protected ValidationResult macAvailable() {
+        Boolean allowDupMacs = Config.<Boolean> 
GetValue(ConfigValues.AllowDuplicateMacAddresses);
+        if (allowDupMacs || 
!existsPluggedInterfaceWithSameMac(vmNetworkInterface)) {
+            return ValidationResult.VALID;
+        } else {
+            return new 
ValidationResult(VdcBllMessages.NETWORK_MAC_ADDRESS_IN_USE);
+        }
+    }
+
+    private boolean existsPluggedInterfaceWithSameMac(VmNetworkInterface 
interfaceToPlug) {
+        List<VmNetworkInterface> vmNetworkIntrefaces =
+                
getDbFacade().getVmNetworkInterfaceDao().getAllForMac(interfaceToPlug.getMacAddress());
+        for (VmNetworkInterface vmNetworkInterface : vmNetworkIntrefaces) {
+            if (!interfaceToPlug.getId().equals(vmNetworkInterface.getId()) && 
vmNetworkInterface.isPlugged()) {
+                return true;
+            }
+        }
+        return false;
+    }
 }
diff --git 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/network/VmNetworkInterfaceDao.java
 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/network/VmNetworkInterfaceDao.java
index c19d3cb..06c4b20 100644
--- 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/network/VmNetworkInterfaceDao.java
+++ 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/network/VmNetworkInterfaceDao.java
@@ -78,4 +78,13 @@
      * @return the list of MAC addresses
      */
     List<String> getAllMacsByDataCenter(Guid dataCenterId);
+
+    /***
+     * Retrieves the VmNetworkInterfaces that have the given MAC address
+     *
+     * @param macAddress
+     *            the MAC address
+     * @return the list of VmNetworkInterfaces
+     */
+    List<VmNetworkInterface> getAllForMac(String macAddress);
 }
diff --git 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/network/VmNetworkInterfaceDaoDbFacadeImpl.java
 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/network/VmNetworkInterfaceDaoDbFacadeImpl.java
index e79365a..c924225 100644
--- 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/network/VmNetworkInterfaceDaoDbFacadeImpl.java
+++ 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/network/VmNetworkInterfaceDaoDbFacadeImpl.java
@@ -152,4 +152,10 @@
         return getCallsHandler().executeReadList("GetMacsByDataCenterId",
                 macMapper, 
getCustomMapSqlParameterSource().addValue("data_center_id", dataCenterId));
     }
+
+    @Override
+    public List<VmNetworkInterface> getAllForMac(String macAddress) {
+        return getCallsHandler().executeReadList("GetVmInterfacesByMacAddress",
+                mapper, 
getCustomMapSqlParameterSource().addValue("mac_address", macAddress));
+    }
 }
diff --git 
a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/FixturesTool.java
 
b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/FixturesTool.java
index 1ecf49a..4811a79 100644
--- 
a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/FixturesTool.java
+++ 
b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/FixturesTool.java
@@ -320,6 +320,18 @@
     public static final Guid VM_NETWORK_INTERFACE = new 
Guid("e2817b12-f873-4046-b0da-0098293c14fd");
 
     /**
+     * Predefined VmNetworkInterface with the following properties :
+     * <ul>
+     * <li>network_name: engine4</li>
+     * <li>vm_guid: 77296e00-0cad-4e5a-9299-008a7b6f4359</li>
+     * <li>vmt_guid: 1b85420c-b84c-4f29-997e-0eb674b40b79</li>
+     * <li>mac_addr: 00:1a:4a:16:87:db</li>
+     * <li>name: nic1</li>
+     * </ul>
+     */
+    public static final Guid VM_NETWORK_INTERFACE2 = new 
Guid("14550e82-1e1f-47b5-ae41-b009348dabfb");
+
+    /**
      * Predefined VmNetworkInterface with the following properties:
      * <ul>
      * <li>network_name: engine</li>
diff --git 
a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/network/VmNetworkInterfaceDaoTest.java
 
b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/network/VmNetworkInterfaceDaoTest.java
index 5a4aa91..82f38fd 100644
--- 
a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/network/VmNetworkInterfaceDaoTest.java
+++ 
b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/network/VmNetworkInterfaceDaoTest.java
@@ -277,6 +277,13 @@
         assertEquals(FixturesTool.MAC_ADDRESS, result.get(0));
     }
 
+    @Test
+    public void testGetAllForMac() throws Exception {
+        List<VmNetworkInterface> result = 
dao.getAllForMac(FixturesTool.MAC_ADDRESS);
+        assertEquals(1, result.size());
+        assertEquals(FixturesTool.VM_NETWORK_INTERFACE2, 
result.get(0).getId());
+    }
+
     private void assertCorrectResultForTemplate(List<VmNetworkInterface> 
result) {
         assertNotNull(result);
         assertFalse(result.isEmpty());


--
To view, visit http://gerrit.ovirt.org/12242
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: If1476e8bec112c0c592e5cc16deefcf67076f5dc
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Muli Salem <msa...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to