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
