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
