Ravi Nori has uploaded a new change for review. Change subject: core : Introduce engine_sessions table and DAO ......................................................................
core : Introduce engine_sessions table and DAO Introduce engine sessions table to hold the session information for authenticated users and the dao to manipulate the table Change-Id: I4b4d9cfc3edc6084fc0436ecfd09c82d5ae57f5e Bug-Url: https://bugzilla.redhat.com/1092744 Signed-off-by: Ravi Nori <rn...@redhat.com> --- A backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/EngineSession.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/EngineSessionDAO.java A backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/EngineSessionDAODbFacadeImpl.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/EngineSessionDAOTest.java M backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/FixturesTool.java M backend/manager/modules/dal/src/test/resources/fixtures.xml A packaging/dbscripts/engine_sessions_sp.sql A packaging/dbscripts/upgrade/03_06_0530_add_engine_sessions.sql 10 files changed, 546 insertions(+), 0 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/48/35148/1 diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/EngineSession.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/EngineSession.java new file mode 100644 index 0000000..7b2d4a3 --- /dev/null +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/EngineSession.java @@ -0,0 +1,144 @@ +package org.ovirt.engine.core.common.businessentities; + +import org.ovirt.engine.core.common.utils.ObjectUtils; +import org.ovirt.engine.core.compat.Guid; + +import javax.validation.constraints.Size; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Date; + +public class EngineSession implements Serializable { + private static final long serialVersionUID = 6964615561527013329L; + + + private String engineSessionId; + + private Guid userId; + + @Size(min = 1, max = BusinessEntitiesDefinitions.USER_LOGIN_NAME_SIZE) + private String userName; + + private String role; + + private Collection<Guid> groupIds; + + private String authRecord; + + private String principalRecord; + + private Date sessionExpiration; + + /** + * Session id assigned by engine for the user's session + */ + public String getEngineSessionId() { + return engineSessionId; + } + + public void setEngineSessionId(String engineSessionId) { + this.engineSessionId = engineSessionId; + } + + /** + * Identifier assigned by the engine to this user for internal use only. + */ + public Guid getUserId() { + return userId; + } + + public void setUserId(Guid userId) { + this.userId = userId; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getRole() { + return role; + } + + public void setRole(String role) { + this.role = role; + } + + /** + * Comma delimited list of group identifiers. + */ + public Collection<Guid> getGroupIds() { + if (groupIds == null) { + groupIds = Collections.emptyList(); + } + return new ArrayList<Guid>(groupIds); + } + + public void setGroupIds(Collection<Guid> groupIds) { + this.groupIds = groupIds; + } + + public String getAuthRecord() { + return authRecord; + } + + public void setAuthRecord(String authRecord) { + this.authRecord = authRecord; + } + + public String getPrincipalRecord() { + return principalRecord; + } + + public void setPrincipalRecord(String principalRecord) { + this.principalRecord = principalRecord; + } + + /** + * The hard timeout for session expiration + */ + public Date getSessionExpiration() { + return sessionExpiration; + } + + public void setSessionExpiration(Date sessionExpiration) { + this.sessionExpiration = sessionExpiration; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((engineSessionId == null) ? 0 : engineSessionId.hashCode()); + result = prime * result + ((userId == null) ? 0 : userId.hashCode()); + result = prime * result + ((userName == null) ? 0 : userName.hashCode()); + result = prime * result + ((authRecord == null) ? 0 : authRecord.hashCode()); + result = prime * result + ((principalRecord == null) ? 0 : principalRecord.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + EngineSession other = (EngineSession) obj; + return ObjectUtils.objectsEqual(engineSessionId, other.engineSessionId) + && ObjectUtils.objectsEqual(userId, other.userId) + && ObjectUtils.objectsEqual(userName, other.userName) + && ObjectUtils.objectsEqual(authRecord, other.authRecord) + && ObjectUtils.objectsEqual(principalRecord, other.principalRecord); + + } +} 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 b2e410c..2ce6206 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 @@ -17,6 +17,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.EngineSession; import org.ovirt.engine.core.common.businessentities.Image; import org.ovirt.engine.core.common.businessentities.IscsiBond; import org.ovirt.engine.core.common.businessentities.MacPool; @@ -72,6 +73,7 @@ import org.ovirt.engine.core.dao.DiskImageDAO; import org.ovirt.engine.core.dao.DiskImageDynamicDAO; import org.ovirt.engine.core.dao.DiskLunMapDao; +import org.ovirt.engine.core.dao.EngineSessionDAO; import org.ovirt.engine.core.dao.EventDAO; import org.ovirt.engine.core.dao.ExternalVariableDao; import org.ovirt.engine.core.dao.GenericDao; @@ -204,6 +206,7 @@ put(VmJob.class, VmJobDao.class); put(MacPool.class, MacPoolDao.class); put(DiskProfile.class, DiskProfileDao.class); + put(EngineSession.class, EngineSessionDAO.class); } }; @@ -635,6 +638,15 @@ } /** + * Returns the singleton instance of {@link EngineSessionDAO}. + * + * @return the dao + */ + public EngineSessionDAO getEngineSessionDao() { + return getDao(EngineSessionDAO.class); + } + + /** * Returns the singleton instance of {@link ProviderDao}. * * @return the dao diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/EngineSessionDAO.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/EngineSessionDAO.java new file mode 100644 index 0000000..3b5ae8a --- /dev/null +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/EngineSessionDAO.java @@ -0,0 +1,42 @@ +package org.ovirt.engine.core.dao; + +import org.ovirt.engine.core.common.businessentities.EngineSession; + +import java.util.List; + +/** + * <code>EngineSessionDAO</code> defines a type which performs CRUD operations on instances of {@link org.ovirt.engine.core.common.businessentities.EngineSession}. + * + * + */ +public interface EngineSessionDAO extends DAO { + /** + * Retrieves the session with the specified id. + * + * @param id the task id + * @return the task + */ + EngineSession get(String id); + + /** + * Retrieves all sessions. + * + * @return the list of sessions + */ + List<EngineSession> getAll(); + + /** + * Saves or updates the specified session + * + * @param session the session + */ + void saveOrUpdate(EngineSession session); + + /** + * Removes the session with the specified id. + * + * @param id + */ + int remove(String id); + +} diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/EngineSessionDAODbFacadeImpl.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/EngineSessionDAODbFacadeImpl.java new file mode 100644 index 0000000..14eb2e9 --- /dev/null +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/EngineSessionDAODbFacadeImpl.java @@ -0,0 +1,103 @@ +package org.ovirt.engine.core.dao; + +import org.apache.commons.lang.StringUtils; +import org.ovirt.engine.core.common.businessentities.EngineSession; +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.dal.dbbroker.CustomMapSqlParameterSource; +import org.ovirt.engine.core.dal.dbbroker.DbEngineDialect; +import org.ovirt.engine.core.dal.dbbroker.DbFacadeUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.LinkedList; +import java.util.List; + +/** + * <code>EngineSessionDAODbFacadeImpl</code> provides an implementation of {@link org.ovirt.engine.core.dao.EngineSessionDAO} using code refactored from + * {@code DbFacade}. + */ +public class EngineSessionDAODbFacadeImpl extends BaseDAODbFacade implements EngineSessionDAO { + private static final Logger log = LoggerFactory.getLogger(EngineSessionDAODbFacadeImpl.class); + + private static class EngineSessionRowMapper implements RowMapper<EngineSession> { + public static final EngineSessionRowMapper instance = new EngineSessionRowMapper(); + + @Override + public EngineSession mapRow(ResultSet rs, int rowNum) throws SQLException { + EngineSession session = new EngineSession(); + session.setEngineSessionId(rs.getString("id")); + session.setUserId(getGuidDefaultEmpty(rs, "user_id")); + session.setUserName(rs.getString("user_name")); + session.setAuthRecord(rs.getString("auth_record")); + session.setPrincipalRecord(rs.getString("principal_record")); + session.setGroupIds(convertToGuidList(rs.getString("group_ids"), ',')); + session.setRole(rs.getString("role")); + session.setSessionExpiration(DbFacadeUtils.fromDate(rs.getTimestamp("session_expiration"))); + return session; + } + + private LinkedList<Guid> convertToGuidList(String str, char delimiter) { + LinkedList<Guid> results = new LinkedList<>(); + if (str != null) { + for (String id : str.split(String.format(" *%s *", delimiter))) { + results.add(Guid.createGuidFromString(id)); + } + } + return results; + } + } + + private static class EngineSessionParameterSource extends CustomMapSqlParameterSource { + + public EngineSessionParameterSource(DbEngineDialect dialect, EngineSession session) { + super(dialect); + addValue("id", session.getEngineSessionId()); + addValue("user_id", session.getUserId()); + addValue("user_name", session.getUserName()); + addValue("auth_record", session.getAuthRecord()); + addValue("principal_record", session.getPrincipalRecord()); + addValue("group_ids", StringUtils.join(session.getGroupIds(), ",")); + addValue("role", session.getRole()); + addValue("session_expiration", session.getSessionExpiration()); + } + } + + @Override + public EngineSession get(String id) { + MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource() + .addValue("id", id); + + return getCallsHandler().executeRead("GetEngineSessionById", EngineSessionRowMapper.instance, parameterSource); + } + + @Override + public List<EngineSession> getAll() { + MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource(); + + return getCallsHandler().executeReadList("GetAllFromEngineSessions", EngineSessionRowMapper.instance, parameterSource); + } + + private EngineSessionParameterSource getEngineSessionParameterSource(EngineSession session) { + return new EngineSessionParameterSource(dialect, session); + } + + @Override + public void saveOrUpdate(EngineSession session) { + EngineSessionParameterSource parameterSource = getEngineSessionParameterSource(session); + getCallsHandler().executeModification("InsertOrUpdateEngineSession", parameterSource); + } + + + @Override + public int remove(String id) { + MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource() + .addValue("id", id); + + return getCallsHandler().executeModificationReturnResult("DeleteEngineSession", parameterSource); + } + +} 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 8d96e8a..d4b42a7 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 @@ -1,6 +1,7 @@ BookmarkDAO=org.ovirt.engine.core.dao.BookmarkDAODbFacadeImpl CommandEntityDao=org.ovirt.engine.core.dao.CommandEntityDaoDbFacadeImpl DbUserDAO=org.ovirt.engine.core.dao.DbUserDAODbFacadeImpl +EngineSessionDAO=org.ovirt.engine.core.dao.EngineSessionDAODbFacadeImpl VdsDAO=org.ovirt.engine.core.dao.VdsDAODbFacadeImpl VdsStaticDAO=org.ovirt.engine.core.dao.VdsStaticDAODbFacadeImpl VdsDynamicDAO=org.ovirt.engine.core.dao.VdsDynamicDAODbFacadeImpl diff --git a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/EngineSessionDAOTest.java b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/EngineSessionDAOTest.java new file mode 100644 index 0000000..d2a5d6a --- /dev/null +++ b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/EngineSessionDAOTest.java @@ -0,0 +1,115 @@ +package org.ovirt.engine.core.dao; + +import org.junit.Before; +import org.junit.Test; +import org.ovirt.engine.core.common.businessentities.EngineSession; +import org.ovirt.engine.core.compat.Guid; + +import java.util.Arrays; +import java.util.Date; +import java.util.LinkedList; +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; + +/** + * <code>EngineSessionDAOTest</code> performs tests against the {@link org.ovirt.engine.core.dao.EngineSessionDAO} type. + * + * + */ +public class EngineSessionDAOTest extends BaseDAOTestCase { + private static final int SESSION_COUNT = 1; + private EngineSessionDAO dao; + private EngineSession newEngineSession; + private EngineSession existingEngineSession; + + @Override + @Before + public void setUp() throws Exception { + super.setUp(); + + dao = dbFacade.getEngineSessionDao(); + + // create some test data + newEngineSession = new EngineSession(); + newEngineSession.setEngineSessionId(Guid.newGuid().toString()); + newEngineSession.setUserId(Guid.newGuid()); + newEngineSession.setSessionExpiration(new Date()); + newEngineSession.setRole(""); + newEngineSession.setPrincipalRecord(""); + newEngineSession.setAuthRecord(""); + newEngineSession.setGroupIds(new LinkedList<Guid>(Arrays.asList(FixturesTool.EXISTING_GROUP_ID))); + newEngineSession.setUserName(""); + + existingEngineSession = dao.get(FixturesTool.EXISTING_SESSION_ID.toString()); + } + + /** + * Ensures that if the id is invalid then no EngineSession is returned. + */ + @Test + public void testGetWithInvalidId() { + EngineSession result = dao.get(Guid.newGuid().toString()); + + assertNull(result); + } + + /** + * Ensures that, if the id is valid, then retrieving a EngineSession works as expected. + */ + @Test + public void testGet() { + EngineSession result = dao.get(existingEngineSession.getEngineSessionId()); + + assertNotNull(result); + assertEquals(existingEngineSession, result); + } + + /** + * Ensures that finding all EngineSessions works as expected. + */ + @Test + public void testGetAll() { + List<EngineSession> result = dao.getAll(); + + assertEquals(SESSION_COUNT, result.size()); + } + + /** + * Ensures that removing a ad_group works as expected. + */ + @Test + public void testRemove() { + EngineSession result = dao.get(existingEngineSession.getEngineSessionId()); + assertNotNull(result); + + assertEquals(dao.remove(existingEngineSession.getEngineSessionId()), 1); + result = dao.get(existingEngineSession.getEngineSessionId()); + + assertNull(result); + assertEquals(dao.remove(existingEngineSession.getEngineSessionId()), 0); + + } + + @Test + public void testSaveOrUpdate() { + List<EngineSession> sessions = dao.getAll(); + assertNotNull(sessions); + int sessionsNumber = sessions.size(); + dao.saveOrUpdate(existingEngineSession); + sessions = dao.getAll(); + assertEquals(sessionsNumber, sessions.size()); + EngineSession sessionFromDb = dao.get(existingEngineSession.getEngineSessionId()); + assertNotNull(sessionFromDb); + assertEquals(sessionFromDb, existingEngineSession); + dao.saveOrUpdate(newEngineSession); + sessions = dao.getAll(); + assertNotNull(sessions); + assertEquals(sessionsNumber + 1, sessions.size()); + sessionFromDb = dao.get(newEngineSession.getEngineSessionId()); + assertEquals(sessionFromDb, newEngineSession); + } + +} diff --git a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/FixturesTool.java b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/FixturesTool.java index 0e0cc66..2f29812 100644 --- a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/FixturesTool.java +++ b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/FixturesTool.java @@ -400,6 +400,16 @@ protected static final Guid EXISTING_TASK_ID = new Guid("340fd52b-3400-4cdd-8d3f-C9d03704b0aa"); /** + * Predefined engine session id + */ + protected static final Guid EXISTING_SESSION_ID = new Guid("c61a1dec-6b5f-11e4-80d9-3c970e14c386"); + + /** + * Predefined engine group id + */ + protected static final Guid EXISTING_GROUP_ID = new Guid("cd854d52-b6bf-4d74-81cd-0345d8266939"); + + /** * ID of an existing snapshot */ protected static final Guid EXISTING_SNAPSHOT_ID = new Guid("a7bb24df-9fdf-4bd6-b7a9-f5ce52da0f89"); diff --git a/backend/manager/modules/dal/src/test/resources/fixtures.xml b/backend/manager/modules/dal/src/test/resources/fixtures.xml index 19d1f73..3d32f3a 100644 --- a/backend/manager/modules/dal/src/test/resources/fixtures.xml +++ b/backend/manager/modules/dal/src/test/resources/fixtures.xml @@ -210,6 +210,18 @@ </row> </table> + <table name="engine_sessions"> + <column>id</column> + <column>user_id</column> + <column>user_name</column> + <column>session_expiration</column> + <row> + <value>c61a1dec-6b5f-11e4-80d9-3c970e14c386</value> + <value>9bf7c640-b620-456f-a550-0348f366544a</value> + <value>userportal2</value> + <value>2010-12-01 14:13:07</value> + </row> + </table> <table name="storage_server_connections"> <column>id</column> diff --git a/packaging/dbscripts/engine_sessions_sp.sql b/packaging/dbscripts/engine_sessions_sp.sql new file mode 100644 index 0000000..e2ca5d3 --- /dev/null +++ b/packaging/dbscripts/engine_sessions_sp.sql @@ -0,0 +1,96 @@ +---------------------------------------------------------------- +-- [engine_sessions] Table +-- +Create or replace FUNCTION InsertEngineSession(v_id VARCHAR(255), + v_user_id UUID, + v_user_name VARCHAR(255), + v_auth_record VARCHAR(255), + v_principal_record VARCHAR(255), + v_group_ids VARCHAR(2048), + v_role VARCHAR(255), + v_session_expiration timestamp WITH TIME ZONE) +RETURNS VOID + AS $procedure$ +BEGIN +INSERT INTO engine_sessions(id, user_id, user_name, auth_record, principal_record, group_ids, role, session_expiration) + VALUES(v_id, v_user_id, v_user_name, v_auth_record, v_principal_record, v_group_ids, v_role, v_session_expiration); +END; $procedure$ +LANGUAGE plpgsql; + + +Create or replace FUNCTION UpdateEngineSession(v_id VARCHAR(255), + v_user_id UUID, + v_user_name VARCHAR(255), + v_auth_record VARCHAR(255), + v_principal_record VARCHAR(255), + v_group_ids VARCHAR(2048), + v_role VARCHAR(255), + v_session_expiration timestamp WITH TIME ZONE) +RETURNS VOID + AS $procedure$ +BEGIN + UPDATE engine_sessions + SET user_id = v_user_id, + user_name = v_user_name, + auth_record = v_auth_record, + principal_record = v_principal_record, + group_ids = v_group_ids, + role = v_role, + session_expiration = v_session_expiration + WHERE id = v_id; +END; $procedure$ +LANGUAGE plpgsql; + +Create or replace FUNCTION InsertOrUpdateEngineSession(v_id VARCHAR(255), + v_user_id UUID, + v_user_name VARCHAR(255), + v_auth_record VARCHAR(255), + v_principal_record VARCHAR(255), + v_group_ids VARCHAR(2048), + v_role VARCHAR(255), + v_session_expiration timestamp WITH TIME ZONE) +RETURNS VOID + AS $procedure$ +BEGIN + IF NOT EXISTS (SELECT 1 from engine_sessions where engine_sessions.id = v_id) THEN + PERFORM InsertEngineSession(v_id, v_user_id, v_user_name, v_auth_record, v_principal_record, v_group_ids, v_role, v_session_expiration); + ELSE + PERFORM UpdateEngineSession(v_id, v_user_id, v_user_name, v_auth_record, v_principal_record, v_group_ids, v_role, v_session_expiration); + END IF; +END; $procedure$ +LANGUAGE plpgsql; + + +Create or replace FUNCTION GetAllFromEngineSessions() RETURNS SETOF engine_sessions STABLE + AS $procedure$ +BEGIN + RETURN QUERY SELECT * + FROM engine_sessions; + +END; $procedure$ +LANGUAGE plpgsql; + + +Create or replace FUNCTION GetEngineSessionById(v_id VARCHAR(255)) RETURNS SETOF engine_sessions STABLE + AS $procedure$ +BEGIN + RETURN QUERY SELECT * + FROM engine_sessions + WHERE id = v_id; + +END; $procedure$ +LANGUAGE plpgsql; + +Create or replace FUNCTION DeleteEngineSession(v_id VARCHAR(255)) +RETURNS integer + AS $procedure$ +DECLARE +deleted_rows int; +BEGIN + DELETE FROM engine_sessions + WHERE id = v_id; + GET DIAGNOSTICS deleted_rows = ROW_COUNT; + RETURN deleted_rows; + +END; $procedure$ +LANGUAGE plpgsql; diff --git a/packaging/dbscripts/upgrade/03_06_0530_add_engine_sessions.sql b/packaging/dbscripts/upgrade/03_06_0530_add_engine_sessions.sql new file mode 100644 index 0000000..251fc7b --- /dev/null +++ b/packaging/dbscripts/upgrade/03_06_0530_add_engine_sessions.sql @@ -0,0 +1,11 @@ +CREATE TABLE engine_sessions ( + id character varying(255) NOT NULL, + user_id uuid NOT NULL, + user_name character varying(255) NOT NULL, + auth_record character varying(255), + principal_record character varying(255), + group_ids text, + role character varying(255), + session_expiration timestamp with time zone, + CONSTRAINT pk_engine_sessions PRIMARY KEY(id) +); -- To view, visit http://gerrit.ovirt.org/35148 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I4b4d9cfc3edc6084fc0436ecfd09c82d5ae57f5e Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Ravi Nori <rn...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches