anmolbabu has uploaded a new change for review.

Change subject: engine : Query to fetch list of volumes eligible for geo 
replication
......................................................................

engine : Query to fetch list of volumes eligible for geo replication

Query to fetch list of volumes eligible for geo replication session.
This query fetches a list of volumes satisfying the required
conditions for geo replication session establishment.

Change-Id: I0fc3ecb15535181f1ca2a8780461cb89788a3f41
Signed-off-by: Anmol Babu <[email protected]>
---
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GetGlusterGeoReplicationEligibleVolumesQuery.java
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GetNonEligibilityReasonsOfVolumeForGeoRepSessionQuery.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterQueriesCommandBase.java
A 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/utils/GlusterGeoRepUtil.java
A 
backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/gluster/GeoRepCreateEligibilityBaseTest.java
A 
backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/gluster/GetGlusterGeoReplicationEligibleVolumesQueryTest.java
A 
backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/gluster/GetNonEligibilityReasonsOfVolumeForGeoRepSessionQueryTest.java
A 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterGeoRepNonEligibilityReason.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java
A 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/gluster/GlusterVolumeGeoRepEligibilityParameters.java
M 
backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VdsGroupDAO.java
M 
backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VdsGroupDAODbFacadeImpl.java
M 
backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterGeoRepDao.java
M 
backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterGeoRepDaoDbFacadeImpl.java
M 
backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/VdsGroupDAOTest.java
M 
backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/gluster/GlusterGeoRepDaoTest.java
M 
frontend/webadmin/modules/gwt-common/src/main/resources/org/ovirt/engine/core/Common.gwt.xml
M packaging/dbscripts/gluster_georep_sp.sql
M packaging/dbscripts/vds_groups_sp.sql
19 files changed, 636 insertions(+), 0 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/31/39431/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GetGlusterGeoReplicationEligibleVolumesQuery.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GetGlusterGeoReplicationEligibleVolumesQuery.java
new file mode 100644
index 0000000..4d1c603
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GetGlusterGeoReplicationEligibleVolumesQuery.java
@@ -0,0 +1,58 @@
+package org.ovirt.engine.core.bll.gluster;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.ovirt.engine.core.bll.utils.GlusterGeoRepUtil;
+import org.ovirt.engine.core.bll.utils.Injector;
+import org.ovirt.engine.core.common.businessentities.VDSGroup;
+import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterGeoRepNonEligibilityReason;
+import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity;
+import org.ovirt.engine.core.common.queries.IdQueryParameters;
+import org.ovirt.engine.core.compat.Guid;
+import org.ovirt.engine.core.utils.linq.LinqUtils;
+import org.ovirt.engine.core.utils.linq.Predicate;
+
+public class GetGlusterGeoReplicationEligibleVolumesQuery<P extends 
IdQueryParameters> extends GlusterQueriesCommandBase<IdQueryParameters> {
+
+    public GlusterGeoRepUtil getGeoRepUtilInstance() {
+        return Injector.get(GlusterGeoRepUtil.class);
+    }
+
+    public GetGlusterGeoReplicationEligibleVolumesQuery(IdQueryParameters 
parameters) {
+        super(parameters);
+    }
+
+    @Override
+    protected void executeQueryCommand() {
+        Guid masterVolumeId = getParameters().getId();
+        GlusterVolumeEntity masterVolume = 
getGlusterVolumeDao().getById(masterVolumeId);
+        getQueryReturnValue().setReturnValue(getEligibleVolumes(masterVolume));
+    }
+
+    public List<GlusterVolumeEntity> getEligibleVolumes(GlusterVolumeEntity 
masterVolume) {
+        List<GlusterVolumeEntity> possiblyEligibleVolumes = 
getAllGlusterVolumesWithMasterCompatibleVersion(masterVolume.getId());
+        Map<GlusterGeoRepNonEligibilityReason, Predicate<GlusterVolumeEntity>> 
eligibilityPredicateMap = 
getGeoRepUtilInstance().getEligibilityPredicates(masterVolume);
+        for(Map.Entry<GlusterGeoRepNonEligibilityReason, 
Predicate<GlusterVolumeEntity>> eligibilityPredicateMapEntries : 
eligibilityPredicateMap.entrySet()) {
+            possiblyEligibleVolumes = 
LinqUtils.filter(possiblyEligibleVolumes, 
eligibilityPredicateMapEntries.getValue());
+        }
+        return possiblyEligibleVolumes;
+    }
+
+    private List<GlusterVolumeEntity> 
getAllGlusterVolumesWithMasterCompatibleVersion(Guid masterVolumeId) {
+        GlusterVolumeEntity masterVolume = 
getGlusterVolumeDao().getById(masterVolumeId);
+        VDSGroup masterCluster = 
getVdsGroupDao().get(masterVolume.getClusterId());
+        List<VDSGroup> clusters = 
getVdsGroupDao().getClustersByServiceAndCompatibilityVersion(true, false, 
masterCluster.getcompatibility_version().getValue());
+        List<GlusterVolumeEntity> volumes = new ArrayList<>();
+        if(clusters != null) {
+            for(VDSGroup currentCluster : clusters) {
+                if(!currentCluster.getId().equals(masterCluster.getId())) {
+                    
volumes.addAll(getGlusterVolumeDao().getByClusterId(currentCluster.getId()));
+                }
+            }
+        }
+        return volumes;
+    }
+
+}
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GetNonEligibilityReasonsOfVolumeForGeoRepSessionQuery.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GetNonEligibilityReasonsOfVolumeForGeoRepSessionQuery.java
new file mode 100644
index 0000000..cb89ad7
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GetNonEligibilityReasonsOfVolumeForGeoRepSessionQuery.java
@@ -0,0 +1,41 @@
+package org.ovirt.engine.core.bll.gluster;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.ovirt.engine.core.bll.utils.GlusterGeoRepUtil;
+import org.ovirt.engine.core.bll.utils.Injector;
+import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterGeoRepNonEligibilityReason;
+import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity;
+import 
org.ovirt.engine.core.common.queries.gluster.GlusterVolumeGeoRepEligibilityParameters;
+import org.ovirt.engine.core.utils.linq.Predicate;
+
+public class GetNonEligibilityReasonsOfVolumeForGeoRepSessionQuery<P extends 
GlusterVolumeGeoRepEligibilityParameters> extends GlusterQueriesCommandBase<P> {
+
+    public GetNonEligibilityReasonsOfVolumeForGeoRepSessionQuery(P parameters) 
{
+        super(parameters);
+    }
+
+    @Override
+    protected void executeQueryCommand() {
+        GlusterVolumeEntity masterVolume = 
getGlusterVolumeDao().getById(getParameters().getId());
+        GlusterVolumeEntity slaveVolume = 
getGlusterVolumeDao().getById(getParameters().getSlaveVolumeId());
+        
getQueryReturnValue().setReturnValue(getNonEligibilityReasons(masterVolume, 
slaveVolume));
+    }
+
+    protected List<GlusterGeoRepNonEligibilityReason> 
getNonEligibilityReasons(GlusterVolumeEntity masterVolume, GlusterVolumeEntity 
slaveVolume) {
+        List<GlusterGeoRepNonEligibilityReason> nonEligibilityreasons = new 
ArrayList<GlusterGeoRepNonEligibilityReason>();
+        Map<GlusterGeoRepNonEligibilityReason, Predicate<GlusterVolumeEntity>> 
eligibilityPredicateMap = 
getGeoRepUtilInstance().getEligibilityPredicates(masterVolume);
+        for(Map.Entry<GlusterGeoRepNonEligibilityReason, 
Predicate<GlusterVolumeEntity>> eligibilityPredicateMapEntries : 
eligibilityPredicateMap.entrySet()) {
+            if(!eligibilityPredicateMapEntries.getValue().eval(slaveVolume)) {
+                
nonEligibilityreasons.add(eligibilityPredicateMapEntries.getKey());
+            }
+        }
+        return nonEligibilityreasons;
+    }
+
+    protected GlusterGeoRepUtil getGeoRepUtilInstance() {
+        return Injector.get(GlusterGeoRepUtil.class);
+    }
+}
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterQueriesCommandBase.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterQueriesCommandBase.java
index 3843b97..d07b273 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterQueriesCommandBase.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterQueriesCommandBase.java
@@ -12,6 +12,7 @@
 import org.ovirt.engine.core.common.vdscommands.VDSReturnValue;
 import org.ovirt.engine.core.compat.Guid;
 import org.ovirt.engine.core.dal.dbbroker.DbFacade;
+import org.ovirt.engine.core.dao.VdsGroupDAO;
 import org.ovirt.engine.core.dao.gluster.GlusterBrickDao;
 import org.ovirt.engine.core.dao.gluster.GlusterClusterServiceDao;
 import org.ovirt.engine.core.dao.gluster.GlusterGeoRepDao;
@@ -69,6 +70,10 @@
         return vds.getId();
     }
 
+    protected VdsGroupDAO getVdsGroupDao() {
+        return DbFacade.getInstance().getVdsGroupDao();
+    }
+
     protected Guid getRandomUpServerId(Guid clusterId) {
         VDS vds = getClusterUtils().getRandomUpServer(clusterId);
         if (vds == null) {
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/utils/GlusterGeoRepUtil.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/utils/GlusterGeoRepUtil.java
new file mode 100644
index 0000000..8b80097
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/utils/GlusterGeoRepUtil.java
@@ -0,0 +1,108 @@
+package org.ovirt.engine.core.bll.utils;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.inject.Singleton;
+
+import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterGeoRepNonEligibilityReason;
+import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterGeoRepSession;
+import org.ovirt.engine.core.common.businessentities.gluster.GlusterStatus;
+import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity;
+import org.ovirt.engine.core.compat.Guid;
+import org.ovirt.engine.core.compat.Version;
+import org.ovirt.engine.core.dal.dbbroker.DbFacade;
+import org.ovirt.engine.core.dao.VdsGroupDAO;
+import org.ovirt.engine.core.dao.gluster.GlusterGeoRepDao;
+import org.ovirt.engine.core.utils.linq.Predicate;
+
+@Singleton
+public class GlusterGeoRepUtil {
+
+    public Map<GlusterGeoRepNonEligibilityReason, 
Predicate<GlusterVolumeEntity>> getEligibilityPredicates(final 
GlusterVolumeEntity masterVolume) {
+        Map<GlusterGeoRepNonEligibilityReason, Predicate<GlusterVolumeEntity>> 
eligibilityPredicates = new HashMap<>();
+        final List<Guid> existingSessionSlavesIds = getSessionSlaveVolumeIds();
+
+
+        
eligibilityPredicates.put(GlusterGeoRepNonEligibilityReason.SLAVE_VOLUME_SHOULD_BE_UP,
 new Predicate<GlusterVolumeEntity>() {
+            @Override
+            public boolean eval(GlusterVolumeEntity slaveVolume) {
+                return slaveVolume.getStatus() == GlusterStatus.UP;
+            }
+        });
+
+        
eligibilityPredicates.put(GlusterGeoRepNonEligibilityReason.SLAVE_AND_MASTER_VOLUMES_SHOULD_NOT_BE_IN_SAME_CLUSTER,
 new Predicate<GlusterVolumeEntity>() {
+            @Override
+            public boolean eval(GlusterVolumeEntity slaveVolume) {
+                return ! 
masterVolume.getClusterId().equals(slaveVolume.getClusterId());
+            }
+        });
+
+        final Predicate<GlusterVolumeEntity> nonNullSlaveSizePredicate = new 
Predicate<GlusterVolumeEntity>() {
+            @Override
+            public boolean eval(GlusterVolumeEntity slaveVolume) {
+                return slaveVolume.getAdvancedDetails().getCapacityInfo() != 
null;
+            }
+        };
+        
eligibilityPredicates.put(GlusterGeoRepNonEligibilityReason.SLAVE_VOLUME_SIZE_TO_BE_AVAILABLE,
 nonNullSlaveSizePredicate);
+
+        final Predicate<GlusterVolumeEntity> nonNullMasterSizePredicate = new 
Predicate<GlusterVolumeEntity>() {
+            @Override
+            public boolean eval(GlusterVolumeEntity slaveVolume) {
+                return masterVolume.getAdvancedDetails().getCapacityInfo() != 
null;
+            }
+        };
+        
eligibilityPredicates.put(GlusterGeoRepNonEligibilityReason.MASTER_VOLUME_SIZE_TO_BE_AVAILABLE,
 nonNullMasterSizePredicate);
+
+        Predicate<GlusterVolumeEntity> masterSlaveSizePredicate = new 
Predicate<GlusterVolumeEntity>() {
+            @Override
+            public boolean eval(GlusterVolumeEntity slaveVolume) {
+                boolean eligible = nonNullSlaveSizePredicate.eval(slaveVolume) 
&& nonNullMasterSizePredicate.eval(masterVolume);
+                if (eligible) {
+                    eligible = 
slaveVolume.getAdvancedDetails().getCapacityInfo().getTotalSize() >= 
masterVolume.getAdvancedDetails().getCapacityInfo().getTotalSize();
+                }
+                return eligible;
+            }
+        };
+        
eligibilityPredicates.put(GlusterGeoRepNonEligibilityReason.SLAVE_VOLUME_SIZE_SHOULD_BE_GREATER_THAN_MASTER_VOLUME_SIZE,
 masterSlaveSizePredicate);
+
+        
eligibilityPredicates.put(GlusterGeoRepNonEligibilityReason.SLAVE_VOLUME_SHOULD_NOT_BE_SLAVE_OF_ANOTHER_GEO_REP_SESSION,
 new Predicate<GlusterVolumeEntity>() {
+            @Override
+            public boolean eval(GlusterVolumeEntity slaveVolume) {
+                return !existingSessionSlavesIds.contains(slaveVolume.getId());
+            }
+        });
+
+        
eligibilityPredicates.put(GlusterGeoRepNonEligibilityReason.SLAVE_CLUSTER_AND_MASTER_CLUSTER_COMPATIBILITY_VERSIONS_DO_NOT_MATCH,
 new Predicate<GlusterVolumeEntity>() {
+            @Override
+            public boolean eval(GlusterVolumeEntity slaveVolume) {
+                VdsGroupDAO vdsGroupDao = getVdsGroupDao();
+                Version slaveCompatibilityVersion = 
vdsGroupDao.get(slaveVolume.getClusterId()).getcompatibility_version();
+                Version masterCompatibilityVersion = 
vdsGroupDao.get(masterVolume.getClusterId()).getcompatibility_version();
+                return 
masterCompatibilityVersion.equals(slaveCompatibilityVersion);
+            }
+        });
+
+
+        return eligibilityPredicates;
+    }
+
+    private List<Guid> getSessionSlaveVolumeIds() {
+        List<GlusterGeoRepSession> existingSessions = 
getGeoRepDao().getAllSessions();
+        List<Guid> sessionSlavesIds = new ArrayList<Guid>();
+        for(GlusterGeoRepSession currentSession : existingSessions) {
+            sessionSlavesIds.add(currentSession.getSlaveVolumeId());
+        }
+        return sessionSlavesIds;
+    }
+
+    public VdsGroupDAO getVdsGroupDao() {
+        return DbFacade.getInstance().getVdsGroupDao();
+    }
+
+    public GlusterGeoRepDao getGeoRepDao() {
+        return DbFacade.getInstance().getGlusterGeoRepDao();
+    }
+}
diff --git 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/gluster/GeoRepCreateEligibilityBaseTest.java
 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/gluster/GeoRepCreateEligibilityBaseTest.java
new file mode 100644
index 0000000..c6551d5
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/gluster/GeoRepCreateEligibilityBaseTest.java
@@ -0,0 +1,116 @@
+package org.ovirt.engine.core.bll.gluster;
+
+import static org.mockito.Mockito.doReturn;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.junit.Before;
+import org.ovirt.engine.core.bll.utils.GlusterGeoRepUtil;
+import org.ovirt.engine.core.common.businessentities.VDSGroup;
+import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterGeoRepSession;
+import org.ovirt.engine.core.common.businessentities.gluster.GlusterStatus;
+import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity;
+import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeSizeInfo;
+import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeType;
+import org.ovirt.engine.core.compat.Guid;
+import org.ovirt.engine.core.compat.Version;
+import org.ovirt.engine.core.dao.VdsGroupDAO;
+import org.ovirt.engine.core.dao.gluster.GlusterGeoRepDao;
+
+public class GeoRepCreateEligibilityBaseTest {
+
+    private Guid MASTER_CLUSTER_ID = Guid.newGuid();
+
+    private Guid SLAVE_CLUSTER_ID = Guid.newGuid();
+
+    private Guid MASTER_VOLUME_ID = Guid.newGuid();
+
+    private Guid SLAVE_VOLUME_1_ID = Guid.newGuid();
+    private Guid SLAVE_VOLUME_2_ID = Guid.newGuid();
+    private Guid SLAVE_VOLUME_3_ID = Guid.newGuid();
+    private Guid SLAVE_VOLUME_4_ID = Guid.newGuid();
+
+    private Version CLUSTER_COMPATIBILITY_VERSION = new Version("3.5");
+
+    public GeoRepCreateEligibilityBaseTest() {
+        super();
+    }
+
+    protected GlusterVolumeEntity getMasterVolume() {
+        return getGlusterVolume(MASTER_VOLUME_ID, MASTER_CLUSTER_ID, 
GlusterStatus.UP, new GlusterVolumeSizeInfo(10000L, 4000L, 6000L));
+    }
+
+    @Before
+    public void setupMock(GlusterGeoRepUtil geoRepUtil, GlusterGeoRepDao 
geoRepDao, VdsGroupDAO vdsGroupDao) {
+        doReturn(geoRepDao).when(geoRepUtil).getGeoRepDao();
+        doReturn(getGeoRepSessions()).when(geoRepDao).getAllSessions();
+        doReturn(vdsGroupDao).when(geoRepUtil).getVdsGroupDao();
+
+        doReturn(getVdsGroup(MASTER_CLUSTER_ID, 
CLUSTER_COMPATIBILITY_VERSION)).when(vdsGroupDao).get(MASTER_CLUSTER_ID);
+
+        doReturn(getVdsGroup(SLAVE_CLUSTER_ID, 
CLUSTER_COMPATIBILITY_VERSION)).when(vdsGroupDao).get(SLAVE_CLUSTER_ID);
+    }
+
+    protected GlusterVolumeEntity getGlusterVolume(Guid volumeId, Guid 
clusterId, GlusterStatus status, GlusterVolumeSizeInfo sizeInfo) {
+        GlusterVolumeEntity volume = new GlusterVolumeEntity();
+        volume.setId(volumeId);
+        volume.setClusterId(clusterId);
+        volume.setStatus(status);
+        volume.getAdvancedDetails().setCapacityInfo(sizeInfo);
+        volume.setName(volumeId.toString());
+        volume.setVolumeType(GlusterVolumeType.DISTRIBUTE);
+        return volume;
+    }
+
+    protected VDSGroup getVdsGroup(Guid vdsGroupId, Version 
compatibilityVersion) {
+        VDSGroup vdsGroup = new VDSGroup();
+        vdsGroup.setId(vdsGroupId);
+        vdsGroup.setcompatibility_version(compatibilityVersion);
+        return vdsGroup;
+    }
+
+    protected GlusterGeoRepSession getSession(Guid slaveVolumeId) {
+        GlusterGeoRepSession session = new GlusterGeoRepSession();
+        session.setId(Guid.newGuid());
+        session.setMasterVolumeId(Guid.newGuid());
+        session.setSlaveVolumeId(slaveVolumeId);
+        return session;
+    }
+
+    protected List<GlusterGeoRepSession> getGeoRepSessions() {
+        return Collections.singletonList(getSession(SLAVE_VOLUME_2_ID));
+    }
+
+    public Guid getMASTER_CLUSTER_ID() {
+        return MASTER_CLUSTER_ID;
+    }
+
+    public Guid getSLAVE_CLUSTER_ID() {
+        return SLAVE_CLUSTER_ID;
+    }
+
+    public Guid getMASTER_VOLUME_ID() {
+        return MASTER_VOLUME_ID;
+    }
+
+    public Guid getSLAVE_VOLUME_1_ID() {
+        return SLAVE_VOLUME_1_ID;
+    }
+
+    public Guid getSLAVE_VOLUME_2_ID() {
+        return SLAVE_VOLUME_2_ID;
+    }
+
+    public Guid getSLAVE_VOLUME_3_ID() {
+        return SLAVE_VOLUME_3_ID;
+    }
+
+    public Guid getSLAVE_VOLUME_4_ID() {
+        return SLAVE_VOLUME_4_ID;
+    }
+
+    public Version getCLUSTER_COMPATIBILITY_VERSION() {
+        return CLUSTER_COMPATIBILITY_VERSION;
+    }
+}
diff --git 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/gluster/GetGlusterGeoReplicationEligibleVolumesQueryTest.java
 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/gluster/GetGlusterGeoReplicationEligibleVolumesQueryTest.java
new file mode 100644
index 0000000..09d1fd2
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/gluster/GetGlusterGeoReplicationEligibleVolumesQueryTest.java
@@ -0,0 +1,107 @@
+package org.ovirt.engine.core.bll.gluster;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.doReturn;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.Spy;
+import org.mockito.runners.MockitoJUnitRunner;
+import org.ovirt.engine.core.bll.AbstractQueryTest;
+import org.ovirt.engine.core.bll.utils.GlusterGeoRepUtil;
+import org.ovirt.engine.core.common.businessentities.VDSGroup;
+import org.ovirt.engine.core.common.businessentities.gluster.GlusterStatus;
+import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity;
+import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeSizeInfo;
+import org.ovirt.engine.core.common.queries.IdQueryParameters;
+import org.ovirt.engine.core.dao.VdsGroupDAO;
+import org.ovirt.engine.core.dao.gluster.GlusterGeoRepDao;
+import org.ovirt.engine.core.dao.gluster.GlusterVolumeDao;
+
+@RunWith(MockitoJUnitRunner.class)
+public class GetGlusterGeoReplicationEligibleVolumesQueryTest extends 
AbstractQueryTest<IdQueryParameters, 
GetGlusterGeoReplicationEligibleVolumesQuery<IdQueryParameters>> {
+
+    @Mock
+    private GlusterGeoRepDao geoRepDao;
+
+    @Mock
+    private VdsGroupDAO vdsGroupDao;
+
+    @Mock
+    private GlusterVolumeDao volumeDao;
+
+    @Spy
+    private GlusterGeoRepUtil geoRepUtil;
+
+    private GeoRepCreateEligibilityBaseTest baseTest = new 
GeoRepCreateEligibilityBaseTest();
+
+    @Before
+    public void setupMock() {
+        doReturn(geoRepUtil).when(getQuery()).getGeoRepUtilInstance();
+        
doReturn(getExpectedVolumes()).when(getQuery()).getEligibleVolumes(baseTest.getMasterVolume());
+        doReturn(volumeDao).when(getQuery()).getGlusterVolumeDao();
+        doReturn(vdsGroupDao).when(getQuery()).getVdsGroupDao();
+        baseTest.setupMock(geoRepUtil, geoRepDao, vdsGroupDao);
+        
doReturn(getClustersByServiceAndCompatibilityVersion()).when(vdsGroupDao).getClustersByServiceAndCompatibilityVersion(true,
 false, baseTest.getCLUSTER_COMPATIBILITY_VERSION().getValue());
+        
doReturn(getVolumesByClusterId()).when(volumeDao).getByClusterId(baseTest.getSLAVE_CLUSTER_ID());
+        
doReturn(baseTest.getMasterVolume()).when(volumeDao).getById(baseTest.getMASTER_VOLUME_ID());
+    }
+
+    private List<GlusterVolumeEntity> getVolumesByClusterId() {
+        List<GlusterVolumeEntity> volumeInCluster = new 
ArrayList<GlusterVolumeEntity>();
+
+        
volumeInCluster.add(baseTest.getGlusterVolume(baseTest.getSLAVE_VOLUME_1_ID(), 
baseTest.getSLAVE_CLUSTER_ID(), GlusterStatus.UP, new 
GlusterVolumeSizeInfo(10000L, 4000L, 6000L)));
+        
volumeInCluster.add(baseTest.getGlusterVolume(baseTest.getSLAVE_VOLUME_2_ID(), 
baseTest.getSLAVE_CLUSTER_ID(), GlusterStatus.DOWN, new 
GlusterVolumeSizeInfo(4000L, 0L, 0L)));
+        
volumeInCluster.add(baseTest.getGlusterVolume(baseTest.getSLAVE_VOLUME_3_ID(), 
baseTest.getMASTER_CLUSTER_ID(), GlusterStatus.UP, new 
GlusterVolumeSizeInfo(10000L, 4000L, 6000L)));
+        
volumeInCluster.add(baseTest.getGlusterVolume(baseTest.getSLAVE_VOLUME_4_ID(), 
baseTest.getSLAVE_CLUSTER_ID(), GlusterStatus.UP, null));
+
+        return volumeInCluster;
+    }
+
+    private List<VDSGroup> getClustersByServiceAndCompatibilityVersion() {
+        List<VDSGroup> possiblyEligibleClusters = new ArrayList<VDSGroup>();
+
+        VDSGroup possiblyEligibleVDSGroup = new VDSGroup();
+        possiblyEligibleVDSGroup.setId(baseTest.getSLAVE_CLUSTER_ID());
+
+        possiblyEligibleClusters.add(possiblyEligibleVDSGroup);
+        return possiblyEligibleClusters;
+    }
+
+    private List<GlusterVolumeEntity> getExpectedVolumes() {
+        return 
Collections.singletonList(baseTest.getGlusterVolume(baseTest.getSLAVE_VOLUME_1_ID(),
 baseTest.getSLAVE_CLUSTER_ID(), GlusterStatus.UP, new 
GlusterVolumeSizeInfo(10000L, 4000L, 6000L)));
+    }
+
+    private boolean checkEquals(List<GlusterVolumeEntity> actual, 
List<GlusterVolumeEntity> expected) {
+        boolean equals = false;
+        for(GlusterVolumeEntity aVolume : actual) {
+            for(GlusterVolumeEntity eVolume : expected) {
+                if(aVolume.getId().equals(eVolume.getId())) {
+                    equals = true;
+                    break;
+                }
+            }
+            if(!equals) {
+                break;
+            }
+        }
+        return equals;
+    }
+
+    @Test
+    public void testGetEligibleVolumeListQuery() {
+        doReturn(new 
IdQueryParameters(baseTest.getMASTER_VOLUME_ID())).when(getQuery()).getParameters();
+        getQuery().executeQueryCommand();
+        List<GlusterVolumeEntity> returnValue = 
(List<GlusterVolumeEntity>)getQuery().getQueryReturnValue().getReturnValue();
+        List<GlusterVolumeEntity> expectedVolumes = getExpectedVolumes();
+        assertEquals(expectedVolumes.size(), returnValue.size());
+        assertTrue(checkEquals(returnValue, expectedVolumes));
+    }
+}
diff --git 
a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/gluster/GetNonEligibilityReasonsOfVolumeForGeoRepSessionQueryTest.java
 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/gluster/GetNonEligibilityReasonsOfVolumeForGeoRepSessionQueryTest.java
new file mode 100644
index 0000000..d95ab5b
--- /dev/null
+++ 
b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/gluster/GetNonEligibilityReasonsOfVolumeForGeoRepSessionQueryTest.java
@@ -0,0 +1,105 @@
+package org.ovirt.engine.core.bll.gluster;
+
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.doReturn;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.Spy;
+import org.mockito.runners.MockitoJUnitRunner;
+import org.ovirt.engine.core.bll.AbstractQueryTest;
+import org.ovirt.engine.core.bll.utils.GlusterGeoRepUtil;
+import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterGeoRepNonEligibilityReason;
+import org.ovirt.engine.core.common.businessentities.gluster.GlusterStatus;
+import 
org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeSizeInfo;
+import 
org.ovirt.engine.core.common.queries.gluster.GlusterVolumeGeoRepEligibilityParameters;
+import org.ovirt.engine.core.dao.VdsGroupDAO;
+import org.ovirt.engine.core.dao.gluster.GlusterGeoRepDao;
+
+@RunWith(MockitoJUnitRunner.class)
+public class GetNonEligibilityReasonsOfVolumeForGeoRepSessionQueryTest extends 
AbstractQueryTest<GlusterVolumeGeoRepEligibilityParameters, 
GetNonEligibilityReasonsOfVolumeForGeoRepSessionQuery<GlusterVolumeGeoRepEligibilityParameters>>
 {
+
+    @Mock
+    private GlusterGeoRepDao geoRepDao;
+
+    @Mock
+    private VdsGroupDAO vdsGroupDao;
+
+    private GeoRepCreateEligibilityBaseTest baseTest = new 
GeoRepCreateEligibilityBaseTest();
+
+    @Spy
+    private GlusterGeoRepUtil geoRepUtil;
+
+    @Before
+    public void setupMock() {
+        doReturn(geoRepUtil).when(getQuery()).getGeoRepUtilInstance();
+        baseTest.setupMock(geoRepUtil, geoRepDao, vdsGroupDao);
+    }
+
+    protected List<GlusterGeoRepNonEligibilityReason> 
getNonEligibilityReasonsForSlaveVolume1() {
+        List<GlusterGeoRepNonEligibilityReason> nonEligibilityreasons = new 
ArrayList<GlusterGeoRepNonEligibilityReason>();
+
+        return nonEligibilityreasons;
+    }
+
+    protected List<GlusterGeoRepNonEligibilityReason> 
getNonEligibilityReasonsForSlaveVolume2() {
+        List<GlusterGeoRepNonEligibilityReason> nonEligibilityreasons = new 
ArrayList<GlusterGeoRepNonEligibilityReason>();
+
+        
nonEligibilityreasons.add(GlusterGeoRepNonEligibilityReason.SLAVE_VOLUME_SHOULD_BE_UP);
+        
nonEligibilityreasons.add(GlusterGeoRepNonEligibilityReason.SLAVE_VOLUME_SIZE_SHOULD_BE_GREATER_THAN_MASTER_VOLUME_SIZE);
+        
nonEligibilityreasons.add(GlusterGeoRepNonEligibilityReason.SLAVE_VOLUME_SHOULD_NOT_BE_SLAVE_OF_ANOTHER_GEO_REP_SESSION);
+
+        return nonEligibilityreasons;
+    }
+
+    protected List<GlusterGeoRepNonEligibilityReason> 
getNonEligibilityReasonsForSlaveVolume3() {
+        List<GlusterGeoRepNonEligibilityReason> nonEligibilityreasons = new 
ArrayList<GlusterGeoRepNonEligibilityReason>();
+
+        
nonEligibilityreasons.add(GlusterGeoRepNonEligibilityReason.SLAVE_AND_MASTER_VOLUMES_SHOULD_NOT_BE_IN_SAME_CLUSTER);
+
+        return nonEligibilityreasons;
+    }
+
+    protected List<GlusterGeoRepNonEligibilityReason> 
getNonEligibilityReasonsForSlaveVolume4() {
+        List<GlusterGeoRepNonEligibilityReason> nonEligibilityreasons = new 
ArrayList<GlusterGeoRepNonEligibilityReason>();
+
+        
nonEligibilityreasons.add(GlusterGeoRepNonEligibilityReason.SLAVE_VOLUME_SIZE_TO_BE_AVAILABLE);
+        
nonEligibilityreasons.add(GlusterGeoRepNonEligibilityReason.MASTER_VOLUME_SIZE_TO_BE_AVAILABLE);
+        
nonEligibilityreasons.add(GlusterGeoRepNonEligibilityReason.SLAVE_VOLUME_SIZE_SHOULD_BE_GREATER_THAN_MASTER_VOLUME_SIZE);
+
+        return nonEligibilityreasons;
+    }
+
+    @Test
+    public void testExecuteQueryCommnadOnVolume1() {
+        List<GlusterGeoRepNonEligibilityReason> actualNonEligibilityReasons = 
getQuery().getNonEligibilityReasons(baseTest.getGlusterVolume(baseTest.getMASTER_VOLUME_ID(),
 baseTest.getMASTER_CLUSTER_ID(), GlusterStatus.UP, new 
GlusterVolumeSizeInfo(10000L, 4000L, 6000L)), 
baseTest.getGlusterVolume(baseTest.getSLAVE_VOLUME_1_ID(), 
baseTest.getSLAVE_CLUSTER_ID(), GlusterStatus.UP, new 
GlusterVolumeSizeInfo(10000L, 4000L, 6000L)));
+        assertTrue(actualNonEligibilityReasons.size() == 
getNonEligibilityReasonsForSlaveVolume1().size());
+        
assertTrue(getNonEligibilityReasonsForSlaveVolume1().equals(actualNonEligibilityReasons));
+    }
+
+    @Test
+    public void testExecuteQueryCommnadOnVolume2() {
+        List<GlusterGeoRepNonEligibilityReason> actual = 
getQuery().getNonEligibilityReasons(baseTest.getGlusterVolume(baseTest.getMASTER_VOLUME_ID(),
 baseTest.getMASTER_CLUSTER_ID(), GlusterStatus.UP, new 
GlusterVolumeSizeInfo(10000L, 4000L, 6000L)), 
baseTest.getGlusterVolume(baseTest.getSLAVE_VOLUME_2_ID(), 
baseTest.getSLAVE_CLUSTER_ID(), GlusterStatus.DOWN, new 
GlusterVolumeSizeInfo(4000L, 0L, 0L)));
+        assertTrue(actual.size() == 
getNonEligibilityReasonsForSlaveVolume2().size());
+        
assertTrue(getNonEligibilityReasonsForSlaveVolume2().containsAll(actual));
+    }
+
+    @Test
+    public void testExecuteQueryCommnadOnVolume3() {
+        List<GlusterGeoRepNonEligibilityReason> actual = 
getQuery().getNonEligibilityReasons(baseTest.getGlusterVolume(baseTest.getMASTER_VOLUME_ID(),
 baseTest.getMASTER_CLUSTER_ID(), GlusterStatus.UP, new 
GlusterVolumeSizeInfo(10000L, 4000L, 6000L)), 
baseTest.getGlusterVolume(baseTest.getSLAVE_VOLUME_3_ID(), 
baseTest.getMASTER_CLUSTER_ID(), GlusterStatus.UP, new 
GlusterVolumeSizeInfo(10000L, 4000L, 6000L)));
+        assertTrue(actual.size() == 
getNonEligibilityReasonsForSlaveVolume3().size());
+        
assertTrue(getNonEligibilityReasonsForSlaveVolume3().containsAll(actual));
+    }
+
+    @Test
+    public void testExecuteQueryCommnadOnVolume4() {
+        List<GlusterGeoRepNonEligibilityReason> actual = 
getQuery().getNonEligibilityReasons(baseTest.getGlusterVolume(baseTest.getMASTER_VOLUME_ID(),
 baseTest.getMASTER_CLUSTER_ID(), GlusterStatus.UP, null), 
baseTest.getGlusterVolume(baseTest.getSLAVE_VOLUME_4_ID(), 
baseTest.getSLAVE_CLUSTER_ID(), GlusterStatus.UP, null));
+        assertTrue(actual.size() == 
getNonEligibilityReasonsForSlaveVolume4().size());
+        
assertTrue(getNonEligibilityReasonsForSlaveVolume4().containsAll(actual));
+    }
+}
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterGeoRepNonEligibilityReason.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterGeoRepNonEligibilityReason.java
new file mode 100644
index 0000000..b9de0b9
--- /dev/null
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterGeoRepNonEligibilityReason.java
@@ -0,0 +1,11 @@
+package org.ovirt.engine.core.common.businessentities.gluster;
+
+public enum GlusterGeoRepNonEligibilityReason {
+        SLAVE_AND_MASTER_VOLUMES_SHOULD_NOT_BE_IN_SAME_CLUSTER,
+        SLAVE_VOLUME_SIZE_SHOULD_BE_GREATER_THAN_MASTER_VOLUME_SIZE,
+        SLAVE_CLUSTER_AND_MASTER_CLUSTER_COMPATIBILITY_VERSIONS_DO_NOT_MATCH,
+        SLAVE_VOLUME_SHOULD_NOT_BE_SLAVE_OF_ANOTHER_GEO_REP_SESSION,
+        SLAVE_VOLUME_SHOULD_BE_UP,
+        SLAVE_VOLUME_SIZE_TO_BE_AVAILABLE,
+        MASTER_VOLUME_SIZE_TO_BE_AVAILABLE;
+}
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java
index 14b6020..9f67df5 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java
@@ -336,6 +336,8 @@
     GetGlusterVolumeGeoRepSessions,
     GetGlusterVolumeRemoveBricksStatus,
     GetGlusterVolumeByTaskId,
+    GetNonEligibilityReasonsOfVolumeForGeoRepSession,
+    GetGlusterGeoReplicationEligibleVolumes,
 
     GetDefaultConfigurationVersion(VdcQueryAuthType.User),
     OsRepository(VdcQueryAuthType.User),
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/gluster/GlusterVolumeGeoRepEligibilityParameters.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/gluster/GlusterVolumeGeoRepEligibilityParameters.java
new file mode 100644
index 0000000..99dc18e
--- /dev/null
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/gluster/GlusterVolumeGeoRepEligibilityParameters.java
@@ -0,0 +1,29 @@
+package org.ovirt.engine.core.common.queries.gluster;
+
+import org.ovirt.engine.core.common.queries.IdQueryParameters;
+import org.ovirt.engine.core.compat.Guid;
+
+
+public class GlusterVolumeGeoRepEligibilityParameters extends 
IdQueryParameters {
+
+    private static final long serialVersionUID = 1L;
+
+    private Guid slaveVolumeId;
+
+    public GlusterVolumeGeoRepEligibilityParameters() {
+        super();
+    }
+
+    public GlusterVolumeGeoRepEligibilityParameters(Guid masterVolumeId, Guid 
slaveVolumeId) {
+        super(masterVolumeId);
+        this.slaveVolumeId = slaveVolumeId;
+    }
+
+    public Guid getSlaveVolumeId() {
+        return slaveVolumeId;
+    }
+
+    public void setSlaveVolumeId(Guid slaveVolumeId) {
+        this.slaveVolumeId = slaveVolumeId;
+    }
+}
diff --git 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VdsGroupDAO.java
 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VdsGroupDAO.java
index 7403961..b376f56 100644
--- 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VdsGroupDAO.java
+++ 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VdsGroupDAO.java
@@ -184,4 +184,5 @@
      */
     int getVmsCountByClusterId(Guid vdsGroupId);
 
+    List<VDSGroup> getClustersByServiceAndCompatibilityVersion(boolean 
glusterService, boolean virtService, String compatibilityVersion);
 }
diff --git 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VdsGroupDAODbFacadeImpl.java
 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VdsGroupDAODbFacadeImpl.java
index 57b6607..e8777a4 100644
--- 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VdsGroupDAODbFacadeImpl.java
+++ 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VdsGroupDAODbFacadeImpl.java
@@ -340,4 +340,13 @@
         return vdsGroups;
 
     }
+
+    @Override
+    public List<VDSGroup> getClustersByServiceAndCompatibilityVersion(boolean 
glusterService, boolean virtService, String compatibilityVersion) {
+        return 
getCallsHandler().executeReadList("GetVdsGroupsByServiceAndCompatibilityVersion",
+                VdsGroupRowMapper.instance,
+                getCustomMapSqlParameterSource().addValue("gluster_service", 
glusterService)
+                        .addValue("virt_service", virtService)
+                        .addValue("compatibility_version", 
compatibilityVersion));
+    }
 }
diff --git 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterGeoRepDao.java
 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterGeoRepDao.java
index 1e8f470..c695eaa 100644
--- 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterGeoRepDao.java
+++ 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterGeoRepDao.java
@@ -42,4 +42,5 @@
 
     public List<GlusterGeoRepSessionConfiguration> getGeoRepSessionConfig(Guid 
sessionId);
 
+    public List<GlusterGeoRepSession> getAllSessions();
  }
diff --git 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterGeoRepDaoDbFacadeImpl.java
 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterGeoRepDaoDbFacadeImpl.java
index 6bb6771..92ce2df 100644
--- 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterGeoRepDaoDbFacadeImpl.java
+++ 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterGeoRepDaoDbFacadeImpl.java
@@ -205,4 +205,7 @@
         };
     }
 
