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