Martin Peřina has uploaded a new change for review.

Change subject: core: Add ExternalVariable entity
......................................................................

core: Add ExternalVariable entity

1) Creates external_variable table
2) Adds stored procedures to access external_variable table
3) Adds DAO to access the entity

This table will be used to share fence_kdump listener heartbeat between
engine and fence_kdump listener.

Change-Id: I61ffd646c102c01c34478309d072f74a8f7d7edf
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/ExternalVariable.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/ExternalVariableDao.java
A 
backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/ExternalVariableDaoDbFacadeImpl.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/ExternalVariableDaoTest.java
M backend/manager/modules/dal/src/test/resources/fixtures.xml
A packaging/dbscripts/external_variable_sp.sql
A packaging/dbscripts/upgrade/03_05_0350_add_external_variable.sql
9 files changed, 393 insertions(+), 0 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/34/27934/1

diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/ExternalVariable.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/ExternalVariable.java
new file mode 100644
index 0000000..d826706
--- /dev/null
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/ExternalVariable.java
@@ -0,0 +1,79 @@
+package org.ovirt.engine.core.common;
+
+import java.util.Date;
+
+import org.ovirt.engine.core.common.utils.ObjectUtils;
+
+/**
+ * Holder to exchange data with external systems using db
+ */
+public class ExternalVariable {
+    /**
+     * Name of the variable
+     */
+    private String name;
+
+    /**
+     * Value of the variable
+     */
+    private String value;
+
+    /**
+     * Last updated. If {@code null}, then current timestamp is assigned 
during db update.
+     */
+    private Date updated;
+
+    public ExternalVariable() {
+        name = null;
+        value = null;
+        updated = null;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    public Date getUpdated() {
+        return updated;
+    }
+
+    public void setUpdated(Date updated) {
+        this.updated = updated;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (!(obj instanceof ExternalVariable)) {
+            return false;
+        }
+
+        ExternalVariable other = (ExternalVariable) obj;
+        return ObjectUtils.objectsEqual(name, other.getName())
+                && ObjectUtils.objectsEqual(value, other.getValue())
+                && ObjectUtils.objectsEqual(updated, other.getUpdated());
+    }
+
+    @Override
+    public int hashCode() {
+        int result = 17;
+        result = 31 * result + (name != null ? name.hashCode() : 0);
+        result = 31 * result + (value != null ? value.hashCode() : 0);
+        result = 31 * result + (updated != null ? updated.hashCode() : 0);
+        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..5840acb 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
@@ -8,6 +8,7 @@
 import java.util.Map;
 
 import org.apache.commons.lang.StringUtils;
+import org.ovirt.engine.core.common.ExternalVariable;
 import org.ovirt.engine.core.common.VdcObjectType;
 import org.ovirt.engine.core.common.businessentities.BaseDisk;
 import org.ovirt.engine.core.common.businessentities.BusinessEntity;
@@ -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.ExternalVariableDao;
 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(ExternalVariable.class, ExternalVariableDao.class);
         }
     };
 
@@ -983,6 +986,15 @@
     }
 
     /**
+     * Returns the singleton instance of {@link ExternalVariableDao}.
+     *
+     * @return the dao instance
+     */
+    public ExternalVariableDao getExternalVariableDao() {
+        return getDao(ExternalVariableDao.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/ExternalVariableDao.java
 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/ExternalVariableDao.java
new file mode 100644
index 0000000..c203576
--- /dev/null
+++ 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/ExternalVariableDao.java
@@ -0,0 +1,29 @@
+package org.ovirt.engine.core.dao;
+
+import org.ovirt.engine.core.common.ExternalVariable;
+
+public interface ExternalVariableDao extends DAO {
+    /**
+     * Inserts or updates variable in db
+     *
+     * @param var
+     *            variable to save
+     */
+    public void upsert(ExternalVariable var);
+
+    /**
+     * Removes variable from db
+     *
+     * @param name
+     *            name of the variable to remove
+     */
+    public void remove(String name);
+
+    /**
+     * Get variable from db
+     *
+     * @param name
+     *            name of the variable to get
+     */
+    public ExternalVariable get(String name);
+}
diff --git 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/ExternalVariableDaoDbFacadeImpl.java
 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/ExternalVariableDaoDbFacadeImpl.java
new file mode 100644
index 0000000..227df6a
--- /dev/null
+++ 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/ExternalVariableDaoDbFacadeImpl.java
@@ -0,0 +1,54 @@
+package org.ovirt.engine.core.dao;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+import org.ovirt.engine.core.common.ExternalVariable;
+import org.ovirt.engine.core.dal.dbbroker.DbFacadeUtils;
+import org.springframework.jdbc.core.RowMapper;
+
+public class ExternalVariableDaoDbFacadeImpl extends BaseDAODbFacade 
implements ExternalVariableDao {
+
+    private static class ExternalVariableMapper implements 
RowMapper<ExternalVariable> {
+        private static final ExternalVariableMapper instance = new 
ExternalVariableMapper();
+
+        @Override
+        public ExternalVariable mapRow(ResultSet rs, int rowNum) throws 
SQLException {
+            ExternalVariable entity = new ExternalVariable();
+            entity.setName(rs.getString("var_name"));
+            entity.setValue(rs.getString("var_value"));
+            
entity.setUpdated(DbFacadeUtils.fromDate(rs.getTimestamp("updated")));
+            return entity;
+        }
+    }
+
+    @Override
+    public void upsert(ExternalVariable var) {
+        getCallsHandler().executeModification(
+                "UpsertExternalVariable",
+                getCustomMapSqlParameterSource()
+                        .addValue("var_name", var.getName())
+                        .addValue("var_value", var.getValue())
+                        .addValue("updated", var.getUpdated())
+        );
+    }
+
+    @Override
+    public void remove(String name) {
+        getCallsHandler().executeModification(
+                "DeleteExternalVariable",
+                getCustomMapSqlParameterSource()
+                        .addValue("var_name", name)
+        );
+    }
+
+    @Override
+    public ExternalVariable get(String name) {
+        return getCallsHandler().executeRead(
+                "GetExternalVariableByName",
+                ExternalVariableMapper.instance,
+                getCustomMapSqlParameterSource()
+                        .addValue("var_name", name)
+        );
+    }
+}
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..12500f8 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
+ExternalVariableDao=org.ovirt.engine.core.dao.ExternalVariableDaoDbFacadeImpl
diff --git 
a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/ExternalVariableDaoTest.java
 
b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/ExternalVariableDaoTest.java
new file mode 100644
index 0000000..ac80ccc
--- /dev/null
+++ 
b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/ExternalVariableDaoTest.java
@@ -0,0 +1,133 @@
+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 java.util.Date;
+import java.util.TimeZone;
+
+import org.junit.Test;
+import org.ovirt.engine.core.common.ExternalVariable;
+
+/**
+ * {@link ExternalVariableDao} tests
+ */
+public class ExternalVariableDaoTest extends BaseDAOTestCase {
+    /**
+     * Test getting existing variable
+     */
+    @Test
+    public void getExistingVariable() {
+        ExternalVariable expected = new ExternalVariable();
+        expected.setName("fence-kdump-listener");
+        Calendar cal = Calendar.getInstance();
+        cal.setTimeZone(TimeZone.getTimeZone("UTC"));
+        cal.set(2014, 3, 22, 15, 0, 5);
+        cal.set(Calendar.MILLISECOND, 0);
+        expected.setUpdated(cal.getTime());
+
+        ExternalVariable found = 
dbFacade.getExternalVariableDao().get(expected.getName());
+
+        assertNotNull(found);
+        assertEquals(expected, found);
+    }
+
+    /**
+     * Test getting non existent variable
+     */
+    @Test
+    public void getNonExistentVariable() {
+        ExternalVariable found = 
dbFacade.getExternalVariableDao().get("non-existent");
+
+        assertNull(found);
+    }
+
+    /**
+     * Test creating new variable
+     */
+    @Test
+    public void createNewVariable() {
+        ExternalVariable newVar = new ExternalVariable();
+        newVar.setName("new-var");
+        newVar.setValue("123456");
+        newVar.setUpdated(new Date());
+
+        dbFacade.getExternalVariableDao().upsert(newVar);
+
+        ExternalVariable found = 
dbFacade.getExternalVariableDao().get(newVar.getName());
+
+        assertNotNull(found);
+        assertEquals(newVar, found);
+    }
+
+    /**
+     * Test creating new variable with updated set to {@code null} (db will 
set updated to now)
+     */
+    @Test
+    public void createNewVariableWithEmptyUpdated() {
+        ExternalVariable newVar = new ExternalVariable();
+        newVar.setName("new-var");
+        newVar.setValue("123456");
+
+        dbFacade.getExternalVariableDao().upsert(newVar);
+
+        ExternalVariable found = 
dbFacade.getExternalVariableDao().get(newVar.getName());
+
+        assertNotNull(found);
+        assertEquals(newVar.getName(), found.getName());
+        assertEquals(newVar.getValue(), found.getValue());
+        assertNotNull(found.getUpdated());
+    }
+
+    /**
+     * Test updating existing variable
+     */
+    @Test
+    public void updateExistingVariable() {
+        String name = "fence-kdump-listener";
+
+        ExternalVariable existing = 
dbFacade.getExternalVariableDao().get(name);
+        existing.setValue("123456");
+        existing.setUpdated(new Date());
+
+        dbFacade.getExternalVariableDao().upsert(existing);
+
+        ExternalVariable found = dbFacade.getExternalVariableDao().get(name);
+
+        assertNotNull(found);
+        assertEquals(existing, found);
+    }
+
+    /**
+     * Test removing existing variable
+     */
+    @Test
+    public void removeExistingVariable() {
+        ExternalVariable var = new ExternalVariable();
+        var.setName("new-var");
+        var.setValue("123456");
+        var.setUpdated(new Date());
+
+        dbFacade.getExternalVariableDao().upsert(var);
+
+        ExternalVariable found = 
dbFacade.getExternalVariableDao().get(var.getName());
+        assertNotNull(found);
+        assertEquals(var, found);
+
+        dbFacade.getExternalVariableDao().remove(var.getName());
+
+        dbFacade.getExternalVariableDao().get(var.getName());
+        ExternalVariable removed = 
dbFacade.getExternalVariableDao().get(var.getName());
+        assertNull(removed);
+    }
+
+    /**
+     * Test removing existing variable
+     */
+    @Test
+    public void removeNonExistentVariable() {
+        dbFacade.getExternalVariableDao().remove("non-existent-var");
+    }
+}
diff --git a/backend/manager/modules/dal/src/test/resources/fixtures.xml 
b/backend/manager/modules/dal/src/test/resources/fixtures.xml
index d37c85e..42a6147 100644
--- a/backend/manager/modules/dal/src/test/resources/fixtures.xml
+++ b/backend/manager/modules/dal/src/test/resources/fixtures.xml
@@ -6290,4 +6290,15 @@
             <value></value>
         </row>
     </table>
+
+    <table name="external_variable">
+        <column>var_name</column>
+        <column>var_value</column>
+        <column>updated</column>
+        <row>
+            <value>fence-kdump-listener</value>
+            <null />
+            <value>2014-04-22 15:00:05 UTC</value>
+        </row>
+    </table>
 </dataset>
diff --git a/packaging/dbscripts/external_variable_sp.sql 
b/packaging/dbscripts/external_variable_sp.sql
new file mode 100644
index 0000000..ba24f39
--- /dev/null
+++ b/packaging/dbscripts/external_variable_sp.sql
@@ -0,0 +1,62 @@
+--
+-- Table external_variable
+--
+
+-- UpsertExternalVariable is used in fence_kdump listener
+CREATE OR REPLACE FUNCTION UpsertExternalVariable(
+        v_var_name VARCHAR(50),
+        v_var_value VARCHAR(255),
+        v_updated TIMESTAMP WITH TIME ZONE)
+RETURNS VOID
+    AS $procedure$
+DECLARE
+    db_updated TIMESTAMP WITH TIME ZONE;
+BEGIN
+    -- set updated to db now if not provided
+    db_updated := v_updated;
+    IF db_updated IS NULL THEN
+        SELECT NOW() INTO db_updated;
+    END IF;
+
+    UPDATE external_variable
+        SET
+            var_value = v_var_value,
+            updated = db_updated
+        WHERE var_name = v_var_name;
+
+    IF NOT found THEN
+        INSERT INTO external_variable(
+                var_name,
+                var_value,
+                updated
+            ) VALUES (
+                v_var_name,
+                v_var_value,
+                db_updated
+            );
+    END IF;
+END; $procedure$
+LANGUAGE plpgsql;
+
+
+CREATE OR REPLACE FUNCTION DeleteExternalVariable(
+        v_var_name VARCHAR(50))
+RETURNS VOID
+    AS $procedure$
+BEGIN
+    DELETE FROM external_variable
+        WHERE var_name = v_var_name;
+END; $procedure$
+LANGUAGE plpgsql;
+
+
+CREATE OR REPLACE FUNCTION GetExternalVariableByName(
+        v_var_name VARCHAR(50))
+RETURNS SETOF external_variable STABLE
+    AS $procedure$
+BEGIN
+    RETURN QUERY SELECT external_variable.*
+        FROM external_variable
+        WHERE var_name = v_var_name;
+END; $procedure$
+LANGUAGE plpgsql;
diff --git a/packaging/dbscripts/upgrade/03_05_0350_add_external_variable.sql 
b/packaging/dbscripts/upgrade/03_05_0350_add_external_variable.sql
new file mode 100644
index 0000000..0f5d9ea
--- /dev/null
+++ b/packaging/dbscripts/upgrade/03_05_0350_add_external_variable.sql
@@ -0,0 +1,12 @@
+--
+-- Table is used to exchange data with external systems
+--
+CREATE TABLE external_variable (
+  var_name VARCHAR(50) NOT NULL,
+  var_value VARCHAR(255),
+  updated TIMESTAMP WITH TIME ZONE NOT NULL,
+  CONSTRAINT pk_external_variable PRIMARY KEY(var_name)
+) WITH OIDS;
+
+CREATE INDEX idx_external_variable_updated ON external_variable(updated);
+


-- 
To view, visit http://gerrit.ovirt.org/27934
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I61ffd646c102c01c34478309d072f74a8f7d7edf
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