Muli Salem has uploaded a new change for review. Change subject: engine: Fail Import Vm on MAC Address (#872100, WIP) ......................................................................
engine: Fail Import Vm on MAC Address (#872100, WIP) This patch changes the VmInterfaceManager to throw a VdcBllExpection when trying to add a interface with a used MAC address. It also adds a new VdcBllError for this case, and changes the VmInterfaceManagerTest according to the change in behavior. Change-Id: I68d37ed183adb4adf8abf8b11332f6c822f8c4c0 Bug-Url: https://bugzilla.redhat.com/872100 Signed-off-by: Muli Salem <msa...@redhat.com> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/VmInterfaceManager.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/snapshots/SnapshotsManager.java M backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/network/VmInterfaceManagerTest.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllErrors.java M backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties M backend/manager/modules/dal/src/main/resources/bundles/AuditLogMessages.properties M backend/manager/modules/utils/src/test/resources/AppErrors.properties M frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java M frontend/webadmin/modules/userportal-gwtp/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties M frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties 11 files changed, 108 insertions(+), 45 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/44/9144/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmCommand.java index 8d373c9..c274f68 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/ImportVmCommand.java @@ -14,13 +14,13 @@ import org.ovirt.engine.core.bll.command.utils.StorageDomainSpaceChecker; import org.ovirt.engine.core.bll.job.ExecutionHandler; import org.ovirt.engine.core.bll.network.VmInterfaceManager; +import org.ovirt.engine.core.bll.quota.Quotable; import org.ovirt.engine.core.bll.quota.StorageQuotaValidationParameter; import org.ovirt.engine.core.bll.snapshots.SnapshotsManager; +import org.ovirt.engine.core.bll.utils.PermissionSubject; import org.ovirt.engine.core.bll.utils.VmDeviceUtils; import org.ovirt.engine.core.bll.validator.StorageDomainValidator; import org.ovirt.engine.core.common.AuditLogType; -import org.ovirt.engine.core.bll.utils.PermissionSubject; -import org.ovirt.engine.core.bll.quota.Quotable; import org.ovirt.engine.core.common.VdcObjectType; import org.ovirt.engine.core.common.action.ImportVmParameters; import org.ovirt.engine.core.common.action.MoveOrCopyImageGroupParameters; @@ -91,6 +91,7 @@ private List<DiskImage> imageList; private List<Guid> diskGuidList = new ArrayList<Guid>(); private List<Guid> imageGuidList = new ArrayList<Guid>(); + private List<String> macsAdded = new ArrayList<String>(); public ImportVmCommand(ImportVmParameters parameters) { super(parameters); @@ -820,8 +821,6 @@ AuditLogDirector.log(logable, AuditLogType.VM_IMPORT_INFO); } - protected boolean macAdded = false; - protected void addVmInterfaces() { VmInterfaceManager vmInterfaceManager = new VmInterfaceManager(); List<String> invalidNetworkNames = new ArrayList<String>(); @@ -837,7 +836,9 @@ iface.setNetworkName(StringUtils.EMPTY); } - macAdded = vmInterfaceManager.add(iface, getCompensationContext(), getParameters().isImportAsNewEntity()); + if (vmInterfaceManager.add(iface, getCompensationContext(), getParameters().isImportAsNewEntity())) { + macsAdded.add(iface.getMacAddress()); + } } auditInvalidInterfaces(invalidNetworkNames, invalidIfaceNames); @@ -910,7 +911,7 @@ } protected void removeVmNetwork() { - new VmInterfaceManager().removeAll(macAdded, getVmId()); + new VmInterfaceManager().removeAllInterfacesAndMacsFromList(getVmId(), macsAdded); } protected void endImportCommand() { diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/VmInterfaceManager.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/VmInterfaceManager.java index cc9abc9..23fdea1 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/VmInterfaceManager.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/VmInterfaceManager.java @@ -10,6 +10,8 @@ import org.ovirt.engine.core.common.businessentities.Network; import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.common.businessentities.VmNetworkInterface; +import org.ovirt.engine.core.common.errors.VdcBLLException; +import org.ovirt.engine.core.common.errors.VdcBllErrors; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dal.dbbroker.DbFacade; import org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogDirector; @@ -19,6 +21,8 @@ import org.ovirt.engine.core.dao.VmNetworkStatisticsDAO; import org.ovirt.engine.core.utils.log.Log; import org.ovirt.engine.core.utils.log.LogFactory; +import org.ovirt.engine.core.utils.transaction.TransactionMethod; +import org.ovirt.engine.core.utils.transaction.TransactionSupport; /** * Helper class to use for adding/removing {@link VmNetworkInterface}s. @@ -36,16 +40,15 @@ * Used to snapshot the saved entities. * @return <code>true</code> if the MAC wasn't used, <code>false</code> if it was. */ - public boolean add(VmNetworkInterface iface, CompensationContext compensationContext, boolean allocateMac) { + public boolean add(final VmNetworkInterface iface, CompensationContext compensationContext, boolean allocateMac) { boolean macAdded = false; if (allocateMac) { iface.setMacAddress(getMacPoolManager().allocateNewMac()); macAdded = true; } else if (getMacPoolManager().IsMacInUse(iface.getMacAddress())) { - AuditLogableBase logable = new AuditLogableBase(); - logable.AddCustomValue("MACAddr", iface.getMacAddress()); - logable.AddCustomValue("VmName", iface.getVmName()); - log(logable, AuditLogType.MAC_ADDRESS_IS_IN_USE); + auditLogMacInUse(iface); + log.errorFormat("VmInterfaceManager::Mac {0} is in use.", iface.getMacAddress()); + throw new VdcBLLException(VdcBllErrors.MAC_ADDRESS_IS_IN_USE); } else { macAdded = getMacPoolManager().AddMac(iface.getMacAddress()); } @@ -57,22 +60,31 @@ return macAdded; } + // This method is protected for test purposes + protected void auditLogMacInUse(final VmNetworkInterface iface) { + TransactionSupport.executeInNewTransaction(new TransactionMethod<Void>() { + @Override + public Void runInTransaction() { + AuditLogableBase logable = new AuditLogableBase(); + logable.AddCustomValue("MACAddr", iface.getMacAddress()); + logable.AddCustomValue("VmName", iface.getVmName()); + log(logable, AuditLogType.MAC_ADDRESS_IS_IN_USE); + return null; + } + }); + } + /** - * Remove all {@link VmNetworkInterface}s from the VM, removing from {@link MacPoolManager} if required. + * Remove all {@link VmNetworkInterface}s from the VM, and remove the Mac addresses from {@link MacPoolManager}. * - * @param removeFromMacPool - * Should the MAC be removed from {@link MacPoolManager}? * @param vmId * The ID of the VM to remove from. */ - public void removeAll(boolean removeFromMacPool, Guid vmId) { + public void removeAllInterfacesAndMacs(Guid vmId) { List<VmNetworkInterface> interfaces = getVmNetworkInterfaceDAO().getAllForVm(vmId); if (interfaces != null) { for (VmNetworkInterface iface : interfaces) { - if (removeFromMacPool) { - getMacPoolManager().freeMac(iface.getMacAddress()); - } - + getMacPoolManager().freeMac(iface.getMacAddress()); getVmNetworkInterfaceDAO().remove(iface.getId()); getVmNetworkStatisticsDAO().remove(iface.getId()); } @@ -80,6 +92,27 @@ } /** + * Remove all {@link VmNetworkInterface}s from the VM, and the Macs in the list from {@link MacPoolManager}. + * + * @param macsToRemove + * The list of Mac addresses to remove from {@link MacPoolManager} + * @param vmId + * The ID of the VM to remove from. + */ + public void removeAllInterfacesAndMacsFromList(Guid vmId, List<String> macsToRemove) { + List<VmNetworkInterface> interfaces = getVmNetworkInterfaceDAO().getAllForVm(vmId); + if (interfaces != null) { + for (VmNetworkInterface iface : interfaces) { + getVmNetworkInterfaceDAO().remove(iface.getId()); + getVmNetworkStatisticsDAO().remove(iface.getId()); + } + } + for (String macAddress : macsToRemove) { + getMacPoolManager().freeMac(macAddress); + } + } + + /** * Checks if a Network is in the given list and is a VM Network * @param iface * @param networksByName diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/snapshots/SnapshotsManager.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/snapshots/SnapshotsManager.java index 8426886..920eceb 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/snapshots/SnapshotsManager.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/snapshots/SnapshotsManager.java @@ -308,7 +308,7 @@ protected void synchronizeNics(Guid vmId, List<VmNetworkInterface> nics, CompensationContext compensationContext) { VmInterfaceManager vmInterfaceManager = new VmInterfaceManager(); - vmInterfaceManager.removeAll(true, vmId); + vmInterfaceManager.removeAllInterfacesAndMacs(vmId); for (VmNetworkInterface vmInterface : nics) { // These fields might not be saved in the OVF, so fill them with reasonable values. if (vmInterface.getId() == null) { diff --git a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/network/VmInterfaceManagerTest.java b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/network/VmInterfaceManagerTest.java index 566a051..3935b5d 100644 --- a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/network/VmInterfaceManagerTest.java +++ b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/network/VmInterfaceManagerTest.java @@ -4,7 +4,6 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.Matchers.any; -import static org.mockito.Matchers.eq; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.never; @@ -28,6 +27,7 @@ import org.ovirt.engine.core.common.businessentities.Network; import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.common.businessentities.VmNetworkInterface; +import org.ovirt.engine.core.common.errors.VdcBLLException; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogableBase; import org.ovirt.engine.core.dao.VmDAO; @@ -39,6 +39,7 @@ private final String NETWORK_NAME = "networkName"; private final String VM_NAME = "vmName"; + private final String MAC_ADDRESS = "00:14:4a:23:67:55"; @Mock private MacPoolManager macPoolManager; @@ -63,6 +64,7 @@ doReturn(vmNetworkStatisticsDAO).when(vmInterfaceManager).getVmNetworkStatisticsDAO(); doReturn(vmNetworkInterfaceDAO).when(vmInterfaceManager).getVmNetworkInterfaceDAO(); doReturn(vmDAO).when(vmInterfaceManager).getVmDAO(); + doNothing().when(vmInterfaceManager).auditLogMacInUse(any(VmNetworkInterface.class)); doNothing().when(vmInterfaceManager).log(any(AuditLogableBase.class), any(AuditLogType.class)); } @@ -77,14 +79,12 @@ runAddAndVerify(createNewInterface(), false, times(1), false); } - @Test + @Test(expected = VdcBLLException.class) public void addLogsWhenMacAlreadyInUseAndReturnsFalse() { VmNetworkInterface iface = createNewInterface(); when(macPoolManager.IsMacInUse(iface.getMacAddress())).thenReturn(true); runAddAndVerify(iface, true, never(), false); - - verify(vmInterfaceManager).log(any(AuditLogableBase.class), eq(AuditLogType.MAC_ADDRESS_IS_IN_USE)); } protected void runAddAndVerify(VmNetworkInterface iface, @@ -104,16 +104,6 @@ when(macPoolManager.allocateNewMac()).thenReturn(newMac); vmInterfaceManager.add(iface, NoOpCompensationContext.getInstance(), true); assertEquals(newMac, iface.getMacAddress()); - } - - @Test - public void removeAllRemovesFromMacPoolAlso() { - runRemoveAllAndVerify(true, times(1)); - } - - @Test - public void removeAllDoesntRemoveFromMacPoolWhenNotNeeded() { - runRemoveAllAndVerify(false, never()); } @Test @@ -158,22 +148,51 @@ assertTrue(vmNames.isEmpty()); } - private void mockDaos() { - VM vm = createVM(VM_NAME, NETWORK_NAME); - when(vmDAO.getAllRunningForVds(any(Guid.class))).thenReturn(Arrays.asList(vm)); - when(vmNetworkInterfaceDAO.getAllForVm(vm.getId())).thenReturn(vm.getInterfaces()); - } - - protected void runRemoveAllAndVerify(boolean removeFromPool, VerificationMode freeMacVerification) { + @Test + public void removeAllInterfacesAndMacs() { List<VmNetworkInterface> interfaces = Arrays.asList(createNewInterface(), createNewInterface()); when(vmNetworkInterfaceDAO.getAllForVm(any(Guid.class))).thenReturn(interfaces); - vmInterfaceManager.removeAll(removeFromPool, Guid.NewGuid()); + vmInterfaceManager.removeAllInterfacesAndMacs(Guid.NewGuid()); for (VmNetworkInterface iface : interfaces) { - verifyRemoveAllDelegatedCorrectly(iface, freeMacVerification); + verifyRemoveAllDelegatedCorrectly(iface, times(1)); } + } + + @Test + public void removeAllInterfacesAndMacsWithNonEmptyList() { + VmNetworkInterface vmNetworkInterface = createNewInterface(); + vmNetworkInterface.setMacAddress(MAC_ADDRESS); + List<VmNetworkInterface> interfaces = Arrays.asList(vmNetworkInterface); + + when(vmNetworkInterfaceDAO.getAllForVm(any(Guid.class))).thenReturn(interfaces); + + vmInterfaceManager.removeAllInterfacesAndMacsFromList(Guid.NewGuid(), Collections.singletonList(MAC_ADDRESS)); + + for (VmNetworkInterface iface : interfaces) { + verifyRemoveAllDelegatedCorrectly(iface, times(1)); + } + } + + @Test + public void removeAllInterfacesAndMacsWithEmptyList() { + List<VmNetworkInterface> interfaces = Arrays.asList(createNewInterface(), createNewInterface()); + + when(vmNetworkInterfaceDAO.getAllForVm(any(Guid.class))).thenReturn(interfaces); + + vmInterfaceManager.removeAllInterfacesAndMacsFromList(Guid.NewGuid(), Collections.EMPTY_LIST); + + for (VmNetworkInterface iface : interfaces) { + verifyRemoveAllDelegatedCorrectly(iface, never()); + } + } + + private void mockDaos() { + VM vm = createVM(VM_NAME, NETWORK_NAME); + when(vmDAO.getAllRunningForVds(any(Guid.class))).thenReturn(Arrays.asList(vm)); + when(vmNetworkInterfaceDAO.getAllForVm(vm.getId())).thenReturn(vm.getInterfaces()); } /** @@ -191,7 +210,9 @@ } /** - * Verify that {@link VmInterfaceManager#removeAll} delegated correctly to {@link MacPoolManager} & DAOs. + * Verify that {@link VmInterfaceManager#removeAllInterfacesAndMacs} or + * {@link VmInterfaceManager#removeAllInterfacesAndMacsFromList} delegated correctly to {@link MacPoolManager} & + * DAOs. * * @param iface * The interface to check for. diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllErrors.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllErrors.java index 011ac46..a213129 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllErrors.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllErrors.java @@ -364,6 +364,7 @@ MAC_POOL_INITIALIZATION_FAILED(5010), MAC_POOL_NOT_INITIALIZED(5011), MAC_POOL_NO_MACS_LEFT(5012), + MAC_ADDRESS_IS_IN_USE(5013), VM_POOL_CANNOT_ALLOCATE_VM(5014), // Could not allocate VDS for a new VM to run on RESOURCE_MANAGER_CANT_ALLOC_VDS_MIGRATION(5015), diff --git a/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties b/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties index e39b835..19ae47c 100644 --- a/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties +++ b/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties @@ -626,6 +626,7 @@ VAR__TYPE__VM__CLUSTER=$type VM Cluster VDS_FENCING_OPERATION_FAILED=Cannot ${action} ${type}. Fencing operation failed. VM_CANNOT_WITHOUT_ACTIVE_STORAGE_DOMAIN_ISO=Cannot ${action} without active ISO domain. +MAC_ADDRESS_IS_IN_USE=MAC Address is in use. CAN_DO_ACTION_GENERAL_FAILURE - General command validation failure. ERROR_CANNOT_REMOVE_ACTIVE_STORAGE_POOL - Cannot remove an active Data Center. ROLE_TYPE_CANNOT_BE_EMPTY - Invalid Role Type. diff --git a/backend/manager/modules/dal/src/main/resources/bundles/AuditLogMessages.properties b/backend/manager/modules/dal/src/main/resources/bundles/AuditLogMessages.properties index 7495aa9..6f5342e 100644 --- a/backend/manager/modules/dal/src/main/resources/bundles/AuditLogMessages.properties +++ b/backend/manager/modules/dal/src/main/resources/bundles/AuditLogMessages.properties @@ -320,7 +320,7 @@ USER_UPDATE_VM_POOL_WITH_VMS_FAILED=Failed to update VM Pool ${VmPoolName}(User: ${UserName}). USER_VM_POOL_MAX_SUBSEQUENT_FAILURES_REACHED=Not all VMs where successfully created in VM Pool ${VmPoolName}. MAC_POOL_EMPTY=No MAC addresses left in the MAC Address Pool. -MAC_ADDRESS_IS_IN_USE=Import Vm ${VmName}: Mac Address ${MACAddr} is in use +MAC_ADDRESS_IS_IN_USE=VM ${VmName}: Mac Address ${MACAddr} is in use. USER_PASSWORD_CHANGED=Password changed successfully for ${UserName} USER_PASSWORD_CHANGE_FAILED=Failed to change password. (User: ${UserName}) USER_CLEAR_UNKNOWN_VMS=All VMs' status on Non-Responsive Host ${VdsName} were changed to 'Down' by ${UserName} diff --git a/backend/manager/modules/utils/src/test/resources/AppErrors.properties b/backend/manager/modules/utils/src/test/resources/AppErrors.properties index a1f5a75..ac2491c 100644 --- a/backend/manager/modules/utils/src/test/resources/AppErrors.properties +++ b/backend/manager/modules/utils/src/test/resources/AppErrors.properties @@ -333,6 +333,7 @@ ACTION_TYPE_FAILED_VDS_WITH_SAME_MANAGEMENT_IP_EXIST=Cannot ${action} ${type}. Host with the same Power Management address already exists. VDS_FENCING_OPERATION_FAILED=Cannot ${action} ${type}. Fencing opperation failed. # Quota messages. +MAC_ADDRESS_IS_IN_USE=MAC Address is in use. ACTION_TYPE_FAILED_QUOTA_NOT_EXIST=Cannot ${action} ${type}. Quota doesn't exist. ACTION_TYPE_FAILED_QUOTA_IS_NOT_VALID=Cannot ${action} ${type}. Quota is not valid. ACTION_TYPE_FAILED_QUOTA_IS_NO_LONGER_AVAILABLE_IN_SYSTEM=Cannot ${action} ${type}. The quota associated with VM ${VmName} is no longer available. This may be a result of an import or snapshot restoring actions. Please reassign a quota to this VM. diff --git a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java index da53061..9b419b4 100644 --- a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java +++ b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java @@ -1675,6 +1675,9 @@ @DefaultStringValue("Cannot ${action} without active ISO domain.") String VM_CANNOT_WITHOUT_ACTIVE_STORAGE_DOMAIN_ISO(); + @DefaultStringValue("MAC Address is in use.") + String MAC_ADDRESS_IS_IN_USE(); + @DefaultStringValue("General command validation failure.") String CAN_DO_ACTION_GENERAL_FAILURE(); diff --git a/frontend/webadmin/modules/userportal-gwtp/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties b/frontend/webadmin/modules/userportal-gwtp/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties index 86194a7..694a6f1 100644 --- a/frontend/webadmin/modules/userportal-gwtp/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties +++ b/frontend/webadmin/modules/userportal-gwtp/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties @@ -619,6 +619,7 @@ VAR__TYPE__VM__CLUSTER=$type VM Cluster VDS_FENCING_OPERATION_FAILED=Cannot ${action} ${type}. Fencing operation failed. VM_CANNOT_WITHOUT_ACTIVE_STORAGE_DOMAIN_ISO=Cannot ${action} without active ISO domain. +MAC_ADDRESS_IS_IN_USE=Mac Address is in use. CAN_DO_ACTION_GENERAL_FAILURE - General command validation failure. ERROR_CANNOT_REMOVE_ACTIVE_STORAGE_POOL - Cannot remove an active Data Center. ROLE_TYPE_CANNOT_BE_EMPTY - Invalid Role Type. diff --git a/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties b/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties index 2c729ff..296a43a 100644 --- a/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties +++ b/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties @@ -618,6 +618,7 @@ VAR__TYPE__VM__CLUSTER=$type VM Cluster VDS_FENCING_OPERATION_FAILED=Cannot ${action} ${type}. Fencing operation failed. VM_CANNOT_WITHOUT_ACTIVE_STORAGE_DOMAIN_ISO=Cannot ${action} without active ISO domain. +MAC_ADDRESS_IS_IN_USE=Mac Address is in use. CAN_DO_ACTION_GENERAL_FAILURE - General command validation failure. ERROR_CANNOT_REMOVE_ACTIVE_STORAGE_POOL - Cannot remove an active Data Center. ROLE_TYPE_CANNOT_BE_EMPTY - Invalid Role Type. -- To view, visit http://gerrit.ovirt.org/9144 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I68d37ed183adb4adf8abf8b11332f6c822f8c4c0 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