Martin Peřina has uploaded a new change for review. Change subject: core: Add FenceKdumpMessage entity ......................................................................
core: Add FenceKdumpMessage entity 1) Creates fence_kdump_messages table 2) Add stored procedure to access fence_kdump_messages table 3) Ads DAO to access the entity Change-Id: I58696ddefa8602b1daa5f55ab4dc11bdc565e265 Bug-Url: https://bugzilla.redhat.com/1079821 Signed-off-by: Martin Perina <[email protected]> --- A backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/FenceKdumpMessage.java A backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/KdumpFlowStatus.java M backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/DbFacade.java A backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/FenceKdumpMessageDao.java A backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/FenceKdumpMessageDaoDbFacadeImpl.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/FenceKdumpMessageDaoTest.java M backend/manager/modules/dal/src/test/resources/fixtures.xml A packaging/dbscripts/fence_kdump_messages_sp.sql A packaging/dbscripts/upgrade/03_05_0350_add_fence_kdump_messages.sql 10 files changed, 336 insertions(+), 0 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/00/27200/1 diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/FenceKdumpMessage.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/FenceKdumpMessage.java new file mode 100644 index 0000000..4ec9065 --- /dev/null +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/FenceKdumpMessage.java @@ -0,0 +1,79 @@ +package org.ovirt.engine.core.common.businessentities; + +import java.util.Date; + +import org.ovirt.engine.core.common.utils.ObjectUtils; + +/** + * Message received from kdumping host + */ +public class FenceKdumpMessage { + /** + * Host IP address + */ + private String host; + + /** + * Message received + */ + private Date received; + + /** + * Host kdump flow status + */ + private KdumpFlowStatus status; + + public FenceKdumpMessage() { + host = null; + received = null; + status = null; + } + + public String getHost() { + return host; + } + + public void setHost(String host) { + this.host = host; + } + + public Date getReceived() { + return received; + } + + public void setReceived(Date received) { + this.received = received; + } + + public KdumpFlowStatus getStatus() { + return status; + } + + public void setStatus(KdumpFlowStatus status) { + this.status = status; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (!(obj instanceof FenceKdumpMessage)) { + return false; + } + FenceKdumpMessage msg = (FenceKdumpMessage) obj; + + return ObjectUtils.objectsEqual(host, msg.getHost()) + && ObjectUtils.objectsEqual(received, msg.getReceived()) + && status == msg.getStatus(); + } + + @Override + public int hashCode() { + int result = 17; + result = 31 * result + (host == null ? 0 : host.hashCode()); + result = 31 * result + (received == null ? 0 : received.hashCode()); + result = 31 * result + (status == null ? 0 : status.hashCode()); + return result; + } +} diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/KdumpFlowStatus.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/KdumpFlowStatus.java new file mode 100644 index 0000000..afb91ba --- /dev/null +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/KdumpFlowStatus.java @@ -0,0 +1,42 @@ +package org.ovirt.engine.core.common.businessentities; + +/** + * Status of host kdump flow + */ +public enum KdumpFlowStatus { + /** + * Kdump flow started + */ + STARTED, + + /** + * Kdump flow is currently running + */ + DUMPING, + + /** + * Kdump flow finished successfully + */ + FINISHED; + + /** + * Returns string value (lowercase name) + */ + public String getAsString() { + return name().toLowerCase(); + } + + /** + * Creates an enum instance for specified string value + * + * @param value + * string value + */ + public static KdumpFlowStatus forString(String value) { + KdumpFlowStatus result = null; + if (value != null) { + result = KdumpFlowStatus.valueOf(value.toUpperCase()); + } + return result; + } +} 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 b8d519e..8b84ea3 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 @@ -14,6 +14,7 @@ import org.ovirt.engine.core.common.businessentities.DiskImage; import org.ovirt.engine.core.common.businessentities.DiskImageDynamic; import org.ovirt.engine.core.common.businessentities.DwhHistoryTimekeeping; +import org.ovirt.engine.core.common.businessentities.FenceKdumpMessage; import org.ovirt.engine.core.common.businessentities.Image; import org.ovirt.engine.core.common.businessentities.IscsiBond; import org.ovirt.engine.core.common.businessentities.Permissions; @@ -63,6 +64,7 @@ import org.ovirt.engine.core.dao.DiskImageDynamicDAO; import org.ovirt.engine.core.dao.DiskLunMapDao; import org.ovirt.engine.core.dao.EventDAO; +import org.ovirt.engine.core.dao.FenceKdumpMessageDao; import org.ovirt.engine.core.dao.GenericDao; import org.ovirt.engine.core.dao.ImageDao; import org.ovirt.engine.core.dao.ImageStorageDomainMapDao; @@ -177,6 +179,7 @@ put(DwhHistoryTimekeeping.class, DwhHistoryTimekeepingDao.class); put(IscsiBond.class, IscsiBondDao.class); put(VmInit.class, VmInitDAO.class); + put(FenceKdumpMessage.class, FenceKdumpMessageDao.class); } }; @@ -983,6 +986,15 @@ } /** + * Returns the singleton instance of {@link FenceKdumpMessageDao}. + * + * @return the dao instance + */ + public FenceKdumpMessageDao getFenceKdumpMessageDao() { + return getDao(FenceKdumpMessageDao.class); + } + + /** * This call will populate a translation table of OS Ids to they're name * The translation table shall be in use by DWH * diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/FenceKdumpMessageDao.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/FenceKdumpMessageDao.java new file mode 100644 index 0000000..47ae017 --- /dev/null +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/FenceKdumpMessageDao.java @@ -0,0 +1,27 @@ +package org.ovirt.engine.core.dao; + +import java.util.Date; + +import org.ovirt.engine.core.common.businessentities.FenceKdumpMessage; + +public interface FenceKdumpMessageDao extends DAO { + /** + * Returns most recent record for specified host + * + * @param host + * host IP address + */ + public FenceKdumpMessage getMostRecent(String host); + + /** + * Removes all message older then specified date + * + * @param date specified date + */ + public void removeAllOlderThan(Date date); + + /** + * Checks if fence_kdump listener is alive + */ + public boolean isFenceKdumpListenerAlive(); +} diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/FenceKdumpMessageDaoDbFacadeImpl.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/FenceKdumpMessageDaoDbFacadeImpl.java new file mode 100644 index 0000000..b57b390 --- /dev/null +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/FenceKdumpMessageDaoDbFacadeImpl.java @@ -0,0 +1,56 @@ +package org.ovirt.engine.core.dao; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Date; + +import org.ovirt.engine.core.common.businessentities.KdumpFlowStatus; +import org.ovirt.engine.core.common.businessentities.FenceKdumpMessage; +import org.ovirt.engine.core.common.config.Config; +import org.ovirt.engine.core.common.config.ConfigValues; +import org.ovirt.engine.core.dal.dbbroker.DbFacadeUtils; +import org.springframework.jdbc.core.RowMapper; + +public class FenceKdumpMessageDaoDbFacadeImpl extends BaseDAODbFacade implements FenceKdumpMessageDao { + /** + * Value of {@code ip} column for fence_kdump listener heartbeat + */ + private static final String HEARTBEAT_RECORD = "fence_kdump_listener"; + + private static class FenceKdumpMessageMapper implements RowMapper<FenceKdumpMessage> { + private static final FenceKdumpMessageMapper instance = new FenceKdumpMessageMapper(); + + @Override + public FenceKdumpMessage mapRow(ResultSet rs, int rowNum) throws SQLException { + FenceKdumpMessage entity = new FenceKdumpMessage(); + entity.setHost(rs.getString("host")); + entity.setReceived(DbFacadeUtils.fromDate(rs.getTimestamp("received"))); + entity.setStatus(KdumpFlowStatus.forString(rs.getString("status"))); + return entity; + } + } + + @Override + public FenceKdumpMessage getMostRecent(String host) { + return getCallsHandler().executeRead("GetMostRecentFenceKdumpMessageForHost", + FenceKdumpMessageMapper.instance, + getCustomMapSqlParameterSource().addValue("host", host)); + } + + @Override + public void removeAllOlderThan(Date date) { + getCallsHandler().executeModification("RemoveFenceKdumpMessageOlderThan", + getCustomMapSqlParameterSource().addValue("older_than", date)); + } + + @Override + public boolean isFenceKdumpListenerAlive() { + boolean alive = false; + FenceKdumpMessage msg = getMostRecent(HEARTBEAT_RECORD); + if (msg != null) { + int timeout = Config.<Integer> getValue(ConfigValues.FenceKdumpListenerAliveTimeout) * 1000; + alive = msg.getReceived().getTime() + timeout > System.currentTimeMillis(); + } + return alive; + } +} 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 19273d7..4a68a3b 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 @@ -74,3 +74,4 @@ IscsiBondDao=org.ovirt.engine.core.dao.IscsiBondDaoDbFacadeImpl VmInitDAO=org.ovirt.engine.core.dao.VmInitDAODbFacadeImpl StorageDomainOvfInfoDao=org.ovirt.engine.core.dao.StorageDomainOvfInfoDbFacadeImpl +FenceKdumpMessageDao=org.ovirt.engine.core.dao.FenceKdumpMessageDaoDbFacadeImpl diff --git a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/FenceKdumpMessageDaoTest.java b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/FenceKdumpMessageDaoTest.java new file mode 100644 index 0000000..8dfb8b9 --- /dev/null +++ b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/FenceKdumpMessageDaoTest.java @@ -0,0 +1,49 @@ +package org.ovirt.engine.core.dao; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; + +import java.util.Calendar; + +import org.junit.Test; +import org.ovirt.engine.core.common.businessentities.FenceKdumpMessage; +import org.ovirt.engine.core.common.businessentities.KdumpFlowStatus; + +/** + * {@link FenceKdumpMessageDao} tests + */ +public class FenceKdumpMessageDaoTest extends BaseDAOTestCase { + /** + * Test getting most recent record for host + */ + @Test + public void getMostRecentForExistingHost() { + FenceKdumpMessage expected = new FenceKdumpMessage(); + expected.setHost("10.34.63.152"); + Calendar cal = Calendar.getInstance(); + cal.set(2014, 3, 22, 15, 0, 20); + cal.set(Calendar.MILLISECOND, 0); + expected.setReceived(cal.getTime()); + expected.setStatus(KdumpFlowStatus.FINISHED); + + FenceKdumpMessage found = dbFacade.getFenceKdumpMessageDao().getMostRecent(expected.getHost()); + + assertNotNull(found); + assertEquals(expected, found); + } + + /** + * Test removing all records older then a date + */ + @Test + public void removeAllMessageOlderThan() { + Calendar cal = Calendar.getInstance(); + cal.set(2014, 4, 20); + + dbFacade.getFenceKdumpMessageDao().removeAllOlderThan(cal.getTime()); + FenceKdumpMessage found = dbFacade.getFenceKdumpMessageDao().getMostRecent("10.34.63.178"); + + assertNull(found); + } +} diff --git a/backend/manager/modules/dal/src/test/resources/fixtures.xml b/backend/manager/modules/dal/src/test/resources/fixtures.xml index d37c85e..2b518ec 100644 --- a/backend/manager/modules/dal/src/test/resources/fixtures.xml +++ b/backend/manager/modules/dal/src/test/resources/fixtures.xml @@ -6290,4 +6290,44 @@ <value></value> </row> </table> + <table name="fence_kdump_messages"> + <column>host</column> + <column>received</column> + <column>status</column> + <row> + <value>10.34.63.178</value> + <value>2014-04-01 12:10:00</value> + <value>started</value> + </row> + <row> + <value>10.34.63.178</value> + <value>2014-04-01 12:10:05</value> + <value>dumping</value> + </row> + <row> + <value>10.34.63.178</value> + <value>2014-04-01 12:10:10</value> + <value>finished</value> + </row> + <row> + <value>10.34.63.152</value> + <value>2014-04-22 15:00:00</value> + <value>started</value> + </row> + <row> + <value>10.34.63.152</value> + <value>2014-04-22 15:00:05</value> + <value>dumping</value> + </row> + <row> + <value>10.34.63.152</value> + <value>2014-04-22 15:00:15</value> + <value>dumping</value> + </row> + <row> + <value>10.34.63.152</value> + <value>2014-04-22 15:00:20</value> + <value>finished</value> + </row> + </table> </dataset> diff --git a/packaging/dbscripts/fence_kdump_messages_sp.sql b/packaging/dbscripts/fence_kdump_messages_sp.sql new file mode 100644 index 0000000..111fb9c --- /dev/null +++ b/packaging/dbscripts/fence_kdump_messages_sp.sql @@ -0,0 +1,23 @@ +---------------------------------------------------------------- +-- [fence_kdump_messages] Table +---------------------------------------------------------------- +CREATE OR REPLACE FUNCTION GetMostRecentFenceKdumpMessageForHost(v_host VARCHAR(50)) +RETURNS SETOF fence_kdump_messages STABLE + AS $procedure$ +BEGIN + RETURN QUERY SELECT * + FROM fence_kdump_messages + WHERE host = v_host + ORDER BY received DESC + LIMIT 1; +END; $procedure$ +LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION RemoveFenceKdumpMessageOlderThan(v_older_than TIMESTAMP WITH TIME ZONE) +RETURNS VOID + AS $procedure$ +BEGIN + DELETE FROM fence_kdump_messages + WHERE received <= v_older_than; +END; $procedure$ +LANGUAGE plpgsql; diff --git a/packaging/dbscripts/upgrade/03_05_0350_add_fence_kdump_messages.sql b/packaging/dbscripts/upgrade/03_05_0350_add_fence_kdump_messages.sql new file mode 100644 index 0000000..4494f4d --- /dev/null +++ b/packaging/dbscripts/upgrade/03_05_0350_add_fence_kdump_messages.sql @@ -0,0 +1,7 @@ +CREATE TABLE fence_kdump_messages ( + host VARCHAR(50) NOT NULL, + received TIMESTAMP WITH TIME ZONE NOT NULL, + status VARCHAR(20) NOT NULL, + CONSTRAINT pk_fence_kdump_messages PRIMARY KEY(host, received) +) WITH OIDS; + -- To view, visit http://gerrit.ovirt.org/27200 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I58696ddefa8602b1daa5f55ab4dc11bdc565e265 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Martin Peřina <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