+    public List<GlusterGeoRepSession> getAllSessions() {
+        return 
getCallsHandler().executeReadList("GetAllGlusterGeoRepSessions", 
georepSessionRowMapper, getCustomMapSqlParameterSource());
+    }
 }
diff --git 
a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/VdsGroupDAOTest.java
 
b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/VdsGroupDAOTest.java
index c5267e5..dbe2d75 100644
--- 
a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/VdsGroupDAOTest.java
+++ 
b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/VdsGroupDAOTest.java
@@ -471,4 +471,12 @@
         assertEquals("Incorrect number of VMs in cluster", 
data.get(0).getGroupHostsAndVms().getVms(), 7);
         assertEquals("Incorrect number of Hosts in cluster", 
data.get(0).getGroupHostsAndVms().getHosts(), 1);
     }
+
+    @Test
+    public void testGetClustersByServiceAndCompatibilityVersion() {
+        List<VDSGroup> vdsGroups = 
((VdsGroupDAODbFacadeImpl)dao).getClustersByServiceAndCompatibilityVersion(true,
 false, "2.3");
+        assertNotNull(vdsGroups);
+        assertEquals(1, vdsGroups.size());
+        assertEquals(FixturesTool.GLUSTER_CLUSTER_ID, 
vdsGroups.get(0).getId());
+    }
 }
diff --git 
a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/gluster/GlusterGeoRepDaoTest.java
 
b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/gluster/GlusterGeoRepDaoTest.java
index b93c72e..51a5029 100644
--- 
a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/gluster/GlusterGeoRepDaoTest.java
+++ 
b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/gluster/GlusterGeoRepDaoTest.java
@@ -136,4 +136,16 @@
         assertEquals("NEW_VAL", fetchedSessionConfig.get(0).getValue());
     }
 
+    @Test
+    public void testGetAllInCluster() {
+        List<GlusterGeoRepSession> fetchedSessions = 
dao.getGeoRepSessionsInCluster(FixturesTool.GLUSTER_CLUSTER_ID);
+        assertEquals(1, fetchedSessions.size());
+    }
+
+    @Test
+    public void testGetAllSessions() {
+        List<GlusterGeoRepSession> sessions = dao.getAllSessions();
+        assertNotNull(sessions);
+        assertEquals(FixturesTool.GLUSTER_GEOREP_SESSION_ID, 
sessions.get(0).getId());
+    }
 }
diff --git 
a/frontend/webadmin/modules/gwt-common/src/main/resources/org/ovirt/engine/core/Common.gwt.xml
 
b/frontend/webadmin/modules/gwt-common/src/main/resources/org/ovirt/engine/core/Common.gwt.xml
index 05d669f..e56c232 100644
--- 
a/frontend/webadmin/modules/gwt-common/src/main/resources/org/ovirt/engine/core/Common.gwt.xml
+++ 
b/frontend/webadmin/modules/gwt-common/src/main/resources/org/ovirt/engine/core/Common.gwt.xml
@@ -297,6 +297,7 @@
                <include 
