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

Reply via email to