Federico Simoncelli has uploaded a new change for review. Change subject: core: prevent maintenance when domain is sill in use ......................................................................
core: prevent maintenance when domain is sill in use Change-Id: I55cd5aa6a6dc32f374a4bb21b159d3cb30da65f5 Signed-off-by: Federico Simoncelli <[email protected]> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ActivateStorageDomainCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/DeactivateStorageDomainCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ReconstructMasterDomainCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/RemoveStoragePoolCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/StorageDomainCommandBase.java M backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/storage/ActivateStorageDomainCommandTest.java M backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/storage/DeactivateStorageDomainCommandTest.java M backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/storage/ReconstructMasterDomainCommandTest.java M backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/storage/RemoveStoragePoolCommandTest.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/StorageDomainStatus.java M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/VdsManager.java M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsBrokerCommand.java M frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/StorageDomainStatusColumn.java 13 files changed, 192 insertions(+), 26 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/45/22045/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ActivateStorageDomainCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ActivateStorageDomainCommand.java index 693c40e..3787421 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ActivateStorageDomainCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ActivateStorageDomainCommand.java @@ -142,10 +142,11 @@ boolean returnValue; if (isInternalExecution()) { returnValue = checkStorageDomainStatus(StorageDomainStatus.InActive, StorageDomainStatus.Unknown, - StorageDomainStatus.Locked, StorageDomainStatus.Maintenance); + StorageDomainStatus.Locked, StorageDomainStatus.Maintenance, + StorageDomainStatus.MovingToMaintenance); } else { returnValue = checkStorageDomainStatus(StorageDomainStatus.InActive, StorageDomainStatus.Unknown, - StorageDomainStatus.Maintenance); + StorageDomainStatus.Maintenance, StorageDomainStatus.MovingToMaintenance); } return returnValue; } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/DeactivateStorageDomainCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/DeactivateStorageDomainCommand.java index b529f05..af0de96 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/DeactivateStorageDomainCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/DeactivateStorageDomainCommand.java @@ -107,7 +107,8 @@ return false; } - if (!filterDomainsByStatus(domains, StorageDomainStatus.Locked).isEmpty()) { + if (!filterDomainsByStatus(domains, StorageDomainStatus.Locked).isEmpty() + || !filterDomainsByStatus(domains, StorageDomainStatus.MovingToMaintenance).isEmpty()) { addCanDoActionMessage(VdcBllMessages.ERROR_CANNOT_DEACTIVATE_MASTER_WITH_LOCKED_DOMAINS); return false; } @@ -167,7 +168,8 @@ (new StoragePoolIsoMapId(getParameters().getStorageDomainId(), getParameters().getStoragePoolId())); map.setStatus(StorageDomainStatus.Unknown); - changeStorageDomainStatusInTransaction(map, StorageDomainStatus.Locked); + changeStorageDomainStatusInTransaction(map, + getParameters().isInactive() ? StorageDomainStatus.Locked : StorageDomainStatus.MovingToMaintenance); proceedStorageDomainTreatmentByDomainType(false); if (_isLastMaster) { @@ -227,8 +229,6 @@ public Object runInTransaction() { if (getParameters().isInactive()) { map.setStatus(StorageDomainStatus.InActive); - } else { - map.setStatus(StorageDomainStatus.Maintenance); } getStoragePoolIsoMapDAO().updateStatus(map.getId(), map.getStatus()); if (!Guid.Empty.equals(_newMasterStorageDomainId)) { diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ReconstructMasterDomainCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ReconstructMasterDomainCommand.java index 67d6f8c..b2fecf3 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ReconstructMasterDomainCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/ReconstructMasterDomainCommand.java @@ -51,8 +51,8 @@ } private boolean checkIsDomainLocked(StoragePoolIsoMap domainMap) { - if (StorageDomainStatus.Locked == domainMap.getStatus()) { - addInvalidSDStatusMessage(StorageDomainStatus.Locked); + if (domainMap.getStatus().isLocked()) { + addInvalidSDStatusMessage(domainMap.getStatus()); return true; } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/RemoveStoragePoolCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/RemoveStoragePoolCommand.java index 2327d76..8583a0f 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/RemoveStoragePoolCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/RemoveStoragePoolCommand.java @@ -366,7 +366,7 @@ domainsList = LinqUtils.filter(domainsList, new Predicate<StorageDomain>() { @Override public boolean eval(StorageDomain dom) { - return (dom.getStatus() == StorageDomainStatus.Active || dom.getStatus() == StorageDomainStatus.Locked); + return (dom.getStatus() == StorageDomainStatus.Active || dom.getStatus().isLocked()); } }); return domainsList; diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/StorageDomainCommandBase.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/StorageDomainCommandBase.java index 19a7d37..8590f4a 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/StorageDomainCommandBase.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/storage/StorageDomainCommandBase.java @@ -164,7 +164,7 @@ valid = Arrays.asList(statuses).contains(status); } if (!valid) { - if (status == StorageDomainStatus.Locked) { + if (status.isLocked()) { return failCanDoAction(VdcBllMessages.ACTION_TYPE_FAILED_OBJECT_LOCKED); } addStorageDomainStatusIllegalMessage(); diff --git a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/storage/ActivateStorageDomainCommandTest.java b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/storage/ActivateStorageDomainCommandTest.java index 2e9cd27..c4ac393 100644 --- a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/storage/ActivateStorageDomainCommandTest.java +++ b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/storage/ActivateStorageDomainCommandTest.java @@ -95,6 +95,16 @@ } @Test + public void internalMovingToMaintenanceAllowed() { + internalActionAllowed(StorageDomainStatus.MovingToMaintenance); + } + + @Test + public void nonInternalMovingToMaintenanceAllowed() { + nonInternalActionAllowed(StorageDomainStatus.MovingToMaintenance); + } + + @Test public void nonActiveVdsDisallowed() { testNonActiveVdsExecution(StorageDomainStatus.Maintenance); canDoActionFails(); diff --git a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/storage/DeactivateStorageDomainCommandTest.java b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/storage/DeactivateStorageDomainCommandTest.java index 2160dca..2fcc0a0 100644 --- a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/storage/DeactivateStorageDomainCommandTest.java +++ b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/storage/DeactivateStorageDomainCommandTest.java @@ -71,7 +71,6 @@ doReturn(mock(IStorageHelper.class)).when(cmd).getStorageHelper(any(StorageDomain.class)); doReturn(dbFacade).when(cmd).getDbFacade(); - when(dbFacade.getStoragePoolIsoMapDao()).thenReturn(isoMapDAO); when(dbFacade.getStoragePoolDao()).thenReturn(storagePoolDAO); when(dbFacade.getVdsDao()).thenReturn(vdsDAO); @@ -80,7 +79,6 @@ when(storagePoolDAO.get(any(Guid.class))).thenReturn(new StoragePool()); when(isoMapDAO.get(any(StoragePoolIsoMapId.class))).thenReturn(map); when(storageDomainDAO.getForStoragePool(any(Guid.class), any(Guid.class))).thenReturn(new StorageDomain()); - doReturn(backendInternal).when(cmd).getBackend(); when(vdsDAO.getAllForStoragePoolAndStatus(any(Guid.class), any(VDSStatus.class))).thenReturn(new ArrayList<VDS>()); when(backendInternal.getResourceManager()).thenReturn(vdsBrokerFrontend); @@ -93,6 +91,6 @@ cmd.setCompensationContext(mock(CompensationContext.class)); cmd.executeCommand(); - assertTrue(map.getStatus() == StorageDomainStatus.Maintenance); + assertTrue(map.getStatus() == StorageDomainStatus.MovingToMaintenance); } } diff --git a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/storage/ReconstructMasterDomainCommandTest.java b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/storage/ReconstructMasterDomainCommandTest.java index 1b54c40..d55ad09 100644 --- a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/storage/ReconstructMasterDomainCommandTest.java +++ b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/storage/ReconstructMasterDomainCommandTest.java @@ -14,12 +14,20 @@ public ReconstructMasterDomainCommand<ReconstructMasterParameters> cmd = new ReconstructMasterDomainCommand(new ReconstructMasterParameters()); - @Test - public void testAddInvalidSDStatusMessage() { - StorageDomainStatus status = StorageDomainStatus.Locked; + private void testAddInvalidSDStatusMessage(StorageDomainStatus status) { cmd.addInvalidSDStatusMessage(status); List<String> messages = cmd.getReturnValue().getCanDoActionMessages(); assertEquals(messages.get(0), VdcBllMessages.ACTION_TYPE_FAILED_STORAGE_DOMAIN_STATUS_ILLEGAL2.toString()); assertEquals(messages.get(1), String.format("$status %1$s", status)); } + + @Test + public void testAddInvalidSDStatusMessageLocked() { + testAddInvalidSDStatusMessage(StorageDomainStatus.Locked); + } + + @Test + public void testAddInvalidSDStatusMessageMovingToMaintenance() { + testAddInvalidSDStatusMessage(StorageDomainStatus.MovingToMaintenance); + } } diff --git a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/storage/RemoveStoragePoolCommandTest.java b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/storage/RemoveStoragePoolCommandTest.java index 5940bed..26e6c08 100644 --- a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/storage/RemoveStoragePoolCommandTest.java +++ b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/storage/RemoveStoragePoolCommandTest.java @@ -40,33 +40,41 @@ assertTrue(!listReturned.isEmpty()); } - /** - * Test when there is locked domain is in the Data Center. - */ - @Test - public void testLockedDomainInList() { + private void testBusyDomainInList(StorageDomainStatus status) { StoragePoolParametersBase param = new StoragePoolParametersBase(); RemoveStoragePoolCommand<StoragePoolParametersBase> cmd = createCommand(param); List<StorageDomain> domainsList = new ArrayList<StorageDomain>(); StorageDomain tempStorageDomains = new StorageDomain(); - tempStorageDomains.setStatus(StorageDomainStatus.Locked); + tempStorageDomains.setStatus(status); domainsList.add(tempStorageDomains); List<StorageDomain> listReturned = cmd.getActiveOrLockedDomainList(domainsList); assertTrue(!listReturned.isEmpty()); } /** - * Test when there is locked domain and active is in the Data Center. + * Test removal with locked domain in the Data Center. */ @Test - public void testLockedAndActiveDomainInList() { + public void testLockedDomainInList() { + testBusyDomainInList(StorageDomainStatus.Locked); + } + + /** + * Test removal with moving to maintenance domain in the Data Center. + */ + @Test + public void testMovingToMaintenanceDomainInList() { + testBusyDomainInList(StorageDomainStatus.MovingToMaintenance); + } + + private void testBusyAndActiveDomainInList(StorageDomainStatus status) { StoragePoolParametersBase param = new StoragePoolParametersBase(); RemoveStoragePoolCommand<StoragePoolParametersBase> cmd = createCommand(param); List<StorageDomain> domainsList = new ArrayList<StorageDomain>(); // Add first locked storage StorageDomain tempStorageDomains = new StorageDomain(); - tempStorageDomains.setStatus(StorageDomainStatus.Locked); + tempStorageDomains.setStatus(status); domainsList.add(tempStorageDomains); // Add second active storage @@ -78,6 +86,22 @@ } /** + * Test removal with locked and active domains in the Data Center. + */ + @Test + public void testLockedAndActiveDomainInList() { + testBusyAndActiveDomainInList(StorageDomainStatus.Locked); + } + + /** + * Test removal with moving to maintenance and active domains in the Data Center. + */ + @Test + public void testMovingToMaintenanceAndActiveDomainInList() { + testBusyAndActiveDomainInList(StorageDomainStatus.MovingToMaintenance); + } + + /** * Test when there is in active domain. */ @Test diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/StorageDomainStatus.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/StorageDomainStatus.java index d7def9c..3ae56c4 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/StorageDomainStatus.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/StorageDomainStatus.java @@ -7,7 +7,8 @@ Active, InActive, Locked, - Maintenance; + Maintenance, + MovingToMaintenance; public int getValue() { return this.ordinal(); @@ -17,4 +18,7 @@ return values()[value]; } + public boolean isLocked() { + return this == Locked || this == MovingToMaintenance; + } } diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/VdsManager.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/VdsManager.java index 234b731..2d85cb6 100644 --- a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/VdsManager.java +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/VdsManager.java @@ -279,6 +279,8 @@ } + IrsBrokerCommand.updateVdsDomainsVisibility(tmpVds, domainsList); + // Now update the status of domains, this code should not be in // synchronized part of code if (domainsList != null) { diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsBrokerCommand.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsBrokerCommand.java index c446afc..25beaf1 100644 --- a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsBrokerCommand.java +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/irsbroker/IrsBrokerCommand.java @@ -103,6 +103,13 @@ } } + public static void updateVdsDomainsVisibility(VDS vds, ArrayList<VDSDomainsData> vdsDomainData) { + IrsProxyData proxy = _irsProxyData.get(vds.getStoragePoolId()); + if (proxy != null) { + proxy.updateDomainsVisibility(vds, vdsDomainData); + } + } + public static List<Guid> fetchDomainsReportedAsProblematic(Guid storagePoolId, List<VDSDomainsData> vdsDomainsData) { IrsProxyData proxy = _irsProxyData.get(storagePoolId); if (proxy != null) { @@ -1001,6 +1008,117 @@ mCurrentVdsId = null; } + // key: domain id, value: set of vds ids + private final Map<Guid, HashSet<Guid>> _domainsVisibility = new ConcurrentHashMap<>(); + + public void updateDomainsVisibility(VDS vds, ArrayList<VDSDomainsData> domainsDataList) { + // Step 1: if the host is not Up remove it from all the entries in the _domainsVisibility + if (vds.getStatus() == VDSStatus.Maintenance) { + for (HashSet<Guid> domainHostsSet : _domainsVisibility.values()) { + if (domainHostsSet.contains(vds.getId())) { + log.infoFormat("Removing domain in maintenance {0} from the domain visibility map", + vds.getName()); + domainHostsSet.remove(vds.getId()); + } + } + return; // do not process the domainsDataList + } else if (domainsDataList == null) { + return; // skipping, no data to process + } + + Map<Guid, VDSDomainsData> dataDomainMap = new HashMap<>(); + for (VDSDomainsData domainsData : domainsDataList) { + dataDomainMap.put(domainsData.getDomainId(), domainsData); + } + + Map<Guid, StorageDomain> poolDomainMap = new HashMap<>(); + for (StorageDomain poolDomain : + DbFacade.getInstance().getStorageDomainDao().getAllForStoragePool(_storagePoolId)) { + poolDomainMap.put(poolDomain.getId(), poolDomain); + } + + // Step 2: remove vds from each domain it didn't report (and that is not problematic) + for (VDSDomainsData domainData : dataDomainMap.values()) { + HashSet<Guid> domainHostsSet; + + domainHostsSet = _domainsVisibility.get(domainData.getDomainId()); + if (domainHostsSet == null) { + log.infoFormat("Adding the domain {0} to the domain visibility map", + domainData.getDomainId()); + domainHostsSet = new HashSet<>(); + _domainsVisibility.put(domainData.getDomainId(), domainHostsSet); + } + + if (!domainHostsSet.contains(vds.getId()) && !isDomainReportedAsProblematic(domainData, false)) { + log.infoFormat("Adding a new VDS {0} to the visibility map for domain {1}", + vds.getName(), domainData.getDomainId()); + domainHostsSet.add(vds.getId()); + } + } + + // Step 3: remove vds from each domain it didn't report (or that is problematic) + for (StorageDomain poolDomain : poolDomainMap.values()) { + VDSDomainsData domainData = dataDomainMap.get(poolDomain.getId()); + + if (domainData == null || isDomainReportedAsProblematic(domainData, false)) { + HashSet<Guid> domainHostsSet = _domainsVisibility.get(poolDomain.getId()); + if (domainHostsSet != null && domainHostsSet.contains(vds.getId())) { + log.infoFormat("Removing VDS {0} from the visibility map of domain {1}", + vds.getName(), poolDomain.getId()); + domainHostsSet.remove(vds.getId()); + } + } + } + + // Step 4: check if any domain can be removed from the map (detached and not reported by any vds) + for (Guid storageDomainId : _domainsVisibility.keySet()) { + if (!poolDomainMap.containsKey(storageDomainId)) { + // TODO: check that there are not vds in the HashSet + log.infoFormat("Removing domain {0} from the visibility map"); + _domainsVisibility.remove(storageDomainId); + } + } + + // Step 5: try to synchronize the vds domain visibility when needed + syncVdsDomainVisibility(vds, dataDomainMap); + + // Step 6: move the relevant domains to maintenance when needed + moveDomainsToMaintenance(); + } + + private void syncVdsDomainVisibility(VDS vds, Map<Guid, VDSDomainsData> dataDomainMap) { + boolean refreshNeeded = false; + + for (StorageDomain poolDomain : + DbFacade.getInstance().getStorageDomainDao().getAllForStoragePool(_storagePoolId)) { + VDSDomainsData domainData = dataDomainMap.get(poolDomain.getId()); + if ((domainData == null && poolDomain.getStatus() == StorageDomainStatus.Active) + || (domainData != null && poolDomain.getStatus() == StorageDomainStatus.Maintenance)) { + refreshNeeded = true; + break; + } + } + + if (refreshNeeded) { + // ResourceManager.getInstance().runVdsCommand( + // VDSCommandType.RefreshStoragePool, new RefreshStoragePoolVDSCommandParameters( + // vds.getId(), _storagePoolId, ... + } + } + + private void moveDomainsToMaintenance() { + for (StorageDomain poolDomain : + DbFacade.getInstance().getStorageDomainDao().getAllForStoragePool(_storagePoolId)) { + if (poolDomain.getStatus() != StorageDomainStatus.MovingToMaintenance || + !_domainsVisibility.get(poolDomain.getId()).isEmpty()) { + continue; + } + log.infoFormat("Moving domain {0} to maintenance", poolDomain.getId()); + DbFacade.getInstance().getStoragePoolIsoMapDao().updateStatus( + poolDomain.getStoragePoolIsoMapData().getId(), StorageDomainStatus.Maintenance); + } + } + private final Map<Guid, HashSet<Guid>> _domainsInProblem = new ConcurrentHashMap<Guid, HashSet<Guid>>(); private final Map<Guid, String> _timers = new HashMap<Guid, String>(); diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/StorageDomainStatusColumn.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/StorageDomainStatusColumn.java index d4392c3..ca35614 100644 --- a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/StorageDomainStatusColumn.java +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/StorageDomainStatusColumn.java @@ -24,6 +24,7 @@ case Uninitialized: return getApplicationResources().unconfiguredImage(); case Locked: + case MovingToMaintenance: return getApplicationResources().lockImage(); default: return getApplicationResources().downImage(); -- To view, visit http://gerrit.ovirt.org/22045 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I55cd5aa6a6dc32f374a4bb21b159d3cb30da65f5 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Federico Simoncelli <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