name="common/businessentities/gluster/GlusterVolumeType.java" />
                <include 
name="common/businessentities/gluster/GlusterTaskSupport.java"/>
                <include 
name="common/businessentities/gluster/GlusterStatus.java" />
+               <include 
name="common/businessentities/gluster/GlusterGeoRepNonEligibilityReason.java" />
                <include 
name="common/businessentities/gluster/GeoRepCrawlStatus.java" />
                <include 
name="common/businessentities/gluster/GeoRepSessionStatus.java" />
                <include 
name="common/businessentities/gluster/GlusterServiceStatus.java" />
@@ -327,6 +328,7 @@
                <include 
name="common/asynctasks/gluster/GlusterAsyncTask.java"/>
                <include 
name="common/asynctasks/gluster/GlusterTaskStatus.java"/>
                <include name="common/asynctasks/gluster/GlusterTaskType.java"/>
+               <include 
name="common/businessentities/gluster/GlusterGeoRepEnums.java"/>
                 <include 
name="common/asynctasks/gluster/GlusterTaskParameters.java"/>
                <include 
name="common/businessentities/gluster/GlusterVolumeTaskStatusDetail.java"/>
                <include 
name="common/businessentities/gluster/GlusterVolumeTaskStatusForHost.java"/>
diff --git a/packaging/dbscripts/gluster_georep_sp.sql 
b/packaging/dbscripts/gluster_georep_sp.sql
index b365231..4b8a51a0 100644
--- a/packaging/dbscripts/gluster_georep_sp.sql
+++ b/packaging/dbscripts/gluster_georep_sp.sql
@@ -172,3 +172,12 @@
 END; $procedure$
 LANGUAGE plpgsql;
 
