Shubhendu Tripathi has uploaded a new change for review. Change subject: gluster: Added additional can do action check ......................................................................
gluster: Added additional can do action check Added additional canDoAction check for stop and commit remove brick actions. If the set of bricks passed as parameter during stop/commit od remove bricks action does not match with the set of bricks used during starting the remove brick, it would throw an error. Change-Id: Id7f5d3b48985552aa5f74178008beb39ee7a06f9 Bug-Url: https://bugzilla.redhat.com/1040686 Signed-off-by: Shubhendu Tripathi <shtri...@redhat.com> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/CommitRemoveGlusterVolumeBricksCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterAsyncCommandBase.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterCommandBase.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/StopRemoveGlusterVolumeBricksCommand.java M backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/gluster/CommitRemoveGlusterVolumeBricksCommandTest.java M backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/gluster/StopRemoveGlusterVolumeBricksCommandTest.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java M backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties M frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java M frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties 10 files changed, 130 insertions(+), 9 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/53/22353/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/CommitRemoveGlusterVolumeBricksCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/CommitRemoveGlusterVolumeBricksCommand.java index 9deedc2..40c2bd7 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/CommitRemoveGlusterVolumeBricksCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/CommitRemoveGlusterVolumeBricksCommand.java @@ -43,10 +43,6 @@ return false; } - if (getParameters().getBricks().isEmpty()) { - return failCanDoAction(VdcBllMessages.ACTION_TYPE_FAILED_BRICKS_REQUIRED); - } - if (!(getGlusterTaskUtils().isTaskOfType(volume, GlusterTaskType.REMOVE_BRICK)) || !(getGlusterTaskUtils().isTaskStatus(volume, JobExecutionStatus.FINISHED))) { return failCanDoAction(VdcBllMessages.ACTION_TYPE_FAILED_GLUSTER_VOLUME_REMOVE_BRICKS_NOT_FINISHED); diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterAsyncCommandBase.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterAsyncCommandBase.java index 0d4db34..9b92f29 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterAsyncCommandBase.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterAsyncCommandBase.java @@ -3,6 +3,7 @@ import java.util.Collections; import java.util.Date; import java.util.HashMap; +import java.util.List; import java.util.Map; import org.ovirt.engine.core.bll.LockMessagesMatchUtil; @@ -11,7 +12,10 @@ import org.ovirt.engine.core.bll.job.ExecutionHandler; import org.ovirt.engine.core.bll.job.JobRepositoryFactory; import org.ovirt.engine.core.common.action.gluster.GlusterVolumeParameters; +import org.ovirt.engine.core.common.action.gluster.GlusterVolumeRemoveBricksParameters; import org.ovirt.engine.core.common.asynctasks.gluster.GlusterAsyncTask; +import org.ovirt.engine.core.common.asynctasks.gluster.GlusterTaskType; +import org.ovirt.engine.core.common.businessentities.gluster.GlusterBrickEntity; import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity; import org.ovirt.engine.core.common.constants.gluster.GlusterConstants; import org.ovirt.engine.core.common.errors.VdcBllMessages; @@ -44,6 +48,35 @@ return failCanDoAction(VdcBllMessages.ACTION_TYPE_FAILED_GLUSTER_VOLUME_SHOULD_BE_STARTED); } + GlusterAsyncTask asyncTask = glusterVolume.getAsyncTask(); + if (asyncTask != null && asyncTask.getType() == GlusterTaskType.REMOVE_BRICK) { + GlusterVolumeRemoveBricksParameters params = (GlusterVolumeRemoveBricksParameters)getParameters(); + if (params.getBricks().isEmpty()) { + return failCanDoAction(VdcBllMessages.ACTION_TYPE_FAILED_BRICKS_REQUIRED); + } + + List<GlusterBrickEntity> bricksForTask = getGlusterBrickDao().getGlusterVolumeBricksByTaskId(asyncTask.getTaskId()); + List<GlusterBrickEntity> paramBricks = params.getBricks(); + if (paramBricks.size() != bricksForTask.size()) { + return failCanDoAction(VdcBllMessages.ACTION_TYPE_FAILED_GLUSTER_VOLUME_REMOVE_BRICKS_PARAMS_SIZE_DOES_NOT_MATCH); + } + + int counter = 0; + for (GlusterBrickEntity paramBrick : paramBricks) { + for (GlusterBrickEntity brick : bricksForTask) { + // If parameter brick directory matches with any brick no need to continue further to check + if (paramBrick.getBrickDirectory().equals(brick.getBrickDirectory())) { + break; + } + counter++; + // If the bricks list exhausted, it means the parameter brick does found, throw an error + if (counter == bricksForTask.size()) { + return failCanDoAction(VdcBllMessages.ACTION_TYPE_FAILED_GLUSTER_VOLUME_REMOVE_BRICKS_PARAMS_INVALID); + } + } + } + } + return true; } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterCommandBase.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterCommandBase.java index 33cc88a..37e99e1 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterCommandBase.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterCommandBase.java @@ -172,7 +172,7 @@ return getDbFacade().getVdsStaticDao(); } - protected GlusterBrickDao getGlusterBrickDao() { + public GlusterBrickDao getGlusterBrickDao() { return getDbFacade().getGlusterBrickDao(); } } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/StopRemoveGlusterVolumeBricksCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/StopRemoveGlusterVolumeBricksCommand.java index 4e294e2..7499ce5 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/StopRemoveGlusterVolumeBricksCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/StopRemoveGlusterVolumeBricksCommand.java @@ -39,10 +39,6 @@ return false; } - if (getParameters().getBricks().isEmpty()) { - return failCanDoAction(VdcBllMessages.ACTION_TYPE_FAILED_BRICKS_REQUIRED); - } - if (!(getGlusterTaskUtils().isTaskOfType(volume, GlusterTaskType.REMOVE_BRICK)) || !(getGlusterTaskUtils().isTaskStatus(volume, JobExecutionStatus.STARTED) || getGlusterTaskUtils().isTaskStatus(volume, JobExecutionStatus.FINISHED))) { diff --git a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/gluster/CommitRemoveGlusterVolumeBricksCommandTest.java b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/gluster/CommitRemoveGlusterVolumeBricksCommandTest.java index e90f60e..7ab76bc 100644 --- a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/gluster/CommitRemoveGlusterVolumeBricksCommandTest.java +++ b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/gluster/CommitRemoveGlusterVolumeBricksCommandTest.java @@ -3,6 +3,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import static org.mockito.Matchers.any; import static org.mockito.Matchers.argThat; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.doNothing; @@ -80,6 +81,7 @@ doReturn(getVds(VDSStatus.Up)).when(command).getUpServer(); doReturn(getVolumeWithRemoveBricksTask(volumeWithRemoveBricksTask)).when(volumeDao) .getById(volumeWithRemoveBricksTask); + doReturn(getBricks(volumeWithoutRemoveBricksTask, 2)).when(brickDao).getGlusterVolumeBricksByTaskId(any(Guid.class)); doReturn(getVolumeWithRemoveBricksTaskNotFinished(volumeWithRemoveBricksTaskNotFinished)).when(volumeDao) .getById(volumeWithRemoveBricksTaskNotFinished); doReturn(getVolume(volumeWithoutAsyncTask)).when(volumeDao).getById(volumeWithoutAsyncTask); @@ -149,6 +151,31 @@ brick.setStatus(GlusterStatus.UP); bricks.add(brick); } + return bricks; + } + + private List<GlusterBrickEntity> getInvalidNoOfBricks(Guid volumeId) { + List<GlusterBrickEntity> bricks = new ArrayList<GlusterBrickEntity>(); + GlusterBrickEntity brick = new GlusterBrickEntity(); + brick.setVolumeId(volumeId); + brick.setBrickDirectory("/tmp/test-vol1"); + brick.setStatus(GlusterStatus.UP); + bricks.add(brick); + return bricks; + } + + private List<GlusterBrickEntity> getInvalidBricks(Guid volumeId) { + List<GlusterBrickEntity> bricks = new ArrayList<GlusterBrickEntity>(); + GlusterBrickEntity brick1 = new GlusterBrickEntity(); + brick1.setVolumeId(volumeId); + brick1.setBrickDirectory("/tmp/test-vol11"); + brick1.setStatus(GlusterStatus.UP); + bricks.add(brick1); + GlusterBrickEntity brick2 = new GlusterBrickEntity(); + brick2.setVolumeId(volumeId); + brick2.setBrickDirectory("/tmp/test-vol122"); + brick2.setStatus(GlusterStatus.UP); + bricks.add(brick2); return bricks; } @@ -267,4 +294,17 @@ prepareMocks(cmd); assertFalse(cmd.canDoAction()); } + + @Test + public void canDoActionFailsWithInvalidParams() { + List<GlusterBrickEntity> paramBricks1 = getInvalidNoOfBricks(volumeWithRemoveBricksTask); + cmd = spy(new CommitRemoveGlusterVolumeBricksCommand(new GlusterVolumeRemoveBricksParameters(volumeWithRemoveBricksTask, paramBricks1))); + prepareMocks(cmd); + assertFalse(cmd.canDoAction()); + + List<GlusterBrickEntity> paramBricks2 = getInvalidBricks(volumeWithRemoveBricksTask); + cmd = spy(new CommitRemoveGlusterVolumeBricksCommand(new GlusterVolumeRemoveBricksParameters(volumeWithRemoveBricksTask, paramBricks2))); + prepareMocks(cmd); + assertFalse(cmd.canDoAction()); + } } diff --git a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/gluster/StopRemoveGlusterVolumeBricksCommandTest.java b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/gluster/StopRemoveGlusterVolumeBricksCommandTest.java index c25bc3e..17840b5 100644 --- a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/gluster/StopRemoveGlusterVolumeBricksCommandTest.java +++ b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/gluster/StopRemoveGlusterVolumeBricksCommandTest.java @@ -3,6 +3,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import static org.mockito.Matchers.any; import static org.mockito.Matchers.argThat; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.doNothing; @@ -43,6 +44,7 @@ import org.ovirt.engine.core.common.vdscommands.VDSReturnValue; import org.ovirt.engine.core.common.vdscommands.gluster.GlusterVolumeVDSParameters; import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.dao.gluster.GlusterBrickDao; import org.ovirt.engine.core.dao.gluster.GlusterVolumeDao; @RunWith(MockitoJUnitRunner.class) @@ -50,6 +52,8 @@ @Mock GlusterVolumeDao volumeDao; + @Mock + GlusterBrickDao brickDao; @Mock protected BackendInternal backend; @Mock @@ -68,9 +72,11 @@ private void prepareMocks(StopRemoveGlusterVolumeBricksCommand command) { doReturn(volumeDao).when(command).getGlusterVolumeDao(); + doReturn(brickDao).when(command).getGlusterBrickDao(); doReturn(getVds(VDSStatus.Up)).when(command).getUpServer(); doReturn(getVolumeWithRemoveBricksTask(volumeWithRemoveBricksTask)).when(volumeDao) .getById(volumeWithRemoveBricksTask); + doReturn(getBricks(volumeWithoutRemoveBricksTask, 2)).when(brickDao).getGlusterVolumeBricksByTaskId(any(Guid.class)); doReturn(getVolumeWithRemoveBricksTaskCompleted(volumeWithRemoveBricksTaskCompleted)).when(volumeDao) .getById(volumeWithRemoveBricksTaskCompleted); doReturn(getVolume(volumeWithoutAsyncTask)).when(volumeDao).getById(volumeWithoutAsyncTask); @@ -132,6 +138,31 @@ brick.setStatus(GlusterStatus.UP); bricks.add(brick); } + return bricks; + } + + private List<GlusterBrickEntity> getInvalidNoOfBricks(Guid volumeId) { + List<GlusterBrickEntity> bricks = new ArrayList<GlusterBrickEntity>(); + GlusterBrickEntity brick = new GlusterBrickEntity(); + brick.setVolumeId(volumeId); + brick.setBrickDirectory("/tmp/test-vol1"); + brick.setStatus(GlusterStatus.UP); + bricks.add(brick); + return bricks; + } + + private List<GlusterBrickEntity> getInvalidBricks(Guid volumeId) { + List<GlusterBrickEntity> bricks = new ArrayList<GlusterBrickEntity>(); + GlusterBrickEntity brick1 = new GlusterBrickEntity(); + brick1.setVolumeId(volumeId); + brick1.setBrickDirectory("/tmp/test-vol11"); + brick1.setStatus(GlusterStatus.UP); + bricks.add(brick1); + GlusterBrickEntity brick2 = new GlusterBrickEntity(); + brick2.setVolumeId(volumeId); + brick2.setBrickDirectory("/tmp/test-vol122"); + brick2.setStatus(GlusterStatus.UP); + bricks.add(brick2); return bricks; } @@ -258,4 +289,17 @@ prepareMocks(cmd); assertFalse(cmd.canDoAction()); } + + @Test + public void canDoActionFailsWithInvalidParams() { + List<GlusterBrickEntity> paramBricks1 = getInvalidNoOfBricks(volumeWithRemoveBricksTask); + cmd = spy(new StopRemoveGlusterVolumeBricksCommand(new GlusterVolumeRemoveBricksParameters(volumeWithRemoveBricksTask, paramBricks1))); + prepareMocks(cmd); + assertFalse(cmd.canDoAction()); + + List<GlusterBrickEntity> paramBricks2 = getInvalidBricks(volumeWithRemoveBricksTask); + cmd = spy(new StopRemoveGlusterVolumeBricksCommand(new GlusterVolumeRemoveBricksParameters(volumeWithRemoveBricksTask, paramBricks2))); + prepareMocks(cmd); + assertFalse(cmd.canDoAction()); + } } diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java index b3a63df..cb8e791 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java @@ -765,6 +765,8 @@ ACTION_TYPE_FAILED_NOT_A_GLUSTER_VOLUME_BRICK(ErrorType.BAD_PARAMETERS), ACTION_TYPE_FAILED_GLUSTER_VOLUME_REMOVE_BRICKS_NOT_STARTED(ErrorType.CONFLICT), ACTION_TYPE_FAILED_GLUSTER_VOLUME_REMOVE_BRICKS_NOT_FINISHED(ErrorType.CONFLICT), + ACTION_TYPE_FAILED_GLUSTER_VOLUME_REMOVE_BRICKS_PARAMS_SIZE_DOES_NOT_MATCH(ErrorType.CONFLICT), + ACTION_TYPE_FAILED_GLUSTER_VOLUME_REMOVE_BRICKS_PARAMS_INVALID(ErrorType.BAD_PARAMETERS), ACTION_TYPE_FAILED_CAN_NOT_REMOVE_ALL_BRICKS_FROM_VOLUME(ErrorType.CONFLICT), ACTION_TYPE_FAILED_CAN_NOT_REDUCE_REPLICA_COUNT_MORE_THAN_ONE(ErrorType.CONFLICT), ACTION_TYPE_FAILED_CAN_NOT_REDUCE_REPLICA_COUNT_WITH_DATA_MIGRATION(ErrorType.CONFLICT), 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 3a10344..59be466 100644 --- a/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties +++ b/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties @@ -958,6 +958,8 @@ ACTION_TYPE_FAILED_GLUSTER_VOLUME_DISTRIBUTED_AND_HAS_SINGLE_BRICK=Cannot ${action} ${type}. Gluster Volume has a single brick. ACTION_TYPE_FAILED_GLUSTER_VOLUME_REMOVE_BRICKS_NOT_STARTED=Cannot ${action} ${type}. Remove brick not started. ACTION_TYPE_FAILED_GLUSTER_VOLUME_REMOVE_BRICKS_NOT_FINISHED=Cannot ${action} ${type}. Remove brick not finished. +ACTION_TYPE_FAILED_GLUSTER_VOLUME_REMOVE_BRICKS_PARAMS_SIZE_DOES_NOT_MATCH=Cannot ${action} ${type}. The no of bricks does not match with the bricks used while starting the action. +ACTION_TYPE_FAILED_GLUSTER_VOLUME_REMOVE_BRICKS_PARAMS_INVALID=Cannot ${action} ${type}. The list of bricks does not match with the bricks used while starting the action. ACTION_TYPE_FAILED_NOT_A_GLUSTER_VOLUME_BRICK=Cannot ${action} ${type}. Replacing brick is not a Gluster volume brick. ACTION_TYPE_FAILED_NO_GLUSTER_HOST_TO_PEER_PROBE=Cannot ${action} ${type}. There is no available server in the cluster to probe the new server. ACTION_TYPE_FAILED_CAN_NOT_REDUCE_REPLICA_COUNT_MORE_THAN_ONE=Cannot ${action} ${type}. Replica count cannot be reduced by more than one. 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 24098c9..36795b9 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 @@ -2531,6 +2531,12 @@ @DefaultStringValue("Cannot ${action} ${type}. Remove brick not started.") String ACTION_TYPE_FAILED_GLUSTER_VOLUME_REMOVE_BRICKS_NOT_STARTED(); + @DefaultStringValue("Cannot ${action} ${type}. The no of bricks does not match with the bricks used while starting the action.") + String ACTION_TYPE_FAILED_GLUSTER_VOLUME_REMOVE_BRICKS_PARAMS_SIZE_DOES_NOT_MATCH(); + + @DefaultStringValue("Cannot ${action} ${type}. The list of bricks does not match with the bricks used while starting the action.") + String ACTION_TYPE_FAILED_GLUSTER_VOLUME_REMOVE_BRICKS_PARAMS_INVALID(); + @DefaultStringValue("Cannot ${action} ${type}. Remove brick not finished.") String ACTION_TYPE_FAILED_GLUSTER_VOLUME_REMOVE_BRICKS_NOT_FINISHED(); 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 6659c13..0ad291a 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 @@ -950,6 +950,8 @@ ACTION_TYPE_FAILED_GLUSTER_VOLUME_DISTRIBUTED_AND_HAS_SINGLE_BRICK=Cannot ${action} ${type}. Gluster Volume has a single brick. ACTION_TYPE_FAILED_GLUSTER_VOLUME_REMOVE_BRICKS_NOT_STARTED=Cannot ${action} ${type}. Remove brick not started. ACTION_TYPE_FAILED_GLUSTER_VOLUME_REMOVE_BRICKS_NOT_FINISHED=Cannot ${action} ${type}. Remove brick not finished. +ACTION_TYPE_FAILED_GLUSTER_VOLUME_REMOVE_BRICKS_PARAMS_SIZE_DOES_NOT_MATCH=Cannot ${action} ${type}. The no of bricks does not match with the bricks used while starting the action. +ACTION_TYPE_FAILED_GLUSTER_VOLUME_REMOVE_BRICKS_PARAMS_INVALID=Cannot ${action} ${type}. The list of bricks does not match with the bricks used while starting the action. ACTION_TYPE_FAILED_NOT_A_GLUSTER_VOLUME_BRICK=Cannot ${action} ${type}. Replacing brick is not a Gluster volume brick. VDS_CANNOT_REMOVE_HOST_HAVING_GLUSTER_VOLUME=Cannot ${action} ${type}. Server having Gluster volume. ACTION_TYPE_FAILED_NO_GLUSTER_HOST_TO_PEER_PROBE=Cannot ${action} ${type}. There is no available server in the cluster to probe the new server. -- To view, visit http://gerrit.ovirt.org/22353 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Id7f5d3b48985552aa5f74178008beb39ee7a06f9 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Shubhendu Tripathi <shtri...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches