Shubhendu Tripathi has uploaded a new change for review. Change subject: gluster: DAO for volume snapshot scheduling ......................................................................
gluster: DAO for volume snapshot scheduling Introduced DAO for gluster volume snapshot scheduling Change-Id: Ie44116df49acc302bfc1b745c00535c1fb0174ad Signed-off-by: Shubhendu Tripathi <[email protected]> --- M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterVolumeEntity.java M backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/DbFacade.java M backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeDaoDbFacadeImpl.java A backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeSnapshotScheduleDao.java A backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeSnapshotScheduleDaoDBFacadeImpl.java M backend/manager/modules/dal/src/main/jdbc-resources/engine-daos.properties A backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeSnapshotScheduleDaoTest.java M backend/manager/modules/dal/src/test/resources/fixtures.xml A packaging/dbscripts/gluster_volume_snapshot_schedule_sp.sql A packaging/dbscripts/upgrade/03_05_1290_add_snapshot_scheduled_flag_to_gluster_volume.sql 10 files changed, 342 insertions(+), 0 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/92/39292/1 diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterVolumeEntity.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterVolumeEntity.java index dfe911b..0b1f4f2 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterVolumeEntity.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterVolumeEntity.java @@ -72,6 +72,8 @@ private Integer snapMaxLimit; + private Boolean snapshotScheduled; + private GlusterStatus status; // Gluster and NFS are enabled by default @@ -93,6 +95,7 @@ volumeType = GlusterVolumeType.DISTRIBUTE; asyncTask = new GlusterAsyncTask(); advancedDetails = new GlusterVolumeAdvancedDetails(); + snapshotScheduled = Boolean.valueOf(false); } @Override @@ -319,6 +322,14 @@ this.snapMaxLimit = limit; } + public Boolean getSnapshotScheduled() { + return this.snapshotScheduled; + } + + public void setSnapshotScheduled(Boolean snapshotScheduled) { + this.snapshotScheduled = snapshotScheduled; + } + public void removeBrick(GlusterBrickEntity GlusterBrick) { bricks.remove(GlusterBrick); } @@ -400,6 +411,7 @@ result = prime * result + ((advancedDetails == null) ? 0 : advancedDetails.hashCode()); result = prime * result + ((snapshotsCount == null) ? 0 : snapshotsCount.hashCode()); result = prime * result + ((snapMaxLimit == null) ? 0 : snapMaxLimit.hashCode()); + result = prime * result + ((snapshotScheduled == null) ? 0 : snapshotScheduled.hashCode()); return result; } @@ -455,6 +467,10 @@ return false; } + if (!ObjectUtils.objectsEqual(snapshotScheduled, volume.getSnapshotScheduled())) { + return false; + } + return true; } diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/DbFacade.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/DbFacade.java index fb3d15f..6d23756 100644 --- a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/DbFacade.java +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/DbFacade.java @@ -128,6 +128,7 @@ import org.ovirt.engine.core.dao.gluster.GlusterServerServiceDao; import org.ovirt.engine.core.dao.gluster.GlusterServiceDao; import org.ovirt.engine.core.dao.gluster.GlusterVolumeDao; +import org.ovirt.engine.core.dao.gluster.GlusterVolumeSnapshotScheduleDao; import org.ovirt.engine.core.dao.gluster.GlusterVolumeSnapshotConfigDao; import org.ovirt.engine.core.dao.gluster.GlusterVolumeSnapshotDao; import org.ovirt.engine.core.dao.network.InterfaceDao; @@ -891,6 +892,15 @@ } /** + * Returns the singleton instance of {@link GlusterVolumeSnapshotScheduleDao} + * + * @return the dao + */ + public GlusterVolumeSnapshotScheduleDao getGlusterVolumeSnapshotScheduleDao() { + return getDao(GlusterVolumeSnapshotScheduleDao.class); + } + + /** * Returns the singleton instance of {@link GlusterVolumeDao}. * * @return the dao diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeDaoDbFacadeImpl.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeDaoDbFacadeImpl.java index 7d70724..e7f4ed8 100644 --- a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeDaoDbFacadeImpl.java +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeDaoDbFacadeImpl.java @@ -377,6 +377,7 @@ entity.setReplicaCount(rs.getInt("replica_count")); entity.setStripeCount(rs.getInt("stripe_count")); entity.setSnapshotsCount(rs.getInt("snapshot_count")); + entity.setSnapshotScheduled(rs.getBoolean("snapshot_scheduled")); return entity; } } diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeSnapshotScheduleDao.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeSnapshotScheduleDao.java new file mode 100644 index 0000000..f4c1e56 --- /dev/null +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeSnapshotScheduleDao.java @@ -0,0 +1,21 @@ +package org.ovirt.engine.core.dao.gluster; + +import java.util.List; + +import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeSnapshotSchedule; +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.dao.DAO; +import org.ovirt.engine.core.dao.SearchDAO; + +public interface GlusterVolumeSnapshotScheduleDao extends DAO, SearchDAO<GlusterVolumeSnapshotSchedule> { + public void save(GlusterVolumeSnapshotSchedule schedule); + + public GlusterVolumeSnapshotSchedule getByVolumeId(Guid volumeId); + + public void removeByVolumeId(Guid volumeId); + + @Override + public List<GlusterVolumeSnapshotSchedule> getAllWithQuery(String query); + + public void updateScheduleByVolumeId(Guid volumeId, GlusterVolumeSnapshotSchedule schedule); +} diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeSnapshotScheduleDaoDBFacadeImpl.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeSnapshotScheduleDaoDBFacadeImpl.java new file mode 100644 index 0000000..6361457 --- /dev/null +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeSnapshotScheduleDaoDBFacadeImpl.java @@ -0,0 +1,89 @@ +package org.ovirt.engine.core.dao.gluster; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Date; +import java.util.List; + +import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeSnapshotSchedule; +import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeSnapshotScheduleRecurrence; +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.dao.BaseDAODbFacade; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; + +public class GlusterVolumeSnapshotScheduleDaoDBFacadeImpl extends BaseDAODbFacade implements GlusterVolumeSnapshotScheduleDao { + + private static final RowMapper<GlusterVolumeSnapshotSchedule> snapshotScheduleRowMapper = + new GlusterVolumeSnapshotScheduleRowMapper(); + + @Override + public void save(GlusterVolumeSnapshotSchedule schedule) { + getCallsHandler().executeModification("InsertGlusterVolumeSnapshotSchedule", + createFullParameterMapper(schedule)); + } + + @Override + public GlusterVolumeSnapshotSchedule getByVolumeId(Guid volumeId) { + GlusterVolumeSnapshotSchedule schedule = + getCallsHandler().executeRead("GetGlusterVolumeSnapshotScheduleByVolumeId", snapshotScheduleRowMapper, + getCustomMapSqlParameterSource().addValue("volume_id", volumeId)); + + return schedule; + } + + @Override + public void removeByVolumeId(Guid volumeId) { + getCallsHandler().executeModification("DeleteGlusterVolumeSnapshotScheduleByVolumeId", + getCustomMapSqlParameterSource().addValue("volume_id", volumeId)); + } + + @Override + public List<GlusterVolumeSnapshotSchedule> getAllWithQuery(String query) { + List<GlusterVolumeSnapshotSchedule> schedules = jdbcTemplate.query(query, snapshotScheduleRowMapper); + return schedules; + } + + @Override + public void updateScheduleByVolumeId(Guid volumeId, GlusterVolumeSnapshotSchedule schedule) { + getCallsHandler().executeModification("UpdateGlusterVolumeSnapshotScheduleByVolumeId", + createFullParameterMapper(schedule)); + } + + private static final class GlusterVolumeSnapshotScheduleRowMapper implements RowMapper<GlusterVolumeSnapshotSchedule> { + @Override + public GlusterVolumeSnapshotSchedule mapRow(ResultSet rs, int rowNum) throws SQLException { + GlusterVolumeSnapshotSchedule schedule = new GlusterVolumeSnapshotSchedule(); + + schedule.setClusterId(getGuidDefaultEmpty(rs, "cluster_id")); + schedule.setVolumeId(getGuidDefaultEmpty(rs, "volume_id")); + schedule.setJobId(rs.getString("job_id")); + schedule.setSnapshotNamePrefix(rs.getString("snapshot_name_prefix")); + schedule.setSnapshotDescription(rs.getString("snapshot_description")); + schedule.setRecurrence(GlusterVolumeSnapshotScheduleRecurrence.from(rs.getString("recurrence"))); + schedule.setTimeZone(rs.getString("time_zone")); + schedule.setInterval(rs.getInt("interval")); + schedule.setStartDate(rs.getTimestamp("start_date") == null ? null : new Date(rs.getTimestamp("start_date") + .getTime())); + schedule.setExecutionTime(rs.getTime("execution_time")); + schedule.setDays(rs.getString("days")); + schedule.setEndByDate(rs.getTimestamp("end_by")); + + return schedule; + } + } + + protected MapSqlParameterSource createFullParameterMapper(GlusterVolumeSnapshotSchedule schedule) { + return getCustomMapSqlParameterSource().addValue("volume_id", schedule.getVolumeId()) + .addValue("job_id", schedule.getJobId()) + .addValue("snapshot_name_prefix", schedule.getSnapshotNamePrefix()) + .addValue("snapshot_description", schedule.getSnapshotDescription()) + .addValue("recurrence", schedule.getRecurrence().toString()) + .addValue("time_zone", schedule.getTimeZone()) + .addValue("interval", schedule.getInterval()) + .addValue("start_date", schedule.getStartDate()) + .addValue("execution_time", schedule.getExecutionTime()) + .addValue("days", schedule.getDays()) + .addValue("end_by", schedule.getEndByDate()); + } +} diff --git a/backend/manager/modules/dal/src/main/jdbc-resources/engine-daos.properties b/backend/manager/modules/dal/src/main/jdbc-resources/engine-daos.properties index a518e9d..d70bb1d 100644 --- a/backend/manager/modules/dal/src/main/jdbc-resources/engine-daos.properties +++ b/backend/manager/modules/dal/src/main/jdbc-resources/engine-daos.properties @@ -59,6 +59,7 @@ GlusterBrickDao=org.ovirt.engine.core.dao.gluster.GlusterBrickDaoDbFacadeImpl GlusterVolumeSnapshotDao=org.ovirt.engine.core.dao.gluster.GlusterVolumeSnapshotDaoDbFacadeImpl GlusterVolumeSnapshotConfigDao=org.ovirt.engine.core.dao.gluster.GlusterVolumeSnapshotConfigDaoDbFacadeImpl +GlusterVolumeSnapshotScheduleDao=org.ovirt.engine.core.dao.gluster.GlusterVolumeSnapshotScheduleDaoDBFacadeImpl GlusterOptionDao=org.ovirt.engine.core.dao.gluster.GlusterOptionDaoDbFacadeImpl ImageStorageDomainMapDao=org.ovirt.engine.core.dao.ImageStorageDomainMapDaoDbFacadeImpl VmAndTemplatesGenerationsDAO=org.ovirt.engine.core.dao.VmAndTemplatesGenerationsDbFacadeImpl diff --git a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeSnapshotScheduleDaoTest.java b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeSnapshotScheduleDaoTest.java new file mode 100644 index 0000000..ac3ac21 --- /dev/null +++ b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeSnapshotScheduleDaoTest.java @@ -0,0 +1,87 @@ +package org.ovirt.engine.core.dao.gluster; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; + +import java.sql.Time; +import java.util.Date; + +import org.junit.Test; +import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeSnapshotSchedule; +import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeSnapshotScheduleRecurrence; +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.dao.BaseDAOTestCase; + +public class GlusterVolumeSnapshotScheduleDaoTest extends BaseDAOTestCase { + + private static final Guid CLUSTER_ID = new Guid("ae956031-6be2-43d6-bb8f-5191c9253314"); + private static final Guid VOLUME_ID_1 = new Guid("0c3f45f6-3fe9-4b35-a30c-be0d1a835ea8"); + private static final Guid VOLUME_ID_2 = new Guid("b2cb2f73-fab3-4a42-93f0-d5e4c069a43e"); + + private GlusterVolumeSnapshotScheduleDao dao; + private GlusterVolumeSnapshotSchedule existingSchedule; + private GlusterVolumeSnapshotSchedule newSchedule; + + @Override + public void setUp() throws Exception { + super.setUp(); + dao = dbFacade.getGlusterVolumeSnapshotScheduleDao(); + existingSchedule = dao.getByVolumeId(VOLUME_ID_1); + } + + @Test + public void testSaveAndGetByVolumeId() { + GlusterVolumeSnapshotSchedule schedule = dao.getByVolumeId(VOLUME_ID_2); + assertNull(schedule); + + newSchedule = insertSnapshotSchedule(); + schedule = dao.getByVolumeId(VOLUME_ID_2); + assertNotNull(schedule); + assertEquals(schedule, newSchedule); + } + + private GlusterVolumeSnapshotSchedule insertSnapshotSchedule() { + GlusterVolumeSnapshotSchedule schedule = new GlusterVolumeSnapshotSchedule(); + schedule.setClusterId(CLUSTER_ID); + schedule.setVolumeId(VOLUME_ID_2); + schedule.setJobId("test_job_id"); + schedule.setSnapshotNamePrefix("prefix"); + schedule.setSnapshotDescription("desc"); + schedule.setInterval(0); + schedule.setRecurrence(GlusterVolumeSnapshotScheduleRecurrence.DAILY); + schedule.setTimeZone("Asia/Calcutta"); + schedule.setExecutionTime(new Time(10, 30, 0)); + schedule.setEndByDate(null); + dao.save(schedule); + return schedule; + } + + @Test + public void testGetByVolumeId() { + GlusterVolumeSnapshotSchedule schedule = dao.getByVolumeId(VOLUME_ID_1); + assertNotNull(schedule); + assertEquals(schedule, existingSchedule); + } + + @Test + public void testRemoveByVolumeId() { + dao.removeByVolumeId(VOLUME_ID_1); + GlusterVolumeSnapshotSchedule schedule = dao.getByVolumeId(VOLUME_ID_1); + assertNull(schedule); + } + + @Test + public void testUpdateShceduleByVolumeId() { + GlusterVolumeSnapshotSchedule schedule = dao.getByVolumeId(VOLUME_ID_1); + schedule.setRecurrence(GlusterVolumeSnapshotScheduleRecurrence.HOURLY); + schedule.setStartDate(new Date()); + schedule.setInterval(0); + + dao.updateScheduleByVolumeId(VOLUME_ID_1, schedule); + + GlusterVolumeSnapshotSchedule fetchedSchedule = dao.getByVolumeId(VOLUME_ID_1); + assertNotNull(fetchedSchedule); + assertEquals(fetchedSchedule, schedule); + } +} diff --git a/backend/manager/modules/dal/src/test/resources/fixtures.xml b/backend/manager/modules/dal/src/test/resources/fixtures.xml index 67d88d9..4f5a98b 100644 --- a/backend/manager/modules/dal/src/test/resources/fixtures.xml +++ b/backend/manager/modules/dal/src/test/resources/fixtures.xml @@ -6586,6 +6586,33 @@ </row> </table> + <table name="gluster_volume_snapshot_schedules"> + <column>volume_id</column> + <column>job_id</column> + <column>snapshot_name_prefix</column> + <column>snapshot_description</column> + <column>recurrence</column> + <column>time_zone</column> + <column>interval</column> + <column>start_date</column> + <column>execution_time</column> + <column>days</column> + <column>end_by</column> + <row> + <value>0c3f45f6-3fe9-4b35-a30c-be0d1a835ea8</value> + <value>0c3f45f6-3fe9-4b35-a30c-be0d1a835eb9</value> + <value>prefix</value> + <value>desc</value> + <value>INTERVAL</value> + <value>Asia/Calcutta</value> + <value>10</value> + <null/> + <null/> + <null/> + <null/> + </row> + </table> + <table name="gluster_volume_bricks"> <column>id</column> <column>volume_id</column> diff --git a/packaging/dbscripts/gluster_volume_snapshot_schedule_sp.sql b/packaging/dbscripts/gluster_volume_snapshot_schedule_sp.sql new file mode 100644 index 0000000..8eb638b --- /dev/null +++ b/packaging/dbscripts/gluster_volume_snapshot_schedule_sp.sql @@ -0,0 +1,89 @@ +/* ---------------------------------------------------------------- + Stored procedures for database operations on Gluster Volume Snapshot + related tables: + - gluster_volume_snapshot_schedules +----------------------------------------------------------------*/ + +Create or replace FUNCTION InsertGlusterVolumeSnapshotSchedule(v_volume_id UUID, + v_job_id VARCHAR(256), + v_snapshot_name_prefix VARCHAR(128), + v_snapshot_description VARCHAR(1024), + v_recurrence VARCHAR(128), + v_time_zone VARCHAR(128), + v_interval INTEGER, + v_start_date TIMESTAMP WITH TIME ZONE, + v_execution_time TIME, + v_days VARCHAR(256), + v_end_by TIMESTAMP WITH TIME ZONE) + RETURNS VOID + AS $procedure$ +BEGIN + INSERT INTO gluster_volume_snapshot_schedules (volume_id, job_id, snapshot_name_prefix, + snapshot_description, recurrence, time_zone, interval, + start_date, execution_time, days, end_by) + VALUES (v_volume_id, v_job_id, v_snapshot_name_prefix, + v_snapshot_description, v_recurrence, v_time_zone, v_interval, + v_start_date, v_execution_time, v_days, v_end_by); + + UPDATE gluster_volumes + SET snapshot_scheduled = true + WHERE id = v_volume_id; +END; $procedure$ +LANGUAGE plpgsql; + +Create or replace FUNCTION GetGlusterVolumeSnapshotScheduleByVolumeId(v_volume_id UUID) + RETURNS SETOF gluster_volume_snapshot_schedules_view STABLE + AS $procedure$ +BEGIN + RETURN QUERY SELECT * + FROM gluster_volume_snapshot_schedules_view + WHERE volume_id = v_volume_id; +END; $procedure$ +LANGUAGE plpgsql; + +Create or replace FUNCTION DeleteGlusterVolumeSnapshotScheduleByVolumeId(v_volume_id UUID) + RETURNS VOID + AS $procedure$ +BEGIN + DELETE FROM gluster_volume_snapshot_schedules + WHERE volume_id = v_volume_id; + + UPDATE gluster_volumes + SET snapshot_scheduled = false + WHERE id = v_volume_id; +END; $procedure$ +LANGUAGE plpgsql; + +Create or replace FUNCTION UpdateGlusterVolumeSnapshotScheduleByVolumeId(v_volume_id UUID, + v_job_id VARCHAR(256), + v_snapshot_name_prefix VARCHAR(128), + v_snapshot_description VARCHAR(1024), + v_recurrence VARCHAR(128), + v_time_zone VARCHAR(128), + v_interval INTEGER, + v_start_date TIMESTAMP WITH TIME ZONE, + v_execution_time TIME, + v_days VARCHAR(256), + v_end_by TIMESTAMP WITH TIME ZONE) + RETURNS VOID + AS $procedure$ +BEGIN + UPDATE gluster_volume_snapshot_schedules + SET job_id = v_job_id, + snapshot_name_prefix = v_snapshot_name_prefix, + snapshot_description = v_snapshot_description, + recurrence = v_recurrence, + time_zone = v_time_zone, + interval = v_interval, + start_date = v_start_date, + execution_time = v_execution_time, + days = v_days, + end_by = v_end_by, + _update_date = LOCALTIMESTAMP + WHERE volume_id = v_volume_id; + + UPDATE gluster_volumes + SET snapshot_scheduled = true + WHERE id = v_volume_id; +END; $procedure$ +LANGUAGE plpgsql; diff --git a/packaging/dbscripts/upgrade/03_05_1290_add_snapshot_scheduled_flag_to_gluster_volume.sql b/packaging/dbscripts/upgrade/03_05_1290_add_snapshot_scheduled_flag_to_gluster_volume.sql new file mode 100644 index 0000000..ef69f20 --- /dev/null +++ b/packaging/dbscripts/upgrade/03_05_1290_add_snapshot_scheduled_flag_to_gluster_volume.sql @@ -0,0 +1 @@ +SELECT fn_db_add_column('gluster_volumes', 'snapshot_scheduled', 'boolean DEFAULT false'); -- To view, visit https://gerrit.ovirt.org/39292 To unsubscribe, visit https://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ie44116df49acc302bfc1b745c00535c1fb0174ad Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: ovirt-engine-3.5-gluster Gerrit-Owner: Shubhendu Tripathi <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