+Create or replace FUNCTION GetAllGlusterGeoRepSessions()
+RETURNS SETOF gluster_georep_session STABLE
+AS $procedure$
+BEGIN
+    RETURN QUERY SELECT *
+    FROM  gluster_georep_session;
+END; $procedure$
+LANGUAGE plpgsql;
+
diff --git a/packaging/dbscripts/vds_groups_sp.sql 
b/packaging/dbscripts/vds_groups_sp.sql
index 10d7dac..ff6bd55 100644
--- a/packaging/dbscripts/vds_groups_sp.sql
+++ b/packaging/dbscripts/vds_groups_sp.sql
@@ -297,3 +297,12 @@
       GROUP BY groups.vds_group_id;
 END; $procedure$
 LANGUAGE plpgsql;
+
+Create or replace FUNCTION 
GetVdsGroupsByServiceAndCompatibilityVersion(v_gluster_service BOOLEAN, 
v_virt_service BOOLEAN, v_compatibility_version VARCHAR(40)) RETURNS SETOF 
vds_groups_view STABLE
+   AS $procedure$
+BEGIN
+      RETURN QUERY SELECT vds_groups_view.*
+      FROM vds_groups_view
+      WHERE virt_service = v_virt_service AND gluster_service = 
v_gluster_service AND compatibility_version = v_compatibility_version;
+END; $procedure$
+LANGUAGE plpgsql;


-- 
To view, visit https://gerrit.ovirt.org/39431
To unsubscribe, visit https://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I0fc3ecb15535181f1ca2a8780461cb89788a3f41
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: ovirt-engine-3.5-gluster
Gerrit-Owner: anmolbabu <[email protected]>
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to